diff --git a/.gitignore b/.gitignore deleted file mode 100644 index a8b54702..00000000 --- a/.gitignore +++ /dev/null @@ -1,7 +0,0 @@ -build/ -qtcreator-build/ -Doxyfile -html/ -latex/ -CMakeLists.txt.user -*.pyc diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index 2ffccaba..00000000 --- a/.gitmodules +++ /dev/null @@ -1,3 +0,0 @@ -[submodule "telldus-gui/3rdparty/qt-components-desktop"] - path = telldus-gui/3rdparty/qt-components-desktop - url = http://git.telldus.com/qt-components-desktop.git diff --git a/3rdparty/tellstick.net/Properties/AssemblyInfo.cs b/3rdparty/tellstick.net/Properties/AssemblyInfo.cs deleted file mode 100644 index 9d953f39..00000000 --- a/3rdparty/tellstick.net/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("TellStick.NET")] -[assembly: AssemblyDescription("A managed .NET wrapper class library for the TellStick native DLL")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Eyedealistic / Levén Labs (http://labs.leven.se)")] -[assembly: AssemblyProduct("TellStick.NET")] -[assembly: AssemblyCopyright("Created by Mikael Levén in 2007")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("24411992-c766-4eb8-b7ac-c002f0d7d5ad")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Revision and Build Numbers -// by using the '*' as shown below: -[assembly: AssemblyVersion("0.1.0.*")] -[assembly: AssemblyFileVersion("0.1.0.0")] diff --git a/3rdparty/tellstick.net/TellStick.NET.csproj b/3rdparty/tellstick.net/TellStick.NET.csproj deleted file mode 100644 index b7e159e8..00000000 --- a/3rdparty/tellstick.net/TellStick.NET.csproj +++ /dev/null @@ -1,102 +0,0 @@ - - - Debug - AnyCPU - 8.0.50727 - 2.0 - {700E41E9-ADB6-4D5A-B9EB-B6560C1C0D3F} - Library - Properties - TellStick - TellStick.NET - - - - - - - - - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - false - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - true - bin\x86\Debug\ - DEBUG;TRACE - full - x86 - C:\Program Files (x86)\Microsoft Visual Studio 8\Team Tools\Static Analysis Tools\FxCop\\rules - true - GlobalSuppressions.cs - prompt - - - bin\x86\Release\ - TRACE - true - none - x86 - C:\Program Files (x86)\Microsoft Visual Studio 8\Team Tools\Static Analysis Tools\FxCop\\rules - true - GlobalSuppressions.cs - prompt - bin\x86\Release\TellStick.NET.XML - - - true - bin\x64\Debug\ - DEBUG;TRACE - full - x64 - C:\Program Files\Microsoft Visual Studio 8\Team Tools\Static Analysis Tools\FxCop\\rules - true - GlobalSuppressions.cs - prompt - - - bin\x64\Release\ - TRACE - true - none - x64 - C:\Program Files\Microsoft Visual Studio 8\Team Tools\Static Analysis Tools\FxCop\\rules - true - GlobalSuppressions.cs - prompt - bin\x64\Release\TellStick.NET.XML - - - - - - - - - - - - - \ No newline at end of file diff --git a/3rdparty/tellstick.net/TellStick.cs b/3rdparty/tellstick.net/TellStick.cs deleted file mode 100644 index 889b39f5..00000000 --- a/3rdparty/tellstick.net/TellStick.cs +++ /dev/null @@ -1,318 +0,0 @@ -/* ------------------------------------------------------------------------------- - * TellStick.NET - * ------------------------------------------------------------------------------- - * Created by Mikael Levén (http://labs.leven.se) - * - * This piece of code is licensed as open source and can be freely used and - * redistributed in any type of project, both commercial and non-commercial, - * as long as this licensing policy is not altered. This means that any alterations - * of this code must also be licensed as open source and therefore cannot be - * protected or patented in any way. However, any software based on this code may - * still be copyrighted (and/or patented) and sold as propritary software as long as - * this code (and any alterations of it) can be freely used and modified by others. - * - * Altough the code is licensed as open source you don't need to republish any - * changes made back to the community (it will be much appreciated tough). - * - * The code comes without any kind of warrantys and the author cannot be held - * responsible for any kind of damage this software may (or may not) cause, no matter - * if it's direct or indirect damage. - * - * Please note: - * All TellStick core functionality is developed by Telldus Technologies - * and as of now (2007-12-14) that code is also licensed as open source. This may - * however change in the future and I suggest that you check there website - * to make sure the licensing terms are still the same: http://www.telldus.se/ - * The documentation and example code for Tellstic is available at their Wiki: - * http://www.telldus.se/wiki/ - * - * ------------------------------------------------------------------------------- - * Description: - * TellStick.NET is a Microsoft .NET wrapper for the native TellStick DLL. - * The wrapper also adds some functionality to make it easier to work with - * TellStick devices. - * - * Author: Mikael Levén - * Created: 2007-12-14 - * - * Dependencies: - * This library depends on the native DLL for TellStick. To be able to actually - * switch lights on and off you also need the driver to be installed as well - * as an TellStick USB device. - * - * Revisions: -------------------------------------------------------------------------------- -*/ - -using System.Collections.Generic; -using System.Runtime.InteropServices; - -/// -/// TellStick.NET is a Microsoft .NET wrapper for the native TellStick DLL. -/// The wrapper also adds some functionality to make it easier to work with TellStick devices. -/// -public sealed class TellStick -{ - private TellStick() - { } - - - #region TellStick native DLL imports class - public sealed class Native - { - private Native() - { } - - [DllImport("TellUsbD101.dll")] - public static extern int devAddDevice(); - - [DllImport("TellUsbD101.dll")] - public static extern bool devTurnOn(int intDeviceId); - - [DllImport("TellUsbD101.dll")] - public static extern bool devTurnOff(int intDeviceId); - - [DllImport("TellUsbD101.dll")] - public static extern int devGetNumberOfDevices(); - - [DllImport("TellUsbD101.dll")] - public static extern string devGetName(int intDeviceId); - - [DllImport("TellUsbD101.dll")] - public static extern bool devSetName(int intDeviceId, string chNewName); - - [DllImport("TellUsbD101.dll")] - public static extern string devGetVendor(int intDeviceId); - - [DllImport("TellUsbD101.dll")] - public static extern bool devSetVendor(int intDeviceId, string chNewName); - - [DllImport("TellUsbD101.dll")] - public static extern string devGetModel(int intDeviceId); - - [DllImport("TellUsbD101.dll")] - public static extern bool devSetModel(int intDeviceId, string chNewName); - - [DllImport("TellUsbD101.dll")] - public static extern int[] devGetArguments(int intDeviceId); - - [DllImport("TellUsbD101.dll")] - public static extern bool devSetArguments(int intDeviceId, int[] intArguments, int intNumberOfArguments); - - [DllImport("TellUsbD101.dll")] - public static extern int devAddDeviceWithArguments(string strVendor, int[] intArguments, int intNumberOfArguments); - - [DllImport("TellUsbD101.dll")] - public static extern bool devRemoveDevice(int intDeviceId); - - [DllImport("TellUsbD101.dll")] - public static extern int devGetDeviceId(int intDeviceIndex); - - } - #endregion - - /// - /// Gets the number of devices registered - /// - /// Returns the number of devices as an integer - /// The native DLL is required for this methods to run. If it's missing a ModuleNotFoundException exception will be thrown. - public static int GetNumberOfDevices() - { - try - { - return Native.devGetNumberOfDevices(); - } - catch (System.DllNotFoundException ex) - { - throw new ModuleNotFoundException("Could not find TellStick software. Please make sure it's installed before you run this application!", ex); - } - catch (System.Exception) - { - throw; - } - - } - - /// - /// Gets the unique idetifier of the device - /// - /// Index number of the device to get ID for - /// Returns the unique identifier as an integer - /// The native DLL is required for this methods to run. If it's missing a ModuleNotFoundException exception will be thrown. - public static int GetDeviceId(int deviceIndex) - { - // Retrieve and return the device unqiue identifier from the native method - try - { - return Native.devGetDeviceId(deviceIndex); - } - catch (System.DllNotFoundException ex) - { - throw new ModuleNotFoundException("Could not find TellStick software. Please make sure it's installed before you run this application!", ex); - } - catch (System.Exception) - { - throw; - } - - } - - - /// - /// Gets the user defined name of the device - /// - /// Device unqiue identification - /// Returns the user defined device name as a string - /// The native DLL is required for this methods to run. If it's missing a ModuleNotFoundException exception will be thrown. - public static string GetName(int deviceId) - { - // Retrieve and return the device name from the native method - try - { - return Native.devGetName(deviceId); - } - catch (System.DllNotFoundException ex) - { - throw new ModuleNotFoundException("Could not find TellStick software. Please make sure it's installed before you run this application!", ex); - } - catch (System.Exception) - { - throw; - } - } - - - /// - /// Turns on the selected device - /// - /// Device unqiue identification - /// Returns true if the device was succesfully turned on - /// The native DLL is required for this methods to run. If it's missing a ModuleNotFoundException exception will be thrown. - public static bool TurnOn(int deviceId) - { - // Send "on" signal - try - { - return Native.devTurnOn(deviceId); - } - catch (System.DllNotFoundException ex) - { - throw new ModuleNotFoundException("Could not find TellStick software. Please make sure it's installed before you run this application!", ex); - } - catch (System.Exception) - { - throw; - } - } - - /// - /// Turns off the selected device - /// - /// Device unqiue identification - /// Returns true if the device was succesfully turned off - /// The native DLL is required for this methods to run. If it's missing a ModuleNotFoundException exception will be thrown. - public static bool TurnOff(int deviceId) - { - // Send "off" signal - try - { - return Native.devTurnOff(deviceId); - } - catch (System.DllNotFoundException ex) - { - throw new ModuleNotFoundException("Could not find TellStick software. Please make sure it's installed before you run this application!", ex); - } - catch (System.Exception) - { - throw; - } - } - - /// - /// Gets the vendors name - /// - /// - /// - /// The native DLL is required for this methods to run. If it's missing a ModuleNotFoundException exception will be thrown. - public static string GetVendor(int deviceId) - { - // Retrieve and return the vendor from the native method - try - { - return Native.devGetVendor(deviceId); - } - catch (System.DllNotFoundException ex) - { - throw new ModuleNotFoundException("Could not find TellStick software. Please make sure it's installed before you run this application!", ex); - } - catch (System.Exception) - { - throw; - } - } - - - - #region "Support classes" - - public abstract class TellStickException : System.Exception - { - public TellStickException() : base() - { - } - - public TellStickException(string message) - : base(message) - { - } - - public TellStickException(string message, System.Exception innerException) - : base(message, innerException) - { - } - - } - - public class UnmanagedException : TellStickException - { - public UnmanagedException() : base() - { - } - - public UnmanagedException(string message) - : base(message) - { - } - - public UnmanagedException(string message, System.Exception innerException) - : base(message, innerException) - { - } - - } - - public class ModuleNotFoundException : TellStickException - { - public ModuleNotFoundException() - : base("Could not find TellStick software. Please make sure it's installed before you run this application!") - { - - } - - public ModuleNotFoundException(string message) - : base(message) - { - - } - - public ModuleNotFoundException(string message, System.Exception innerException) - : base(message, innerException) - { - - } - } - - - #endregion -} - diff --git a/3rdparty/tellstickcontroller/License b/3rdparty/tellstickcontroller/License deleted file mode 100644 index 8f829aec..00000000 --- a/3rdparty/tellstickcontroller/License +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/3rdparty/tellstickcontroller/Readme b/3rdparty/tellstickcontroller/Readme deleted file mode 100644 index 3f607bb4..00000000 --- a/3rdparty/tellstickcontroller/Readme +++ /dev/null @@ -1,181 +0,0 @@ -This Readme explains how to use tellstickControllerTdtool and -tellstickControllerRfcmd programs to control a tellstick. - -The tellstickController shell script can be used as a wrapper help -for old users. - -The two configuration files can also be used as a starting point on -how to control receiver devices when running tellstickController in -daemon mode. - -tellstickControllerTdtool.conf shows how the configuration file can -be written when using tdtool. Remember that tellstick.conf needs to -be used for actual confiuration of receiver devices. - -tellstickControllerRfcmd.conf shows how the configuration file can -be written when using rfcmd. - -The example directory contains a number of shell scripts that can be -used as a starting point for how to use tellstickController. - -###################################################################### - - NAME - tellstickControllerTdtool - - SYNOPSIS - tellstickControllerTdtool [options] - - DESCRIPTION - tellstickController is used for controlling wireless recevier devices from - a TellStick transmitter. This version uses the tdtool software to perform - the actual device control. tellstickController can be used for manual - control of devices, or used as a daemon that is controlled by a number of - configuration file rules. - Devices and groups can be accessed by either name or id. - States can be set to ON, OFF or an integer between 0-255 for dimmer. - - -h, --help Show this help text. - -v, --verbose Show extra information. - -d, --daemon Starts in daemon mode. - -f, --file F Set configfile to file F. - -c, --check Check content of configuration file. - -t, --test Test mode, no real devices will used. - -a, --aliases List of aliases for devices/groups. - -l, --list List states for all devices/groups. - -s, --set D S Set device D to state S - -g, --get D Get state for device/group D. - -w, --swapfirst G Swap states for group G based on first device state. - -x, --swap D Swap state for device/group D. - - EXAMPLES - tellstickControllerTdtool -l - tellstickControllerTdtool --set device_alias on - tellstickControllerTdtool --swap device_alias - tellstickControllerTdtool -d -f myConfigFile.conf - - DEPENDENCIES - The following Perl modules needs to be installed: - DateTime and DateTime::Event::Sunrise - - FILES - tellstickController.conf - tellstickController.log - tellstickController.pid - - CONFIGURATION - The configuration file consists of a number of settings 'Set', a number of - group aliases 'Group', and a number of device rules 'Rules'. - - The settings controls sunrise/sunset, logfile, pidfile, etc. - - The groups configures a list of devices and a delay time. - - The rules can be written as a string containing two parts. - The first part is optional and ends with an '/'. It can contain one or more - of these keywords 'Weekend', 'Workweek', 'Monday', 'Tuesday', 'Wednesday', - 'Thursday', 'Friday', 'Saturday' and 'Sunday'. A specified date like - '2008-03-18', '2008-03-##', '####-03-##' or '####-##-15' is also allowed. - The second part is mandatory and is either a expression or the keyword 'No'. - The expression can contain a micture of these keywords 'Sunrise', 'Sunset', - 'Random(HH:MM)', 'HH:MM' and 'Dimmer(HH:MM,startlevel,stoplevel,steplevel)'. - A Dimmer can be controlled to change dim level from startlevel to stoplevel - by adding/subtracting steplevel value every HH:MM time period. - - Example rule: Weekend/07:15 - Example rule: Monday+Sunday/07:15 - Example rule: 2008-03-##/12:10 - Example rule: 07:15+Random(02:00) - Example rule: Sunset-00:30 - Example rule: Workweek/07:00+Dimmer(00:01,5,255,25) - - AUTHOR - Original version written by Rickard Andersson - - LICENSE - Copyright (C) 2008-2010 Rickard Andersson. Version 2.0.0 - This program comes with ABSOLUTELY NO WARRANTY. - This is free software, and you are welcome to redistribute it under certain - conditions; See license file for details. - -###################################################################### - - NAME - tellstickControllerRfcmd - - SYNOPSIS - tellstickControllerRfcmd [options] - - DESCRIPTION - tellstickController is used for controlling wireless recevier devices from - a TellStick transmitter. This version uses the rfcmd software to perform - the actual device control. tellstickController can be used for manual - control of devices, or used as a daemon that is controlled by a number of - configuration file rules. - A small database is used for keeping track of device states between every - execution of tellstickController. - - -h, --help Show this help text. - -v, --verbose Show extra information. - -d, --daemon Starts in daemon mode. - -f, --file F Set configfile to file F. - -c, --check Check content of configuration file. - -t, --test Test mode, no real devices will used. - -a, --aliases List of aliases for devices/groups. - -l, --list List states for all devices/groups. - -s, --set D S Set device D to state S. - -g, --get D Get state for device/group D. - -w, --swapfirst G Swap states for group G based on first device state. - -x, --swap D Swap state for device/group D. - - EXAMPLES - tellstickControllerRfcmd -l - tellstickControllerRfcmd --set device_alias on - tellstickControllerRfcmd --swap device_alias - tellstickControllerRfcmd -d -f myConfigFile.conf - - DEPENDENCIES - The following Perl modules needs to be installed: - DB_File, DateTime and DateTime::Event::Sunrise - - FILES - tellstickController.conf - tellstickController.db - tellstickController.log - tellstickController.pid - - CONFIGURATION - The configuration file consists of a number of settings 'Set', a number of - device aliases 'Alias', and a number of device rules 'Rules'. - - The settings controls sunrise/sunset, logfile, pidfile, etc. - - The aliases configures device name, channel, code, etc. - - The groups configures a list of devices and a delay time. - - The rules can be written as a string containing two parts. - The first part is optional and ends with an '/'. It can contain one or more - of these keywords 'Weekend', 'Workweek', 'Monday', 'Tuesday', 'Wednesday', - 'Thursday', 'Friday', 'Saturday' and 'Sunday'. A specified date like - '2008-03-18', '2008-03-##', '####-03-##' or '####-##-15' is also allowed. - The second part is mandatory and is either a expression or the keyword 'No'. - The expression can contain a micture of these keywords 'Sunrise', 'Sunset', - 'Random(HH:MM)' and 'HH:MM'. - - Example rule: Weekend/07:15 - Example rule: Monday+Sunday/07:15 - Example rule: 2008-03-##/12:10 - Example rule: 07:15+Random(02:00) - Example rule: Sunset-00:30 - - AUTHOR - Original version written by Rickard Andersson - - LICENSE - Copyright (C) 2008-2010 Rickard Andersson. Version 2.0.0 - This program comes with ABSOLUTELY NO WARRANTY. - This is free software, and you are welcome to redistribute it - under certain conditions; See license file for details. - -###################################################################### diff --git a/3rdparty/tellstickcontroller/examples/power_off_all_lights b/3rdparty/tellstickcontroller/examples/power_off_all_lights deleted file mode 100755 index 438a2505..00000000 --- a/3rdparty/tellstickcontroller/examples/power_off_all_lights +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/sh -# -# Power off every device that control light sources. -# - -tellstickController --set bedroom_mythtv_leds off -tellstickController --set bedroom_window off -tellstickController --set kitchen_cabinets off -tellstickController --set livingroom_cabinets off -tellstickController --set livingroom_mythtv_leds off -tellstickController --set livingroom_uplight off -tellstickController --set livingroom_wall_north off -tellstickController --set livingroom_wall_east off -tellstickController --set livingroom_window off -tellstickController --set study_window off - diff --git a/3rdparty/tellstickcontroller/examples/power_off_bedroom_mythtv b/3rdparty/tellstickcontroller/examples/power_off_bedroom_mythtv deleted file mode 100755 index 448bef94..00000000 --- a/3rdparty/tellstickcontroller/examples/power_off_bedroom_mythtv +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/sh -# -# Power off bedroom MythTV, turn off backlight leds. -# - -tellstickController --set bedroom_mythtv_power off -tellstickController --set bedroom_mythtv_leds off - diff --git a/3rdparty/tellstickcontroller/examples/power_on_all_lights b/3rdparty/tellstickcontroller/examples/power_on_all_lights deleted file mode 100755 index c929495a..00000000 --- a/3rdparty/tellstickcontroller/examples/power_on_all_lights +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/sh -# -# Power on every device that control light sources. -# - -tellstickController --set bedroom_mythtv_leds on -tellstickController --set bedroom_window on -tellstickController --set kitchen_cabinets on -tellstickController --set livingroom_cabinets on -tellstickController --set livingroom_mythtv_leds on -tellstickController --set livingroom_uplight on -tellstickController --set livingroom_wall_north on -tellstickController --set livingroom_wall_east on -tellstickController --set Livingroom_window on -tellstickController --set study_window on - diff --git a/3rdparty/tellstickcontroller/examples/power_on_bedroom_mythtv b/3rdparty/tellstickcontroller/examples/power_on_bedroom_mythtv deleted file mode 100755 index 463581a2..00000000 --- a/3rdparty/tellstickcontroller/examples/power_on_bedroom_mythtv +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/sh -# -# Power on bedroom MythTV, turn on backlight leds and turn off window lamp. -# - -tellstickController --set bedroom_mythtv_power on -tellstickController --set bedroom_mythtv_leds on -tellstickController --set bedroom_window off -tellstickController --set bedroom_bed off - diff --git a/3rdparty/tellstickcontroller/examples/swap_livingroom_tv_mode b/3rdparty/tellstickcontroller/examples/swap_livingroom_tv_mode deleted file mode 100755 index 8efc456d..00000000 --- a/3rdparty/tellstickcontroller/examples/swap_livingroom_tv_mode +++ /dev/null @@ -1,27 +0,0 @@ -#!/bin/sh -# -# Swaps livingroom tv mode on/off -# - -led_status=`tellstickController --get livingroom_mythtv_leds` -#echo $led_status - -if [ "$led_status" != "on" ]; then -# echo on - tellstickController --set livingroom_cabinets on - tellstickController --set livingroom_mythtv_leds on - tellstickController --set livingroom_uplight off - tellstickController --set livingroom_wall_north on - tellstickController --set livingroom_wall_east off - tellstickController --set Livingroom_window on -else -# echo off - tellstickController --set livingroom_cabinets on - tellstickController --set livingroom_mythtv_leds off - tellstickController --set livingroom_uplight off - tellstickController --set livingroom_wall_north on - tellstickController --set livingroom_wall_east on - tellstickController --set Livingroom_window on -fi - -exit diff --git a/3rdparty/tellstickcontroller/examples/tellstickController.conf b/3rdparty/tellstickcontroller/examples/tellstickController.conf deleted file mode 100644 index b26ec0b5..00000000 --- a/3rdparty/tellstickcontroller/examples/tellstickController.conf +++ /dev/null @@ -1,96 +0,0 @@ -################################################################################ -# -# Configuration file for tellstickController -# -# Copyright (C) 2008 Rickard Andersson (ran42ran@gmail.com) -# Version: 1.4 -# -################################################################################ -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -################################################################################ - -# List of location settings. -# -# Usage example: -# Set Key Value -# Set Timezone Europe/Stockholm -# -# -Set Timezone Europe/Stockholm -Set Latitude 58.24 -Set Longitude 15.31 -Set dbfile /var/lib/tellstickController.db -Set pidfile /var/run/tellstickController.pid -Set logfile /var/log/tellstickController.log - - -# Aliases for recevier devices. -# -# Usage example: -# Alias Name Sender Dimmer Protocol Housecode Channel -# Alias BedroomWindow /dev/tellstick0 yes Nexa A 1 -# Alias device42 /dev/tellstick1 No Waveman B 3 -# or -# Usage example: -# Alias Name Sender Dimmer Protocol Channel -# Alias MythTv_Backlight /dev/ttyUSB0 No Sartano 000000001 -# -# -Alias Bedroom_window /dev/tellstick0 No Nexa G 10 -Alias Bedroom_mythtv_power /dev/tellstick0 No Nexa G 6 -Alias Bedroom_mythtv_leds /dev/tellstick0 No Nexa G 7 -Alias Kitchen_cabinets /dev/tellstick0 No Nexa G 2 -Alias Kitchen_window /dev/tellstick0 No Nexa G 11 -Alias Livingroom_cabinets /dev/tellstick0 No Nexa G 3 -Alias Livingroom_wall_north /dev/tellstick0 No Nexa G 4 -Alias Livingroom_wall_east /dev/tellstick0 No Nexa G 9 -Alias Livingroom_uplight /dev/tellstick0 Yes Nexa G 5 -Alias Livingroom_mythtv_leds /dev/tellstick0 No Nexa G 8 -Alias Livingroom_window /dev/tellstick0 No Nexa G 1 -Alias Study_window /dev/tellstick0 No Nexa G 12 - - -# Group aliases uses for handling a group of aliases -# -# Usage examples: -# Group Name Delay List of Aliases -# Group Livingroom_walls 60 Livingroom_wall_north Livingroom_wall_east -# Group Kitchen 5 Kitchen_cabinets Kitchen_window -# -# -Group Christmas_lights 20 Bedroom_window Kitchen_window Study_window -Group Background_lights 60 Kitchen_cabinets Livingroom_window Livingroom_wall_east Livingroom_wall_north -Group All_lights 10 Bedroom_mythtv_leds Bedroom_window Kitchen_cabinets Kitchen_window Livingroom_cabinets Livingroom_mythtv_leds Livingroom_uplight Livingroom_wall_north Livingroom_wall_east Livingroom_window Study_window - - -# Timer rules for reciever devices. -# -# Usage examples: -# Rule Alias DeviceOn DeviceOff -# Rule BedroomWindow Sunrise Sunrise+01:30 -# Rule BedroomWindow 18:33 23:10+Random(00:45) -# Rule MythTv_Backlight Weekend/20:00 Weekend/Sunset -# -# -Rule Background_lights Workweek/Sunset+Random(01:00) Workweek/00:00+Random(00:30) -Rule Background_lights Weekend/Sunset-Random(00:30) Weekend/00:45+Random(00:30) - -Rule Christmas_lights 07:00+Random(00:30) 09:00+Random(00:30) -Rule Christmas_lights 14:30+Random(00:30) 00:30+Random(00:30) - -Rule Kitchen_cabinets Sunrise-01:30 Sunrise+01:00 - -Rule All_lights No 02:00 diff --git a/3rdparty/tellstickcontroller/tellstick.conf b/3rdparty/tellstickcontroller/tellstick.conf deleted file mode 100644 index 15fea9e5..00000000 --- a/3rdparty/tellstickcontroller/tellstick.conf +++ /dev/null @@ -1,142 +0,0 @@ -deviceNode = "/dev/tellstick0" - -device { - id = 1 - name = "Bedroom_bed" - protocol = "arctech" - model = "selflearning-switch" - parameters { - house = "100010" - unit = "1" - } -} -device { - id = 2 - name = "Bedroom_window" - protocol = "arctech" - model = "selflearning-switch" - parameters { - house = "100020" - unit = "1" - } -} -device { - id = 3 - name = "Bedroom_mythtv_leds" - protocol = "arctech" - model = "selflearning-switch" - parameters { - house = "100030" - unit = "1" - } -} -device { - id = 4 - name = "Study_window" - protocol = "arctech" - model = "selflearning-switch" - parameters { - house = "100040" - unit = "1" - } -} -device { - id = 5 - name = "Kitchen_cabinets" - protocol = "arctech" - model = "selflearning-switch" - parameters { - house = "100050" - unit = "1" - } -} -device { - id = 6 - name = "Bedroom_dimmer" - protocol = "arctech" - model = "selflearning-dimmer" - parameters { - house = "100060" - unit = "1" - } -} -device { - id = 7 - name = "Livingroom_cabinets" - protocol = "arctech" - model = "selflearning-switch" - parameters { - house = "100070" - unit = "1" - } -} -device { - id = 8 - name = "Livingroom_wall_north" - protocol = "arctech" - model = "selflearning-switch" - parameters { - house = "100080" - unit = "1" - } -} -device { - id = 9 - name = "Test" - protocol = "arctech" - model = "selflearning-switch" - parameters { - house = "100090" - unit = "1" - } -} -device { - id = 10 - name = "Livingroom_window" - protocol = "arctech" - model = "selflearning-switch" - parameters { - house = "100100" - unit = "1" - } -} -device { - id = 11 - name = "Kitchen_window" - protocol = "arctech" - model = "selflearning-switch" - parameters { - house = "100110" - unit = "1" - } -} -device { - id = 12 - name = "Livingroom_wall_east" - protocol = "arctech" - model = "selflearning-switch" - parameters { - house = "100120" - unit = "1" - } -} -device { - id = 13 - name = "Livingroom_mythtv_leds" - protocol = "arctech" - model = "selflearning-switch" - parameters { - house = "100130" - unit = "1" - } -} -device { - id = 14 - name = "Livingroom_uplight" - protocol = "arctech" - model = "selflearning-dimmer" - parameters { - house = "100140" - unit = "1" - } -} diff --git a/3rdparty/tellstickcontroller/tellstickController b/3rdparty/tellstickcontroller/tellstickController deleted file mode 100755 index 7dc6dc67..00000000 --- a/3rdparty/tellstickcontroller/tellstickController +++ /dev/null @@ -1,58 +0,0 @@ -#!/bin/sh -###################################################################### -# -# Wrapper script that can be used to select which tellstickController -# program to run -# -# Copyright (C) 2008-2010 Rickard Andersson (ran42ran@gmail.com) -# Version 2.0.0 -# -###################################################################### -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -###################################################################### -# -# How to run tellstickController with tdtool -# tellstickController --tdtool --list -# -# How to run tellstickController with rfcmd -# tellstickController --rdfcmd --list -# -# How to run tellstickController with default program (tdtool or rfcmd) -# tellstickController --list -# - - -case "$1" in ---tdtool) - shift - tellstickControllerTdtool $@ - exit $? - ;; ---rfcmd) - shift - tellstickControllerRfcmd $@ - exit $? - ;; -esac - -# -# Uncomment your choice of default program below -# - -# tellstickControllerRfcmd $@ -tellstickControllerTdtool $@ - -exit $? diff --git a/3rdparty/tellstickcontroller/tellstickController.conf b/3rdparty/tellstickcontroller/tellstickController.conf deleted file mode 100644 index ce0914ee..00000000 --- a/3rdparty/tellstickcontroller/tellstickController.conf +++ /dev/null @@ -1,85 +0,0 @@ -################################################################################ -# -# Configuration file for tellstickController -# -# Copyright (C) 2008-2010 Rickard Andersson (ran42ran@gmail.com) -# Version: 2.0.0 -# -################################################################################ -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -################################################################################ - -# List of location settings. -# -# Usage example: -# Set Key Value -# -# Set Timezone Europe/Stockholm -# -Set Timezone Europe/Stockholm -Set Altitude -0.833 -Set Latitude 58.24 -Set Longitude 15.31 -Set dbfile /var/lib/tellstickController.db -Set pidfile /var/run/tellstickController.pid -Set logfile /var/log/tellstickController.log - - -# Aliases for recevier devices. -# -# Usage example: -# Alias Name Sender Dimmer Protocol Housecode Channel -# -# Alias BedroomWindow /dev/tellstick0 yes Nexa A 1 -# Alias device42 /dev/tellstick1 No Waveman B 3 -# -# or -# -# Usage example: -# Alias Name Sender Dimmer Protocol Channel -# -# Alias MythTv_Backlight /dev/ttyUSB0 No Sartano 000000001 -# -Alias device1 /dev/tellstick No Nexa A 1 -Alias device2 /dev/tellstick No Nexa A 2 - - -# Groups used for handling a list of aliases. -# -# Usage examples: -# Group Name Delay Aliases -# Group Livingroom_walls 60 Livingroom_wall_north Livingroom_wall_east -# Group Kitchen 5 Kitchen_cabinets Kitchen_window -# -Group allDevices 10 Device1 Device2 - - -# Timer rules for reciever devices. -# -# Usage examples: -# Rule Alias DeviceOn DeviceOff -# -# Rule BedroomWindow Sunrise Sunrise+01:30 -# Rule BedroomWindow 18:33 23:10+Random(00:45) -# Rule MythTv_Backlight Weekend/20:00 Weekend/Sunset -# Rule device42 2008-03-##/18:45 2008-03-##/22:11 -# Rule device42 No 02:00 -# -Rule device1 weekend/sunrise weekend/08:45 -Rule device1 sunset+00:15 23:30+Random(00:20) -Rule device2 Workweek/07:00+Dimmer(00:02,0,200,25) weekend/08:45 -Rule allDevices 16:45 23:45 - diff --git a/3rdparty/tellstickcontroller/tellstickControllerRfcmd b/3rdparty/tellstickcontroller/tellstickControllerRfcmd deleted file mode 100755 index 0cd662bc..00000000 --- a/3rdparty/tellstickcontroller/tellstickControllerRfcmd +++ /dev/null @@ -1,1083 +0,0 @@ -#!/usr/bin/perl -###################################################################### -# -# tellstickControllerRfcmd program -# -# Copyright (C) 2008-2010 Rickard Andersson (ran42ran@gmail.com) -# Version 2.0.0 -# -###################################################################### -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -###################################################################### - - -use warnings; -use strict; -use sigtrap 'handler', \&daemon_exit, 'normal-signals'; -use sigtrap 'die', 'untrapped', 'normal-signals'; -use sigtrap 'stack-trace', 'any', 'error-signals'; -use POSIX 'setsid'; - - -use DB_File; -use DateTime; -use DateTime::Event::Sunrise; - - -###################################################################### - -# All these cfg settings can be altered from the configuration file. -# -my %cfg_set = ( - "configfile" => "/etc/tellstickController.conf", - "dbfile" => "/var/lib/tellstickController.db", - "logfile" => "/var/log/tellstickController.log", - "pidfile" => "/var/run/tellstickController.pid", - "program" => "/usr/local/bin/rfcmd", - "altitude" => "-0.833", - "latitude" => "58.24", - "longitude" => "15.31", - "timezone" => "Europe/Stockholm", -); -my %cfg_group = (); -my %cfg_alias = (); -my %cfg_dimmer = (); -my @cfg_rule = (); - - -my %option = ( - "aliases" => 0, - "check" => 0, - "daemon" => 0, - "list" => 0, - "device" => "", - "state" => "", - "swapfirst" => 0, - "swap" => 0, - "test" => 0, - "verbose" => 0, -); -my %device_state = (); -my @device_on = (); -my @device_off = (); - - -###################################################################### - - -sub check_args(@) { - my (@args) = @_; - - if (not @args) { - usage(); - exit; - } - while (@args) { - if ($args[0] =~ /^-(h|-help)$/) { - usage(); - exit; - } elsif ($args[0] =~ /^-(a|-aliases)$/) { - shift(@args); - $option{"aliases"} = 1; - next; - } elsif ($args[0] =~ /^-(c|-check)$/) { - shift(@args); - $option{"check"} = 1; - next; - } elsif ($args[0] =~ /^-(d|-daemon)$/) { - shift(@args); - $option{"daemon"} = 1; - next; - } elsif ($args[0] =~ /^-(f|-file)$/) { - shift(@args); - $cfg_set{"configfile"} = shift(@args); - next; - } elsif ($args[0] =~ /^-(g|-get)$/) { - shift(@args); - $option{"get"} = 1; - $option{"device"} = lc($args[0]); - shift(@args); - next; - } elsif ($args[0] =~ /^-(l|-list)$/) { - shift(@args); - $option{"list"} = 1; - next; - } elsif ($args[0] =~ /^-(s|-set)$/) { - shift(@args); - $option{"set"} = 1; - $option{"device"} = lc($args[0]); - shift(@args); - $option{"state"} = lc($args[0]); - shift(@args); - next; - } elsif ($args[0] =~ /^-(w|-swapfirst)$/) { - shift(@args); - $option{"swapfirst"} = 1; - $option{"device"} = lc($args[0]); - shift(@args); - next; - } elsif ($args[0] =~ /^-(x|-swap)$/) { - shift(@args); - $option{"swap"} = 1; - $option{"device"} = lc($args[0]); - shift(@args); - next; - } elsif ($args[0] =~ /^-(t|-test)$/) { - shift(@args); - $option{"test"} = 1; - next; - } elsif ($args[0] =~ /^-(v|-verbose)$/) { - shift(@args); - $option{"verbose"} = 1; - next; - } - - usage(); - exit; - } -} - - -sub usage() { - while () { - if ($_ =~ /^#-(.*)/) { - print "$1\n"; - } - } -} - - -sub println($) { - my ($text) = @_; - - print "$text\n"; -} - - -sub printlogger($) { - my ($text) = @_; - - if ($option{"daemon"}) { - my $now = get_datetime_now(); - my $logfile = $cfg_set{"logfile"}; - my $output = "echo '$now $text' >> $logfile"; - system ($output); - } -} - - -###################################################################### - - -sub daemon_init() { - chdir "/"; - umask 0; - my $pid = fork; - exit if $pid; - die "Couldn't fork program" unless defined(\$pid); - setsid() or die "Couldn't start new program session"; - open STDIN, '/dev/null' or die "Couldn't read /dev/null!"; - open STDOUT, '>/dev/null' or die "Couldn't write to /dev/null!"; - open STDERR, '>/dev/null' or die "Couldn't write to /dev/null!"; - - my $pidfile = $cfg_set{"pidfile"}; - $0="tellstickControllerDaemon"; - $pid = $$; - system("echo $pid > $pidfile") if (defined($pidfile)); - - printlogger "> Daemon started"; -} - - -sub daemon_exit() { - printlogger "> Daemon stopped"; - - unlink $cfg_set{"pidfile"} if (defined($cfg_set{"pidfile"})); - my $pid = $$; - kill('TERM', $pid); - exit; -} - - -sub get_datetime_now() { - my $now = DateTime->now(time_zone => $cfg_set{"timezone"}); - - return $now; -} - - -sub get_datetime_sunrise($) { - my ($now) = @_; - - my $sunrise = DateTime::Event::Sunrise->sunrise ( - altitude => $cfg_set{"altitude"}, - latitude => $cfg_set{"latitude"}, - longitude => $cfg_set{"longitude"}, - iteration => '2' - ); - my $time = $sunrise->next($now); - - return $time; -} - - -sub get_datetime_sunset($) { - my ($now) = @_; - - my $sunset = DateTime::Event::Sunrise->sunset ( - altitude => $cfg_set{"altitude"}, - latitude => $cfg_set{"latitude"}, - longitude => $cfg_set{"longitude"}, - iteration => '2' - ); - my $time = $sunset->next($now); - - return $time; -} - - -sub read_db($) { - my ($dbfile) = @_; - - println "> Reading db started" if ($option{"verbose"}); - - tie %device_state, "DB_File", $dbfile, O_RDWR|O_CREAT, 0666, $DB_HASH - or die "Couldn't read dbfile '$dbfile'!\n"; - - foreach my $key (sort keys %cfg_alias) { - if (not $device_state{$key}) { - $device_state{$key} = "unknown"; - println "Added device $key to db!" if ($option{"verbose"}); - } - } - - foreach my $key (sort keys %device_state) { - if (not $cfg_alias{$key}) { - delete $device_state{$key}; - println "Removed device $key from db!" if ($option{"verbose"}); - } - } - - println "> Reading db finished" if ($option{"verbose"}); -} - - -sub write_db($) { - my ($dbfile) = @_; - - println "> Writing db started" if ($option{"verbose"}); - - untie %device_state; - - println "> Writing db finished" if ($option{"verbose"}); -} - - -sub read_config($) { - my ($infile) = @_; - - my $text = "> Reading configurationfile started"; - println $text if ($option{"verbose"}); - printlogger $text; - - open(my $indata, $infile) or die "Couldn't read configfile '$infile'!"; - - while(my $line = <$indata>) { - chomp($line); - $line =~ s/\s+/ /g; - - if ($line =~ /^Set\s+/i) { - #println $line if ($option{"verbose"}); - my (undef, $key, $val, $suffix) = split(/\s+/, $line); - if (defined($suffix)) { - println "Wrong argument '$suffix' in line '$line'!"; - } else { - if (defined($key)) { - if (defined($val)) { - $cfg_set{lc($key)} = $val; - } else { - println "Wrong value in line '$line'!"; - } - } else { - println "Wrong key in line '$line'!"; - } - } - next; - } - - if ($line =~ /^Alias\s+/i) { - #println $line if ($option{"verbose"}); - my (undef, $name, $sender, $dimmer, $prot, $code, $addr, $suffix) - = split(/\s+/, $line); - if (defined($suffix)) { - println "Wrong argument '$suffix' in line '$line'!"; -println $addr; - } else { - $name = lc($name); - $sender = $sender; - $dimmer = lc($dimmer); - $prot = uc($prot); - $code = uc($code); - $addr = uc($addr); - if ($dimmer =~ /^no|yes$/) { - $cfg_dimmer{$name} = $dimmer; - if ($prot =~ /^NEXA|WAVEMAN$/) { - if ($code =~ /^[A-P]$/) { - if ($addr =~ /^[1-9]{1}|1{1}[0-6]{1}$/) { - $cfg_alias{$name} = "$sender $prot $code $addr"; - } else { - println "Wrong channel '$addr' in line '$line'!"; - } - } else { - println "Wrong housecode '$code' in line '$line'!"; - } - } elsif ($prot =~ /^SARTANO$/) { - if ($code =~ /^[01]{10}$/) { - if ($addr eq "") { - $cfg_alias{$name} = "$sender $prot $code"; - } else { - println "Wrong argument '$addr' in line '$line'!"; - } - } else { - println "Wrong channel '$code' in line '$line'!"; - } - } else { - println "Wrong protocol '$prot' in line '$line'!"; - } - } else { - println "Wrong dimmer mode '$dimmer' in line '$line'!"; - } - } - next; - } - - if ($line =~ /^Group\s+/i) { - println $line if ($option{"verbose"}); - my (undef, $name, $delay, $aliases) = split(/\s+/, $line, 4); - $name = lc($name); - $delay = lc($delay); - if ($delay =~ /^\d+$/) { - my $error = 0; - $aliases = lc($aliases); - my @aliaslist = split(/\s+/, $aliases); - foreach my $alias (@aliaslist) { - if (! exists($cfg_alias{$alias})) { - println "Wrong alias '$alias' in line '$line'!"; - $error += 1; - } - } - if ($error == 0) { - $cfg_group{$name} = "$delay $aliases"; - } - } else { - println "Wrong delay time '$delay' in line '$line'!"; - } - next; - } - - if ($line =~ /^Rule\s+/i) { - #println $line if ($option{"verbose"}); - my (undef, $alias, $on, $off, $suffix) = split(/\s+/, $line); - if (defined($suffix)) { - println "Wrong argument '$suffix' in line '$line'!"; - } else { - $alias = lc($alias); - $on = lc($on); - $off = lc($off); - if ($on eq "") { - println "Wrong on time '$on' in line '$line'!"; - } elsif ($off eq "") { - println "Wrong off time '$off' in line '$line'!"; - } else { - if ($on !~ /[\w\/\+\-\:\$\(\)]+/) { - println "Wrong on time '$on' in line '$line'!"; - } elsif ($off !~ /[\w\/\+\-\:\$\(\)]+/) { - println "Wrong off time '$off' in line '$line'!"; - } - } - if (exists($cfg_alias{$alias})) { - push @cfg_rule, [$alias, $on, $off]; - } elsif (exists($cfg_group{$alias})) { - push @cfg_rule, [$alias, $on, $off]; - } else { - println "Wrong alias '$alias' in line '$line'!"; - } - } - next; - } - - if ($line =~ /^#/) { - next; - } - - if ($line =~ /^\s*/) { - next; - } - - println "Unhandled config line: '$line'!" if ($option{"check"}); - } - - close $indata; - - $text = "=== Set ==="; - println $text if ($option{"check"}); - printlogger $text; - foreach my $key (sort keys %cfg_set) { - $text = "$key = $cfg_set{$key}"; - println $text if ($option{"check"}); - printlogger $text; - } - $text = "=== Alias ==="; - println $text if ($option{"check"}); - printlogger $text; - foreach my $key (sort keys %cfg_alias) { - $text = "$key = $cfg_alias{$key}"; - println $text if ($option{"check"}); - printlogger $text; - } - $text = "=== Group ==="; - println $text if ($option{"check"}); - printlogger $text; - foreach my $key (sort keys %cfg_group) { - my $val = $cfg_group{$key}; - my ($delay, $aliases) = split(/\s+/, $val, 2); - $text = "$key ="; - $text .= " delay time $delay seconds"; - $text .= " between aliases ($aliases)"; - println $text if ($option{"check"}); - printlogger $text; - } - $text = "=== Rule ==="; - println $text if ($option{"check"}); - printlogger $text; - foreach my $rule (@cfg_rule) { - my ($alias, $on, $off) = @$rule; - $text = "$alias ="; - $text .= " on at $on" if ($on !~ /no/); - $text .= " and" if (($on !~ /no/) && ($off !~ /no/)); - $text .= " off at $off" if ($off !~ /no/); - println $text if ($option{"check"}); - printlogger $text; - } - - $text = "> Reading configurationfile finished"; - println $text if ($option{"verbose"}); - printlogger $text; -} - - -sub call_program($$) { - my ($device, $state) = @_; - - if ($option{"test"}) { - my $text = "Test mode, no real device will be used"; - println $text if ($option{"verbose"}); - printlogger $text; - } else { - my $alias = $cfg_alias{$device}; - my $mode = 0; - if ($state eq "on") { - $mode = 1; - } - my $prog = $cfg_set{"program"}; - my $command = "$prog $alias $mode"; - my $text = "Executing command: '$command'"; - println $text if ($option{"verbose"}); - system($command); - } -} - - -sub load_device_rules () { - my $text = "> Loading device rules started"; - println $text if ($option{"verbose"}); - printlogger $text; - - my $now = get_datetime_now(); - $text = "Time = $now"; - println $text if ($option{"verbose"}); - printlogger $text; - my $today = get_datetime_now(); - $today->set( hour => 0, minute => 0, second => 0 ); - $text = "Today = $today"; - println $text if ($option{"verbose"}); - printlogger $text; - my $sunrise = get_datetime_sunrise($today); - $text = "Sunrise = $sunrise"; - println $text if ($option{"verbose"}); - printlogger $text; - my $sunset = get_datetime_sunset($today); - $text = "Sunset = $sunset"; - println $text if ($option{"verbose"}); - printlogger $text; - - foreach my $rule (@cfg_rule) { - my ($alias, $on, $off) = @$rule; - if (exists($cfg_alias{$alias})) { - my $time = get_rule_datetime($on, $today, $sunrise, $sunset); - push @device_on, [$time, $alias] if (defined($time) && ($now <= $time)); - $time = get_rule_datetime($off, $today, $sunrise, $sunset); - push @device_off, [$time, $alias] if (defined($time) && ($now <= $time)); - } else { - foreach my $val ($cfg_group{$alias}) { - my ($delay, $aliases) = split(/\s+/, $val, 2); - my $timedelay = 0; - my $ontime = get_rule_datetime($on, $today, $sunrise, $sunset); - my $offtime = get_rule_datetime($off, $today, $sunrise, $sunset); - my (@aliaslist) = split(/\s+/, $aliases); - foreach my $device (@aliaslist) { - if (defined($ontime)) { - my $time = $ontime->clone->add(seconds => $timedelay); - push @device_on, [$time, $device] if (defined($time) && ($now <= $time)); - } - if (defined($offtime)) { - my $time = $offtime->clone->add(seconds => $timedelay); - push @device_off, [$time, $device] if (defined($time) && ($now <= $time)); - } - $timedelay += $delay; - } - } - } - } - - @device_on = sort { $a->[0] cmp $b->[0] } @device_on; - @device_off = sort { $a->[0] cmp $b->[0] } @device_off; - - $text = "=== Device on ==="; - println $text if ($option{"verbose"}); - printlogger $text; - foreach my $rule (@device_on) { - my ($time, $alias) = @$rule; - $text = "$alias = $time"; - println $text if ($option{"verbose"}); - printlogger $text; - } - $text = "=== Device off ==="; - println $text if ($option{"verbose"}); - printlogger $text; - foreach my $rule (@device_off) { - my ($time, $alias) = @$rule; - $text = "$alias = $time"; - println $text if ($option{"verbose"}); - printlogger $text; - } - - $text = "> Loading device rules finished"; - println $text if ($option{"verbose"}); - printlogger $text; -} - - -sub get_rule_datetime($$$$) { - my ($rule, $now, $sunrise, $sunset) = @_; - -#println "Rule='$rule'"; - - my ($date, $time) = split(/\//, $rule); - if (not defined($time)) { - $time = $date; - $date = $now->ymd; - } else { - my $today = 0; - my $match = 0; - if ($date =~ /([\d#]{4})-([\d#]{2})-([\d#]{2})/) { - $match = 1; - $today = 1 if ((($1 =~ /####/) || ($now->year == $1)) - && (($2 =~ /##/) || ($now->month == $2)) - && (($3 =~ /##/) || ($now->day == $3))); - } - if ($date =~ /workweek/) { - $match = 1; - $today = 1 if ($now->day_of_week < 6); - } - if ($date =~ /weekend/) { - $match = 1; - $today = 1 if ($now->day_of_week > 5); - } - if ($date =~ /monday/) { - $match = 1; - $today = 1 if ($now->day_of_week == 1); - } - if ($date =~ /tuesday/) { - $match = 1; - $today = 1 if ($now->day_of_week == 2); - } - if ($date =~ /wednesday/) { - $match = 1; - $today = 1 if ($now->day_of_week == 3); - } - if ($date =~ /thursday/) { - $match = 1; - $today = 1 if ($now->day_of_week == 4); - } - if ($date =~ /friday/) { - $match = 1; - $today = 1 if ($now->day_of_week == 5); - } - if ($date =~ /saturday/) { - $match = 1; - $today = 1 if ($now->day_of_week == 6); - } - if ($date =~ /sunday/) { - $match = 1; - $today = 1 if ($now->day_of_week == 7); - } - - if ($match) { - if ($today) { - $date = $now->ymd; - } else { - $time = undef; - } - } else { - println "Wrong date '$date' for rule '$rule'!"; - $time = undef; - } - } - - if (defined($time) && ($time !~ /^no$/)) { - my $days = 0; - my $hours = 0; - my $minutes = 0; - my $lastOp = "+"; - my $expr = ""; - my $op = ""; - my $rest = ""; - my $mins = 0; -#println "rule='$time'"; - - while ($time ne "") { - $op = $lastOp; - if ($time =~ /(.+?)(\+|-)(.*)/) { - $expr = $1; - $lastOp = $2; - $rest = $3; - $time = $rest; - } elsif ($time =~ /(.+)/) { - $expr = $1; - $lastOp = ""; - $rest = ""; - $time = ""; - } - - if ($expr =~ /^sunrise$/) { - $expr = 0; - if ($sunrise->hms =~ /(\d\d):(\d\d):(\d\d)/) { - $expr = $1*60+$2; - } - } elsif ($expr =~ /^sunset$/) { - $expr = 0; - if ($sunset->hms =~ /(\d\d):(\d\d):(\d\d)/) { - $expr = $1*60+$2; - } - } elsif ($expr =~ /^random\((\d\d):(\d\d)\)$/) { - $expr = int rand($1*60+$2+1); - } elsif ($expr =~ /^(\d\d):(\d\d)$/) { - $expr = $1*60+$2; - } else { - println "Wrong time '$expr' for rule '$rule'!"; - $expr = ""; - } - -#println "expr='$expr', op='$op', rest='$rest'"; - if ($op eq "+") { - $mins += $expr; - } elsif ($op eq "-") { - $mins -= $expr; - } -#println "mins='$mins'"; - } - if ($mins <= 0) { - $mins = $mins % (24*60); - $days = 1; - } elsif ($mins >= 24*60) { - $mins = $mins % (24*60); - $days = 1; - } - - $hours = int $mins/60; - $minutes = int $mins%60; -# UTC ? - $time = get_datetime_now(); - $time->set(hour => 0, minute => 0, second => 0); - $time->add(hours => $hours+24*$days, minutes => $minutes, seconds => 0); -#println "days='$days', hours='$hours', minutes='$minutes'"; -#println "time='$time'"; - } else { - $time = undef; - } - - return $time; -} - - -sub check_device_rules($) { - my ($now) = @_; - - println "Checking device rules '$now'" if ($option{verbose}); - - my $rule = $device_on[0]; - while (defined(@$rule)) { - my ($time, $device) = @$rule; - if ($time <= $now) { - shift(@device_on); - change_device_state($device, 'off') if ($cfg_dimmer{$device} eq 'yes'); - change_device_state($device, 'on'); - } else { - last; - } - $rule = $device_on[0]; - } - - $rule = $device_off[0]; - while (defined(@$rule)) { - my ($time, $device) = @$rule; - if ($time <= $now) { - shift(@device_off); - change_device_state($device, 'off'); - } else { - last; - } - $rule = $device_off[0]; - } - -} - - -sub change_device_state($$) { - my ($device, $state) = @_; - - $device_state{$device} = $state; - write_db($cfg_set{"dbfile"}); - read_db($cfg_set{"dbfile"}); - call_program($device, $state); - my $text = "Device $device = $state"; - println $text if ($option{"verbose"}); - printlogger $text; -} - - -###################################################################### - - -sub get_device_state() { - if ($option{"device"}) { - my $device = $option{"device"}; - if ($device_state{$device}) { - my $state = $device_state{$device}; - println "$state" if (not $option{"verbose"}); - println "Device $device = $state" if ($option{"verbose"}); - } elsif (exists($cfg_group{$device})) { - my $val = $cfg_group{$device}; - my ($delay, $aliases) = split(/\s+/, $val, 2); - my $states = ""; - my (@aliaslist) = split(/\s+/, $aliases); - foreach my $alias (@aliaslist) { - $states .= " $device_state{$alias}"; - } - println "Group $device =$states"; - } else { - println "No alias or group found with name '$device'!"; - } - } -} - - -sub set_device_state() { - if ($option{"device"}) { - if ($option{"state"}) { - my $state = $option{"state"}; - if ($state !~ /^(on|off)$/i) { - println "No state found with name '$state'!"; - } - my $device = $option{"device"}; - if ($device_state{$device}) { - change_device_state($device, $state); - } elsif (exists($cfg_group{$device})) { - my $val = $cfg_group{$device}; - my ($delay, $aliases) = split(/\s+/, $val, 2); - my (@aliaslist) = split(/\s+/, $aliases); - foreach my $alias (@aliaslist) { - change_device_state($alias, $state); - sleep(1); - } - } else { - println "No alias or group found with name '$device'!"; - } - } - } -} - - -sub swap_first_device_state() { - if ($option{"device"}) { - if ($option{"swapfirst"}) { - my $device = $option{"device"}; - if ($device_state{$device}) { - my $state = $device_state{$device}; - if ($state =~ /^off$/i) { - $state = 'on'; - } else { - $state = 'off'; - } - change_device_state($device, $state); - } elsif (exists($cfg_group{$device})) { - my $val = $cfg_group{$device}; - my ($delay, $aliases) = split(/\s+/, $val, 2); - my ($alias) = split(/\s+/, $aliases); - my $state = $device_state{$alias}; - if ($state =~ /^off$/i) { - $state = 'on'; - } else { - $state = 'off'; - } - my (@aliaslist) = split(/\s+/, $aliases); - foreach my $alias (@aliaslist) { - change_device_state($alias, $state); - sleep(1); - } - } else { - println "No alias or group found with name '$device'!"; - } - } - } -} - - -sub swap_device_state() { - if ($option{"device"}) { - if ($option{"swap"}) { - my $device = $option{"device"}; - if ($device_state{$device}) { - my $state = $device_state{$device}; - if ($state =~ /^off$/i) { - $state = 'on'; - } else { - $state = 'off'; - } - change_device_state($device, $state); - } elsif (exists($cfg_group{$device})) { - my $val = $cfg_group{$device}; - my ($delay, $aliases) = split(/\s+/, $val, 2); - my (@aliaslist) = split(/\s+/, $aliases); - foreach my $alias (@aliaslist) { - my $state = $device_state{$alias}; - if ($state =~ /^off$/i) { - $state = 'on'; - } else { - $state = 'off'; - } - change_device_state($alias, $state); - sleep(1); - } - } else { - println "No alias or group found with name '$device'!"; - } - } - } -} - - -sub list_all_devices() { - foreach my $key (sort keys %device_state) { - println "Device $key = $device_state{$key}"; - } - foreach my $key (sort keys %cfg_group) { - my $val = $cfg_group{$key}; - my ($delay, $aliases) = split(/\s+/, $val, 2); - my $states = ""; - my (@aliaslist) = split(/\s+/, $aliases); - foreach my $device (@aliaslist) { - $states .= " $device_state{$device}"; - } - println "Group $key =$states"; - } -} - - -sub list_all_aliases { - foreach my $key (sort keys %cfg_alias) { - my $dimmer = ""; - $dimmer = " dimmer" if $cfg_dimmer{$key} eq "yes"; - println "Alias $key = receiver ($cfg_alias{$key}$dimmer)"; - } - foreach my $key (sort keys %cfg_group) { - my $val = $cfg_group{$key}; - my ($delay, $aliases) = split(/\s+/, $val, 2); - println "Group $key = delay $delay seconds, aliases ($aliases)"; - } -} - - -sub daemon_loop() { - daemon_init(); - - while ($option{"daemon"}) { - my $now = get_datetime_now(); - my $next_day = get_datetime_now(); - $next_day->add( hours => 24 ); - $next_day->set( hour => 0, minute => 0, second => 0 ); - println "Next reload of device rules = $next_day" if ($option{"verbose"}); - - my $wait_time = 5; - my $loop = 1; - - check_device_rules($now); - - while ($loop) { - $now = get_datetime_now(); - if ($now > $next_day) { - load_device_rules(); - $next_day->add( hours => 24 ); - } - check_device_rules($now); - sleep($wait_time); - } - } - - daemon_exit(); -} - - -sub perform_action() { - if ($option{"aliases"}) { - list_all_aliases(); - } elsif ($option{"get"}) { - get_device_state(); - } elsif ($option{"set"}) { - set_device_state(); - } elsif ($option{"swapfirst"}) { - swap_first_device_state(); - } elsif ($option{"swap"}) { - swap_device_state(); - } elsif ($option{"list"}) { - list_all_devices(); - } elsif ($option{"daemon"}) { - daemon_loop(); - } -} - - -###################################################################### - - -sub main() { - # check arguments - check_args(@ARGV); - - # read configuration file - read_config($cfg_set{"configfile"}); - - # read DB - read_db($cfg_set{"dbfile"}); - - # Load rules - load_device_rules(); - - # perform action - perform_action(); - - # write DB - write_db($cfg_set{"dbfile"}); -} - - -main(); - - -###################################################################### - - -__DATA__ -#- -#- NAME -#- tellstickControllerRfcmd -#- -#- SYNOPSIS -#- tellstickControllerRfcmd [options] -#- -#- DESCRIPTION -#- tellstickController is used for controlling wireless recevier devices from -#- a TellStick transmitter. This version uses the rfcmd software to perform -#- the actual device control. tellstickController can be used for manual -#- control of devices, or used as a daemon that is controlled by a number of -#- configuration file rules. -#- A small database is used for keeping track of device states between every -#- execution of tellstickController. -#- -#- -h, --help Show this help text. -#- -v, --verbose Show extra information. -#- -d, --daemon Starts in daemon mode. -#- -f, --file F Set configfile to file F. -#- -c, --check Check content of configuration file. -#- -t, --test Test mode, no real devices will used. -#- -a, --aliases List of aliases for devices/groups. -#- -l, --list List states for all devices/groups. -#- -s, --set D S Set device D to state S. -#- -g, --get D Get state for device/group D. -#- -w, --swapfirst G Swap states for group G based on first device state. -#- -x, --swap D Swap state for device/group D. -#- -#- EXAMPLES -#- tellstickControllerRfcmd -l -#- tellstickControllerRfcmd --set device_alias on -#- tellstickControllerRfcmd --swap device_alias -#- tellstickControllerRfcmd -d -f myConfigFile.conf -#- -#- DEPENDENCIES -#- The following Perl modules needs to be installed: -#- DB_File, DateTime and DateTime::Event::Sunrise -#- -#- FILES -#- tellstickController.conf -#- tellstickController.db -#- tellstickController.log -#- tellstickController.pid -#- -#- CONFIGURATION -#- The configuration file consists of a number of settings 'Set', a number of -#- device aliases 'Alias', and a number of device rules 'Rules'. -#- -#- The settings controls sunrise/sunset, logfile, pidfile, etc. -#- -#- The aliases configures device name, channel, code, etc. -#- -#- The groups configures a list of devices and a delay time. -#- -#- The rules can be written as a string containing two parts. -#- The first part is optional and ends with an '/'. It can contain one or more -#- of these keywords 'Weekend', 'Workweek', 'Monday', 'Tuesday', 'Wednesday', -#- 'Thursday', 'Friday', 'Saturday' and 'Sunday'. A specified date like -#- '2008-03-18', '2008-03-##', '####-03-##' or '####-##-15' is also allowed. -#- The second part is mandatory and is either a expression or the keyword 'No'. -#- The expression can contain a micture of these keywords 'Sunrise', 'Sunset', -#- 'Random(HH:MM)' and 'HH:MM'. -#- -#- Example rule: Weekend/07:15 -#- Example rule: Monday+Sunday/07:15 -#- Example rule: 2008-03-##/12:10 -#- Example rule: 07:15+Random(02:00) -#- Example rule: Sunset-00:30 -#- -#- AUTHOR -#- Original version written by Rickard Andersson -#- -#- LICENSE -#- Copyright (C) 2008-2010 Rickard Andersson. Version 2.0.0 -#- This program comes with ABSOLUTELY NO WARRANTY. -#- This is free software, and you are welcome to redistribute it -#- under certain conditions; See license file for details. -#- diff --git a/3rdparty/tellstickcontroller/tellstickControllerRfcmd.conf b/3rdparty/tellstickcontroller/tellstickControllerRfcmd.conf deleted file mode 100644 index d517de92..00000000 --- a/3rdparty/tellstickcontroller/tellstickControllerRfcmd.conf +++ /dev/null @@ -1,108 +0,0 @@ -################################################################################ -# -# Configuration file for tellstickController -# -# Copyright (C) 2008 Rickard Andersson (ran42ran@gmail.com) -# Version: 1.4 -# -################################################################################ -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -################################################################################ - -# List of location settings. -# -# Usage example: -# Set Key Value -# Set Timezone Europe/Stockholm -# -# -Set Timezone Europe/Stockholm -Set Altitude -0.833 -Set Latitude 58.24 -Set Longitude 15.31 -Set dbfile /var/lib/tellstickController.db -Set pidfile /var/run/tellstickController.pid -Set logfile /var/log/tellstickController.log -set progrsm /usr/bin/rfcmd - - -# Aliases for recevier devices. -# -# Usage example: -# Alias Name Sender Dimmer Protocol Housecode Channel -# Alias BedroomWindow /dev/tellstick0 yes Nexa A 1 -# Alias device42 /dev/tellstick1 No Waveman B 3 -# or -# Usage example: -# Alias Name Sender Dimmer Protocol Channel -# Alias MythTv_Backlight /dev/ttyUSB0 No Sartano 000000001 -# -# -Alias Bedroom_bed /dev/tellstick0 No Nexa G 11 -Alias Bedroom_window /dev/tellstick0 No Nexa G 10 -Alias Bedroom_mythtv_power /dev/tellstick0 No Nexa G 6 -Alias Bedroom_mythtv_leds /dev/tellstick0 No Nexa G 7 -Alias Kitchen_cabinets /dev/tellstick0 No Nexa G 2 -Alias Kitchen_window /dev/tellstick0 No Nexa G 12 -Alias Livingroom_cabinets /dev/tellstick0 No Nexa G 3 -Alias Livingroom_wall_north /dev/tellstick0 No Nexa G 4 -Alias Livingroom_wall_east /dev/tellstick0 No Nexa G 9 -Alias Livingroom_uplight /dev/tellstick0 Yes Nexa G 5 -Alias Livingroom_mythtv_leds /dev/tellstick0 No Nexa G 8 -Alias Livingroom_window /dev/tellstick0 No Nexa G 1 -Alias Study_window /dev/tellstick0 No Nexa G 13 - - -# Group aliases uses for handling a group of aliases -# -# Usage examples: -# Group Name Delay List of Aliases -# Group Livingroom_walls 60 Livingroom_wall_north Livingroom_wall_east -# Group Kitchen 5 Kitchen_cabinets Kitchen_window -# -# -Group Normal_lights 120 Bedroom_window Kitchen_cabinets Kitchen_window Livingroom_window Livingroom_wall_east Study_window -Group Extra_lights 180 Livingroom_cabinets Livingroom_uplight Livingroom_wall_north -Group All_lights 10 Bedroom_mythtv_leds Bedroom_window Bedroom_bed Kitchen_cabinets Kitchen_window Livingroom_cabinets Livingroom_mythtv_leds Livingroom_uplight Livingroom_wall_north Livingroom_wall_east Livingroom_window Study_window -Group Christmas_lights 60 Bedroom_window Kitchen_window Study_window - - -# Timer rules for reciever devices. -# -# Usage examples: -# Rule Alias DeviceOn DeviceOff -# Rule BedroomWindow Sunrise Sunrise+01:30 -# Rule BedroomWindow 18:33 23:10+Random(00:45) -# Rule MythTv_Backlight Weekend/20:00 Weekend/Sunset -# -# -Rule Normal_lights Workweek/Sunset-01:00+Random(00:50) Workweek/00:01+Random(00:50) -Rule Normal_lights Weekend/Sunset-01:00+Random(00:50) Weekend/00:01+Random(00:50) - -Rule Extra_lights No 00:15+Random(00:30) - -Rule All_lights No 02:00 -Rule All_lights No 03:00 - -#Rule Bedroom_window Workweek/07:30 Workweek/08:30 - -#Rule Christmas_lights 07:00+Random(00:15) 10:00+Random(00:30) -#Rule Christmas_lights 15:00+Random(00:30) 00:30+Random(00:15) - -#Rule Livingroom_cabinets 18:55+Random(01:00) 21:55+Random(01:00) -#Rule Livingroom_wall_north 19:55+Random(01:00) 20:55+Random(01:00) -#Rule Bedroom_bed 20:55+Random(01:00) 22:55+Random(01:00) - diff --git a/3rdparty/tellstickcontroller/tellstickControllerTdtool b/3rdparty/tellstickcontroller/tellstickControllerTdtool deleted file mode 100755 index 45710b46..00000000 --- a/3rdparty/tellstickcontroller/tellstickControllerTdtool +++ /dev/null @@ -1,1133 +0,0 @@ -#!/usr/bin/perl -###################################################################### -# -# tellstickControllerTdtool program -# -# Copyright (C) 2008-2010 Rickard Andersson (ran42ran@gmail.com) -# Version 2.0.0 -# -###################################################################### -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -###################################################################### - - -use warnings; -use strict; -use sigtrap 'handler', \&daemon_exit, 'normal-signals'; -use sigtrap 'die', 'untrapped', 'normal-signals'; -use sigtrap 'stack-trace', 'any', 'error-signals'; -use POSIX 'setsid'; - - -use DateTime; -use DateTime::Event::Sunrise; - - -###################################################################### - - -# All these cfg settings can be altered from the configuration file. -# -my %cfg_set = ( - "configfile" => "/etc/tellstickController.conf", - "logfile" => "/var/log/tellstickController.log", - "pidfile" => "/var/run/tellstickController.pid", - "program" => "/usr/bin/tdtool", - "altitude" => "-0.833", - "latitude" => "58.24", - "longitude" => "15.31", - "timezone" => "Europe/Stockholm", -); - - -###################################################################### - - -my %cfg_group = (); -my %cfg_groupId = (); -my %cfg_idGroup = (); -my %cfg_alias = (); -my %cfg_aliasId = (); -my %cfg_idAlias = (); -my @cfg_rule = (); -my %option = ( - "aliases" => 0, - "check" => 0, - "daemon" => 0, - "list" => 0, - "device" => "", - "state" => "", - "swapfirst" => 0, - "swap" => 0, - "test" => 0, - "verbose" => 0, -); -my @device = (); - - -###################################################################### - - -sub check_args(@) { - my (@args) = @_; - - if (not @args) { - usage(); - exit; - } - while (@args) { - if ($args[0] =~ /^-(h|-help)$/) { - usage(); - exit; - } elsif ($args[0] =~ /^-(a|-aliases)$/) { - shift(@args); - $option{"aliases"} = 1; - next; - } elsif ($args[0] =~ /^-(c|-check)$/) { - shift(@args); - $option{"check"} = 1; - next; - } elsif ($args[0] =~ /^-(d|-daemon)$/) { - shift(@args); - $option{"daemon"} = 1; - next; - } elsif ($args[0] =~ /^-(f|-file)$/) { - shift(@args); - $cfg_set{"configfile"} = shift(@args); - next; - } elsif ($args[0] =~ /^-(g|-get)$/) { - shift(@args); - $option{"get"} = 1; - $option{"device"} = lc($args[0]); - shift(@args); - next; - } elsif ($args[0] =~ /^-(l|-list)$/) { - shift(@args); - $option{"list"} = 1; - next; - } elsif ($args[0] =~ /^-(s|-set)$/) { - shift(@args); - $option{"set"} = 1; - $option{"device"} = lc($args[0]); - shift(@args); - $option{"state"} = lc($args[0]); - shift(@args); - next; - } elsif ($args[0] =~ /^-(w|-swapfirst)$/) { - shift(@args); - $option{"swapfirst"} = 1; - $option{"device"} = lc($args[0]); - shift(@args); - next; - } elsif ($args[0] =~ /^-(x|-swap)$/) { - shift(@args); - $option{"swap"} = 1; - $option{"device"} = lc($args[0]); - shift(@args); - next; - } elsif ($args[0] =~ /^-(t|-test)$/) { - shift(@args); - $option{"test"} = 1; - next; - } elsif ($args[0] =~ /^-(v|-verbose)$/) { - shift(@args); - $option{"verbose"} = 1; - next; - } - - usage(); - exit; - } -} - - -sub usage() { - while () { - if ($_ =~ /^#-(.*)/) { - print "$1\n"; - } - } -} - - -sub printLine($) { - my ($text) = @_; - - print "$text\n"; -} - - -sub printlogger($) { - my ($text) = @_; - - if ($option{"daemon"}) { - my $now = get_datetime_now(); - my $logfile = $cfg_set{"logfile"}; - my $output = "echo '$now $text' >> $logfile"; - system ($output); - } -} - - -###################################################################### - - -sub daemon_init() { - chdir "/"; - umask 0; - my $pid = fork; - exit if $pid; - die "Couldn't fork program" unless defined(\$pid); - setsid() or die "Couldn't start new program session"; - open STDIN, '/dev/null' or die "Couldn't read /dev/null!"; - open STDOUT, '>/dev/null' or die "Couldn't write to /dev/null!"; - open STDERR, '>/dev/null' or die "Couldn't write to /dev/null!"; - - my $pidfile = $cfg_set{"pidfile"}; - $0="tellstickControllerDaemon"; - $pid = $$; - system("echo $pid > $pidfile") if (defined($pidfile)); - - printlogger "> Daemon started"; -} - - -sub daemon_exit() { - printlogger "> Daemon stopped"; - - unlink $cfg_set{"pidfile"} if (defined($cfg_set{"pidfile"})); - my $pid = $$; - kill('TERM', $pid); - exit; -} - - -sub get_datetime_now() { - my $now = DateTime->now(time_zone => $cfg_set{"timezone"}); - - return $now; -} - - -sub get_datetime_sunrise($) { - my ($now) = @_; - - my $sunrise = DateTime::Event::Sunrise->sunrise ( - altitude => $cfg_set{"altitude"}, - latitude => $cfg_set{"latitude"}, - longitude => $cfg_set{"longitude"}, - iteration => '4' - ); - my $time = $sunrise->next($now); - - return $time; -} - - -sub get_datetime_sunset($) { - my ($now) = @_; - - my $sunset = DateTime::Event::Sunrise->sunset ( - altitude => $cfg_set{"altitude"}, - latitude => $cfg_set{"latitude"}, - longitude => $cfg_set{"longitude"}, - iteration => '2' - ); - my $time = $sunset->next($now); - - return $time; -} - - -sub get_info_from_program() { - my $prog = $cfg_set{"program"}; - my $command = "$prog --list"; - my $text = "Executing command: '$command'"; - printLine $text if ($option{"verbose"}); - my @result = qx($command); - - foreach my $line (@result) { - chomp($line); - $line =~ s/\s+/ /g; - - if ($line =~ /^\d+/i) { - my ($id, $name, $state) = split(/\s+/, $line); - if (defined($name)) { - $cfg_alias{lc($name)} = 'off'; - if (defined($state)) { - $cfg_alias{lc($name)} = lc($state); - } - if (defined($id)) { - $cfg_idAlias{lc($id)} = lc($name); - $cfg_aliasId{lc($name)} = lc($id); - } - } - } - } -} - - -sub read_config($) { - my ($infile) = @_; - - my $text = "> Reading configurationfile started"; - printLine $text if ($option{"verbose"}); - printlogger $text; - - open(my $indata, $infile) or die "Couldn't read configfile '$infile'!"; - - while(my $line = <$indata>) { - chomp($line); - $line =~ s/\s+/ /g; - - if ($line =~ /^Set\s+/i) { - my (undef, $key, $val, $suffix) = split(/\s+/, $line); - if (defined($suffix)) { - printLine "Wrong argument '$suffix' in line '$line'!"; - } else { - if (defined($key)) { - if (defined($val)) { - $cfg_set{lc($key)} = $val; - } else { - printLine "Wrong value in line '$line'!"; - } - } else { - printLine "Wrong key in line '$line'!"; - } - } - next; - } - } - - close $indata; - - get_info_from_program(); - - open($indata, $infile) or die "Couldn't read configfile '$infile'!"; - - while(my $line = <$indata>) { - chomp($line); - $line =~ s/\s+/ /g; - - if ($line =~ /^Group\s+/i) { - my (undef, $name, $id, $delay, $aliases) = split(/\s+/, $line, 5); - $name = lc($name); - $delay = lc($delay); - if (defined $id) { - $cfg_idGroup{$id} = $name; - $cfg_groupId{$name} = $id; - } - if ($delay =~ /^\d+$/) { - my $error = 0; - $aliases = lc($aliases); - my @aliaslist = split(/\s+/, $aliases); - foreach my $alias (@aliaslist) { - if (! exists($cfg_alias{$alias})) { - printLine "Wrong alias '$alias' in line '$line'!"; - $error += 1; - } - } - if ($error == 0) { - $cfg_group{$name} = "$delay $aliases"; - } - } else { - printLine "Wrong delay time '$delay' in line '$line'!"; - } - next; - } - - if ($line =~ /^Rule\s+/i) { - my (undef, $alias, $on, $off, $suffix) = split(/\s+/, $line); - if (defined($suffix)) { - printLine "Wrong argument '$suffix' in line '$line'!"; - } else { - $alias = lc($alias); - $on = lc($on); - $off = lc($off); - if ($on eq "") { - printLine "Wrong on time '$on' in line '$line'!"; - } elsif ($off eq "") { - printLine "Wrong off time '$off' in line '$line'!"; - } else { - if ($on !~ /[\w\/\+\-\:\$\(\)]+/) { - printLine "Wrong on time '$on' in line '$line'!"; - } elsif ($off !~ /[\w\/\+\-\:\$\(\)]+/) { - printLine "Wrong off time '$off' in line '$line'!"; - } - } - if (exists($cfg_alias{$alias})) { - push @cfg_rule, [$alias, $on, $off]; - } elsif (exists($cfg_group{$alias})) { - push @cfg_rule, [$alias, $on, $off]; - } else { - printLine "Wrong alias '$alias' in line '$line'!"; - } - } - next; - } - } - - close $indata; - - $text = "=== Set ==="; - printLine $text if ($option{"check"}); - printlogger $text; - foreach my $key (sort keys %cfg_set) { - $text = "$key = $cfg_set{$key}"; - printLine $text if ($option{"check"}); - printlogger $text; - } - $text = "=== Alias ==="; - printLine $text if ($option{"check"}); - printlogger $text; - foreach my $key (sort keys %cfg_alias) { - $text = "$key($cfg_aliasId{$key}) = $cfg_alias{$key}"; - printLine $text if ($option{"check"}); - printlogger $text; - } - $text = "=== Group ==="; - printLine $text if ($option{"check"}); - printlogger $text; - foreach my $key (sort keys %cfg_group) { - my $val = $cfg_group{$key}; - my ($delay, $aliases) = split(/\s+/, $val, 2); - $text = "$key($cfg_groupId{$key}) ="; - $text .= " delay time $delay seconds"; - $text .= " between aliases ($aliases)"; - printLine $text if ($option{"check"}); - printlogger $text; - } - $text = "=== Rule ==="; - printLine $text if ($option{"check"}); - printlogger $text; - foreach my $rule (@cfg_rule) { - my ($alias, $on, $off) = @$rule; - $text = "$alias ="; - $text .= " on at $on" if ($on !~ /no/); - $text .= " and" if (($on !~ /no/) && ($off !~ /no/)); - $text .= " off at $off" if ($off !~ /no/); - printLine $text if ($option{"check"}); - printlogger $text; - } - - $text = "> Reading configurationfile finished"; - printLine $text if ($option{"verbose"}); - printlogger $text; -} - - -sub call_program($$) { - my ($device, $state) = @_; - - if ($option{"test"}) { - my $text = "Test mode, no real device will be used"; - printLine $text if ($option{"verbose"}); - printlogger $text; - } else { - my $mode = "--off"; - if ($state eq "off") { - $mode = "--off"; - } elsif ($state eq "on") { - $mode = "--on"; - } elsif (($state >= 0) && ($state <= 255)) { - $mode = "--dimlevel $state --dim"; - } - my $prog = $cfg_set{"program"}; - my $command = "$prog $mode $device"; - my $text = "Executing command: '$command'"; - printLine $text if ($option{"verbose"}); - system($command); - } -} - - -sub load_device_rules () { - my $text = "> Loading device rules started"; - printLine $text if ($option{"verbose"}); - printlogger $text; - - my $now = get_datetime_now(); - $text = "Time = $now"; - printLine $text if ($option{"verbose"}); - printlogger $text; - my $today = get_datetime_now(); - $today->set( hour => 0, minute => 0, second => 0 ); - $text = "Today = $today"; - printLine $text if ($option{"verbose"}); - printlogger $text; - my $sunrise = get_datetime_sunrise($today); - $text = "Sunrise = $sunrise"; - printLine $text if ($option{"verbose"}); - printlogger $text; - my $sunset = get_datetime_sunset($today); - $text = "Sunset = $sunset"; - printLine $text if ($option{"verbose"}); - printlogger $text; - - foreach my $rule (@cfg_rule) { - my ($alias, $on, $off) = @$rule; - if (exists($cfg_alias{$alias})) { - my $time = get_rule_datetime($on, $today, $sunrise, $sunset); - my $value = 'on'; - if ($on =~ /dimmer\((.*)\)/i) { - load_dimmer_rules($alias, $time, $on, $now, $today, $sunrise, $sunset); - } else { - push @device, [$time, $alias, $value] if (defined($time) && ($now <= $time)); - } - $time = get_rule_datetime($off, $today, $sunrise, $sunset); - $value = 'off'; - if ($off =~ /dimmer\((.*)\)/i) { - load_dimmer_rules($alias, $time, $off, $now, $today, $sunrise, $sunset); - } else { - push @device, [$time, $alias, $value] if (defined($time) && ($now <= $time)); - } - } else { - foreach my $val ($cfg_group{$alias}) { - my ($delay, $aliases) = split(/\s+/, $val, 2); - my $timedelay = 0; - my $ontime = get_rule_datetime($on, $today, $sunrise, $sunset); - my $offtime = get_rule_datetime($off, $today, $sunrise, $sunset); - my (@aliaslist) = split(/\s+/, $aliases); - foreach my $device (@aliaslist) { - if (defined($ontime)) { - my $time = $ontime->clone->add(seconds => $timedelay); - my $value = 'on'; - if ($on =~ /dimmer\((.*)\)/i) { - load_dimmer_rules($device, $time, $on, $now, $today, $sunrise, $sunset); - } else { - push @device, [$time, $device, $value] if (defined($time) && ($now <= $time)); - } - } - if (defined($offtime)) { - my $time = $offtime->clone->add(seconds => $timedelay); - my $value = 'off'; - if ($off =~ /dimmer\((.*)\)/i) { - load_dimmer_rules($device, $time, $off, $now, $today, $sunrise, $sunset); - } else { - push @device, [$time, $device, $value] if (defined($time) && ($now <= $time)); - } - } - $timedelay += $delay; - } - } - } - } - - @device = sort { $a->[0] cmp $b->[0] } @device; - - $text = "=== Device ==="; - printLine $text if ($option{"verbose"}); - printlogger $text; - foreach my $rule (@device) { - my ($time, $alias, $value) = @$rule; - $text = "$alias = $value at $time"; - printLine $text if ($option{"verbose"}); - printlogger $text; - } - - $text = "> Loading device rules finished"; - printLine $text if ($option{"verbose"}); - printlogger $text; -} - - -sub get_rule_datetime($$$$) { - my ($rule, $now, $sunrise, $sunset) = @_; - - my ($date, $time) = split(/\//, $rule); - if (not defined($time)) { - $time = $date; - $date = $now->ymd; - } else { - my $today = 0; - my $match = 0; - if ($date =~ /([\d#]{4})-([\d#]{2})-([\d#]{2})/) { - $match = 1; - $today = 1 if ((($1 =~ /####/) || ($now->year == $1)) - && (($2 =~ /##/) || ($now->month == $2)) - && (($3 =~ /##/) || ($now->day == $3))); - } - if ($date =~ /workweek/) { - $match = 1; - $today = 1 if ($now->day_of_week < 6); - } - if ($date =~ /weekend/) { - $match = 1; - $today = 1 if ($now->day_of_week > 5); - } - if ($date =~ /monday/) { - $match = 1; - $today = 1 if ($now->day_of_week == 1); - } - if ($date =~ /tuesday/) { - $match = 1; - $today = 1 if ($now->day_of_week == 2); - } - if ($date =~ /wednesday/) { - $match = 1; - $today = 1 if ($now->day_of_week == 3); - } - if ($date =~ /thursday/) { - $match = 1; - $today = 1 if ($now->day_of_week == 4); - } - if ($date =~ /friday/) { - $match = 1; - $today = 1 if ($now->day_of_week == 5); - } - if ($date =~ /saturday/) { - $match = 1; - $today = 1 if ($now->day_of_week == 6); - } - if ($date =~ /sunday/) { - $match = 1; - $today = 1 if ($now->day_of_week == 7); - } - - if ($match) { - if ($today) { - $date = $now->ymd; - } else { - $time = undef; - } - } else { - printLine "Wrong date '$date' for rule '$rule'!"; - $time = undef; - } - } - - if (defined($time) && ($time !~ /^no$/)) { - my $days = 0; - my $hours = 0; - my $minutes = 0; - my $lastOp = "+"; - my $expr = ""; - my $op = ""; - my $rest = ""; - my $mins = 0; - - while ($time ne "") { - $op = $lastOp; - if ($time =~ /(.+?)(\+|-)(.*)/) { - $expr = $1; - $lastOp = $2; - $rest = $3; - $time = $rest; - } elsif ($time =~ /(.+)/) { - $expr = $1; - $lastOp = ""; - $rest = ""; - $time = ""; - } - - if ($expr =~ /^sunrise$/) { - $expr = 0; - if ($sunrise->hms =~ /(\d\d):(\d\d):(\d\d)/) { - $expr = $1*60+$2; - } - } elsif ($expr =~ /^sunset$/) { - $expr = 0; - if ($sunset->hms =~ /(\d\d):(\d\d):(\d\d)/) { - $expr = $1*60+$2; - } - } elsif ($expr =~ /^random\((\d\d):(\d\d)\)$/) { - $expr = int rand($1*60+$2+1); - } elsif ($expr =~ /^dimmer\((\d\d):(\d\d).*\)$/) { - $expr = 0; - } elsif ($expr =~ /^(\d\d):(\d\d)$/) { - $expr = $1*60+$2; - } else { - printLine "Wrong time '$expr' for rule '$rule'!"; - return; - $expr = ""; - } - - if ($op eq "+") { - $mins += $expr; - } elsif ($op eq "-") { - $mins -= $expr; - } - } - if ($mins <= 0) { - $mins = $mins % (24*60); - $days = 1; - } elsif ($mins >= 24*60) { - $mins = $mins % (24*60); - $days = 1; - } - - $hours = int $mins/60; - $minutes = int $mins%60; - # Hopefully we will deal with UTC and daylightsavingtime in a decent fashion? - $time = get_datetime_now(); - $time->set(hour => 0, minute => 0, second => 0); - $time->add(hours => $hours+24*$days, minutes => $minutes, seconds => 0); - } else { - $time = undef; - } - - return $time; -} - -sub load_dimmer_rules($$$$$$$$){ - my ($alias, $time, $expr, $now, $today, $sunrise, $sunset) = @_; - - my $dimmer =$expr; - if ($expr =~ /dimmer\((.*)\)/i) { - $dimmer = $1; - } - - my ($offset, $start, $stop, $step) = split(/\,/,$dimmer); - - if (!defined($offset)) { - $offset = ''; - } - if ($offset !~ /^\d\d:\d\d$/) { - printLine "Wrong dimmer time offset '$offset' for rule '$expr'!"; - next; - } - if (!defined($start)) { - $start = ''; - } - if (($start !~ /^(\d+)$/) || (($start < 0) || ($start > 255))) { - printLine "Wrong dimmer start level '$start' for rule '$expr'!"; - next; - } - if (!defined($stop)) { - $stop = ''; - } - if (($stop !~ /^(\d+)$/) || (($stop < 0) || ($stop > 255))) { - printLine "Wrong dimmer stop level '$stop' for rule '$expr'!"; - next; - } - if (!defined($step)) { - $step = ''; - } - if (($step !~ /^(\d+)$/) || (($step < 1) || ($step > 255))) { - printLine "Wrong dimmer step level '$step' for rule '$expr'!"; - next; - } - - if (! defined($time)) { - return; - } - - my $dimtime = $time; - my $level = $start; - while(1) { - if ($dimtime =~ /T(.*):00/) { - $dimtime = $1; - } - if ($level != $start) { - $dimtime .= "+" . $offset; - } - - $dimtime = get_rule_datetime($dimtime, $today, $sunrise, $sunset); - push @device, [$dimtime, $alias, $level] if (defined($time) && ($now <= $time)); - - if ($stop>=$start) { - $level += $step; - if ($level>$stop) { - last; - } - } - if ($stop<$start) { - $level -= $step; - if ($level<$stop) { - last; - } - } - } -} - - -sub check_device_rules($) { - my ($now) = @_; - - printLine "Checking device rules '$now'" if ($option{verbose}); - - my $rule = $device[0]; - while (defined(@$rule)) { - my ($time, $device, $value) = @$rule; - if ($time <= $now) { - shift(@device); - change_device_state($device, $value); - } else { - last; - } - $rule = $device[0]; - } -} - - -sub change_device_state($$) { - my ($device, $state) = @_; - - call_program($device, $state); - my $text = "Device $device = $state"; - printLine $text if ($option{"verbose"}); - printlogger $text; -} - - -###################################################################### - - -sub get_device_state() { - get_info_from_program(); - - if (defined($option{"device"})) { - my $device = $option{"device"}; - if (defined($cfg_idAlias{$device})) { - $device = $cfg_idAlias{$device}; - } - if ($cfg_alias{$device}) { - my $state = $cfg_alias{$device}; - printLine "$state" if (not $option{"verbose"}); - printLine "Device $device = $state" if ($option{"verbose"}); - return; - } - if (defined($cfg_idGroup{$device})) { - $device = $cfg_idGroup{$device}; - } - if (exists($cfg_group{$device})) { - my $val = $cfg_group{$device}; - my ($delay, $aliases) = split(/\s+/, $val, 2); - my $states = ""; - my (@aliaslist) = split(/\s+/, $aliases); - foreach my $alias (@aliaslist) { - $states .= " $cfg_alias{$alias}"; - } - printLine "Group $device =$states"; - return; - } - printLine "No alias or group found with name/id '$device'!"; - } -} - - -sub set_device_state() { - get_info_from_program(); - - if (defined($option{"device"})) { - if (defined($option{"state"})) { - my $state = $option{"state"}; - if ($state !~ /^(on|off|\d+)$/i) { - printLine "No state found with name '$state'!"; - return; - } - if (($state =~ /^(\d+)$/i) && (($state < 0) || ($state > 255))) { - printLine "State needs to be an integer between 0 and 255 for dimmers!"; - return; - } - my $device = $option{"device"}; - if (defined($cfg_idAlias{$device})) { - $device = $cfg_idAlias{$device}; - } - if ($cfg_alias{$device}) { - change_device_state($device, $state); - return; - } - if (defined($cfg_idGroup{$device})) { - $device = $cfg_idGroup{$device}; - } - if (exists($cfg_group{$device})) { - my $val = $cfg_group{$device}; - my ($delay, $aliases) = split(/\s+/, $val, 2); - my (@aliaslist) = split(/\s+/, $aliases); - foreach my $alias (@aliaslist) { - change_device_state($alias, $state); - sleep(1); - } - return; - } - printLine "No alias or group found with name '$device'!"; - } - } -} - - -sub swap_first_device_state() { - get_info_from_program(); - - if ($option{"device"}) { - if ($option{"swapfirst"}) { - my $device = $option{"device"}; - if (defined($cfg_idAlias{$device})) { - $device = $cfg_idAlias{$device}; - } - if ($cfg_alias{$device}) { - my $state = $cfg_alias{$device}; - if ($state =~ /^off$/i) { - $state = 'on'; - } else { - $state = 'off'; - } - change_device_state($device, $state); - return; - } - if (defined($cfg_idGroup{$device})) { - $device = $cfg_idGroup{$device}; - } - if (exists($cfg_group{$device})) { - my $val = $cfg_group{$device}; - my ($delay, $aliases) = split(/\s+/, $val, 2); - my ($alias) = split(/\s+/, $aliases); - my $state = $cfg_alias{$device}; - if ($state =~ /^off$/i) { - $state = 'on'; - } else { - $state = 'off'; - } - my (@aliaslist) = split(/\s+/, $aliases); - foreach my $alias (@aliaslist) { - change_device_state($alias, $state); - sleep(1); - } - return; - } - printLine "No alias or group found with name '$device'!"; - } - } -} - - -sub swap_device_state() { - get_info_from_program(); - - if ($option{"device"}) { - if ($option{"swap"}) { - my $device = $option{"device"}; - if (defined($cfg_idAlias{$device})) { - $device = $cfg_idAlias{$device}; - } - if ($cfg_alias{$device}) { - my $state = $cfg_alias{$device}; - if ($state =~ /^off$/i) { - $state = 'on'; - } else { - $state = 'off'; - } - change_device_state($device, $state); - return; - } - if (defined($cfg_idGroup{$device})) { - $device = $cfg_idGroup{$device}; - } - if (exists($cfg_group{$device})) { - my $val = $cfg_group{$device}; - my ($delay, $aliases) = split(/\s+/, $val, 2); - my (@aliaslist) = split(/\s+/, $aliases); - foreach my $alias (@aliaslist) { - my $state = $cfg_alias{$device}; - if ($state =~ /^off$/i) { - $state = 'on'; - } else { - $state = 'off'; - } - change_device_state($alias, $state); - sleep(1); - } - return; - } - printLine "No alias or group found with name '$device'!"; - } - } -} - - -sub list_all_devices() { - foreach my $key (sort keys %cfg_alias) { - printLine "Device $key($cfg_aliasId{$key}) = $cfg_alias{$key}"; - } - foreach my $key (sort keys %cfg_group) { - my $val = $cfg_group{$key}; - my ($delay, $aliases) = split(/\s+/, $val, 2); - my $states = ""; - my (@aliaslist) = split(/\s+/, $aliases); - foreach my $device (@aliaslist) { - $states .= " $cfg_alias{$device}"; - } - printLine "Group $key($cfg_groupId{$key}) =$states"; - } -} - - -sub list_all_aliases { - foreach my $key (sort keys %cfg_alias) { - printLine "Alias $key($cfg_aliasId{$key}) = receiver"; - } - foreach my $key (sort keys %cfg_group) { - my $val = $cfg_group{$key}; - my ($delay, $aliases) = split(/\s+/, $val, 2); - printLine "Group $key($cfg_groupId{$key}) = delay $delay seconds, aliases ($aliases)"; - } -} - - -sub daemon_loop() { - daemon_init(); - - while ($option{"daemon"}) { - my $now = get_datetime_now(); - my $next_day = get_datetime_now(); - $next_day->add( hours => 24 ); - $next_day->set( hour => 0, minute => 0, second => 0 ); - printLine "Next reload of device rules = $next_day" if ($option{"verbose"}); - - my $wait_time = 5; - my $loop = 1; - - check_device_rules($now); - - while ($loop) { - $now = get_datetime_now(); - if ($now > $next_day) { - load_device_rules(); - $next_day->add( hours => 24 ); - } - check_device_rules($now); - sleep($wait_time); - } - } - - daemon_exit(); -} - - -sub perform_action() { - if ($option{"aliases"}) { - list_all_aliases(); - } elsif ($option{"get"}) { - get_device_state(); - } elsif ($option{"set"}) { - set_device_state(); - } elsif ($option{"swapfirst"}) { - swap_first_device_state(); - } elsif ($option{"swap"}) { - swap_device_state(); - } elsif ($option{"list"}) { - list_all_devices(); - } elsif ($option{"daemon"}) { - daemon_loop(); - } -} - - -###################################################################### - - -sub main() { - # check arguments - check_args(@ARGV); - - # read configuration file - read_config($cfg_set{"configfile"}); - - # Load rules - load_device_rules(); - - # perform action - perform_action(); -} - - -main(); - - -###################################################################### - - -__DATA__ -#- -#- NAME -#- tellstickControllerTdtool -#- -#- SYNOPSIS -#- tellstickControllerTdtool [options] -#- -#- DESCRIPTION -#- tellstickController is used for controlling wireless recevier devices from -#- a TellStick transmitter. This version uses the tdtool software to perform -#- the actual device control. tellstickController can be used for manual -#- control of devices, or used as a daemon that is controlled by a number of -#- configuration file rules. -#- Devices and groups can be accessed by either name or id. -#- States can be set to ON, OFF or an integer between 0-255 for dimmer. -#- -#- -h, --help Show this help text. -#- -v, --verbose Show extra information. -#- -d, --daemon Starts in daemon mode. -#- -f, --file F Set configfile to file F. -#- -c, --check Check content of configuration file. -#- -t, --test Test mode, no real devices will used. -#- -a, --aliases List of aliases for devices/groups. -#- -l, --list List states for all devices/groups. -#- -s, --set D S Set device D to state S -#- -g, --get D Get state for device/group D. -#- -w, --swapfirst G Swap states for group G based on first device state. -#- -x, --swap D Swap state for device/group D. -#- -#- EXAMPLES -#- tellstickControllerTdtool -l -#- tellstickControllerTdtool --set device_alias on -#- tellstickControllerTdtool --swap device_alias -#- tellstickControllerTdtool -d -f myConfigFile.conf -#- -#- DEPENDENCIES -#- The following Perl modules needs to be installed: -#- DateTime and DateTime::Event::Sunrise -#- -#- FILES -#- tellstickController.conf -#- tellstickController.log -#- tellstickController.pid -#- -#- CONFIGURATION -#- The configuration file consists of a number of settings 'Set', a number of -#- group aliases 'Group', and a number of device rules 'Rules'. -#- -#- The settings controls sunrise/sunset, logfile, pidfile, etc. -#- -#- The groups configures a list of devices and a delay time. -#- -#- The rules can be written as a string containing two parts. -#- The first part is optional and ends with an '/'. It can contain one or more -#- of these keywords 'Weekend', 'Workweek', 'Monday', 'Tuesday', 'Wednesday', -#- 'Thursday', 'Friday', 'Saturday' and 'Sunday'. A specified date like -#- '2008-03-18', '2008-03-##', '####-03-##' or '####-##-15' is also allowed. -#- The second part is mandatory and is either a expression or the keyword 'No'. -#- The expression can contain a micture of these keywords 'Sunrise', 'Sunset', -#- 'Random(HH:MM)', 'HH:MM' and 'Dimmer(HH:MM,startlevel,stoplevel,steplevel)'. -#- A Dimmer can be controlled to change dim level from startlevel to stoplevel -#- by adding/subtracting steplevel value every HH:MM time period. -#- -#- Example rule: Weekend/07:15 -#- Example rule: Monday+Sunday/07:15 -#- Example rule: 2008-03-##/12:10 -#- Example rule: 07:15+Random(02:00) -#- Example rule: Sunset-00:30 -#- Example rule: Workweek/07:00+Dimmer(00:01,5,255,25) -#- -#- AUTHOR -#- Original version written by Rickard Andersson -#- -#- LICENSE -#- Copyright (C) 2008-2010 Rickard Andersson. Version 2.0.0 -#- This program comes with ABSOLUTELY NO WARRANTY. -#- This is free software, and you are welcome to redistribute it under certain -#- conditions; See license file for details. -#- diff --git a/3rdparty/tellstickcontroller/tellstickControllerTdtool.conf b/3rdparty/tellstickcontroller/tellstickControllerTdtool.conf deleted file mode 100644 index b2b3a4fb..00000000 --- a/3rdparty/tellstickcontroller/tellstickControllerTdtool.conf +++ /dev/null @@ -1,89 +0,0 @@ -################################################################################ -# -# Configuration file for tellstickController -# -# Copyright (C) 2008-2010 Rickard Andersson (ran42ran@gmail.com) -# Version: 2.0 -# -################################################################################ -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -################################################################################ - -# List of location settings -# -# Usage example: -# Set Key Value -# Set Timezone Europe/Stockholm -# -# -Set Timezone Europe/Stockholm -Set Altitude -0.833 -Set Latitude 58.24 -Set Longitude 15.31 - -Set pidfile /var/run/tellstickController.pid -Set logfile /var/log/tellstickController.log -Set program /usr/bin/tdtool - - -# Group aliases uses for handling a group of devices -# -# Usage examples: -# Group Name Delay List of devices -# Group Livingroom_walls 60 Livingroom_wall_north Livingroom_wall_east -# Group Kitchen 5 Kitchen_cabinets Kitchen_window -# -# -Group Normal_lights 120 Bedroom_window Kitchen_cabinets Kitchen_window Livingroom_window Livingroom_wall_east Study_window - -Group Extra_lights 180 Livingroom_cabinets Livingroom_uplight Livingroom_wall_north - -Group All_lights 10 Bedroom_mythtv_leds Bedroom_window Bedroom_bed Kitchen_cabinets Kitchen_window Livingroom_cabinets Livingroom_mythtv_leds Livingroom_uplight Livingroom_wall_north Livingroom_wall_east Livingroom_window Study_window - -#Group Christmas_lights 60 Bedroom_window Kitchen_window Study_window - -#Group dimmers 60 testDimmer test - - -# Timer rules for devices -# -# Usage examples: -# Rule Alias DeviceOn DeviceOff -# Rule LivingroomWindow Sunrise Sunrise+01:30 -# Rule LivingroomWindow 18:33 23:10+Random(00:45) -# Rule MythTv_Backlight Weekend/20:00 Weekend/Sunset -# Rule BedroomDimmer 07:00+Dimmer(00:01,5,255,25) 08:00 -# -# -Rule Normal_lights Workweek/Sunset-01:00+Random(00:50) Workweek/00:01+Random(00:50) -Rule Normal_lights Weekend/Sunset-01:00+Random(00:50) Weekend/00:01+Random(00:50) - -Rule Extra_lights No 00:15+Random(00:30) - -Rule All_lights No 02:00 -Rule All_lights No 03:00 - -#Rule Bedroom_window Workweek/07:30 Workweek/08:30 - -#Rule Christmas_lights 07:00+Random(00:15) 10:00+Random(00:30) -#Rule Christmas_lights 15:00+Random(00:30) 00:30+Random(00:15) - -#Rule Livingroom_cabinets 18:55+Random(01:00) 21:55+Random(01:00) -#Rule Livingroom_wall_north 19:55+Random(01:00) 20:55+Random(01:00) -#Rule Bedroom_bed 20:55+Random(01:00) 22:55+Random(01:00) - -#Rule testDimmer 22:00+Dimmer(00:01,5,255,50) Sunrise+Dimmer(00:01,5,250,25) -#Rule dimmers No 23:00+Dimmer(00:01,250,0,50) diff --git a/3rdparty/tellstickd/LICENSE b/3rdparty/tellstickd/LICENSE deleted file mode 100644 index 8f829aec..00000000 --- a/3rdparty/tellstickd/LICENSE +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/3rdparty/tellstickd/README b/3rdparty/tellstickd/README deleted file mode 100644 index 9e1885ba..00000000 --- a/3rdparty/tellstickd/README +++ /dev/null @@ -1,46 +0,0 @@ -General -================= -This software is intended for controlling remote switch devices with rfcmd. - -Dependencies -================= -For this script to run you need perl and the following perl-modules: -DateTime -DateTime::Event::Sunrise - - -Installation -================= -0. Install rfcmd and necessary perl modules (on a typical Fedora/Centos/RHEL with the necessary repos installed, this should do it for you: yum install perl-DateTime perl-DateTime-Event-Sunrise). - -1. Copy the file tellstickd-version/tellstickd to /usr/local/bin/ (or anywhere else depending on your wishes). - -2. Copy the file tellstickd-version/tellstickd.conf to /etc/ (or anywhere else depending on your wishes). - -3. Copy the suitable init script found under tellstickd-version/init_script to /etc/rc.d/init.d, this way you can control the script as any other service, easily make it start at boot (with chkconfig --level 35 tellstickd on). The file init_script/tellstickd is a Redhat type script whereas init_script/tellstickd.debian not unexpectedly should work on Debian type systems. -4. Remember to make the perl-script and init-script executable. As root chmod 755 /usr/local/bin/tellstickd /etc/rc.d/init.d/tellstickd - -Configuration -================= -1. In tellstickd.conf: - a. Set appropriate coordinates and timezone to suit your geographical location (further information: http://search.cpan.org/dist/DateTime-Event-Sunrise/lib/DateTime/Event/Sunrise.pm). - b. Specifiy the rfcmd-binary location. Default: /usr/local/bin/rfcmd - c. Specify the tellstick device name. Default: /dev/tellstick - d. Specify the location of the logfile. - e. Add device configurations. Multiple definitions for each device are possible (avoid having on and off times of multiple definitions overlapping each other). - -2. If you would like this script to start at boot-time, on a RHEL/Centos/Fedora system, execute the following command chkconfig --level 35 tellstickd on - - -Licensing -================= -This software is freely distributable under the GNU General Public License, -the full content of the license is included in the file LICENSE. -Bug reports are welcome, but even more appreciated are patches with the solution to the problem. - -Authors -================= -Magnus Juntti -mjuntti@gmail.com - -Anders Betnér diff --git a/3rdparty/tellstickd/init_script/tellstickd b/3rdparty/tellstickd/init_script/tellstickd deleted file mode 100755 index bbcae277..00000000 --- a/3rdparty/tellstickd/init_script/tellstickd +++ /dev/null @@ -1,84 +0,0 @@ -#!/bin/bash -# -# Init file for tellstickd remote light switch daemon -# -# Written by Magnus Juntti -# -# chkconfig: 35 54 46 -# description: tellstickd remote light switch daemon -# -# processname: tellstickd -# config: /etc/tellstickd.conf -# pidfile: /var/run/tellstick - -source /etc/rc.d/init.d/functions - -EXECUTABLE="/usr/bin/tellstickd" -CONFIG_FILE="/etc/tellstickd.conf" -OPTIONS="" - -[ -x $EXECUTABLE ] || exit 1 -[ -r $CONFIG_FILE ] || exit 1 - -RETVAL=0 -prog="tellstickd" -desc="remote switch daemon" - -start() { - echo -n $"Starting $desc ($prog): " - daemon --user root $prog --daemon --config $CONFIG_FILE $OPTIONS - RETVAL=$? - echo - [ $RETVAL -eq 0 ] && touch /var/lock/subsys/$prog - return $RETVAL -} - -stop() { - echo -n $"Shutting down $desc ($prog): " - killproc $prog - RETVAL=$? - echo - [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/$prog - return $RETVAL -} - -restart() { - stop - start -} - -reload() { - echo -n $"Reloading $desc ($prog): " - killproc $prog -HUP - RETVAL=$? - echo - return $RETVAL -} - -case "$1" in - start) - start - ;; - stop) - stop - ;; - restart) - restart - ;; - reload) - reload - ;; - condrestart) - [ -e /var/lock/subsys/$prog ] && restart - RETVAL=$? - ;; - status) - status $prog - RETVAL=$? - ;; - *) - echo $"Usage: $0 {start|stop|restart|reload|condrestart|status}" - RETVAL=1 -esac - -exit $RETVAL diff --git a/3rdparty/tellstickd/init_script/tellstickd.debian b/3rdparty/tellstickd/init_script/tellstickd.debian deleted file mode 100755 index ad262510..00000000 --- a/3rdparty/tellstickd/init_script/tellstickd.debian +++ /dev/null @@ -1,75 +0,0 @@ -#!/bin/bash -# -# Init file for tellstickd remote light switch daemon -# -# Written by Magnus Juntti -# -# chkconfig: 35 54 46 -# description: tellstickd remote light switch daemon -# -# processname: tellstickd -# config: /etc/tellstickd.conf -# pidfile: /var/run/tellstick - -. /lib/lsb/init-functions - -DAEMON="/usr/local/bin/tellstickd" -NAME="tellstickd" -CONFIG_FILE="/etc/tellstickd.conf" -PID_FILE="/var/run/tellstickd.pid" -OPTIONS="" - -[ -x $DAEMON ] || exit 1 -[ -r $CONFIG_FILE ] || exit 1 - - -RETVAL=0 -prog="tellstickd" -desc="remote switch daemon" - -start() { - log_begin_msg "Starting $desc ($prog): " - start-stop-daemon --start --quiet --pidfile "$PID_FILE" --name $NAME --exec $DAEMON -- --daemon --config $CONFIG_FILE $OPTIONS - log_end_msg $? - -} - -stop() { - log_begin_msg "Shutting down $desc ($prog): " - start-stop-daemon --stop --quiet --pidfile "$PID_FILE" --name $NAME - log_end_msg $? -} - -restart() { - stop - start -} - -reload() { - restart -# the daemon doesn't reacto to sig HUP, so just restart it -# log_begin_msg "Reloading $desc ($prog): " -# start-stop-daemon --stop --quiet --pidfile "$PID_FILE" --name $NAME --signal 1 -# log_end_msg $? -} - -case "$1" in - start) - start - ;; - stop) - stop - ;; - restart) - restart - ;; - reload) - reload - ;; - - *) - echo $"Usage: $0 {start|stop|restart|reload}" - exit 2 -esac - -exit 0 diff --git a/3rdparty/tellstickd/tellstickd b/3rdparty/tellstickd/tellstickd deleted file mode 100755 index e5f51636..00000000 --- a/3rdparty/tellstickd/tellstickd +++ /dev/null @@ -1,850 +0,0 @@ -#!/usr/bin/perl - -use POSIX; -use DateTime; -use DateTime::Event::Sunrise; -use Time::Local; -use strict; -use sigtrap 'handler', \&daemon_exit, 'normal-signals'; - -# The following variables should be adapted to your geographical location and system setup -my $LATITUDE = "65.603"; # 65.603N 22.18W -> LuleÃ¥, Sweden -my $LONGITUDE = "22.18"; -my $TIMEZONE = "Europe/Stockholm"; -my $RFCMD = "/usr/local/bin/rfcmd"; -my $TELLSTICK_DEVICE = "/dev/tellstick"; -my $CONFIG_FILE = "/etc/tellstickd.conf"; -my $LOG_FILE = "/var/log/tellstickd"; -my $pidFile = '/var/run/tellstickd.pid'; - - -# You should not need to go beyond this point (unless you have found a bug or need to improve the functionality). -my @months = qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec); -my @weekDays = qw(Sun Mon Tue Wed Thu Fri Sat Sun); -my $NO = 0; -my $YES = 1; -my @device_cfg; -my $conf_file = ""; -my $make_daemon = $NO; -my $simulate = $NO; -my $n_rfcmd_calls; -my $current_time; -my $number_of_rules; -my $Day; -my $Month; -my $Year; -my $Minute; -my $Hour; -my $Second; -my $WeekDay; -my $DayOfYear; -my $IsDST; -my $daylightSavings; -my $dayOfYear; -my $dayOfWeek; -my $dayOfMonth; - -my $PROGRAM_NAME = "tellstickd"; -my $VERSION = "0.6.3"; - -# Structure of the configurations to be read; -# $device_cfg[$i][0]; # Protocol, only NEXA, WAVEMAN and SARTANO supported so far by rfcmd -# $device_cfg[$i][1]; # Housecode A-P -# $device_cfg[$i][2]; # Channel 1-3 -# $device_cfg[$i][3]; # On time -# $device_cfg[$i][4]; # Off time -# $device_cfg[$i][5]; # Off when bright, 0 = no, 1 = yes -# $device_cfg[$i][6]; # Off when bright delay -# $device_cfg[$i][7]; # Time in advance when getting dark -# $device_cfg[$i][8]; # On time random interval -# $device_cfg[$i][9]; # Off time random interval -# $device_cfg[$i][10]; # Rule active these days [11234567], 1=monday, ... 7=sunday. -# $device_cfg[$i][20]; # Sunrise off time, calculated in this program and stored here -# $device_cfg[$i][21]; # Sunset on time, calculated in this program and stored here -# $device_cfg[$i][22]; # Switch state, 0 = off, 1 = on -# $device_cfg[$i][23]; # Original on time -# $device_cfg[$i][24]; # Original off time - -sub daemonize { - chdir '/' or die "$PROGRAM_NAME: Can't chdir to /: $!"; - open STDIN, '/dev/null' or die "$PROGRAM_NAME: Can't read /dev/null: $!"; -#open STDOUT, '>/dev/null' or die "Can't write to /dev/null: $!"; -#open STDERR, '>/dev/null' or die "$PROGRAM_NAME: Can't write to /dev/null: $!"; - defined(my $pid = fork) or die "$PROGRAM_NAME: Can't fork: $!"; - exit if $pid; - setsid or die "$PROGRAM_NAME: Can't start a new session: $!"; - umask 0; -} -sub daemon_exit() { - # Remove pidfile - unlink $pidFile; - # Since tellstickd most probably is stuck sleeping just kill ourself - kill('TERM', $$); - die; -} -sub get_sunrise_time -{ - my $sunrise_time; - - ($Second, $Minute, $Hour, $Day, $Month, $Year, $WeekDay, $DayOfYear, $IsDST) = localtime(time); - $Year += 1900; - - # Note, localtime returns months 0..11, Datetime->new expects months 1..12. - my $dt = DateTime->new( year => $Year, month => $Month+1, day => $Day, time_zone => $TIMEZONE, ); - my $sunrise = DateTime::Event::Sunrise ->new( longitude => $LONGITUDE, latitude => $LATITUDE, altitude => '-0.833', iteration => '1'); - - my $dt1 = $sunrise->sunrise_datetime($dt); - - ($sunrise_time) = $dt1->datetime =~ /T(.*)\:/; - - return $sunrise_time -} - -sub get_sunset_time -{ - my $sunset_time; - - ($Second, $Minute, $Hour, $Day, $Month, $Year, $WeekDay, $DayOfYear, $IsDST) = localtime(time); - $Year += 1900; - - # Note, localtime returns months 0..11, Datetime->new expects months 1..12. - my $dt = DateTime->new( year => $Year, month => $Month+1, day => $Day, time_zone => $TIMEZONE, ); - my $sunrise = DateTime::Event::Sunrise ->new( longitude => $LONGITUDE, latitude => $LATITUDE, altitude => '-0.833', iteration => '1'); - - my $dt2 = $sunrise->sunset_datetime($dt); - - ($sunset_time) = $dt2->datetime =~ /T(.*)\:/; - - return $sunset_time; -} - -# Checks if $current_time is inbetween argument 1 ($time1) and argument 2 ($time2) -sub is_inbetween_times -{ - my $time1 = $_[0]; - my $time2 = $_[1]; - my $curr_time = $_[2]; - - $curr_time =~ s/://g; - $time1 =~ s/://g; - $time2 =~ s/://g; - $curr_time =~ s/^0*//; - $time1 =~ s/^0*//; - $time2 =~ s/^0*//; - - # If we pass midnight, the following has to be checked/done - if ($time2 <= $time1) { - if ($curr_time >= $time1 && $curr_time < 2400 || $curr_time >= 0000 && $curr_time < $time2) { - return $YES; - } - } - # The following applies to the most common rules within a day. - else { - if ($curr_time >= $time1 && $curr_time < $time2) { - return $YES; - } - } - - return $NO; -} - - - -sub rfcmd_exec { - my $device_id = $_[0]; - my $action = $_[1]; - my $RFCMD_OPTIONS; - - if ($device_cfg[$device_id][0] eq "SARTANO") { - $RFCMD_OPTIONS = "$TELLSTICK_DEVICE $device_cfg[$device_id][0] $device_cfg[$device_id][1]"; - } - elsif ($device_cfg[$device_id][0] eq "NEXA" || $device_cfg[$device_id][0] eq "WAVEMAN") { - $RFCMD_OPTIONS = "$TELLSTICK_DEVICE $device_cfg[$device_id][0] $device_cfg[$device_id][1] $device_cfg[$device_id][2]"; - } - else { - die("$PROGRAM_NAME: Device $device_id has an unknown protocol. Only NEXA, WAVEMAN and SARTANO allowed.\n"); - } - - - # Action = 1 means turn device on, 0 turn device off - if ($action == 1) { - # Only turn the device on if it is not already turned on to avoid flashing dimmers. - # and check that it is not disabled by on/off time set to -1 in the config file - if ($device_cfg[$device_id][22] == 0 && $device_cfg[$device_id][23] != -1) { - printf("$PROGRAM_NAME: Time is $current_time. Switching on $device_cfg[$device_id][0] device $device_cfg[$device_id][1]$device_cfg[$device_id][2].\n"); - if ($simulate == $NO) { - `$RFCMD $RFCMD_OPTIONS 1`; - } - $device_cfg[$device_id][22] = 1; - - return; - } - else { - return; - } - } - elsif ($action == 0) { - if ($device_cfg[$device_id][22] == 1 && $device_cfg[$device_id][24] != -1) { - printf("$PROGRAM_NAME: Time is $current_time. Switching off $device_cfg[$device_id][0] device $device_cfg[$device_id][1]$device_cfg[$device_id][2].\n"); - if ($simulate == $NO) { - `$RFCMD $RFCMD_OPTIONS 0`; - } - $device_cfg[$device_id][22] = 0; - - return; - } - else { - return; - } - } - - return; -} - - -# Time format xx:yy for input parameters argument1 has to be positive, argument2 can be positive or negative -sub add_time -{ - my $time1 = $_[0]; - my $time2 = $_[1]; - my $multiplier = 1; - my $hour; - my $min; - my $time1_hour; - my $time1_minute; - my $time2_hour; - my $time2_minute; - my $time1_epoch_seconds; - my $time2_offset_seconds; - - ($Second, $Minute, $Hour, $Day, $Month, $Year, $WeekDay, $DayOfYear, $IsDST) = localtime(time); - $Year += 1900; - - (my $sign) = $time2 =~ /^(.*?)[0-9]/; - ($time1_hour, $time1_minute) = $time1 =~ /(.*)\:(.*)/; - # Remove any leading signs - $time2 =~ s/^-?//g; - ($time2_hour, $time2_minute) = $time2 =~ /(.*)\:(.*)/; - - if ($sign eq "-") { - $multiplier = -1; - } - - $time1_epoch_seconds = timelocal(0,$time1_minute,$time1_hour, $Day, $Month, $Year); - $time2_offset_seconds = 3600*$time2_hour + 60*$time2_minute; - - my $result_seconds = $time1_epoch_seconds + $multiplier*$time2_offset_seconds; - - ($min,$hour)= (localtime($result_seconds))[1,2]; - - return sprintf("%02d:%02d", $hour, $min); -} - -# Time format xx:yy for input parameters -sub subtract_time -{ - my $time1 = $_[0]; - my $time2 = $_[1]; - my $multiplier = 1; - my $hour; - my $min; - my $time1_hour; - my $time1_minute; - my $time2_hour; - my $time2_minute; - my $time1_epoch_seconds; - my $time2_offset_seconds; - - ($Second, $Minute, $Hour, $Day, $Month, $Year, $WeekDay, $DayOfYear, $IsDST) = localtime(time); - $Year += 1900; - - (my $sign) = $time2 =~ /^(.*?)[0-9]/; - ($time1_hour, $time1_minute) = $time1 =~ /(.*)\:(.*)/; - # Remove any leading signs - $time2 =~ s/^-?//g; - ($time2_hour, $time2_minute) = $time2 =~ /(.*)\:(.*)/; - - if ($sign eq "-") { - $multiplier = -1; - } - - $time1_epoch_seconds = timelocal(0,$time1_minute,$time1_hour, $Day, $Month, $Year); - $time2_offset_seconds = 3600*$time2_hour + 60*$time2_minute; - - my $result_seconds = $time1_epoch_seconds - $multiplier*$time2_offset_seconds; - - ($min,$hour)= (localtime($result_seconds))[1,2]; - - return sprintf("%02d:%02d", $hour, $min); -} - -sub randomize_on -{ - my $device_id = $_[0]; - - # If the on- and off times are the same, just return - if ($device_cfg[$device_id][23] eq $device_cfg[$device_id][24]) { - return; - } - - (my $random_hour, my $random_minute) = $device_cfg[$device_id][8] =~ /(.*)\:(.*)/; - - my $rand_res = int(rand(60 * $random_hour + $random_minute)); - - my $rand_res_hour = floor($rand_res / 60); - my $rand_res_minute = $rand_res - 60*$rand_res_hour; - - # Here we have the random offset in format xx:yy - my $random_time = sprintf("%02d:%02d", $rand_res_hour, $rand_res_minute); - - $device_cfg[$device_id][3] = add_time($device_cfg[$device_id][23], $random_time); - - if (is_inbetween_times($device_cfg[$device_id][23], $device_cfg[$device_id][24], $device_cfg[$device_id][3]) == $NO) { - randomize_on($device_id); - } - - return; -} - -sub randomize_off -{ - my $device_id = $_[0]; - - # If the on- and off times are the same, just return - if ($device_cfg[$device_id][23] eq $device_cfg[$device_id][24]) { - return; - } - - (my $random_hour, my $random_minute) = $device_cfg[$device_id][9] =~ /(.*)\:(.*)/; - - my $rand_res = int(rand(60 * $random_hour + $random_minute)); - - my $rand_res_hour = floor($rand_res / 60); - my $rand_res_minute = $rand_res - 60*$rand_res_hour; - - # Here we have the random offset in format xx:yy - my $random_time = sprintf("%02d:%02d", $rand_res_hour, $rand_res_minute); - - $device_cfg[$device_id][4] = add_time($device_cfg[$device_id][24], $random_time); - - if (is_inbetween_times($device_cfg[$device_id][23], $device_cfg[$device_id][24], $device_cfg[$device_id][4]) == $YES) { - randomize_off($device_id); - } - - return; -} - - -# Time format sanity check routine -sub is_time_format_correct -{ - my $time = $_[0]; - (my $hour, my $minute) = $time =~ /^-?(\d\d)\:(\d\d)$/; - - if ($hour && $minute) { - if ($hour >= 0 && $hour <= 23 && $minute >= 0 && $minute <= 59) { - return $YES; - } - } - - return $NO; -} - - -# Time format sanity check routine -sub is_rule_valid_today -{ - my $device_id = $_[0]; - my $now = $_[1]; - my $rule = $device_cfg[$device_id][10]; - - (my $week_rule) = $rule =~/^([e|o])/; - if ($week_rule) { - my $is_odd_week = ($now->week_number % 2); - if (($is_odd_week && ($week_rule eq "e")) || - (!$is_odd_week && ($week_rule eq "o"))) { - return $NO; - } - } - my $day_of_week = $now->day_of_week; - if ($rule =~ /$day_of_week/) { - return $YES; - } - - return $NO; -} - -# Ugly hack, but we have to get the log_file option from the config file -# before parsing the config file -sub get_config_log_file_param -{ - my $input_file = $_[0]; - open(CFG_FILE, "<$input_file") or die "$PROGRAM_NAME: Could not access config file: $conf_file\n"; - - while ($_ = ) { - chomp($_); - (my $value) = $_ =~ /^log_file\s*=\s*([a-zA-Z0-9_\/\.]*)/; - if ($value) { - close(CFG_FILE); - return $value; - } - } - close(CFG_FILE); - return $NO; -} - -sub read_config -{ - my $input_file = $_[0]; - my @inrad; - my $on_interval_end; - my $off_interval_end; - - printf("$PROGRAM_NAME: Reading configuration file $conf_file...\n"); - - open(CFG_FILE, "<$input_file") or die "$PROGRAM_NAME: Could not access config file: $conf_file\n"; - - my $i = 0; - my $conf_row = 0; - while ($_ = ) { - $conf_row++; - if ($_ =~ /^[\#|\s|\n]/) { - # skip lines beginning with # or space or just a new line - next; - } - - - if ($_ =~ /^[NEXA|WAVEMAN|SARTANO]/ ) { - chomp($_); - - @inrad = split /\s+/, $_; - $device_cfg[$i][0] = $inrad[0]; # Protocol - $device_cfg[$i][1] = $inrad[1]; # Housecode A and channel for NEXA, WAVEMAN, channel for SARTANO. - $device_cfg[$i][10] = $inrad[2]; # Rule valid days [[oe]1234567] - $device_cfg[$i][22] = 1; # Initial state set to on (1) so that they will be switched off at startup - - - if ($device_cfg[$i][0] eq "SARTANO") { - $device_cfg[$i][2] = ""; - } - elsif ($device_cfg[$i][0] eq "NEXA" || $device_cfg[$i][0] eq "WAVEMAN") { - # Put the housecode and channel in the respective fields. - (my $house_code,my $channel) = $device_cfg[$i][1] =~ /^([A-P])(\d{1,2})$/; - if (!$house_code || !$channel || ($channel < 1) || ($channel > 16)) { - die("$PROGRAM_NAME: Housecode/channel out of range error on row $conf_row in configuration file.\n"); - } - $device_cfg[$i][1] = $house_code; - $device_cfg[$i][2] = $channel; - } - else { - die("$PROGRAM_NAME: Unsupported protcol: $device_cfg[$i][0]. Only NEXA, WAVEMAN or SARTANO allowed.\n"); - } - - - - - # Lets find the on interval and put it into the proper fields, $device_cfg[$i][3]=On time, $device_cfg[$i][8] = On time random interval - - if ($inrad[3] =~ /-/) { - ($device_cfg[$i][3], $on_interval_end) = $inrad[3] =~ /^(\d?\d:\d\d)-(\d?\d:\d\d)$/; - } - else { - ($device_cfg[$i][3]) = $inrad[3] =~ /^(\d?\d:\d\d)$/; - $on_interval_end = $device_cfg[$i][3]; - } - - $device_cfg[$i][8] = subtract_time($on_interval_end, $device_cfg[$i][3]); - - - - # Off time = $device_cfg[$i][4], Off time random interval = $device_cfg[$i][9] - if ($inrad[4] =~ /-/) { - ($device_cfg[$i][4], $off_interval_end) = $inrad[4] =~ /^(\d?\d:\d\d)-(\d?\d:\d\d)$/; - } - else { - ($device_cfg[$i][4]) = $inrad[4] =~ /^(\d?\d:\d\d)$/; - $off_interval_end = $device_cfg[$i][4]; - } - - $device_cfg[$i][9] = subtract_time($off_interval_end, $device_cfg[$i][4]); - - - - # Save the original on and off - $device_cfg[$i][23] = $device_cfg[$i][3]; # Original on time is stored here pos 3 will be used for random on times - $device_cfg[$i][24] = $device_cfg[$i][4]; # Original off time is stored here pos 4 will be used for random off times - - - - - - # $inrad[5] is the off post sunrise value including sign, $inrad[6] is the on pre sunrise value sign, - if (length($inrad[5]) > 0 && length($inrad[6]) > 0) { - # Found a parameter after off interval, assuming daytime switch off is sought. - $device_cfg[$i][5] = 1; - - - # First the off post sunrise - (my $sign, my $minutes) = $inrad[5] =~ /^([-\+]?)(.*?)$/; - - if ($sign eq "+") { - $sign = ""; - } - - (my $hours) = floor($minutes / 60); - $minutes = $minutes - $hours * 60; - - $device_cfg[$i][6] = sprintf("%s%02d:%02d", $sign, $hours, $minutes); - - # Then figure on pre sunset out - (my $sign, my $minutes) = $inrad[6] =~ /^([-\+]?)(.*?)$/; - - if ($sign eq "+") { - $sign = ""; - } - - (my $hours) = floor($minutes / 60); - $minutes = $minutes - $hours * 60; - - $device_cfg[$i][7] = sprintf("%s%02d:%02d", $sign, $hours, $minutes); - } - else { - # If no parameters given after off interval it is assumed that the light will be on daytime - $device_cfg[$i][5] = 0; - $device_cfg[$i][6] = "00:00"; - $device_cfg[$i][7] = "00:00"; - } - - - - ############################################################################## - # Some sanity checks - # If the turn on time is not to be used, this is marked with -1 - if ($device_cfg[$i][3] != -1) { - if (is_time_format_correct($device_cfg[$i][3]) == $NO) { - die("$PROGRAM_NAME: Format of turn on time for device $device_cfg[$i][0] $device_cfg[$i][1]$device_cfg[$i][2] not correct: $device_cfg[$i][3]\n"); - } - } - else { - printf("$PROGRAM_NAME: Noted configuration for device $device_cfg[$i][0] $device_cfg[$i][1]$device_cfg[$i][2] with no turn on time.\n"); - } - - # If the turn off time is not to be used, this is marked with -1 - if ($device_cfg[$i][4] != -1) { - if (is_time_format_correct($device_cfg[$i][4]) == $NO) { - die("$PROGRAM_NAME: Format of turn off time for device $device_cfg[$i][0] $device_cfg[$i][1]$device_cfg[$i][2] not correct: $device_cfg[$i][4]\n"); - } - } - else { - printf("$PROGRAM_NAME: Noted configuration for device $device_cfg[$i][0] $device_cfg[$i][1]$device_cfg[$i][2] with no turn off time.\n"); - } - - if (is_time_format_correct($device_cfg[$i][6]) == $NO) { - die("$PROGRAM_NAME: Format of turn off after sunrise for device $device_cfg[$i][0] $device_cfg[$i][1]$device_cfg[$i][2] not correct: $device_cfg[$i][6]\n"); - } - - if (is_time_format_correct($device_cfg[$i][7]) == $NO) { - die("$PROGRAM_NAME: Format of turn on before sunset for device $device_cfg[$i][0] $device_cfg[$i][1]$device_cfg[$i][2] not correct. Exiting.\n"); - } - - if (is_time_format_correct($device_cfg[$i][8]) == $NO) { - die("$PROGRAM_NAME: Format of on interval for device $device_cfg[$i][0] $device_cfg[$i][1]$device_cfg[$i][2] not correct: $device_cfg[$i][8]\n"); - } - - if (is_time_format_correct($device_cfg[$i][9]) == $NO) { - die("$PROGRAM_NAME: Format of off interval for device $device_cfg[$i][0] $device_cfg[$i][1]$device_cfg[$i][2] not correct: $device_cfg[$i][9]\n"); - } - - if ($device_cfg[$i][10] =~ /^[o|e][^1-7]/) { - die("$PROGRAM_NAME: Device $device_cfg[$i][0] $device_cfg[$i][1]$device_cfg[$i][2]: Specified rule validity day out of range: $device_cfg[$i][10]\n"); - } - - - - printf("$PROGRAM_NAME: $device_cfg[$i][0] device $device_cfg[$i][1]$device_cfg[$i][2] config:\n"); - - printf(" This rule is valid: "); - for (my $j = 1 ; $j <= 7 ; $j++) { - if ($device_cfg[$i][10] =~ /$j/) { - printf(" $weekDays[$j]"); - } - } - if ($device_cfg[$i][10] =~ /o/) { - printf(" (odd weeks)"); - } - if ($device_cfg[$i][10] =~ /e/) { - printf(" (even weeks)"); - } - printf("\n"); - - if ($device_cfg[$i][3] == -1) { - printf(" On time: N/A\n"); - } - else { - printf(" On time: $device_cfg[$i][3]\n"); - } - - if ($device_cfg[$i][4] == -1) { - printf(" Off time: N/A\n"); - } - else { - printf(" Off time: $device_cfg[$i][4]\n"); - } - - printf(" On time random interval: $device_cfg[$i][8]\n"); - printf(" Off time random interval: $device_cfg[$i][9]\n"); - - if ($device_cfg[$i][5] == $YES) { - printf(" Turned off daytime: yes\n"); - printf(" Off post sunrise: $device_cfg[$i][6]\n"); - printf(" On pre sunset: $device_cfg[$i][7]\n"); - } - else { - printf(" Turned off daytime: no\n"); - } - - $i++; - next; - } - # Try to get config parameter name and value - (my $param, my $value) = $_ =~ /\s*(\w+)\s*=\s*(-?[a-zA-Z0-9_\/\.]*)/; - if ($param && $value) { - printf("$PROGRAM_NAME: $param = $value\n"); - if ($param eq 'latitude') { - if ($value !~ /^-?[0-9\.]*$/) { - die ("$PROGRAM_NAME: Latitude must be a valid number\n"); - } - if ($value < -90 || $value > 90) { - die ("$PROGRAM_NAME: Latitude must be between -90 and 90 degrees\n"); - } - $LATITUDE = $value; - next; - } - if ($param eq 'longitude') { - if ($value !~ /^-?[0-9\.]*$/) { - die ("$PROGRAM_NAME: Longitude must be a valid number\n"); - } - if ($value < -90 || $value > 90) { - die ("$PROGRAM_NAME: Longitude must be between -180 and 180 degrees\n"); - } - $LONGITUDE = $value; - next; - } - if ($param eq 'timezone') { - if (!DateTime::TimeZone->is_valid_name($value)) { - die ("$PROGRAM_NAME: Invalid timezone\n"); - } - $TIMEZONE = $value; - next; - } - if ($param eq 'rfcmd') { - $RFCMD = $value; - next; - } - if ($param eq 'tellstick_device') { - $TELLSTICK_DEVICE = $value; - next; - } - if ($param eq 'log_file') { - $LOG_FILE = $value; - next; - } - if ($param eq 'pid_file') { - $pidFile = $value; - next; - } - die ("$PROGRAM_NAME: Unknown config parameter $param = $value\n"); - } - else { - die("$PROGRAM_NAME: Unknown config file line $_\n"); - } - } - close(CFG_FILE); - return $i; -} - -sub usageprompt -{ - printf("This program is intended for control of Tellstick remote devices.\n"); - printf("Version: %s\n", $VERSION); - - printf("\nUsage: %s [options]\n", $PROGRAM_NAME); - printf("\nOptions:\n"); - printf("-c, --config filename Searchpath to configuration file, if not given $CONFIG_FILE is assumed.\n"); - printf("-d, --daemon Run the program as a daemon and write a logfile.\n"); - printf("-h, --help Show this message and exit.\n"); - printf("--simulate Run in foreground, log to console, no actual device operations performed.\n"); -} - - -# ############## Main section ###################### -my $i = -1; - -while ($i < $#ARGV) { - if ($i+1 <= $#ARGV) { - if ($ARGV[$i+1] =~ /^--config$/ || $ARGV[$i+1] =~ /^-c$/) { - $i++; - $conf_file = $ARGV[$i+1]; - } - elsif ($ARGV[$i+1] =~ /^-d$/ || $ARGV[$i+1] =~ /^--daemon$/) { - $make_daemon = $YES; - } - elsif ($ARGV[$i+1] =~ /^-h$/ || $ARGV[$i+1] =~ /^--help$/) { - usageprompt(); - exit; - } - elsif ($ARGV[$i+1] =~ /--simulate/) { - $simulate = $YES; - } - else { - die("$PROGRAM_NAME: Unknown input argument: $ARGV[$i+1]\n"); - } - } - - $i++; -} - -if ($#ARGV < 0) { - die "Try \"$PROGRAM_NAME --help\" for more information.\n"; -} - - -if (length($conf_file) < 1) { - $conf_file = $CONFIG_FILE; -} -$LOG_FILE = get_config_log_file_param($conf_file); - -if ($LOG_FILE && $make_daemon && !$simulate) { - open STDOUT, "> $LOG_FILE" or die "$PROGRAM_NAME: Can't write to $LOG_FILE: $!"; - open STDERR, ">> $LOG_FILE" or die "$PROGRAM_NAME: Can't write to $LOG_FILE: $!"; -} -if (!$LOG_FILE && $make_daemon) { -# start a daemon without a log file - open STDOUT, '>/dev/null' or die "Can't write to /dev/null: $!"; - open STDERR, '>/dev/null' or die "$PROGRAM_NAME: Can't write to /dev/null: $!"; -} -# Read the configuration file -$number_of_rules = read_config($conf_file); - -if ($number_of_rules < 1) { - die("$PROGRAM_NAME: Configuration file has no devices to control, exiting.\n"); -} -else { - printf("\n$PROGRAM_NAME: $number_of_rules rule(s) has been read.\n\n"); -} - -if ($make_daemon == $YES && $simulate == $NO) { - &daemonize(); - open PIDFILE, ">$pidFile" or die "$PROGRAM_NAME: Can't open $pidFile: $!\n"; - print PIDFILE $$ . "\n"; - close PIDFILE; -} - - -printf("$PROGRAM_NAME: Starting $PROGRAM_NAME version $VERSION\n"); - - -################################################################################################### -# Now to the eternal loop -my $first_loop = $YES; -my $now; -while (1) { - $n_rfcmd_calls = 0; - - # What is the current time - ($Second, $Minute, $Hour, $Day, $Month, $Year, $WeekDay, $DayOfYear, $IsDST) = localtime(); - $Year += 1900; - $current_time = sprintf("%02d:%02d", $Hour, $Minute); - $now = DateTime->now( time_zone => $TIMEZONE); - - ################################################################################################### - - # First, lets set the sunrise and sunset times for the devices that it applies to, once a day, at 00:00. - if ($first_loop == $YES || $current_time eq "00:00") { - my $sunrise_time = get_sunrise_time(); - printf("$PROGRAM_NAME: Recalculating sunrise/sunset. Current date: %d-%02d-%02d\n", $Year, $Month + 1, $Day); - printf("$PROGRAM_NAME: Time is $current_time. Sunrise today is expected at $sunrise_time\n"); - - my $sunset_time = get_sunset_time(); - printf("$PROGRAM_NAME: Time is $current_time. Sunset today is expected at $sunset_time\n\n"); - - for (my $i = 0; $i < $number_of_rules; $i++) { - # Initially all devices are switched off to get a known state - if ($first_loop == $YES) { - rfcmd_exec($i, 0); - } - - # Lets set the actual on- and offtimes depending on random interval settings. - randomize_on($i); - if (is_rule_valid_today($i, $now) == $YES) { - printf("$PROGRAM_NAME: Today device $device_cfg[$i][0] $device_cfg[$i][1]$device_cfg[$i][2] will be turned on $device_cfg[$i][3]\n"); - } - randomize_off($i); - if (is_rule_valid_today($i, $now) == $YES) { - printf("$PROGRAM_NAME: Today device $device_cfg[$i][0] $device_cfg[$i][1]$device_cfg[$i][2] will be turned off $device_cfg[$i][4]\n"); - } - - # If the device is supposed to be off daytime, the following applies - # Sunrise time + requested offset - if ($device_cfg[$i][5] == $YES) { - $device_cfg[$i][20] = add_time($sunrise_time, $device_cfg[$i][6]); - if (is_rule_valid_today($i, $now) == $YES) { - printf("$PROGRAM_NAME: Device $device_cfg[$i][0] $device_cfg[$i][1]$device_cfg[$i][2] sunrise off time set to $device_cfg[$i][20].\n"); - } - # Sunset time - requested offset - $device_cfg[$i][21] = subtract_time($sunset_time, $device_cfg[$i][7]); - if (is_rule_valid_today($i, $now) == $YES) { - printf("$PROGRAM_NAME: Device $device_cfg[$i][0] $device_cfg[$i][1]$device_cfg[$i][2] sunset on time set to $device_cfg[$i][21].\n"); - } - } - } - } - - - ################################################################################################### - - # Below the required actions are performed for each device - for ($i = 0; $i < $number_of_rules; $i++) { - - - # Lets check if the rule is to be applied today - if (is_rule_valid_today($i, $now) == $YES) { - - - - # First if we consider daytime off - if ($device_cfg[$i][5] == $YES) { - if (is_inbetween_times($device_cfg[$i][3], $device_cfg[$i][4], $current_time) == $YES && is_inbetween_times($device_cfg[$i][20], $device_cfg[$i][21], $current_time) == $NO) { - rfcmd_exec($i, 1); - $n_rfcmd_calls++; - } - else { - rfcmd_exec($i, 0); - $n_rfcmd_calls++; - } - } - - - # Then if daytime off is not considered - else { - if (is_inbetween_times($device_cfg[$i][3], $device_cfg[$i][4], $current_time) == $YES) { - rfcmd_exec($i, 1); - $n_rfcmd_calls++; - } - else { - rfcmd_exec($i, 0); - $n_rfcmd_calls++; - } - } - } - - - - } - - $first_loop = $NO; - - if ($n_rfcmd_calls < 30) { - sleep(60 - 2*$n_rfcmd_calls); # Wait a while until next round [seconds]. If rfcmd has been called, reduce this figure by 2 seconds per call. - } -} diff --git a/3rdparty/tellstickd/tellstickd.conf b/3rdparty/tellstickd/tellstickd.conf deleted file mode 100644 index a62e9de8..00000000 --- a/3rdparty/tellstickd/tellstickd.conf +++ /dev/null @@ -1,60 +0,0 @@ -# Tellstickd file for control of remote switches with rfcmd. - -# To be able to calculate sunrise and sunset times tellstickd needs to know your position -# Your latitude -latitude = 65.603 - -# Your longitude -longitude = 22.18 - -# Your timezone -timezone = Europe/Stockholm - -# Where to find the rfcmd command -rfcmd = /usr/local/bin/rfcmd - -# The tellstick device name -tellstick_device = /dev/tellstick - -# Where to put the log file -log_file = /var/log/tellstickd - -# Where to put the pid file -pid_file = /var/run/tellstickd.pid - -# -# -# -# In valid day field, days are numbered 1=Monday, 2=Tuesday, ... , 7=Sunday. I.e. 1234567 means that the rule should be active every weekday. -# The day fields can be prefixed with "o" or "e" making the rule valid on odd or even weeks. Week numbers are -# calculated according to ISO, with the first week of the year being the one containing 4 jan - -# Time format xx:yy where xx is hour and yy is minute -# Multiple definitions are possible for each device. Be aware that overlapping rules (overlapping in time) can/will cause troubles. -# -# Setting and the same means that the device will always be switched on. -# - -# Sample rules - - -# The sample rule below will turn on the device between 06:10 and 06:20 and off between 22:00 and 23:00 monday to friday. -# The device will be turned off daytime 10 minutes after sunrise and 15 before sunset -SARTANO 0000000000 12345 06:10-06:20 22:00-23:00 10 15 - -# This device will be turned on between 07:34 and 07:48, turned off between 23:00 and 23:15 (every day of the week). -# It will be turned off exactly on sunrise and off exactly on sunset. -WAVEMAN P2 1234567 07:34-07:48 23:00-23:15 0 0 - -# This device will be turned on 07:00 off between 20:00 and 20:30 and will be on daytime on sundays. -NEXA P3 7 07:00 20:00-20:30 - -# This device will be turned on 07:00 and off 20:00 on fridays and sundays on evenly numbered weeks -NEXA P3 e57 07:00 20:00 - -# This device will be turned on 07:00 and off 20:00 on fridays and sundays on oddly numbered weeks -NEXA P3 o57 07:00 20:00 - - - - diff --git a/telldus-core/AUTHORS b/AUTHORS similarity index 53% rename from telldus-core/AUTHORS rename to AUTHORS index 58bd0e4e..a8356907 100644 --- a/telldus-core/AUTHORS +++ b/AUTHORS @@ -2,6 +2,6 @@ telldus-core has been developed by : Micke Prag Fredrik Jacobsson - Stefan Persson + Stefan Persson -The package is maintained by Micke Prag +The package is maintained by Micke Prag \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 00000000..1bd962d3 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,60 @@ +PROJECT( telldus-core ) + +CMAKE_MINIMUM_REQUIRED( VERSION 2.6.0 ) + +cmake_policy(SET CMP0003 NEW) + +SET(PACKAGE_VERSION 2.0.2) +SET(PACKAGE_SUBVERSION) +SET(PACKAGE_SOVERSION 2) + +IF (PACKAGE_SUBVERSION) + SET(DISPLAYED_VERSION "${PACKAGE_VERSION}_${PACKAGE_SUBVERSION}") +ELSE (PACKAGE_SUBVERSION) + SET(DISPLAYED_VERSION ${PACKAGE_VERSION}) +ENDIF(PACKAGE_SUBVERSION) + +SET(BUILD_LIBTELLDUS-CORE TRUE CACHE BOOL "Build libtelldus-core") +SET(SUPPORT_TELLSTICK_DUO FALSE CACHE BOOL "Include support for TellStick Duo") +IF (UNIX) + SET(SUPPORT_USB FALSE CACHE BOOL "Build support for usb-devices") +ELSE (UNIX) + SET(SUPPORT_USB TRUE CACHE BOOL "Build support for usb-devices") +ENDIF(UNIX) +SET(USE_QT_SETTINGS_BACKEND FALSE CACHE BOOL "Use QT as settings backend instead of the native one") + +SET(BUILD_RFCMD TRUE CACHE BOOL "Build rfcmd") +SET(BUILD_RFCMD_WITH_LIBFTDI FALSE CACHE BOOL "Enable support for using rfcmd with libftdi (does not need kernel-driver)") +SET(BUILD_TDTOOL TRUE CACHE BOOL "Build tdtool") + +SET(GENERATE_MAN FALSE CACHE BOOL "Enable generation of man-files") +SET(BRANDING "telldus" CACHE STRING "The brand to use") + +ADD_SUBDIRECTORY(driver) + +if(BUILD_TDTOOL) + ADD_SUBDIRECTORY(tdtool) +endif(BUILD_TDTOOL) + +if(BUILD_RFCMD) + ADD_SUBDIRECTORY(rfcmd) +endif(BUILD_RFCMD) + +########## CPack ############# +SET(CPACK_PACKAGE_NAME ${CMAKE_PROJECT_NAME}) +SET(CPACK_PACKAGE_VERSION "${PACKAGE_VERSION}${PACKAGE_SUBVERSION}") +SET(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE") +SET(CPACK_PACKAGE_CONTACT "Micke Prag ") +SET(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Utilities for a Telldus TellStick") +SET(CPACK_PACKAGE_DESCRIPTION "Utilities and driver to control NEXA and other RF remote receivers through a TellStick USB interface") +SET(CPACK_PACKAGE_VENDOR "Telldus Technologies AB") +SET(CPACK_STRIP_FILES "usr/bin/tdtool;usr/bin/rfcmd") +# SET(CPACK_PACKAGE_INSTALL_DIRECTORY "") +# SET(CPACK_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}") + +#### .deb #### +SET(CPACK_DEBIAN_PACKAGE_DEPENDS "libc6 (>= 2.7-1), libconfuse0 (>=2.6-2), udev") +SET(CPACK_DEBIAN_PACKAGE_SECTION "utils") +SET(CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA "${CMAKE_CURRENT_SOURCE_DIR}/debian/postinst;${CMAKE_CURRENT_SOURCE_DIR}/debian/postrm") + +INCLUDE(CPack) diff --git a/ChangeLog b/ChangeLog new file mode 100644 index 00000000..82d7959b --- /dev/null +++ b/ChangeLog @@ -0,0 +1,10 @@ +telldus-core 2.0.1 (2009-11-10) + + * Fixed bug when the number of devices is more then 9 on Windows + * Provided functions for possible memory leaks in some languages + * Better error-reporting when communication with TellStick doesn't work + * More friendlier configuration for GAO + +telldus-core 2.0.0 (2009-09-22) + + * Initial release diff --git a/telldus-core/INSTALL b/INSTALL similarity index 100% rename from telldus-core/INSTALL rename to INSTALL diff --git a/LICENSE b/LICENSE new file mode 100644 index 00000000..82fa1daa --- /dev/null +++ b/LICENSE @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/telldus-core/README b/README similarity index 78% rename from telldus-core/README rename to README index dd80b5bf..5778ee2b 100644 --- a/telldus-core/README +++ b/README @@ -10,7 +10,7 @@ INSTALLING Telldus Core On Windows, if you want to install the precompiles binary packages, simply launch the package and follow the instructions in the installation wizard. -If you have a source package (a .tar.gz file), follow the instruction in the +If you have a source package (a .tag.gz file), follow the instruction in the INSTALL file. @@ -19,8 +19,8 @@ CONFIGURATION AND TOOLS Once Telldus Core is installed, we suggest that you start by adding the devices you want to control. -On Windows, this is done by installing TelldusCenter. On Linux it's done by -editing the file /etc/tellstick.conf directly, or in TelldusCenter. +On Windows, this is done with the tool TelldusSetup. On Linux this is done in +the file /etc/tellstick.conf. Telldus Core installs the tool tdtool for controlling devices with TellStick. Have a look in the man page for a description how to use it: diff --git a/bindings/dotnet/TelldusNETWrapper/Properties/AssemblyInfo.cs b/bindings/dotnet/TelldusNETWrapper/Properties/AssemblyInfo.cs deleted file mode 100644 index 2238f2f5..00000000 --- a/bindings/dotnet/TelldusNETWrapper/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("TelldusNETWrapper")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Telldus Technologies AB")] -[assembly: AssemblyProduct("")] -[assembly: AssemblyCopyright("Copyright © Telldus Technologies AB 2011")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(true)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("a66028f7-b342-4dc0-9504-9e07c462ec15")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/bindings/dotnet/TelldusNETWrapper/TelldusNETWrapper.cs b/bindings/dotnet/TelldusNETWrapper/TelldusNETWrapper.cs deleted file mode 100644 index 0d476504..00000000 --- a/bindings/dotnet/TelldusNETWrapper/TelldusNETWrapper.cs +++ /dev/null @@ -1,816 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Runtime.InteropServices; - -namespace TelldusWrapper -{ - public sealed class TelldusNETWrapper //don't allow inheritance - { - int lastEventID = 0; - Dictionary callbackFunctionReferenceList = new Dictionary(); //this prevents errors in "unknown module" due to callback functions being garbage collected since there are no reference to them - - //TODO - List lista = new List(); - - //Device methods - public const int TELLSTICK_TURNON = 1; - public const int TELLSTICK_TURNOFF = 2; - public const int TELLSTICK_BELL = 4; - public const int TELLSTICK_TOGGLE = 8; - public const int TELLSTICK_DIM = 16; - public const int TELLSTICK_LEARN = 32; - public const int TELLSTICK_EXECUTE = 64; - public const int TELLSTICK_UP = 128; - public const int TELLSTICK_DOWN = 256; - public const int TELLSTICK_STOP = 512; - - //Error codes - public const int TELLSTICK_SUCCESS = 0; - public const int TELLSTICK_ERROR_NOT_FOUND = -1; - public const int TELLSTICK_ERROR_PERMISSION_DENIED = -2; - public const int TELLSTICK_ERROR_DEVICE_NOT_FOUND = -3; - public const int TELLSTICK_ERROR_METHOD_NOT_SUPPORTED = -4; - public const int TELLSTICK_ERROR_COMMUNICATION = -5; - public const int TELLSTICK_ERROR_CONNECTING_SERVICE = -6; - public const int TELLSTICK_ERROR_UNKNOWN_RESPONSE = -7; - public const int TELLSTICK_ERROR_UNKNOWN = -99; - - //Device typedef - public const int TELLSTICK_TYPE_DEVICE = 1; - public const int TELLSTICK_TYPE_GROUP = 2; - public const int TELLSTICK_TYPE_SCENE = 3; - - //Device changes - public const int TELLSTICK_DEVICE_ADDED = 1; - public const int TELLSTICK_DEVICE_CHANGED = 2; - public const int TELLSTICK_DEVICE_REMOVED = 3; - public const int TELLSTICK_DEVICE_STATE_CHANGED = 4; - - //Change types - public const int TELLSTICK_CHANGE_NAME = 1; - public const int TELLSTICK_CHANGE_PROTOCOL = 2; - public const int TELLSTICK_CHANGE_MODEL = 3; - - //variables for event callback (e.g. turnon, turnoff) - public delegate int EventCallbackFunction(int deviceId, int method, string data, int callbackId, Object obj); - private struct DeviceEventFunctionContext - { - public EventCallbackFunction eventCallbackFunc; - public Object context; - public int callbackId; - } - Dictionary deviceEventList = new Dictionary(); - int registeredEventFunctionId = -1; - - //variables for device event callback (e.g. change of name/protocol) - public delegate int DeviceChangeEventCallbackFunction(int deviceId, int changeEvent, int changeType, int callbackId, Object obj); - private struct DeviceChangeEventFunctionContext - { - public DeviceChangeEventCallbackFunction changeEventCallbackFunc; - public Object context; - public int callbackId; - } - Dictionary deviceChangeEventList = new Dictionary(); - int registeredDeviceChangeEventFunctionId = -1; - - //variables for raw controller listening callback (e.g. Tellstick Duo receives data) - public delegate int RawListeningCallbackFunction(string data, int controllerId, int callbackId, Object obj); - private struct RawEventFunctionContext - { - public RawListeningCallbackFunction rawCallbackFunc; - public Object context; - public int callbackId; - } - Dictionary rawListenerList = new Dictionary(); - int registeredRawListenerFunctionId = -1; - - public TelldusNETWrapper() - { - } - - ~TelldusNETWrapper() - { - //clean up - if (registeredEventFunctionId != -1) - { - UnmanagedImport.tdUnregisterCallback(registeredEventFunctionId); - } - if (registeredDeviceChangeEventFunctionId != -1) - { - UnmanagedImport.tdUnregisterCallback(registeredDeviceChangeEventFunctionId); - } - if (registeredRawListenerFunctionId != -1) - { - UnmanagedImport.tdUnregisterCallback(registeredRawListenerFunctionId); - } - UnmanagedImport.tdClose(); //Close the library and clean up the cache it uses. - } - - /// - /// Imported functions from TelldusCore.dll - /// - private sealed class UnmanagedImport - { - private UnmanagedImport() { } //cannot instantiate this class - - #region Unmanaged Code - [DllImport("TelldusCore.dll")] - public static extern int tdGetNumberOfDevices(); - - [DllImport("TelldusCore.dll")] - public static extern int tdGetDeviceId(int value); - - [DllImport("TelldusCore.dll")] - public static unsafe extern char* tdGetName(int deviceId); - - [DllImport("TelldusCore.dll")] - public static unsafe extern char* tdGetProtocol(int deviceId); - - [DllImport("TelldusCore.dll")] - public static unsafe extern char* tdGetModel(int deviceId); - - [DllImport("TelldusCore.dll")] - public static unsafe extern char* tdGetDeviceParameter(int deviceId, char* name, char* defaultValue); - - [DllImport("TelldusCore.dll")] - public static unsafe extern bool tdSetName(int deviceId, char* name); - - [DllImport("TelldusCore.dll")] - public static unsafe extern bool tdSetProtocol(int deviceId, char* protocol); - - [DllImport("TelldusCore.dll")] - public static unsafe extern bool tdSetModel(int deviceId, char* model); - - [DllImport("TelldusCore.dll")] - public static unsafe extern bool tdSetDeviceParameter(int deviceId, char* name, char* value); - - [DllImport("TelldusCore.dll")] - public static unsafe extern int tdAddDevice(); - - [DllImport("TelldusCore.dll")] - public static unsafe extern bool tdRemoveDevice(int deviceId); - - [DllImport("TelldusCore.dll")] - public static unsafe extern int tdMethods(int deviceId, int methodsSupported); - - [DllImport("TelldusCore.dll")] - public static extern int tdTurnOn(int deviceId); - - [DllImport("TelldusCore.dll")] - public static extern int tdTurnOff(int deviceId); - - [DllImport("TelldusCore.dll")] - public static extern int tdBell(int deviceId); - - [DllImport("TelldusCore.dll")] - public static extern int tdDim(int deviceId, char level); - - [DllImport("TelldusCore.dll")] - public static extern int tdExecute(int deviceId); - - [DllImport("TelldusCore.dll")] - public static extern int tdUp(int deviceId); - - [DllImport("TelldusCore.dll")] - public static extern int tdDown(int deviceId); - - [DllImport("TelldusCore.dll")] - public static extern int tdStop(int deviceId); - - [DllImport("TelldusCore.dll")] - public static unsafe extern char* tdGetErrorString(int errorNo); - - [DllImport("TelldusCore.dll")] - public static extern void tdClose(); - - [DllImport("TelldusCore.dll")] - public static extern void tdInit(); - - [DllImport("TelldusCore.dll")] - public static unsafe extern int tdRegisterDeviceEvent(Delegate deviceEventFunction, void* context); - - [DllImport("TelldusCore.dll")] - public static extern int tdLastSentCommand(int deviceId, int methods); - - [DllImport("TelldusCore.dll")] - public static extern int tdGetDeviceType(int deviceId); - - [DllImport("TelldusCore.dll")] - public static unsafe extern int tdSendRawCommand(char* command, int reserved); - - [DllImport("TelldusCore.dll")] - public static unsafe extern int tdRegisterRawDeviceEvent(Delegate rawListeningFunction, void* context); - - [DllImport("TelldusCore.dll")] - public static extern int tdLearn(int deviceId); - - [DllImport("TelldusCore.dll")] - public static unsafe extern char* tdLastSentValue(int deviceId); - - [DllImport("TelldusCore.dll")] - public static unsafe extern void tdReleaseString(char* value); - - [DllImport("TelldusCore.dll")] - public static unsafe extern int tdUnregisterCallback(int eventId); - - [DllImport("TelldusCore.dll")] - public static unsafe extern int tdRegisterDeviceChangeEvent(Delegate deviceChangeEventFunction, void* context); - - [UnmanagedFunctionPointer(CallingConvention.StdCall)] - public unsafe delegate void EventFunctionDelegate(int deviceId, int method, char* data, int callbackId, void* context); - - [UnmanagedFunctionPointer(CallingConvention.StdCall)] - public unsafe delegate void DeviceChangeEventFunctionDelegate(int deviceId, int changeEvent, int changeType, int callbackId, void* context); - - [UnmanagedFunctionPointer(CallingConvention.StdCall)] - public unsafe delegate void RawListeningDelegate(char* data, int controllerId, int callbackId, void* context); - - #endregion - } - - #region Public Methods - - /// - /// Add a new device to the global database of devices. This function must be called first before - /// any call to tdSetName(), tdSetProtocol() and similar functions. - /// - /// The device id for the newly created device. If the creation fails it returnes a - /// negative value. - public static int tdAddDevice() - { - return UnmanagedImport.tdAddDevice(); - } - - /// - /// Sends bell command to devices supporting this. - /// Make sure the device supports this by calling tdMethods() before any calls to this function. - /// - /// Id of device to sound the bell on - /// Success or error code - public static int tdBell(int deviceId) - { - return UnmanagedImport.tdBell(deviceId); - } - - /// - /// Close the library and clean up the cache it uses. - /// This should be called when the library is not supposed to be used anymore. - /// Do not use when this has been instantiated, will be closed in destructor then, only on static methods. - /// - public static void tdClose() - { - UnmanagedImport.tdClose(); - } - - /// - /// Dims a device. - /// Make sure the device supports this by calling tdMethods() before any calls to this function. - /// - /// The device id to dim - /// The level the device should dim to. This value should be 0-255 - /// Success or error code - public static int tdDim(int deviceId, char level) - { - return UnmanagedImport.tdDim(deviceId, level); - } - - /// - /// Send "down" command to device. - /// Make sure the device supports this by calling tdMethods() before any calls to this function. - /// - /// The device id to send the command to - /// Success or error code - public static int tdDown(int deviceId) - { - return UnmanagedImport.tdDown(deviceId); - } - - /// - /// Execute a scene action. - /// Make sure the device supports this by calling tdMethods() before any calls to this function. - /// - /// Id of device to perform the execute action on - /// Success or error code - public static int tdExecute(int deviceId) - { - return UnmanagedImport.tdExecute(deviceId); - } - - /// - /// This function returns the unique id of a device with a specific index. - /// To get all the id numbers you should loop over all the devices, use tdGetNumberOfDevices() to get the number of devices - /// - /// Device index - /// Id of device at that position - public static int tdGetDeviceId(int order) - { - return UnmanagedImport.tdGetDeviceId(order); - } - - /// - /// Get a protocol specific device parameter - /// - /// The id of the device to query - /// The name of the parameter to query - /// A defaultValue to return if the current parameter hasn't previously been set - /// Any protocol specific parameter specified by "name" - public static unsafe string tdGetDeviceParameter(int deviceId, string name, string defaultValue) - { - return getString(UnmanagedImport.tdGetDeviceParameter(deviceId, stringToChar(name), stringToChar(defaultValue))); - } - - /// - /// Returns which type the device is - /// - /// Id of the device - /// TELLSTICK_TYPE_DEVICE or TELLSTICK_TYPE_GROUP - public static int tdGetDeviceType(int deviceId) - { - return UnmanagedImport.tdGetDeviceType(deviceId); - } - - /// - /// Get a human readable string from an error code returned from a function in telldus-core - /// - /// The error code to translate - /// A string ready to show to the user. - /// TELLSTICK_SUCCESS - /// TELLSTICK_ERROR_NOT_FOUND - /// TELLSTICK_ERROR_PERMISSION_DENIED - /// TELLSTICK_ERROR_DEVICE_NOT_FOUND - /// TELLSTICK_ERROR_METHOD_NOT_SUPPORTED - /// TELLSTICK_ERROR_COMMUNICATION - /// TELLSTICK_ERROR_CONNECTING_SERVICE - /// TELLSTICK_ERROR_UNKNOWN_RESPONSE - /// TELLSTICK_ERROR_UNKNOWN - /// - public static unsafe string tdGetErrorString(int errorNo) - { - return getString(UnmanagedImport.tdGetErrorString(errorNo)); - } - - /// - /// Query a device for it’s name - /// - /// Id of device to query - /// The name of the device or an empty string if the device is not found - public static unsafe string tdGetName(int deviceId) - { - return getString(UnmanagedImport.tdGetName(deviceId)); - } - - /// - /// Query a device for which methods it supports. By supplying the methods you support - /// the library could remap the methods a device support for better fit the application. - /// - /// Id of device to query - /// Methods that the client application supports - /// Supported (both by client application and by device) method-flags OR'ed into an integer - /// TELLSTICK_TURNON - /// TELLSTICK_TURNOFF - /// TELLSTICK_BELL - /// TELLSTICK_TOGGLE - /// TELLSTICK_DIM - /// TELLSTICK_EXECUTE - /// TELLSTICK_UP - /// TELLSTICK_DOWN - /// TELLSTICK_EXECUTE - /// TELLSTICK_LEARN - /// - public static int tdMethods(int deviceId, int methodsSupported) - { - return UnmanagedImport.tdMethods(deviceId, methodsSupported); - } - - /// - /// Query a device for it’s model - /// - /// Id of device to query - /// The model for a device. Not all protocols use this. - public static unsafe string tdGetModel(int deviceId) - { - return getString(UnmanagedImport.tdGetModel(deviceId)); - } - - /// - /// This function returns the number of devices configured - /// - /// The total number of devices configured - public static int tdGetNumberOfDevices() - { - return UnmanagedImport.tdGetNumberOfDevices(); - } - - /// - /// Query a device for it’s protocol - /// - /// Id of device to query - /// The protocol for a device. - public static unsafe string tdGetProtocol(int deviceId) - { - return getString(UnmanagedImport.tdGetProtocol(deviceId)); - } - - /// - /// Returns the last sent command to a specific device - /// - /// Id of device to query - /// The methods supported by the client. See tdMethods() for more information. - /// The last sent command as integer, for example TELLSTICK_TURNON or TELLSTICK_TURNOFF - public static int tdLastSentCommand(int deviceId, int methods) - { - return UnmanagedImport.tdLastSentCommand(deviceId, methods); - } - - /// - /// If the last sent command it TELLSTICK_DIM this returns the dimmed value - /// - /// Id of device to query - /// The the value as a human readable string, for example "128" for 50% - public static unsafe string tdLastSentValue(int deviceId) - { - return getString(UnmanagedImport.tdLastSentValue(deviceId)); - } - - /// - /// Sends a special learn command to some devices that need a special learn-command to be used from TellStick - /// Make sure the device supports this by calling tdMethods() before any calls to this function. - /// - /// Id of device to learn - /// Success or error code - public static int tdLearn(int deviceId) - { - return UnmanagedImport.tdLearn(deviceId); - } - - /// - /// Register a callback event function to be called when a device event (e.g. turn on, turn off) occurs - /// - /// Callback function to be called - /// Context object that will be echoed back when function is called. Only the object when the first function is registered will be used. Set to null if not used. - /// Callback event id - public unsafe int tdRegisterDeviceEvent(EventCallbackFunction deviceEventFunc, Object obj) - { - int returnValue = 0; - - if (deviceEventList.Count == 0) - { - //first added, register with dll too - UnmanagedImport.EventFunctionDelegate deviceEventFunctionDelegate = new UnmanagedImport.EventFunctionDelegate(deviceEventFunction); - - registeredEventFunctionId = UnmanagedImport.tdRegisterDeviceEvent(deviceEventFunctionDelegate, (void*)null); //context here or above? - GC.Collect(); - callbackFunctionReferenceList.Add(registeredEventFunctionId, deviceEventFunctionDelegate); - } - - ++lastEventID; - returnValue = lastEventID; - DeviceEventFunctionContext deviceEventFuncContext = new DeviceEventFunctionContext(); - deviceEventFuncContext.eventCallbackFunc = deviceEventFunc; - deviceEventFuncContext.context = obj; - deviceEventFuncContext.callbackId = returnValue; - deviceEventList.Add(returnValue, deviceEventFuncContext); - - return returnValue; - } - - /// - /// Register a callback device change event function to be called when a device change event (e.g. change of name, device added) occurs - /// - /// Callback function to be called - /// Context object that will be echoed back when function is called. Only the object when the first function is registered will be used. Set to null if not used. - /// Callback event id - public unsafe int tdRegisterDeviceChangeEvent(DeviceChangeEventCallbackFunction deviceChangeEventFunc, Object obj) - { - int returnValue = 0; - if (deviceChangeEventList.Count == 0) - { - //first added, register with dll too - //only the context object of the first event will be registered - UnmanagedImport.DeviceChangeEventFunctionDelegate deviceChangeEventFunctionDelegate = new UnmanagedImport.DeviceChangeEventFunctionDelegate(deviceChangeEventFunction); - - registeredDeviceChangeEventFunctionId = UnmanagedImport.tdRegisterDeviceChangeEvent(deviceChangeEventFunctionDelegate, (void*)null); - GC.Collect(); - callbackFunctionReferenceList.Add(registeredDeviceChangeEventFunctionId, deviceChangeEventFunctionDelegate); - } - ++lastEventID; - returnValue = lastEventID; - DeviceChangeEventFunctionContext deviceChangeEventFuncContext = new DeviceChangeEventFunctionContext(); - deviceChangeEventFuncContext.changeEventCallbackFunc = deviceChangeEventFunc; - deviceChangeEventFuncContext.context = obj; - deviceChangeEventFuncContext.callbackId = returnValue; - deviceChangeEventList.Add(returnValue, deviceChangeEventFuncContext); - - return returnValue; - } - - /// - /// Register a callback listening function to be called when a listening event (e.g. data is received with Tellstick Duo) occurs - /// - /// Callback function to be called - /// Context object that will be echoed back when function is called. Only the object when the first function is registered will be used. Set to null if not used. - /// Callback event id - public unsafe int tdRegisterRawDeviceEvent(RawListeningCallbackFunction listeningFunc, Object obj) - { - int returnValue = 0; - if (rawListenerList.Count == 0) - { - //first added, register with dll too - //only the context object of the first event will be registered - UnmanagedImport.RawListeningDelegate listeningFunctionDelegate = new UnmanagedImport.RawListeningDelegate(rawListeningFunction); - - registeredRawListenerFunctionId = UnmanagedImport.tdRegisterRawDeviceEvent(listeningFunctionDelegate, (void*)null); - GC.Collect(); - callbackFunctionReferenceList.Add(registeredRawListenerFunctionId, listeningFunctionDelegate); - } - ++lastEventID; - returnValue = lastEventID; - RawEventFunctionContext rawEventFuncContext = new RawEventFunctionContext(); - rawEventFuncContext.rawCallbackFunc = listeningFunc; - rawEventFuncContext.context = obj; - rawEventFuncContext.callbackId = returnValue; - rawListenerList.Add(returnValue, rawEventFuncContext); - return returnValue; - } - - /// - /// Removes a device. - /// - /// Id of device to remove - /// True on success, false otherwise - public static bool tdRemoveDevice(int deviceId) - { - return UnmanagedImport.tdRemoveDevice(deviceId); - } - - /// - /// Send a raw command to TellStick. Please read the TellStick protocol definition on how the command should be constructed. - /// - /// The command for TellStick in its native format - /// - /// Success or error code - public static unsafe int tdSendRawCommand(string command, int reserved) - { - char* commandChar = stringToChar(command); - int returnValue = UnmanagedImport.tdSendRawCommand(commandChar, reserved); - Marshal.FreeHGlobal((IntPtr)commandChar); - return returnValue; - } - - /// - /// Sets a new protocol specific parameter. Please see the documentation of the protocols before setting any parameter. - /// - /// Id of device to change - /// The name of the parameter to change - /// The new value for the parameter - /// Success or error code - public static unsafe bool tdSetDeviceParameter(int deviceId, string name, string value) - { - char* nameChar = stringToChar(name); - char* valueChar = stringToChar(value); - bool returnValue = UnmanagedImport.tdSetDeviceParameter(deviceId, nameChar, valueChar); - Marshal.FreeHGlobal((IntPtr)nameChar); - Marshal.FreeHGlobal((IntPtr)valueChar); - return returnValue; - } - - /// - /// Sets a new model for a device. Which model to set depends on the current protocol. - /// - /// Id of device to change - /// The new model - /// Success or error code - public static unsafe bool tdSetModel(int deviceId, string model) - { - char* modelChar = stringToChar(model); - bool returnValue = UnmanagedImport.tdSetModel(deviceId, modelChar); - Marshal.FreeHGlobal((IntPtr)modelChar); - return returnValue; - } - - /// - /// Sets a new name for a device. - /// - /// Id of device to change - /// The new name - /// Success or error code - public static unsafe bool tdSetName(int deviceId, string name) - { - char* nameChar = stringToChar(name); - bool returnValue = UnmanagedImport.tdSetName(deviceId, nameChar); - Marshal.FreeHGlobal((IntPtr)nameChar); - return returnValue; - } - - /// - /// This changes the current protocol used by a device. After changing the protocol, setting new parameters is required. - /// - /// Id of device to change - /// The new protocol to use - /// Success or error code - public static unsafe bool tdSetProtocol(int deviceId, string protocol) - { - char* protocolChar = stringToChar(protocol); - bool returnValue = UnmanagedImport.tdSetProtocol(deviceId, protocolChar); - Marshal.FreeHGlobal((IntPtr)protocolChar); - return returnValue; - } - - /// - /// Send "stop" command to device. - /// Make sure the device supports this by calling tdMethods() before any calls to this function. - /// - /// The device id to stop - /// Success or error code - public static int tdStop(int deviceId) - { - return UnmanagedImport.tdStop(deviceId); - } - - /// - /// Turns a device on. - /// Make sure the device supports this by calling tdMethods() before any calls to this function. - /// - /// Id of device to turn on - /// Success or error code - public static int tdTurnOn(int deviceId) - { - return UnmanagedImport.tdTurnOn(deviceId); - } - - /// - /// Turns a device off. - /// Make sure the device supports this by calling tdMethods() before any calls to this function. - /// - /// Id of device to turn off - /// Success or error code - public static int tdTurnOff(int deviceId) - { - return UnmanagedImport.tdTurnOff(deviceId); - } - - /// - /// Unregister a callback function. All functions will be unregistered automatically when this objekt is deleted. - /// - /// Id of callback even to unregister - public void unregisterCallback(int eventId) - { - deviceEventList.Remove(eventId); - if (deviceEventList.Count == 0) - { - //no more events in list - UnmanagedImport.tdUnregisterCallback(registeredEventFunctionId); - callbackFunctionReferenceList.Remove(registeredEventFunctionId); - /* - if (eventContextHandle.IsAllocated) - { - eventContextHandle.Free(); - } - */ - } - - deviceChangeEventList.Remove(eventId); - if (deviceChangeEventList.Count == 0) - { - //no more events in list - UnmanagedImport.tdUnregisterCallback(registeredDeviceChangeEventFunctionId); - callbackFunctionReferenceList.Remove(registeredDeviceChangeEventFunctionId); - } - - rawListenerList.Remove(eventId); - if (rawListenerList.Count == 0) - { - //no more events in list - UnmanagedImport.tdUnregisterCallback(registeredRawListenerFunctionId); - callbackFunctionReferenceList.Remove(registeredRawListenerFunctionId); - } - } - - /// - /// Send "up" command to device. - /// Make sure the device supports this by calling tdMethods() before any calls to this function. - /// - /// The device id to send the command to - /// Success or error code - public static int tdUp(int deviceId) - { - return UnmanagedImport.tdUp(deviceId); - } - - #endregion - - - #region Private Methods - - /// - /// Convert char* to correctly encoded string, clean up received char* - /// - /// Char* to convert - /// Converted string - private static unsafe string getString(char* input) - { - return getString(input, true); - } - - /// - /// Convert char* to correctly encoded string, clean up of received char* is optional - /// - /// Char* to convert - /// Clean up char* or not (don't do that if it is still should be used somewhere) - /// Converted string - private static unsafe string getString(char* input, bool release) - { - string returnString = System.Text.Encoding.UTF8.GetString(System.Text.Encoding.Unicode.GetBytes(new string(input))); - - if (returnString.Contains("\0")) - { - returnString = returnString.Substring(0, returnString.IndexOf('\0')); - } - - if (release) - { - UnmanagedImport.tdReleaseString(input); - } - GC.Collect(); - return returnString; - } - - /// - /// Convert string to correctly encoded char* - /// - /// String to convert - /// Converted char* - private static unsafe char* stringToChar(string input) - { - input = String.Concat(input, char.MinValue); //add null terminator - byte[] inputByte = System.Text.Encoding.UTF8.GetBytes(input); - int size = Marshal.SystemDefaultCharSize * inputByte.Length; - IntPtr inputPointer = Marshal.AllocHGlobal(size); - - Marshal.Copy(inputByte, 0, inputPointer, inputByte.Length); - return (char*)inputPointer; - } - - /// - /// Event function wrapper that will call all registered event functions with C#-arguments when - /// this event function is called from telldus core, with C++-style arguments. This function will - /// be registered with telldus core when the first event callback function is added. - /// - /// Id of affected device - /// Method that was executed on device - /// Optional data that was sent to the method (e.g. dim value) - /// Callback event id - /// Context (optional) - /// 0 - private unsafe void deviceEventFunction(int deviceId, int method, char* data, int callbackId, void* context) - { - foreach (DeviceEventFunctionContext deviceEventFuncContext in deviceEventList.Values) - { - deviceEventFuncContext.eventCallbackFunc(deviceId, method, getString(data, false), deviceEventFuncContext.callbackId, deviceEventFuncContext.context); - GC.Collect(); - } - } - - - /// - /// Event function wrapper that will call all registered device change event functions with C#-arguments when - /// this device change event function is called from telldus core, with C++-style arguments. This function will - /// be registered with telldus core when the first device change event callback function is added. - /// - /// Id of affected device - /// Method that was executed, TELLSTICK_DEVICE_ADDED, TELLSTICK_DEVICE_CHANGED, TELLSTICK_DEVICE_REMOVED, TELLSTICK_DEVICE_STATE_CHANGED - /// Type of change TELLSTICK_CHANGE_NAME, TELLSTICK_CHANGE_PROTOCOL, TELLSTICK_CHANGE_MODEL - /// Callback event id - /// Context (optional) - /// 0 - private unsafe void deviceChangeEventFunction(int deviceId, int changeEvent, int changeType, int callbackId, void* context) - { - foreach (DeviceChangeEventFunctionContext deviceChangeEventFuncContext in deviceChangeEventList.Values) - { - deviceChangeEventFuncContext.changeEventCallbackFunc(deviceId, changeEvent, changeType, deviceChangeEventFuncContext.callbackId, deviceChangeEventFuncContext.context); - GC.Collect(); - } - } - - /// - /// Event function wrapper that will call all registered listening functions with C#-arguments when - /// this listening function is called from telldus core, with C++-style arguments. This function will - /// be registered with telldus core when the first listening callback function is added. - /// - /// Received data - /// Id of receiving controller - /// Callback event id - /// Context (optional) - /// 0 - private unsafe void rawListeningFunction(char* data, int controllerId, int callbackId, void* context) - { - foreach (RawEventFunctionContext rawListeningFuncContext in rawListenerList.Values) - { - rawListeningFuncContext.rawCallbackFunc(getString(data, false), controllerId, rawListeningFuncContext.callbackId, rawListeningFuncContext.context); - GC.Collect(); - } - } - - #endregion - } -} diff --git a/bindings/dotnet/TelldusNETWrapper/TelldusNETWrapper.csproj b/bindings/dotnet/TelldusNETWrapper/TelldusNETWrapper.csproj deleted file mode 100644 index 6ed93111..00000000 --- a/bindings/dotnet/TelldusNETWrapper/TelldusNETWrapper.csproj +++ /dev/null @@ -1,56 +0,0 @@ - - - - Debug - AnyCPU - 9.0.30729 - 2.0 - {675C494F-7D3B-4F6F-AB7A-98BA9E2B2B43} - Library - Properties - TelldusNETWrapper - TelldusNETWrapper - v2.0 - 512 - - - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - true - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/bindings/dotnet/TelldusNETWrapper/TelldusNETWrapper.sln b/bindings/dotnet/TelldusNETWrapper/TelldusNETWrapper.sln deleted file mode 100644 index 28bb73d2..00000000 --- a/bindings/dotnet/TelldusNETWrapper/TelldusNETWrapper.sln +++ /dev/null @@ -1,20 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 10.00 -# Visual Studio 2008 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TelldusNETWrapper", "TelldusNETWrapper.csproj", "{675C494F-7D3B-4F6F-AB7A-98BA9E2B2B43}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {675C494F-7D3B-4F6F-AB7A-98BA9E2B2B43}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {675C494F-7D3B-4F6F-AB7A-98BA9E2B2B43}.Debug|Any CPU.Build.0 = Debug|Any CPU - {675C494F-7D3B-4F6F-AB7A-98BA9E2B2B43}.Release|Any CPU.ActiveCfg = Release|Any CPU - {675C494F-7D3B-4F6F-AB7A-98BA9E2B2B43}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/bindings/dotnet/TelldusNETWrapper/TelldusNETWrapper.suo b/bindings/dotnet/TelldusNETWrapper/TelldusNETWrapper.suo deleted file mode 100644 index 61636ea2..00000000 Binary files a/bindings/dotnet/TelldusNETWrapper/TelldusNETWrapper.suo and /dev/null differ diff --git a/bindings/dotnet/TelldusNETWrapper/app.config b/bindings/dotnet/TelldusNETWrapper/app.config deleted file mode 100644 index b7db2817..00000000 --- a/bindings/dotnet/TelldusNETWrapper/app.config +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/bindings/dotnet/example/BasicListDevicesNetExample.zip b/bindings/dotnet/example/BasicListDevicesNetExample.zip deleted file mode 100644 index d2e7b2bf..00000000 Binary files a/bindings/dotnet/example/BasicListDevicesNetExample.zip and /dev/null differ diff --git a/bindings/dotnet/example/BasicTurnOnDeviceNetExample.zip b/bindings/dotnet/example/BasicTurnOnDeviceNetExample.zip deleted file mode 100644 index e3444ac5..00000000 Binary files a/bindings/dotnet/example/BasicTurnOnDeviceNetExample.zip and /dev/null differ diff --git a/bindings/java/example/test.java b/bindings/java/example/test.java deleted file mode 100644 index 068ab743..00000000 --- a/bindings/java/example/test.java +++ /dev/null @@ -1,98 +0,0 @@ -import java.io.*; - -class test -{ - tellstick TS = new tellstick(); - - public void run() { - try { - BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); - - int nbrDevices = TS.devGetNumberOfDevices(); - for (int i = 0; i < nbrDevices; i++) { - int id = TS.devGetDeviceId(i); - String deviceName = TS.devGetName(id); - System.out.println(id + "\t" + deviceName); - } - - System.out.print("Enter a device: "); - int device = Integer.parseInt(in.readLine()); - process(device); - - } catch (IOException e) { - } - } - - private void process(int device) { - try { - BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); - int methods = TS.devMethods(device); - if ((methods & TS.TELLSTICK_TURNON) > 0) { - System.out.println(TS.TELLSTICK_TURNON + "\tTurn on"); - } - if ((methods & TS.TELLSTICK_TURNOFF) > 0) { - System.out.println(TS.TELLSTICK_TURNOFF + "\tTurn off"); - } - if ((methods & TS.TELLSTICK_BELL) > 0) { - System.out.println(TS.TELLSTICK_BELL + "\tBell"); - } - if ((methods & TS.TELLSTICK_DIM) > 0) { - System.out.println(TS.TELLSTICK_DIM + "\tDim"); - } - System.out.println("What do you want to do?"); - int action = Integer.parseInt(in.readLine()); - if ( (action & methods) == 0 ) { - System.out.println("The device doesn't support this method"); - return; - } - - if ((action & TS.TELLSTICK_TURNON) > 0) { - turnOn(device); - } else if ((action & TS.TELLSTICK_TURNOFF) > 0) { - turnOff(device); - } else if ((action & TS.TELLSTICK_BELL) > 0) { - bell(device); - } else if ((action & TS.TELLSTICK_DIM) > 0) { - dim(device); - } - - } catch (IOException e) { - } - } - - private void turnOn(int device) { - System.out.println("Turning on " + TS.devGetName(device)); - TS.devTurnOn(device); - } - - private void turnOff(int device) { - System.out.println("Turning off " + TS.devGetName(device)); - TS.devTurnOff(device); - } - - private void bell(int device) { - System.out.println("Sending bell to " + TS.devGetName(device)); - TS.devBell(device); - } - - private void dim(int device) { - try { - BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); - System.out.print("Select level (0-255): "); - int level = Integer.parseInt(in.readLine()); - if (level >= 256 || level < 0) { - System.out.println("Out of range"); - } - System.out.println("Dim " + TS.devGetName(device)); - TS.devDim(device, level); - } catch (IOException e) { - } - } - - public static void main(String[] args) - { - test t = new test(); - t.run(); - } - -} \ No newline at end of file diff --git a/bindings/java/tellstick.c b/bindings/java/tellstick.c deleted file mode 100644 index 29b633dc..00000000 --- a/bindings/java/tellstick.c +++ /dev/null @@ -1,60 +0,0 @@ -/*tellstick.c*/ -#include "tellstick.h" -#include -#include - -JNIEXPORT jboolean JNICALL -Java_tellstick_devTurnOn(JNIEnv *, jobject, jint intDeviceId) -{ - return (jboolean) devTurnOn( (int)intDeviceId); -} - - -JNIEXPORT jboolean JNICALL -Java_tellstick_devTurnOff(JNIEnv *, jobject, jint intDeviceId) -{ - return (jboolean) devTurnOff( (int)intDeviceId); -} - - -JNIEXPORT jboolean JNICALL -Java_tellstick_devBell(JNIEnv *, jobject, jint intDeviceId) -{ - return (jboolean) devBell( (int)intDeviceId); -} - - -JNIEXPORT jboolean JNICALL -Java_tellstick_devDim(JNIEnv *, jobject, jint intDeviceId, jint level) -{ - return (jboolean) devDim( (int)intDeviceId, (unsigned char) level); -} - - -JNIEXPORT jint JNICALL -Java_tellstick_devMethods(JNIEnv *, jobject, jint intDeviceId) -{ - return (jint) devMethods( (int)intDeviceId ); -} - - -JNIEXPORT jint JNICALL -Java_tellstick_devGetNumberOfDevices(JNIEnv *, jobject) -{ - return (jint)devGetNumberOfDevices(); -} - - -JNIEXPORT jint JNICALL -Java_tellstick_devGetDeviceId(JNIEnv *, jobject, jint intDeviceIndex) -{ - return (jint)devGetDeviceId( (int)intDeviceIndex ); -} - - -JNIEXPORT jstring JNICALL -Java_tellstick_devGetName(JNIEnv *env, jobject, jint intDeviceId) -{ - const char *name = devGetName( (int)intDeviceId ); - return env->NewStringUTF(name); -} diff --git a/bindings/java/tellstick.h b/bindings/java/tellstick.h deleted file mode 100644 index cde08d2e..00000000 --- a/bindings/java/tellstick.h +++ /dev/null @@ -1,77 +0,0 @@ -/* DO NOT EDIT THIS FILE - it is machine generated */ -#include -/* Header for class tellstick */ - -#ifndef _Included_tellstick -#define _Included_tellstick -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: tellstick - * Method: devTurnOn - * Signature: (I)Z - */ -JNIEXPORT jboolean JNICALL Java_tellstick_devTurnOn - (JNIEnv *, jobject, jint); - -/* - * Class: tellstick - * Method: devTurnOff - * Signature: (I)Z - */ -JNIEXPORT jboolean JNICALL Java_tellstick_devTurnOff - (JNIEnv *, jobject, jint); - -/* - * Class: tellstick - * Method: devBell - * Signature: (I)Z - */ -JNIEXPORT jboolean JNICALL Java_tellstick_devBell - (JNIEnv *, jobject, jint); - -/* - * Class: tellstick - * Method: devDim - * Signature: (II)Z - */ -JNIEXPORT jboolean JNICALL Java_tellstick_devDim - (JNIEnv *, jobject, jint, jint); - -/* - * Class: tellstick - * Method: devMethods - * Signature: (I)I - */ -JNIEXPORT jint JNICALL Java_tellstick_devMethods - (JNIEnv *, jobject, jint); - -/* - * Class: tellstick - * Method: devGetNumberOfDevices - * Signature: ()I - */ -JNIEXPORT jint JNICALL Java_tellstick_devGetNumberOfDevices - (JNIEnv *, jobject); - -/* - * Class: tellstick - * Method: devGetDeviceId - * Signature: (I)I - */ -JNIEXPORT jint JNICALL Java_tellstick_devGetDeviceId - (JNIEnv *, jobject, jint); - -/* - * Class: tellstick - * Method: devGetName - * Signature: (I)Ljava/lang/String; - */ -JNIEXPORT jstring JNICALL Java_tellstick_devGetName - (JNIEnv *, jobject, jint); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/bindings/java/tellstick.java b/bindings/java/tellstick.java deleted file mode 100644 index c3325db9..00000000 --- a/bindings/java/tellstick.java +++ /dev/null @@ -1,27 +0,0 @@ -//firstJNI.java - -public class tellstick -{ - public final int TELLSTICK_TURNON = 1; - public final int TELLSTICK_TURNOFF = 2; - public final int TELLSTICK_BELL = 4; - public final int TELLSTICK_DIM = 16; - - public native boolean devTurnOn(int intDeviceId); - public native boolean devTurnOff(int intDeviceId); - public native boolean devBell(int intDeviceId); - public native boolean devDim(int intDeviceId, int level); - public native int devMethods(int intDeviceId); - - public native int devGetNumberOfDevices(); - public native int devGetDeviceId(int intDeviceIndex); - - public native String devGetName(int intDeviceId); - - static { - System.loadLibrary("tellstickJNI"); - } - - -} - diff --git a/bindings/php/config.m4 b/bindings/php/config.m4 deleted file mode 100644 index e4078683..00000000 --- a/bindings/php/config.m4 +++ /dev/null @@ -1,42 +0,0 @@ -PHP_ARG_ENABLE(telldus, whether to enable Telldus TellStick support, -[ --enable-telldus Enable Telldus TellStick support]) - -if test "$PHP_TELLDUS" = "yes"; then - AC_DEFINE(HAVE_TELLDUS, 1, [Whether you have Telldus TellStick]) - - SEARCH_PATH="/usr/local /usr" - SEARCH_FOR="/include/telldus-core.h" - if test -r $PHP_TELLDUS/; then # path given as parameter - TELLDUS_DIR=$PHP_TELLDUS - else # search default path list - AC_MSG_CHECKING([for telldus files in default path]) - for i in $SEARCH_PATH ; do - if test -r $i/$SEARCH_FOR; then - TELLDUS_DIR=$i - AC_MSG_RESULT(found in $i) - fi - done - fi - if test -z "$TELLDUS_DIR"; then - AC_MSG_RESULT([not found]) - AC_MSG_ERROR([Please reinstall the telldus-core distribution]) - fi - # --enable-telldus -> add include path - PHP_ADD_INCLUDE($TELLDUS_DIR/include) - # --enable-telldus -> check for lib and symbol presence - LIBNAME=telldus-core - LIBSYMBOL=tdGetNumberOfDevices - PHP_CHECK_LIBRARY($LIBNAME,$LIBSYMBOL, - [ - PHP_ADD_LIBRARY_WITH_PATH($LIBNAME, $TELLDUS_DIR/lib, TELLDUS_SHARED_LIBADD) - AC_DEFINE(HAVE_TELLDUSLIB,1,[ ]) - ],[ - AC_MSG_ERROR([wrong telldus lib version or lib not found]) - ],[ - -L$TELLDUS_DIR/lib -lm - ]) - PHP_SUBST(TELLDUS_SHARED_LIBADD) - - PHP_NEW_EXTENSION(telldus, telldus.c, $ext_shared) -fi - diff --git a/bindings/php/example/example.php b/bindings/php/example/example.php deleted file mode 100644 index ed7e092c..00000000 --- a/bindings/php/example/example.php +++ /dev/null @@ -1,43 +0,0 @@ - - - -static function_entry telldus_functions[] = { - PHP_FE(tdInit, NULL) - PHP_FE(tdClose, NULL) - - PHP_FE(tdTurnOn, NULL) - PHP_FE(tdTurnOff, NULL) - PHP_FE(tdBell, NULL) - PHP_FE(tdDim, NULL) - PHP_FE(tdLearn, NULL) - PHP_FE(tdMethods, NULL) - PHP_FE(tdLastSentCommand, NULL) - PHP_FE(tdLastSentValue, NULL) - - PHP_FE(tdGetNumberOfDevices, NULL) - PHP_FE(tdGetDeviceId, NULL) - PHP_FE(tdGetDeviceType, NULL) - - PHP_FE(tdGetErrorString, NULL) - - PHP_FE(tdGetName, NULL) - PHP_FE(tdSetName, NULL) - PHP_FE(tdGetProtocol, NULL) - PHP_FE(tdSetProtocol, NULL) - PHP_FE(tdGetModel, NULL) - PHP_FE(tdSetModel, NULL) - - PHP_FE(tdGetDeviceParameter, NULL) - PHP_FE(tdSetDeviceParameter, NULL) - - PHP_FE(tdAddDevice, NULL) - PHP_FE(tdRemoveDevice, NULL) - - PHP_FE(tdSendRawCommand, NULL) - - {NULL, NULL, NULL} -}; - -zend_module_entry telldus_module_entry = { -#if ZEND_MODULE_API_NO >= 20010901 - STANDARD_MODULE_HEADER, -#endif - PHP_TELLDUS_EXTNAME, - telldus_functions, - PHP_MINIT(telldus), - PHP_MSHUTDOWN(telldus), - PHP_RINIT(telldus), - NULL, - NULL, -#if ZEND_MODULE_API_NO >= 20010901 - PHP_TELLDUS_VERSION, -#endif - STANDARD_MODULE_PROPERTIES -}; - -#ifdef COMPILE_DL_TELLDUS - ZEND_GET_MODULE(telldus) -#endif - - -PHP_RINIT_FUNCTION(telldus) -{ - return SUCCESS; -} - -PHP_MINIT_FUNCTION(telldus) -{ - REGISTER_LONG_CONSTANT("TELLSTICK_TURNON", TELLSTICK_TURNON, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("TELLSTICK_TURNOFF", TELLSTICK_TURNOFF, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("TELLSTICK_BELL", TELLSTICK_BELL, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("TELLSTICK_TOGGLE", TELLSTICK_TOGGLE, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("TELLSTICK_DIM", TELLSTICK_DIM, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("TELLSTICK_LEARN", TELLSTICK_LEARN, CONST_CS | CONST_PERSISTENT); - - REGISTER_LONG_CONSTANT("TELLSTICK_SUCCESS", TELLSTICK_SUCCESS, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("TELLSTICK_ERROR_NOT_FOUND", TELLSTICK_ERROR_NOT_FOUND, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("TELLSTICK_ERROR_PERMISSION_DENIED", TELLSTICK_ERROR_PERMISSION_DENIED, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("TELLSTICK_ERROR_DEVICE_NOT_FOUND", TELLSTICK_ERROR_DEVICE_NOT_FOUND, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("TELLSTICK_ERROR_METHOD_NOT_SUPPORTED", TELLSTICK_ERROR_METHOD_NOT_SUPPORTED, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("TELLSTICK_ERROR_COMMUNICATION", TELLSTICK_ERROR_COMMUNICATION, CONST_CS | CONST_PERSISTENT); - //REGISTER_LONG_CONSTANT("TELLSTICK_ERROR_CONNECTING_SERVICE", TELLSTICK_ERROR_CONNECTING_SERVICE, CONST_CS | CONST_PERSISTENT); - //REGISTER_LONG_CONSTANT("TELLSTICK_ERROR_UNKNOWN_RESPONSE", TELLSTICK_ERROR_UNKNOWN_RESPONSE, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("TELLSTICK_ERROR_UNKNOWN", TELLSTICK_ERROR_UNKNOWN, CONST_CS | CONST_PERSISTENT); - - REGISTER_LONG_CONSTANT("TELLSTICK_TYPE_DEVICE", TELLSTICK_TYPE_DEVICE, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("TELLSTICK_TYPE_GROUP", TELLSTICK_TYPE_GROUP, CONST_CS | CONST_PERSISTENT); - - return SUCCESS; -} - -PHP_MSHUTDOWN_FUNCTION(telldus) -{ - return SUCCESS; -} - -PHP_FUNCTION(tdInit) -{ - tdInit(); - RETURN_NULL(); -} - -PHP_FUNCTION(tdClose) -{ - tdClose(); - RETURN_NULL(); -} - -PHP_FUNCTION(tdTurnOn) -{ - long id; - - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &id) == FAILURE) { - RETURN_NULL(); - } - - RETURN_BOOL( tdTurnOn( id ) ); -} - -PHP_FUNCTION(tdTurnOff) -{ - long id; - - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &id) == FAILURE) { - RETURN_NULL(); - } - - RETURN_BOOL( tdTurnOff( id ) ); -} - -PHP_FUNCTION(tdBell) -{ - long id; - - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &id) == FAILURE) { - RETURN_NULL(); - } - - RETURN_BOOL( tdBell( id ) ); -} - -PHP_FUNCTION(tdDim) -{ - long id; - long level; - - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ll", &id, &level) == FAILURE) { - RETURN_NULL(); - } - if (level < 0 || level > 255) { - RETURN_NULL(); - } - - RETURN_BOOL( tdDim( id, level ) ); -} - -PHP_FUNCTION(tdLearn) -{ - long id; - - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &id) == FAILURE) { - RETURN_NULL(); - } - - RETURN_BOOL( tdLearn( id ) ); -} - -PHP_FUNCTION(tdMethods) -{ - long id; - long supportedMethods; - long methods; - - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ll", &id, &supportedMethods) == FAILURE) { - RETURN_NULL(); - } - - methods = tdMethods( id, supportedMethods ); - RETURN_LONG(methods); -} - -PHP_FUNCTION(tdLastSentCommand) -{ - long id; - long supportedMethods; - long command; - - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ll", &id, &supportedMethods) == FAILURE) { - RETURN_NULL(); - } - - command = tdLastSentCommand( id, supportedMethods ); - RETURN_LONG(command); -} - -PHP_FUNCTION(tdLastSentValue) -{ - long id; - char *value, *retval; - - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &id) == FAILURE) { - RETURN_NULL(); - } - - value = tdLastSentValue( id ); - retval = estrdup(value); - tdReleaseString(value); - RETURN_STRING(retval, 0); -} - -PHP_FUNCTION(tdGetNumberOfDevices) -{ - int nbr = tdGetNumberOfDevices(); - RETURN_LONG(nbr); -} - -PHP_FUNCTION(tdGetDeviceId) -{ - long index; - - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &index) == FAILURE) { - RETURN_LONG(0); - } - - RETURN_LONG( tdGetDeviceId( index ) ); -} - -PHP_FUNCTION(tdGetDeviceType) -{ - long id; - - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &id) == FAILURE) { - RETURN_LONG(0); - } - - RETURN_LONG( tdGetDeviceType( id ) ); -} - -PHP_FUNCTION(tdGetErrorString) -{ - long errorNo; - char *errorString, *retval; - - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &errorNo) == FAILURE) { - RETURN_NULL(); - } - - errorString = tdGetErrorString( errorNo ); - retval = estrdup(errorString); - tdReleaseString(errorString); - RETURN_STRING( retval, 0 ); -} - -PHP_FUNCTION(tdGetName) -{ - long id; - char *name, *retval; - - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &id) == FAILURE) { - RETURN_NULL(); - } - - name = tdGetName( id ); - retval = estrdup(name); - tdReleaseString(name); - RETURN_STRING( retval, 0 ); -} - -PHP_FUNCTION(tdSetName) -{ - long id; - char *name; - int nameLen; - - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ls", &id, &name, &nameLen) == FAILURE) { - RETURN_FALSE; - } - - RETURN_BOOL( tdSetName( id, name ) ); -} - -PHP_FUNCTION(tdGetProtocol) -{ - long id; - char *protocol, *retval; - - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &id) == FAILURE) { - RETURN_NULL(); - } - - protocol = tdGetProtocol( id ); - retval = estrdup(protocol); - tdReleaseString(protocol); - RETURN_STRING( retval, 0 ); -} - -PHP_FUNCTION(tdSetProtocol) -{ - long id; - char *protocol; - int protocolLen; - - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ls", &id, &protocol, &protocolLen) == FAILURE) { - RETURN_FALSE; - } - - RETURN_BOOL( tdSetProtocol( id, protocol ) ); -} - -PHP_FUNCTION(tdGetModel) -{ - long id; - char *model, *retval; - - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &id) == FAILURE) { - RETURN_NULL(); - } - - model = tdGetModel( id ); - retval = estrdup(model); - tdReleaseString(model); - RETURN_STRING( retval, 0 ); -} - -PHP_FUNCTION(tdSetModel) -{ - long id; - char *model; - int modelLen; - - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ls", &id, &model, &modelLen) == FAILURE) { - RETURN_FALSE; - } - - RETURN_BOOL( tdSetModel( id, model ) ); -} - -PHP_FUNCTION(tdGetDeviceParameter) -{ - long id; - char *param, *name, *defaultValue, *retval; - int nameLen, defaultValueLen; - - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "lss", &id, &name, &nameLen, &defaultValue, &defaultValueLen) == FAILURE) { - RETURN_NULL(); - } - - param = tdGetDeviceParameter( id, name, defaultValue ); - retval = estrdup(param); - tdReleaseString(param); - RETURN_STRING( retval, 0 ); -} - -PHP_FUNCTION(tdSetDeviceParameter) -{ - long id; - char *name, *value; - int nameLen, valueLen; - - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "lss", &id, &name, &nameLen, &value, &valueLen) == FAILURE) { - RETURN_FALSE; - } - - RETURN_BOOL( tdSetDeviceParameter( id, name, value ) ); -} - -PHP_FUNCTION(tdAddDevice) -{ - RETURN_LONG(tdAddDevice()); -} - -PHP_FUNCTION(tdRemoveDevice) -{ - long deviceId; - - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &deviceId) == FAILURE) { - RETURN_FALSE; - } - - RETURN_BOOL(tdRemoveDevice(deviceId)); -} - -PHP_FUNCTION(tdSendRawCommand) -{ - char *command; - int commandLen; - long reserved = 0; - - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|l", &command, &commandLen, &reserved) == FAILURE) { - RETURN_FALSE; - } - - RETURN_LONG(tdSendRawCommand(command, reserved)); -} diff --git a/bindings/python/native/MANIFEST.in b/bindings/python/native/MANIFEST.in deleted file mode 100644 index 9a264a7a..00000000 --- a/bindings/python/native/MANIFEST.in +++ /dev/null @@ -1,3 +0,0 @@ -include telldus.c -include telldus-core.h -recursive-include example/* diff --git a/bindings/python/native/example/__init__.py b/bindings/python/native/example/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/bindings/python/native/example/basic.py b/bindings/python/native/example/basic.py deleted file mode 100644 index f8fef675..00000000 --- a/bindings/python/native/example/basic.py +++ /dev/null @@ -1,47 +0,0 @@ - -import telldus -import time - -telldus.tdInit() -devices = telldus.tdGetNumberOfDevices() -print "Devices: %d\n" % devices - -allMethods = telldus.TELLSTICK_TURNON | telldus.TELLSTICK_TURNOFF | telldus.TELLSTICK_BELL | telldus.TELLSTICK_DIM - -for i in xrange(devices): - deviceid = telldus.tdGetDeviceId(i) - - if deviceid: - name = telldus.tdGetName(deviceid) - - print "%s - %s\n" % (deviceid, name) - - methods = telldus.tdMethods(deviceid, allMethods) - - if methods & telldus.TELLSTICK_TURNON: - print " * TurnOn\n" - telldus.tdTurnOn(deviceid) - time.sleep(1) - - if methods & telldus.TELLSTICK_TURNOFF: - print " * TurnOff\n" - telldus.tdTurnOff(deviceid) - time.sleep(1) - - if methods & telldus.TELLSTICK_BELL: - print " * Bell\n" - telldus.tdBell(deviceid) - time.sleep(1) - - if methods & telldus.TELLSTICK_TOGGLE: - print " * Toggle\n" - - if methods & telldus.TELLSTICK_DIM: - print " * Dim\n" - telldus.tdDim(deviceid, 128) - time.sleep(1) - -telldus.tdClose() - - - diff --git a/bindings/python/native/example/callback.py b/bindings/python/native/example/callback.py deleted file mode 100644 index ca5f6b8d..00000000 --- a/bindings/python/native/example/callback.py +++ /dev/null @@ -1,38 +0,0 @@ -import threading -import telldus -import time - -telldus.tdInit() - -def turnOn(): - print "turning on" - telldus.tdTurnOn(1) - -def turnOff(): - print "turning off" - telldus.tdTurnOff(1) - -def callback(deviceId, method, value, callbackId): - print "callback" - print "DeviceId: %i Method: %i Value: %s" % (deviceId, method, value) - return True - -#function to be called when device event occurs, even for unregistered devices -def rawcallback(data, controllerId, callbackId): - print "raw callback" - print "Data: %s ControllerId: %i" % (data, controllerId) - return True - -callbackid = telldus.tdRegisterDeviceEvent(callback) -rawcallbackid = telldus.tdRegisterRawDeviceEvent(rawcallback) - -print callbackid, rawcallbackid - -try: - while(1): - time.sleep(0.5) #don't exit -except KeyboardInterrupt: - print "Exiting" - telldus.tdUnregisterCallback(callbackid) - telldus.tdUnregisterCallback(rawcallbackid) - telldus.tdClose() diff --git a/bindings/python/native/example/poll.py b/bindings/python/native/example/poll.py deleted file mode 100644 index 088882c2..00000000 --- a/bindings/python/native/example/poll.py +++ /dev/null @@ -1,28 +0,0 @@ -import telldus - -telldus.tdInit() - -while True: - result = telldus.tdSensor() - if not isinstance(result, tuple): - break - else: - protocol, model, sensorId, dataTypes = result - print "Protocol: %s,\tModel: %s,\tSensorId: %i\nDataTypes: %i" % (protocol, model, sensorId, dataTypes) - - # Retrieve the values the sensor supports - if dataTypes & telldus.TELLSTICK_TEMPERATURE: - result = telldus.tdSensorValue(protocol, model, sensorId, telldus.TELLSTICK_TEMPERATURE) - if isinstance(result, tuple): - value, timestamp = result - print "Temperature:\t%sC\t(%s)\n" % (value, str(timestamp)) - - if dataTypes & telldus.TELLSTICK_HUMIDITY: - result = telldus.tdSensorValue(protocol, model, sensorId, telldus.TELLSTICK_HUMIDITY) - if isinstance(result, tuple): - value, timestamp = result - print "Humidity:\t%s\t(%s)\n" % (value, str(timestamp)) - - print "\n" - -telldus.tdClose() diff --git a/bindings/python/native/setup.py b/bindings/python/native/setup.py deleted file mode 100644 index 19e0c7fa..00000000 --- a/bindings/python/native/setup.py +++ /dev/null @@ -1,345 +0,0 @@ -import sys -from distutils.core import setup, Extension - -DEBUG = True - -PLATFORM_IS_WINDOWS = sys.platform.lower().startswith('win') - -if PLATFORM_IS_WINDOWS: - - __doc__="""This is a distutils setup-script for the telldus extension - - To build the telldus extensions, simply execute: - python setup.py -q build - or - python setup.py -q install - to build and install into your current Python installation. - - These extensions require a number of libraries to build, some of which may - require you to install special SDKs or toolkits. This script will attempt - to build as many as it can, and at the end of the build will report any - extension modules that could not be built and why. - - This has got complicated due to the various different versions of - Visual Studio used - some VS versions are not compatible with some SDK - versions. Below are the Windows SDK versions required (and the URL - although - these are subject to being changed by MS at any time:) - - Python 2.6+: - - Build using Microsoft Visual Studio 2008 Express Edition: - http://www.microsoft.com/en-us/download/details.aspx?id=6506 - http://jenshuebel.wordpress.com/2009/02/12/visual-c-2008-express-edition-and-64-bit-targets/ - http://www.cppblog.com/Files/xcpp/VCE64BIT_WIN7SDK.zip - - For 32bit build: - Microsoft Windows SDK for Windows 7 and .NET Framework 3.5 - http://www.microsoft.com/downloads/en/details.aspx?FamilyID=6b6c21d2-2006-4afa-9702-529fa782d63b - Copy C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\vcvars32.bat to - C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\vcvarsall.bat - - For 64bit build: - Microsoft Windows SDK for Windows 7 and .NET Framework 3.5 SP1 (ISO) GRMSDKX_EN_DVD.iso - http://www.microsoft.com/en-us/download/details.aspx?id=18950 - Copy C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\vcvars64.bat to - C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\vcvarsall.bat - - Python 2.3->2.5: - - Microsoft Windows Software Development Kit Update for Windows Vista (version 6.0) - http://www.microsoft.com/downloads/en/details.aspx?FamilyID=4377f86d-c913-4b5c-b87e-ef72e5b4e065 - ** If you want to build Python 2.3, be sure to install the SDK compilers - too - although we don't use them, this setup option installs some .lib - files we do need. - ** - - If you multiple SDK versions on a single machine, set the MSSDK environment - variable to point at the one you want to use. Note that using the SDK for - a particular platform (eg, Windows 7) doesn't force you to use that OS as your - build environment. If the links above don't work, use google to find them. - - Building: - --------- - - To install the telldus extension, execute: - python setup.py -q install - - This will install the built extensions into your site-packages directory, - create an appropriate .pth file, and should leave everything ready to use. - There is no need to modify the registry. - - To build or install debug (_d) versions of these extensions, ensure you have - built or installed a debug version of Python itself, then pass the "--debug" - flag to the build command - eg: - python setup.py -q build --debug - or to build and install a debug version: - python setup.py -q build --debug install - - To build 64bit versions of this: - - * py2.5 and earlier - sorry, I've given up in disgust. Using VS2003 with - the Vista SDK is just too painful to make work, and VS2005 is not used for - any released versions of Python. See revision 1.69 of this file for the - last version that attempted to support and document this process. - - * 2.6 and later: On a 64bit OS, just build as you would on a 32bit platform. - On a 32bit platform (ie, to cross-compile), you must use VS2008 to - cross-compile Python itself. Note that by default, the 64bit tools are not - installed with VS2008, so you may need to adjust your VS2008 setup (see "For 64bit build"). Then - use: - vcs - setup.py build --plat-name=win-amd64 - - see the distutils cross-compilation documentation for more details. - """ - # Originally by Thomas Heller, started in 2000 or so. - import os - import shutil - - is_py3k = sys.version_info > (3,) # get this out of the way early on... - # We have special handling for _winreg so our setup3.py script can avoid - # using the 'imports' fixer and therefore start much faster... - if is_py3k: - import winreg as _winreg - else: - import _winreg - - try: - from distutils import log - except ImportError: - class Log: - def debug(self, msg, *args): - print msg % args - def info(self, msg, *args): - print msg % args - log = Log() - - try: - this_file = __file__ - except NameError: - this_file = sys.argv[0] - - this_file = os.path.abspath(this_file) - # We get upset if the cwd is not our source dir, but it is a PITA to - # insist people manually CD there first! - if os.path.dirname(this_file): - os.chdir(os.path.dirname(this_file)) - - - # We need to know the platform SDK dir before we can list the extensions. - def find_platform_sdk_dir(): - # Finding the Platform SDK install dir is a treat. There can be some - # dead ends so we only consider the job done if we find the "windows.h" - # landmark. - landmark = "include\\windows.h" - # 1. The use might have their current environment setup for the - # SDK, in which case the "MSSdk" env var is set. - sdkdir = os.environ.get("MSSdk") - if sdkdir: - if DEBUG: - print "PSDK: try %%MSSdk%%: '%s'" % sdkdir - if os.path.isfile(os.path.join(sdkdir, landmark)): - return sdkdir - # 2. The "Install Dir" value in the - # HKLM\Software\Microsoft\MicrosoftSDK\Directories registry key - # sometimes points to the right thing. However, after upgrading to - # the "Platform SDK for Windows Server 2003 SP1" this is dead end. - try: - key = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, - r"Software\Microsoft\MicrosoftSDK\Directories") - sdkdir, ignore = _winreg.QueryValueEx(key, "Install Dir") - except EnvironmentError: - pass - else: - if DEBUG: - print r"PSDK: try 'HKLM\Software\Microsoft\MicrosoftSDK"\ - "\Directories\Install Dir': '%s'" % sdkdir - if os.path.isfile(os.path.join(sdkdir, landmark)): - return sdkdir - # 3. Each installed SDK (not just the platform SDK) seems to have GUID - # subkey of HKLM\Software\Microsoft\MicrosoftSDK\InstalledSDKs and - # it *looks* like the latest installed Platform SDK will be the - # only one with an "Install Dir" sub-value. - try: - key = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, - r"Software\Microsoft\MicrosoftSDK\InstalledSDKs") - i = 0 - while True: - guid = _winreg.EnumKey(key, i) - guidkey = _winreg.OpenKey(key, guid) - try: - sdkdir, ignore = _winreg.QueryValueEx(guidkey, "Install Dir") - except EnvironmentError: - pass - else: - if DEBUG: - print r"PSDK: try 'HKLM\Software\Microsoft\MicrosoftSDK"\ - "\InstallSDKs\%s\Install Dir': '%s'"\ - % (guid, sdkdir) - if os.path.isfile(os.path.join(sdkdir, landmark)): - return sdkdir - i += 1 - except EnvironmentError: - pass - # 4. Vista's SDK - try: - key = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, - r"Software\Microsoft\Microsoft SDKs\Windows") - sdkdir, ignore = _winreg.QueryValueEx(key, "CurrentInstallFolder") - except EnvironmentError: - pass - else: - if DEBUG: - print r"PSDK: try 'HKLM\Software\Microsoft\MicrosoftSDKs"\ - "\Windows\CurrentInstallFolder': '%s'" % sdkdir - if os.path.isfile(os.path.join(sdkdir, landmark)): - return sdkdir - - # 5. Failing this just try a few well-known default install locations. - progfiles = os.environ.get("ProgramFiles", r"C:\Program Files") - defaultlocs = [ - os.path.join(progfiles, "Microsoft Platform SDK"), - os.path.join(progfiles, "Microsoft SDK"), - ] - for sdkdir in defaultlocs: - if DEBUG: - print "PSDK: try default location: '%s'" % sdkdir - if os.path.isfile(os.path.join(sdkdir, landmark)): - return sdkdir - - - # Some nasty hacks to prevent most of our extensions using a manifest, as - # the manifest - even without a reference to the CRT assembly - is enough - # to prevent the extension from loading. For more details, see - # http://bugs.python.org/issue7833 - that issue has a patch, but it is - # languishing and will probably never be fixed for Python 2.6... - if sys.version_info > (2,6): - from distutils.spawn import spawn - from distutils.msvc9compiler import MSVCCompiler - MSVCCompiler._orig_spawn = MSVCCompiler.spawn - MSVCCompiler._orig_link = MSVCCompiler.link - - # We need to override this method for versions where issue7833 *has* landed - # (ie, 2.7 and 3.2+) - def manifest_get_embed_info(self, target_desc, ld_args): - _want_assembly_kept = getattr(self, '_want_assembly_kept', False) - if not _want_assembly_kept: - return None - for arg in ld_args: - if arg.startswith("/MANIFESTFILE:"): - orig_manifest = arg.split(":", 1)[1] - if target_desc==self.EXECUTABLE: - rid = 1 - else: - rid = 2 - return orig_manifest, rid - return None - # always monkeypatch it in even though it will only be called in 2.7 - # and 3.2+. - MSVCCompiler.manifest_get_embed_info = manifest_get_embed_info - - def monkeypatched_spawn(self, cmd): - is_link = cmd[0].endswith("link.exe") or cmd[0].endswith('"link.exe"') - is_mt = cmd[0].endswith("mt.exe") or cmd[0].endswith('"mt.exe"') - _want_assembly_kept = getattr(self, '_want_assembly_kept', False) - if not _want_assembly_kept and is_mt: - # We don't want mt.exe run... - return - if not _want_assembly_kept and is_link: - # remove /MANIFESTFILE:... and add MANIFEST:NO - # (but note that for winxpgui, which specifies a manifest via a - # .rc file, this is ignored by the linker - the manifest specified - # in the .rc file is still added) - for i in range(len(cmd)): - if cmd[i].startswith("/MANIFESTFILE:"): - cmd[i] = "/MANIFEST:NO" - break - if _want_assembly_kept and is_mt: - # We want mt.exe run with the original manifest - for i in range(len(cmd)): - if cmd[i] == "-manifest": - cmd[i+1] = cmd[i+1] + ".orig" - break - self._orig_spawn(cmd) - if _want_assembly_kept and is_link: - # We want a copy of the original manifest so we can use it later. - for i in range(len(cmd)): - if cmd[i].startswith("/MANIFESTFILE:"): - mfname = cmd[i][14:] - shutil.copyfile(mfname, mfname + ".orig") - break - - def monkeypatched_link(self, target_desc, objects, output_filename, *args, **kw): - # no manifests for 3.3+ - self._want_assembly_kept = sys.version_info < (3,3) and \ - (os.path.basename(output_filename).startswith("PyISAPI_loader.dll") or \ - os.path.basename(output_filename).startswith("perfmondata.dll") or \ - os.path.basename(output_filename).startswith("win32ui.pyd") or \ - target_desc==self.EXECUTABLE) - try: - return self._orig_link(target_desc, objects, output_filename, *args, **kw) - finally: - delattr(self, '_want_assembly_kept') - MSVCCompiler.spawn = monkeypatched_spawn - MSVCCompiler.link = monkeypatched_link - - def find_telldus_dev_dir(): - landmark = "telldus-core.h" - dev_dir = os.environ.get("TELLDUS_DEVDIR") - if dev_dir: - if DEBUG: - print "Telldus dev dir:" % dev_dir - if os.path.isfile(os.path.join(dev_dir, landmark)): - return dev_dir - - progfiles = os.environ.get("ProgramFiles", r"C:\Program Files") - defaultlocs = [ - os.path.join(progfiles + ' (x86)', "Telldus", "Development"), - os.path.join(progfiles, "Telldus", "Development"), - ] - for dev_dir in defaultlocs: - if DEBUG: - print "Telldus dev dir: '%s'" % dev_dir - if os.path.isfile(os.path.join(dev_dir, landmark)): - return dev_dir - if DEBUG: - print "Telldus dev dir not found, make sure dev code is installed. Or set TELLDUS_DEVDIR." - - sdk_dir = find_platform_sdk_dir() - sdk_include_dir = os.path.join(sdk_dir, 'Include') - - telldus_dev_dir = find_telldus_dev_dir() - telldus_platform = os.environ.get("TELLDUS_PLATFORM", 'x86_64') - telldus_library_dir = os.path.join(telldus_dev_dir, telldus_platform) - - include_dirs = [sdk_include_dir, telldus_dev_dir] - library_dirs = [telldus_library_dir] - libraries = ['python%i%i' % (sys.version_info[0], sys.version_info[1]) , 'TelldusCore'] - define_macros = [('_WINDOWS', 1)] - -else: - include_dirs = ['/usr/include', '/usr/local/include'] - library_dirs = ['/usr/lib', '/usr/local/lib'] - libraries = ['telldus-core'] - define_macros = [] - -define_macros.extend([('DATA_LENGTH', 20), ('CALLBACK_LENGTH', 20)]) - -telldus = Extension( - 'telldus', - include_dirs = include_dirs, - libraries = libraries, - library_dirs = library_dirs, - define_macros = define_macros, - sources = ['telldus.c'] -) - -setup( - name = 'telldus', - version = '1.0', - description = 'Python bindings for telldus', - author='Oyvind Saltvik', - author_email='oyvind.saltvik@gmail.com', - url='http://github.com/fivethreeo/telldus/', - ext_modules = [telldus] -) diff --git a/bindings/python/native/telldus.c b/bindings/python/native/telldus.c deleted file mode 100644 index a96fe51d..00000000 --- a/bindings/python/native/telldus.c +++ /dev/null @@ -1,843 +0,0 @@ -#include "Python.h" -#include "datetime.h" -#include -#include - -/* estrdup.c -- duplicate a string, die if error - * - * char *string; - * char *newstring; - * newstring = estrdup(string); - * - * estrdup returns a copy of its argument, located in memory - * allocated from the heap. If it is unable to allocate the - * necessary memory, estrdup executes PyErr_NoMemory(); - * (Generally, the routine error is not expected to return, - * but if it does, estrdup will return NULL.) -*/ - -int callbackLen = 0; - -typedef struct { - PyObject *func; - int callbackId; -} callbackInfo; - -static callbackInfo callbackList[CALLBACK_LENGTH]; - -void -addCallback(PyObject *func, int callbackId) -{ - if (callbackLen < CALLBACK_LENGTH) { - callbackList[callbackLen].func = func; - callbackList[callbackLen].callbackId = callbackId; - callbackLen++; - } -} - -void -removeCallback(int callbackId) -{ - int index = -1; - - int i; - int j; - - for (i = 0; i < callbackLen; i++) - { - if (callbackList[i].callbackId == callbackId) - { - index = i; - } - } - if (!(index == -1)) { - for (j = index; j < callbackLen - 1; j++) - { - callbackList[j] = callbackList[j+1]; - } - callbackLen--; - } -} - -int -hasCallback(int callbackId) -{ - int i; - - for (i = 0; i < callbackLen; i++) - { - if (callbackList[i].callbackId == callbackId) - { - return 1; - } - } - return 0; - -} - -PyObject * -getCallback(int callbackId) -{ - int i; - - for (i = 0; i < callbackLen; i++) - { - if (callbackList[i].callbackId == callbackId) - { - return callbackList[i].func; - } - } - return NULL; -} - -char * -estrdup(char *s) -{ - register char *t; - - if (NULL == (t = malloc(strlen(s)+1))) { - PyErr_NoMemory(); - return NULL; - } - strcpy(t, s); - return(t); -} - -static PyObject * -telldus_tdInit(PyObject *self) -{ - tdInit(); - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject * -telldus_tdClose(PyObject *self) -{ - tdClose(); - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject * -telldus_tdTurnOn(PyObject *self, PyObject *args) -{ - long id; - - if (!PyArg_ParseTuple(args, "l", &id)) - return NULL; - - return PyLong_FromLong((long) tdTurnOn(id)); -} - -static PyObject * -telldus_tdTurnOff(PyObject *self, PyObject *args) -{ - long id; - - if (!PyArg_ParseTuple(args, "l", &id)) - return NULL; - - return PyLong_FromLong((long) tdTurnOff(id)); -} - -static PyObject * -telldus_tdBell(PyObject *self, PyObject *args) -{ - long id; - - if (!PyArg_ParseTuple(args, "l", &id)) - return NULL; - - return PyLong_FromLong((long) tdBell(id)); -} - -static PyObject * -telldus_tdDim(PyObject *self, PyObject *args) -{ - long id; - unsigned char level; - - if (!PyArg_ParseTuple(args, "lb", &id, &level)) - return NULL; - - if (level < 0 || level > 255) - return NULL; - - return PyLong_FromLong((long) tdDim(id, level)); -} - -static PyObject * -telldus_tdLearn(PyObject *self, PyObject *args) -{ - long id; - - if (!PyArg_ParseTuple(args, "l", &id)) - return NULL; - - return PyLong_FromLong((long) tdLearn(id)); -} - -static PyObject * -telldus_tdMethods(PyObject *self, PyObject *args) -{ - long id; - long supportedmethods; - - if (!PyArg_ParseTuple(args, "ll", &id, &supportedmethods)) - return NULL; - - return PyLong_FromLong((long) tdMethods(id, supportedmethods)); -} - - -static PyObject * -telldus_tdLastSentCommand(PyObject *self, PyObject *args) -{ - long id; - long supportedmethods; - - if (!PyArg_ParseTuple(args, "ll", &id, &supportedmethods)) - return NULL; - - return PyLong_FromLong((long) tdLastSentCommand(id, supportedmethods)); -} - -static PyObject * -telldus_tdLastSentValue(PyObject *self, PyObject *args) -{ - long id; - char* value; - char* retval; - - if (!PyArg_ParseTuple(args, "l", &id)) - return NULL; - - value = tdLastSentValue(id); - retval = estrdup(value); - tdReleaseString(value); - return PyString_FromString(retval); -} - -static PyObject * -telldus_tdGetNumberOfDevices(PyObject *self) -{ - return PyLong_FromLong((long) tdGetNumberOfDevices()); -} - -static PyObject * -telldus_tdGetDeviceId(PyObject *self, PyObject *args) -{ - long index; - - if (!PyArg_ParseTuple(args, "l", &index)) - return NULL; - - return PyLong_FromLong((long) tdGetDeviceId(index)); -} - -static PyObject * -telldus_tdGetDeviceType(PyObject *self, PyObject *args) -{ - long id; - - if (!PyArg_ParseTuple(args, "l", &id)) - return NULL; - - return PyLong_FromLong((long) tdGetDeviceType(id)); -} - -static PyObject * -telldus_tdGetErrorString(PyObject *self, PyObject *args) -{ - long errorno; - char* errorString; - char* retval; - - if (!PyArg_ParseTuple(args, "l", &errorno)) - return NULL; - - errorString = tdGetErrorString(errorno); - retval = estrdup(errorString); - tdReleaseString(errorString); - return PyString_FromString(retval); -} - -static PyObject * -telldus_tdGetName(PyObject *self, PyObject *args) -{ - long id; - char* name; - char* retval; - - if (!PyArg_ParseTuple(args, "l", &id)) - return NULL; - - name = tdGetName(id); - retval = estrdup(name); - tdReleaseString(name); - return PyString_FromString(retval); -} - -static PyObject * -telldus_tdSetName(PyObject *self, PyObject *args) -{ - long id; - char* name; - - if (!PyArg_ParseTuple(args, "ls", &id, &name)) - return NULL; - - return PyLong_FromLong((long) tdSetName(id, name)); -} - -static PyObject * -telldus_tdGetProtocol(PyObject *self, PyObject *args) -{ - long id; - char* protocol; - char* retval; - - if (!PyArg_ParseTuple(args, "l", &id)) - return NULL; - - protocol = tdGetProtocol(id); - retval = estrdup(protocol); - tdReleaseString(protocol); - return PyString_FromString(retval); -} - -static PyObject * -telldus_tdSetProtocol(PyObject *self, PyObject *args) -{ - long id; - char* protocol; - - if (!PyArg_ParseTuple(args, "ls", &id, &protocol)) - return NULL; - - return PyLong_FromLong((long) tdSetProtocol(id, protocol)); - -} - -static PyObject * -telldus_tdGetModel(PyObject *self, PyObject *args) -{ - long id; - char* model; - char* retval; - - if (!PyArg_ParseTuple(args, "l", &id)) - return NULL; - - model = tdGetModel(id); - retval = estrdup(model); - tdReleaseString(model); - return PyString_FromString(retval); -} - -static PyObject * -telldus_tdSetModel(PyObject *self, PyObject *args) -{ - long id; - char* model; - - if (!PyArg_ParseTuple(args, "ls", &id, &model)) - return NULL; - - return PyLong_FromLong((long) tdSetProtocol(id, model)); - -} - -static PyObject * -telldus_tdGetDeviceParameter(PyObject *self, PyObject *args) -{ - long id; - char* name; - char* defaultValue; - char* param; - char* retval; - - if (!PyArg_ParseTuple(args, "lss", &id, &name, &defaultValue)) - return NULL; - - param = tdGetDeviceParameter(id, name, defaultValue); - retval = estrdup(param); - tdReleaseString(param); - return PyString_FromString(retval); -} - -static PyObject * -telldus_tdSetDeviceParameter(PyObject *self, PyObject *args) -{ - long id; - char* name; - char* value; - - if (!PyArg_ParseTuple(args, "lss", &id, &name, &value)) - return NULL; - - return PyLong_FromLong((long) tdSetDeviceParameter(id, name, value)); -} - -static PyObject * -telldus_tdAddDevice(PyObject *self) -{ - return PyLong_FromLong((long) tdAddDevice()); -} - -static PyObject * -telldus_tdRemoveDevice(PyObject *self, PyObject *args) -{ - long id; - - if (!PyArg_ParseTuple(args, "l", &id)) - return NULL; - - return PyLong_FromLong((long) tdRemoveDevice(id)); -} - -static PyObject * -telldus_tdSendRawCommand(PyObject *self, PyObject *args) -{ - char *command; - long reserved = 0; - - if (!PyArg_ParseTuple(args, "s|l", &command, &reserved)); - return NULL; - - return PyLong_FromLong((long) tdSendRawCommand(command, reserved)); -} - -static PyObject *DeviceEventCallback = NULL; - -void -telldus_deviceEventCallback(int deviceId, int method, const char *data, int callbackId, int context) -{ - - PyObject * result; - PyGILState_STATE gstate = PyGILState_Ensure(); - - // now call the Python callback function - result = PyObject_CallFunction(DeviceEventCallback, "llsl", deviceId, method, data, callbackId); - - if (result == NULL) { - // something went wrong so print to stderr - PyErr_Print(); - } - - // take care of reference handling - Py_XDECREF(result); - - PyGILState_Release(gstate); - - return; -} - -static PyObject * -telldus_tdRegisterDeviceEvent(PyObject *self, PyObject *args) -{ - - int result; - PyObject *func; - - if (!PyArg_ParseTuple(args, "O:tdRegisterDeviceEvent", &func)) { - PyErr_SetString(PyExc_StandardError, "Parse error!"); - return NULL; - } - - if (!PyCallable_Check(func)) { - // Error - PyErr_SetString(PyExc_StandardError, "The object should be callable!"); - return NULL; - } - - Py_XDECREF(DeviceEventCallback); - // stick around till we need you - Py_XINCREF(func); - - DeviceEventCallback = func; - - result = tdRegisterDeviceEvent((TDDeviceEvent) &telldus_deviceEventCallback, 0); - - addCallback(func, result); - - return PyLong_FromLong((long) result); -} - -static PyObject *DeviceChangeEventCallback = NULL; - -void -telldus_deviceChangeEventCallback(int deviceId, int changeEvent, int changeType, int callbackId, int context) -{ - PyObject * result; - PyGILState_STATE gstate = PyGILState_Ensure(); - - // now call the Python callback function - result = PyObject_CallFunction(DeviceChangeEventCallback, "llll", deviceId, changeEvent, changeType, callbackId); - - if (result == NULL) { - // something went wrong so print to stderr - PyErr_Print(); - } - - // take care of reference handling - Py_XDECREF(result); - - PyGILState_Release(gstate); - - return; -} - -static PyObject * -telldus_tdRegisterDeviceChangeEvent(PyObject *self, PyObject *args) -{ - int result; - PyObject *func; - - if (!PyArg_ParseTuple(args, "O", &func)) { - PyErr_SetString(PyExc_StandardError, "Parse error!"); - return NULL; - } - - if (!PyCallable_Check(func)) { - // Error - PyErr_SetString(PyExc_StandardError, "The object should be callable!"); - return NULL; - } - - Py_XDECREF(DeviceChangeEventCallback); - // stick around till we need you - Py_XINCREF(func); - - DeviceChangeEventCallback = func; - - result = tdRegisterDeviceChangeEvent((TDDeviceChangeEvent) &telldus_deviceChangeEventCallback, 0); - - addCallback(func, result); - - return PyLong_FromLong((long) result); -} - -static PyObject *RawDeviceEventCallback = NULL; - -void -telldus_rawDeviceEventCallback(const char *data, int controllerId, int callbackId, int context) -{ - PyObject * result; - PyGILState_STATE gstate = PyGILState_Ensure(); - - // now call the Python callback function - result = PyObject_CallFunction(RawDeviceEventCallback, "sll", data, controllerId, callbackId); - - if (result == NULL) { - // something went wrong so print to stderr - PyErr_Print(); - } - - // take care of reference handling - Py_XDECREF(result); - - PyGILState_Release(gstate); - - return; -} - -static PyObject * -telldus_tdRegisterRawDeviceEvent(PyObject *self, PyObject *args) -{ - int result; - PyObject *func; - - if (!PyArg_ParseTuple(args, "O", &func)) { - PyErr_SetString(PyExc_StandardError, "Parse error!"); - return NULL; - } - - if (!PyCallable_Check(func)) { - // Error - PyErr_SetString(PyExc_StandardError, "The object should be callable!"); - return NULL; - } - - Py_XDECREF(RawDeviceEventCallback); - // stick around till we need you - Py_XINCREF(func); - - RawDeviceEventCallback = func; - - result = tdRegisterRawDeviceEvent((TDRawDeviceEvent) &telldus_rawDeviceEventCallback, 0); - - addCallback(func, result); - - return PyLong_FromLong((long) result); -} - -static PyObject *SensorEventCallback = NULL; - -void -telldus_sensorEventCallback(const char *protocol, const char *model, int id, int dataType, const char *value, int timestamp, int callbackId, int context) -{ - PyObject * result; - PyGILState_STATE gstate = PyGILState_Ensure(); - - // now call the Python callback function - result = PyObject_CallFunction(SensorEventCallback, "ssllsll", protocol, model, id, dataType, value, timestamp, callbackId); - - if (result == NULL) { - // something went wrong so print to stderr - PyErr_Print(); - } - - // take care of reference handling - Py_XDECREF(result); - - PyGILState_Release(gstate); - - return; -} - -static PyObject * -telldus_tdRegisterSensorEvent(PyObject *self, PyObject *args) -{ - int result; - PyObject *func; - - if (!PyArg_ParseTuple(args, "O", &func)) { - PyErr_SetString(PyExc_StandardError, "Parse error!"); - return NULL; - } - - if (!PyCallable_Check(func)) { - // Error - PyErr_SetString(PyExc_StandardError, "The object should be callable!"); - return NULL; - } - - Py_XDECREF(SensorEventCallback); - // stick around till we need you - Py_XINCREF(func); - - SensorEventCallback = func; - - result = tdRegisterSensorEvent((TDSensorEvent) &telldus_sensorEventCallback, 0); - - addCallback(func, result); - - return PyLong_FromLong((long) result); -} - -static PyObject * -telldus_tdUnregisterCallback(PyObject *self, PyObject *args) -{ - long id; - PyObject *callback; - - if (!PyArg_ParseTuple(args, "l", &id)) - return NULL; - - if (hasCallback(id) == 1) { - callback = getCallback(id); - Py_DECREF(callback); - removeCallback(id); - } - - return PyLong_FromLong((long) tdUnregisterCallback(id)); -} - -static PyObject * -telldus_tdSensor(PyObject *self, PyObject *args) -{ - char protocol[DATA_LENGTH]; - char model[DATA_LENGTH]; - long sensorId = 0; - long dataTypes = 0; - - long result; - - result = tdSensor(protocol, DATA_LENGTH, model, DATA_LENGTH, &sensorId, &dataTypes); - - if (result == TELLSTICK_SUCCESS) - { - return Py_BuildValue("ssll", protocol, model, sensorId, dataTypes); - } - else - { - return PyLong_FromLong(result); - } - -} - -static PyObject * -telldus_tdSensorValue(PyObject *self, PyObject *args) -{ - char protocol[DATA_LENGTH]; - char model[DATA_LENGTH]; - long sensorId = 0; - long dataType = 0; - char value[DATA_LENGTH]; - long timestamp = 0; - long result; - - PyObject *floatObj = NULL; - PyObject *timeTuple = NULL; - PyObject *dateTime = NULL; - - - if (!PyArg_ParseTuple(args, "ssll", &protocol, &model, &sensorId, &dataType)) - return NULL; - - result = tdSensorValue(protocol, model, sensorId, dataType, value, DATA_LENGTH, ×tamp); - - if (result == TELLSTICK_SUCCESS) - { - - floatObj = PyFloat_FromDouble((double) timestamp); - timeTuple = Py_BuildValue("(O)", floatObj); - dateTime = PyDateTime_FromTimestamp(timeTuple); - - Py_DECREF(floatObj); - Py_DECREF(timeTuple); - - return Py_BuildValue("sO", value, dateTime); - } - else - { - return PyLong_FromLong(result); - } -} - -static PyMethodDef telldus_methods[] = { - {"tdInit", (PyCFunction) telldus_tdInit, METH_NOARGS, "Initiate telldus."}, - {"tdClose", (PyCFunction) telldus_tdClose, METH_NOARGS, "Close telldus."}, - {"tdTurnOn", (PyCFunction) telldus_tdTurnOn, METH_VARARGS, "Turn on device."}, - {"tdTurnOff", (PyCFunction) telldus_tdTurnOff, METH_VARARGS, "Turn off device."}, - {"tdBell", (PyCFunction) telldus_tdBell, METH_VARARGS, "Bell device."}, - {"tdDim", (PyCFunction) telldus_tdDim, METH_VARARGS, "Dim device."}, - {"tdLearn", (PyCFunction) telldus_tdLearn, METH_VARARGS, "Learn device."}, - {"tdMethods", (PyCFunction) telldus_tdMethods, METH_VARARGS, "Methods comment."}, - {"tdLastSentCommand", (PyCFunction) telldus_tdLastSentCommand, METH_VARARGS, "LastSentCommand comment."}, - {"tdLastSentValue", (PyCFunction) telldus_tdLastSentValue, METH_VARARGS, "LastSentValue comment."}, - {"tdGetNumberOfDevices", (PyCFunction) telldus_tdGetNumberOfDevices, METH_VARARGS, "GetNumberOfDevices comment."}, - {"tdGetDeviceId", (PyCFunction) telldus_tdGetDeviceId, METH_VARARGS, "GetDeviceId comment."}, - {"tdGetDeviceType", (PyCFunction) telldus_tdGetDeviceType, METH_VARARGS, "GetDeviceType comment."}, - {"tdGetErrorString", (PyCFunction) telldus_tdGetErrorString, METH_VARARGS, "GetErrorString comment."}, - {"tdGetName", (PyCFunction) telldus_tdGetName, METH_VARARGS, "GetName comment."}, - {"tdSetName", (PyCFunction) telldus_tdSetName, METH_VARARGS, "SetName comment."}, - {"tdGetProtocol", (PyCFunction) telldus_tdGetProtocol, METH_VARARGS, "GetProtocol comment."}, - {"tdSetProtocol", (PyCFunction) telldus_tdSetProtocol, METH_VARARGS, "SetProtocol comment."}, - {"tdGetModel", (PyCFunction) telldus_tdGetModel, METH_VARARGS, "GetModel comment."}, - {"tdSetModel", (PyCFunction) telldus_tdSetModel, METH_VARARGS, "SetModel comment."}, - {"tdGetDeviceParameter", (PyCFunction) telldus_tdGetDeviceParameter, METH_VARARGS, "GetDeviceParameter comment."}, - {"tdSetDeviceParameter", (PyCFunction) telldus_tdSetDeviceParameter, METH_VARARGS, "SetDeviceParameter comment."}, - {"tdAddDevice", (PyCFunction) telldus_tdAddDevice, METH_NOARGS, "AddDevice comment."}, - {"tdRemoveDevice", (PyCFunction) telldus_tdRemoveDevice, METH_VARARGS, "RemoveDevice comment."}, - {"tdSendRawCommand", (PyCFunction) telldus_tdSendRawCommand, METH_VARARGS, "SendRawCommand comment."}, - - {"tdRegisterDeviceEvent", (PyCFunction) telldus_tdRegisterDeviceEvent, METH_VARARGS, "RegisterDeviceEvent comment."}, - {"tdRegisterDeviceChangeEvent", (PyCFunction) telldus_tdRegisterDeviceChangeEvent, METH_VARARGS, "RegisterDeviceChangeEvent comment."}, - {"tdRegisterRawDeviceEvent", (PyCFunction) telldus_tdRegisterRawDeviceEvent, METH_VARARGS, "RegisterRawDeviceEvent comment."}, - {"tdRegisterSensorEvent", (PyCFunction) telldus_tdRegisterSensorEvent, METH_VARARGS, "RegisterSensorEvent comment."}, - {"tdUnregisterCallback", (PyCFunction) telldus_tdUnregisterCallback, METH_VARARGS, "UnregisterCallback comment."}, - {"tdSensor", (PyCFunction) telldus_tdSensor, METH_NOARGS, "Sensor comment."}, - {"tdSensorValue", (PyCFunction) telldus_tdSensorValue, METH_VARARGS, "SensorValue comment."}, - - {NULL, NULL, 0, NULL} /* sentinel */ -}; - -void -inittelldus(void) -{ - PyObject *module; - - PyObject *TELLSTICK_TURNON_GLUE; - PyObject *TELLSTICK_TURNOFF_GLUE; - PyObject *TELLSTICK_BELL_GLUE; - PyObject *TELLSTICK_TOGGLE_GLUE; - PyObject *TELLSTICK_DIM_GLUE; - PyObject *TELLSTICK_LEARN_GLUE; - PyObject *TELLSTICK_SUCCESS_GLUE; - PyObject *TELLSTICK_ERROR_NOT_FOUND_GLUE; - PyObject *TELLSTICK_ERROR_PERMISSION_DENIED_GLUE; - PyObject *TELLSTICK_ERROR_DEVICE_NOT_FOUND_GLUE; - PyObject *TELLSTICK_ERROR_METHOD_NOT_SUPPORTED_GLUE; - PyObject *TELLSTICK_ERROR_COMMUNICATION_GLUE; - PyObject *TELLSTICK_ERROR_UNKNOWN_GLUE; - PyObject *TELLSTICK_TYPE_DEVICE_GLUE; - PyObject *TELLSTICK_TYPE_GROUP_GLUE; - PyObject *TELLSTICK_TEMPERATURE_GLUE; - PyObject *TELLSTICK_HUMIDITY_GLUE; - - /* Create the module and add the functions */ - - module = Py_InitModule("telldus", telldus_methods); - - TELLSTICK_TURNON_GLUE = PyLong_FromLong((long) TELLSTICK_TURNON); - PyObject_SetAttrString(module, "TELLSTICK_TURNON", TELLSTICK_TURNON_GLUE); - Py_DECREF(TELLSTICK_TURNON_GLUE); - - TELLSTICK_TURNOFF_GLUE = PyLong_FromLong((long) TELLSTICK_TURNOFF); - PyObject_SetAttrString(module, "TELLSTICK_TURNOFF", TELLSTICK_TURNOFF_GLUE); - Py_DECREF(TELLSTICK_TURNOFF_GLUE); - - TELLSTICK_BELL_GLUE = PyLong_FromLong((long) TELLSTICK_BELL); - PyObject_SetAttrString(module, "TELLSTICK_BELL", TELLSTICK_BELL_GLUE); - Py_DECREF(TELLSTICK_BELL_GLUE); - - TELLSTICK_TOGGLE_GLUE = PyLong_FromLong((long) TELLSTICK_TOGGLE); - PyObject_SetAttrString(module, "TELLSTICK_TOGGLE", TELLSTICK_TOGGLE_GLUE); - Py_DECREF(TELLSTICK_TOGGLE_GLUE); - - TELLSTICK_DIM_GLUE = PyLong_FromLong((long) TELLSTICK_DIM); - PyObject_SetAttrString(module, "TELLSTICK_DIM", TELLSTICK_DIM_GLUE); - Py_DECREF(TELLSTICK_DIM_GLUE); - - TELLSTICK_LEARN_GLUE = PyLong_FromLong((long) TELLSTICK_LEARN); - PyObject_SetAttrString(module, "TELLSTICK_LEARN", TELLSTICK_LEARN_GLUE); - Py_DECREF(TELLSTICK_LEARN_GLUE); - - TELLSTICK_SUCCESS_GLUE = PyLong_FromLong((long) TELLSTICK_SUCCESS); - PyObject_SetAttrString(module, "TELLSTICK_SUCCESS", TELLSTICK_SUCCESS_GLUE); - Py_DECREF(TELLSTICK_SUCCESS_GLUE); - - TELLSTICK_ERROR_NOT_FOUND_GLUE = PyLong_FromLong((long) TELLSTICK_ERROR_NOT_FOUND); - PyObject_SetAttrString(module, "TELLSTICK_ERROR_NOT_FOUND", TELLSTICK_ERROR_NOT_FOUND_GLUE); - Py_DECREF(TELLSTICK_ERROR_NOT_FOUND_GLUE); - - TELLSTICK_ERROR_PERMISSION_DENIED_GLUE = PyLong_FromLong((long) TELLSTICK_ERROR_PERMISSION_DENIED); - PyObject_SetAttrString(module, "TELLSTICK_ERROR_PERMISSION_DENIED", TELLSTICK_ERROR_PERMISSION_DENIED_GLUE); - Py_DECREF(TELLSTICK_ERROR_PERMISSION_DENIED_GLUE); - - TELLSTICK_ERROR_DEVICE_NOT_FOUND_GLUE = PyLong_FromLong((long) TELLSTICK_ERROR_DEVICE_NOT_FOUND); - PyObject_SetAttrString(module, "TELLSTICK_ERROR_DEVICE_NOT_FOUND", TELLSTICK_ERROR_DEVICE_NOT_FOUND_GLUE); - Py_DECREF(TELLSTICK_ERROR_DEVICE_NOT_FOUND_GLUE); - - TELLSTICK_ERROR_METHOD_NOT_SUPPORTED_GLUE = PyLong_FromLong((long) TELLSTICK_ERROR_METHOD_NOT_SUPPORTED); - PyObject_SetAttrString(module, "TELLSTICK_ERROR_METHOD_NOT_SUPPORTED", TELLSTICK_ERROR_METHOD_NOT_SUPPORTED_GLUE); - Py_DECREF(TELLSTICK_ERROR_METHOD_NOT_SUPPORTED_GLUE); - - TELLSTICK_ERROR_COMMUNICATION_GLUE = PyLong_FromLong((long) TELLSTICK_ERROR_COMMUNICATION); - PyObject_SetAttrString(module, "TELLSTICK_ERROR_COMMUNICATION", TELLSTICK_ERROR_COMMUNICATION_GLUE); - Py_DECREF(TELLSTICK_ERROR_COMMUNICATION_GLUE); - - TELLSTICK_ERROR_UNKNOWN_GLUE = PyLong_FromLong((long) TELLSTICK_ERROR_UNKNOWN); - PyObject_SetAttrString(module, "TELLSTICK_ERROR_UNKNOWN", TELLSTICK_ERROR_UNKNOWN_GLUE); - Py_DECREF(TELLSTICK_ERROR_UNKNOWN_GLUE); - - TELLSTICK_TYPE_DEVICE_GLUE = PyLong_FromLong((long) TELLSTICK_TYPE_DEVICE); - PyObject_SetAttrString(module, "TELLSTICK_TYPE_DEVICE", TELLSTICK_TYPE_DEVICE_GLUE); - Py_DECREF(TELLSTICK_TYPE_DEVICE_GLUE); - - TELLSTICK_TYPE_GROUP_GLUE = PyLong_FromLong((long) TELLSTICK_TYPE_GROUP); - PyObject_SetAttrString(module, "TELLSTICK_TYPE_GROUP", TELLSTICK_TYPE_GROUP_GLUE); - Py_DECREF(TELLSTICK_TYPE_GROUP_GLUE); - - TELLSTICK_TEMPERATURE_GLUE = PyLong_FromLong((long) TELLSTICK_TEMPERATURE); - PyObject_SetAttrString(module, "TELLSTICK_TEMPERATURE", TELLSTICK_TEMPERATURE_GLUE); - Py_DECREF(TELLSTICK_TEMPERATURE_GLUE); - - TELLSTICK_HUMIDITY_GLUE = PyLong_FromLong((long) TELLSTICK_HUMIDITY); - PyObject_SetAttrString(module, "TELLSTICK_HUMIDITY", TELLSTICK_HUMIDITY_GLUE); - Py_DECREF(TELLSTICK_HUMIDITY_GLUE); - -} diff --git a/bindings/swig/tellduscore.i b/bindings/swig/tellduscore.i deleted file mode 100644 index 9a4296b2..00000000 --- a/bindings/swig/tellduscore.i +++ /dev/null @@ -1,6 +0,0 @@ -%module tellduscore -%{ -#include "../../telldus-core/driver/libtelldus-core/telldus-core.h" -%} - -%include "../../telldus-core/driver/libtelldus-core/telldus-core.h" diff --git a/bindings/visual-basic/TellStick.bas b/bindings/visual-basic/TellStick.bas deleted file mode 100644 index 558c266f..00000000 --- a/bindings/visual-basic/TellStick.bas +++ /dev/null @@ -1,17 +0,0 @@ -Attribute VB_Name = "TellStickModule" -Public Declare Function devTurnOn Lib "TellUsbD101.dll" (ByVal lngDeviceId As Long) As Boolean -Public Declare Function devTurnOff Lib "TellUsbD101.dll" (ByVal lngDeviceId As Long) As Boolean -Public Declare Function devBell Lib "TellUsbD101.dll" (ByVal lngDeviceId As Long) As Boolean -Public Declare Function devDim Lib "TellUsbD101.dll" (ByVal lngDeviceId As Long, ByVal level As Byte) As Boolean -Public Declare Function devMethods Lib "TellUsbD101.dll" (ByVal lngDeviceId As Long) As Long - -Public Declare Function devGetDeviceId Lib "TellUsbD101.dll" (ByVal a As Long) As Long -Public Declare Function devGetName Lib "TellUsbD101.dll" (ByVal i As Long) As String -Public Declare Function devGetNumberOfDevices Lib "TellUsbD101.dll" () As Long - -Public Const TELLSTICK_TURNON = 1 -Public Const TELLSTICK_TURNOFF = 2 -Public Const TELLSTICK_BELL = 4 -Public Const TELLSTICK_TOGGLE = 8 -Public Const TELLSTICK_DIM = 16 - diff --git a/bindings/visual-basic/example/TellStick VB-example - simple.frm b/bindings/visual-basic/example/TellStick VB-example - simple.frm deleted file mode 100644 index 04aa7196..00000000 --- a/bindings/visual-basic/example/TellStick VB-example - simple.frm +++ /dev/null @@ -1,212 +0,0 @@ -VERSION 5.00 -Begin VB.Form frmMain - BorderStyle = 4 'Fixed ToolWindow - Caption = "TellStick VB-example - simple" - ClientHeight = 4680 - ClientLeft = 2040 - ClientTop = 3600 - ClientWidth = 3990 - Icon = "TellStick VB-example - simple.frx":0000 - LinkTopic = "Form1" - MaxButton = 0 'False - MinButton = 0 'False - ScaleHeight = 4680 - ScaleWidth = 3990 - ShowInTaskbar = 0 'False - Begin VB.CommandButton cmdDim - Caption = "90%" - Height = 465 - Index = 8 - Left = 3480 - TabIndex = 12 - Top = 4110 - Width = 420 - End - Begin VB.CommandButton cmdDim - Caption = "80%" - Height = 465 - Index = 7 - Left = 3060 - TabIndex = 11 - Top = 4110 - Width = 420 - End - Begin VB.CommandButton cmdDim - Caption = "70%" - Height = 465 - Index = 6 - Left = 2640 - TabIndex = 10 - Top = 4110 - Width = 420 - End - Begin VB.CommandButton cmdDim - Caption = "60%" - Height = 465 - Index = 5 - Left = 2220 - TabIndex = 9 - Top = 4110 - Width = 420 - End - Begin VB.CommandButton cmdDim - Caption = "50%" - Height = 465 - Index = 4 - Left = 1800 - TabIndex = 8 - Top = 4110 - Width = 420 - End - Begin VB.CommandButton cmdDim - Caption = "40%" - Height = 465 - Index = 3 - Left = 1380 - TabIndex = 7 - Top = 4110 - Width = 420 - End - Begin VB.CommandButton cmdDim - Caption = "30%" - Height = 465 - Index = 2 - Left = 960 - TabIndex = 6 - Top = 4110 - Width = 420 - End - Begin VB.CommandButton cmdDim - Caption = "20%" - Height = 465 - Index = 1 - Left = 540 - TabIndex = 5 - Top = 4110 - Width = 420 - End - Begin VB.CommandButton cmdDim - Caption = "10%" - Height = 465 - Index = 0 - Left = 120 - TabIndex = 4 - Top = 4110 - Width = 420 - End - Begin VB.CommandButton cmdBell - Caption = "Bell" - Height = 735 - Left = 1500 - Picture = "TellStick VB-example - simple.frx":0ECA - Style = 1 'Graphical - TabIndex = 3 - Top = 3285 - Width = 1000 - End - Begin VB.ListBox deviceList - Height = 3180 - Left = 60 - TabIndex = 2 - Top = 60 - Width = 3810 - End - Begin VB.CommandButton cmdOff - Caption = "Off" - Height = 735 - Left = 120 - Picture = "TellStick VB-example - simple.frx":1794 - Style = 1 'Graphical - TabIndex = 1 - Top = 3285 - Width = 1000 - End - Begin VB.CommandButton cmdOn - Caption = "On" - Height = 735 - Left = 2900 - Picture = "TellStick VB-example - simple.frx":205E - Style = 1 'Graphical - TabIndex = 0 - Top = 3285 - Width = 1000 - End -End -Attribute VB_Name = "frmMain" -Attribute VB_GlobalNameSpace = False -Attribute VB_Creatable = False -Attribute VB_PredeclaredId = True -Attribute VB_Exposed = False -Private Sub cmdBell_Click() - Dim blnBell As Boolean - blnBell = devBell(deviceList.ItemData(deviceList.ListIndex)) -End Sub - -Private Sub cmdDim_Click(Index As Integer) - Dim blnDim As Boolean - Dim level As Byte - Select Case Index - Case "8" - level = 230 - Case "7" - level = 204 - Case "6" - level = 179 - Case "5" - level = 153 - Case "4" - level = 128 - Case "3" - level = 102 - Case "2" - level = 77 - Case "1" - level = 51 - Case "0" - level = 25 - End Select - blnDim = devDim(deviceList.ItemData(deviceList.ListIndex), level) -End Sub - -Private Sub cmdOff_Click() - Dim blnOff As Boolean - blnOff = devTurnOff(deviceList.ItemData(deviceList.ListIndex)) -End Sub - -Private Sub cmdOn_Click() - Dim blnOn As Boolean - blnOn = devTurnOn(deviceList.ItemData(deviceList.ListIndex)) -End Sub - -Private Sub deviceList_Click() - Dim intMethods As Integer - - intMethods = devMethods(deviceList.ItemData(deviceList.ListIndex)) - cmdOn.Enabled = (intMethods And TELLSTICK_TURNON) - cmdOff.Enabled = (intMethods And TELLSTICK_TURNOFF) - cmdBell.Enabled = (intMethods And TELLSTICK_BELL) - - For a = 0 To 8 - cmdDim(a).Enabled = (intMethods And TELLSTICK_DIM) - Next - -End Sub - -Private Sub Form_Load() - - Dim numDevices As Integer, i As Integer - numDevices = devGetNumberOfDevices() - - For i = 0 To numDevices - 1 - Dim strName As String - Dim intId As Integer - - intId = devGetDeviceId(i) - strName = devGetName(intId) - deviceList.AddItem strName - deviceList.ItemData(i) = intId - Next - - deviceList.ListIndex = 0 - -End Sub diff --git a/bindings/visual-basic/example/TellStick VB-example - simple.frx b/bindings/visual-basic/example/TellStick VB-example - simple.frx deleted file mode 100644 index aae19510..00000000 Binary files a/bindings/visual-basic/example/TellStick VB-example - simple.frx and /dev/null differ diff --git a/bindings/visual-basic/example/TellStick VB-example - simple.vbp b/bindings/visual-basic/example/TellStick VB-example - simple.vbp deleted file mode 100644 index d1c100ce..00000000 --- a/bindings/visual-basic/example/TellStick VB-example - simple.vbp +++ /dev/null @@ -1,36 +0,0 @@ -Type=Exe -Reference=*\G{00020430-0000-0000-C000-000000000046}#2.0#0#..\..\..\..\..\..\..\..\WINDOWS\system32\STDOLE2.TLB#OLE Automation -Form=TellStick VB-example - simple.frm -Module=TellStickModule; ..\TellStick.bas -Startup="frmMain" -HelpFile="" -ExeName32="TellStick VB-example - simple.exe" -Command32="" -Name="TellStickExample" -HelpContextID="0" -CompatibleMode="0" -MajorVer=1 -MinorVer=0 -RevisionVer=0 -AutoIncrementVer=0 -ServerSupportFiles=0 -VersionCompanyName="Telldus Technologies" -CompilationType=0 -OptimizationType=0 -FavorPentiumPro(tm)=0 -CodeViewDebugInfo=0 -NoAliasing=0 -BoundsCheck=0 -OverflowCheck=0 -FlPointCheck=0 -FDIVCheck=0 -UnroundedFP=0 -StartMode=0 -Unattended=0 -Retained=0 -ThreadPerObject=0 -MaxNumberOfThreads=1 -DebugStartupOption=0 - -[MS Transaction Server] -AutoRefresh=1 diff --git a/cruise_build.sh b/cruise_build.sh new file mode 100755 index 00000000..a0df64a1 --- /dev/null +++ b/cruise_build.sh @@ -0,0 +1,42 @@ +#!/bin/bash + + +CMAKE_LOG="$CC_BUILD_ARTIFACTS/cmake.log" + +if [ ! -d "$CC_BUILD_ARTIFACTS" ] +then + echo "CC_BUILD_ARTIFACTS does not point to a valid directory!" + exit 1 +fi + +echo -n "Preparing directories... " +test -d build || mkdir build +echo "done." + +( + echo -n "Preparing build... " + echo -n "running cmake... " + cd build +# cmake .. -DCMAKE_BUILD_TYPE=Profile > "$CMAKE_LOG" + cmake .. > "$CMAKE_LOG" +) + +if [ "$?" -ne 0 ] +then + echo "failed" + exit 1 +fi +echo "done." + + +echo "Building..." +make -C build +if [ "$?" -ne 0 ] +then + exit 1 +fi + +#Mina egna tester här + +exit 0 + diff --git a/cruise_config.rb b/cruise_config.rb new file mode 100644 index 00000000..37f803ba --- /dev/null +++ b/cruise_config.rb @@ -0,0 +1,5 @@ +Project.configure do |project| + project.email_notifier.emails = ["micke.prag@telldus.se"] + project.email_notifier.from = 'micke.prag@telldus.se' + project.build_command = './cruise_build.sh' +end diff --git a/debian/changelog b/debian/changelog new file mode 100644 index 00000000..4c8e6350 --- /dev/null +++ b/debian/changelog @@ -0,0 +1,18 @@ +telldus-core (2.0.2-1) unstable; urgency=low + + * New upstream version + + -- Micke Prag Fri, 12 Feb 2010 12:07:00 +0200 + +telldus-core (2.0.1-1) unstable; urgency=low + + * New upstream version + + -- Micke Prag Tue, 10 Nov 2009 21:55:00 +0200 + +telldus-core (2.0.0-1) unstable; urgency=low + + * Initial release (Closes: #544982) + + -- Micke Prag Thu, 03 Sep 2009 20:25:46 +0200 + diff --git a/debian/control b/debian/control new file mode 100644 index 00000000..91b36cba --- /dev/null +++ b/debian/control @@ -0,0 +1,36 @@ +Source: telldus-core +Priority: extra +Maintainer: Micke Prag +Build-Depends: debhelper (>= 7) +Standards-Version: 3.7.3 +Section: libs +Homepage: http://www.telldus.se + +Package: libtelldus-core-dev +Section: libdevel +Architecture: any +Depends: libtelldus-core2 (= ${binary:Version}) +Description: Development file for libtelldus-core + This package contains the header file needed to + compile applications that use telldus-core. + +Package: libtelldus-core2 +Section: libs +Architecture: any +Depends: ${shlibs:Depends} +Description: Library to control a Telldus TellStick + libtelldus-core is the library for controlling wireless devices by a + Telldus TellStick. + . + It makes it very easy to add home automation capabilities to a + program using a simple API. + +Package: telldus-core +Architecture: any +Depends: ${shlibs:Depends} +Description: Utilities and driver to control wireless receivers through a TellStick + TellStick from Telldus Technologies is a USB-interface to various remote + controlled RF receivers on 433,92 MHz. + . + This package contains the command line interface utilities for controling + the devices. diff --git a/debian/copyright b/debian/copyright new file mode 100644 index 00000000..93c11822 --- /dev/null +++ b/debian/copyright @@ -0,0 +1,20 @@ +This package was debianized by Micke Prag on +Thu, 03 Sep 2009 20:25:46 +0200. + +It was downloaded from http://download.telldus.se/TellStick/Software/telldus-core/ + +Upstream Author: + + Micke Prag + +Copyright: + + Copyright (C) 2009 Telldus Technologies AB + +License: + + GPL-2 + +The Debian packaging is (C) 2009, Micke Prag and +is licensed under the GPL-2, see `/usr/share/common-licenses/GPL-2'. + diff --git a/debian/libtelldus-core-dev.install b/debian/libtelldus-core-dev.install new file mode 100644 index 00000000..354b1789 --- /dev/null +++ b/debian/libtelldus-core-dev.install @@ -0,0 +1,3 @@ +usr/include/* +usr/lib/lib*.so + diff --git a/debian/libtelldus-core2.install b/debian/libtelldus-core2.install new file mode 100644 index 00000000..d0dbfd18 --- /dev/null +++ b/debian/libtelldus-core2.install @@ -0,0 +1 @@ +usr/lib/lib*.so.* diff --git a/debian/rules b/debian/rules new file mode 100755 index 00000000..b73135bc --- /dev/null +++ b/debian/rules @@ -0,0 +1,117 @@ +#!/usr/bin/make -f +# -*- makefile -*- +# Sample debian/rules that uses debhelper. +# This file was originally written by Joey Hess and Craig Small. +# As a special exception, when this file is copied by dh-make into a +# dh-make output file, you may use that output file without restriction. +# This special exception was added by Craig Small in version 0.37 of dh-make. + +# Uncomment this to turn on verbose mode. +#export DH_VERBOSE=1 + + + + + + +# shared library versions, option 1 +version=2.0.2 +major=2 +# option 2, assuming the library is created as src/.libs/libfoo.so.2.0.5 or so +#version=`ls src/.libs/lib*.so.* | \ +# awk '{if (match($$0,/[0-9]+\.[0-9]+\.[0-9]+$$/)) print substr($$0,RSTART)}'` +#major=`ls src/.libs/lib*.so.* | \ +# awk '{if (match($$0,/\.so\.[0-9]+$$/)) print substr($$0,RSTART+4)}'` + +configure: configure-stamp +configure-stamp: + dh_testdir + # Add here commands to configure the package. + + mkdir build + cd build && \ + cmake \ + -DBUILD_RFCMD=1 \ + -DBUILD_RFCMD_WITH_LIBFTDI=0 \ + -DBUILD_LIBTELLDUS-CORE=1 \ + -DBUILD_TDTOOL=1 \ + -DSUPPORT_TELLSTICK_DUO=0 \ + -DSUPPORT_USB=0 \ + -DUSE_QT_SETTINGS_BACKEND=0 \ + -DGENERATE_MAN=1 \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_CXX_FLAGS="-Wl,--as-needed" \ + .. + + touch configure-stamp + + +build: build-stamp +build-stamp: configure-stamp + dh_testdir + + # Add here commands to compile the package. + cd build && \ + $(MAKE) + + touch $@ + +clean: + dh_testdir + dh_testroot + rm -f build-stamp configure-stamp + + # Add here commands to clean up after the build process. + if test -d build; then rm -rf build;fi + + dh_clean + +install: build + dh_testdir + dh_testroot + dh_clean -k + dh_installdirs + + # Add here commands to install the package into debian/tmp + cd build && \ + $(MAKE) DESTDIR=$(CURDIR)/debian/tmp install + + +# Build architecture-independent files here. +binary-indep: build install +# We have nothing to do by default. + +# Build architecture-dependent files here. +binary-arch: build install + dh_testdir + dh_testroot + dh_installchangelogs + dh_installdocs + dh_installexamples + dh_install +# dh_installmenu +# dh_installdebconf +# dh_installlogrotate +# dh_installemacsen +# dh_installpam +# dh_installmime +# dh_installinit +# dh_installcron +# dh_installinfo + dh_installman + dh_link + dh_strip + dh_compress + dh_fixperms +# dh_perl +# dh_python + dh_makeshlibs + dh_installdeb + dh_shlibdeps + dh_gencontrol + dh_md5sums + dh_builddeb + +binary: binary-indep binary-arch +.PHONY: build clean binary-indep binary-arch binary install configure diff --git a/debian/telldus-core.install b/debian/telldus-core.install new file mode 100644 index 00000000..c7f3918e --- /dev/null +++ b/debian/telldus-core.install @@ -0,0 +1,4 @@ +usr/bin/* +usr/share/man/man1/* +etc/* + diff --git a/debian/telldus-core.postinst b/debian/telldus-core.postinst new file mode 100644 index 00000000..5b34eb56 --- /dev/null +++ b/debian/telldus-core.postinst @@ -0,0 +1,48 @@ +#!/bin/sh +# postinst script for telldus-core +# +# see: dh_installdeb(1) + +set -e + +# summary of how this script can be called: +# * `configure' +# * `abort-upgrade' +# * `abort-remove' `in-favour' +# +# * `abort-remove' +# * `abort-deconfigure' `in-favour' +# `removing' +# +# for details, see http://www.debian.org/doc/debian-policy/ or +# the debian-policy package + + +case "$1" in + configure) + chown root:plugdev /etc/tellstick.conf + chmod 664 /etc/tellstick.conf + + mkdir -p /var/state + touch /var/state/telldus-core.conf + chown root:plugdev /var/state/telldus-core.conf + chmod 666 /var/state/telldus-core.conf + ;; + + abort-upgrade|abort-remove|abort-deconfigure) + ;; + + *) + echo "postinst called with unknown argument \`$1'" >&2 + exit 1 + ;; +esac + +# dh_installdeb will replace this with shell code automatically +# generated by other debhelper scripts. + +#DEBHELPER# + +exit 0 + + diff --git a/docs/01-telldus-core.dox b/docs/01-telldus-core.dox deleted file mode 100644 index 0102d138..00000000 --- a/docs/01-telldus-core.dox +++ /dev/null @@ -1,351 +0,0 @@ -/** - * @mainpage Telldus Core API - * - * \section Introduction - * - * This is the guide to Telldus TellStick SDK. Even though all examples are - * written in C/C++ most of the code has a direct eqvivalent function in the - * other languages. See \ref sec_other_languages how to use the library in one - * of the supported languages by Telldus. - * - * \section Idea - * - * All of the devices used by TellStick must be predefined before they can be - * used in any software. Under all platforms this can be done with the - * software TelldusCenter but under Linux this can also be done by editing the - * file /etc/tellstick.conf with your favorite text editor. - * - * Having the devices preconfigured is an advantage to both the developer and - * the end user. - * - * \li The end user might use more then one program for controlling his/her - * TellStick. By having the devices preconfigured he/she does not have to - * reconfigure the same devices twice. If some settings change in one of the - * devices, this change will affect all softwares using Telldus TellStick SDK. - * \li Telldus continuously adds support for new devices. If a software - * defines it's own devices, the developer will have to keep the software - * up to date with new devices and settings implemented by Telldus. By querying - * Telldus Tellstick SDK all the new devices will be available automaticly to - * the end user. - * - * \section sec_basic_usage Basic usage (telldus-core) - * - * Telldus provides a non-gui library to list, query and control the devices - * called telldus-core. - * To initiate the library a call to tdInit() must be made. This call will - * open up all controllers (e.g. a TellStick) and start listening for events from - * them. - * When you are done with telldus-core, call tdClose() to allow the library to - * clean up after itself. - * - * \subsection sec_bu_listing Listing devices - * - * To list all of the configured devices, look at the following example: - * \code - * int intNumberOfDevices = tdGetNumberOfDevices(); - * for (int i = 0; i < intNumberOfDevices; i++) { - * int id = tdGetDeviceId( i ); - * char *name = tdGetName( id ); - * printf("%d\t%s\n", id, name); - * tdReleaseString(name); - * } - * \endcode - * - * First, we call tdGetNumberOfDevices(). This returnes the total number of - * devices configured. We then iterate over all of the devices with the index - * in the variable \c i. - * Since the devices could change between runs of the program we can not be - * sure that the index points to the same device between two runs of the - * program. That is why every device has it's own unique id that is safe to - * store in a configuration file. Two different devices can never share the - * same device id. - * - * The call to tdGetDeviceId() returns the id for a specific index. This - * function should only be called in a loop iterating over all of the devices. - * After we have found the id for a device it is safe to store this or use it - * in the rest of the program. - * - * The next two lines of code queries the device for it's name with a call to - * tdGetName() and then displays it to stdout. Finally we must release the - * resource after we are done with it by calling tdReleaseString() on any - * \c char pointer returned by telldus-core. - * - * \subsection sec_bu_sending Sending commands to TellStick - * - * \subsubsection sec_bu_sending_features Device features - * - * TellStick can control many different types of devices that - * support different features. For example, a bell does not support turning - * the on-signal and not all lamp switches support dimming. - * Call tdMethods() to find out what a specific device supports: - * \code - * function checkFeatures( int id ) { - * int supportedMethods = TELLSTICK_TURNON | TELLSTICK_TURNOFF | TELLSTICK_BELL; - * int methods = tdMethods( id, supportedMethods ); - * if ( methods & TELLSTICK_TURNON ) { - * printf( "The device %d support tdTurnOn()\n", id ); - * } - * if ( methods & TELLSTICK_TURNOFF ) { - * printf( "The device %d support tdTurnOff()\n", id ); - * } - * if ( methods & TELLSTICK_BELL ) { - * printf( "The device %d support tdBell()\n", id ); - * } - * } - * \endcode - * - * By supplying the methods your application supports, the library can return - * customized methods for your application, even if your application doesn't - * support the same methods as the device accepts. One example is if your - * application only supports ON and OFF, you can control a device that needs UP - * and DOWN anyway by using just ON and OFF. - * Let's say that the client application only supports turning on and - * off. The call to query a device for it's methods should be: - * \code - * int methods = tdMethods( id, TELLSTICK_TURNON | TELLSTICK_TURNOFF ); - * \endcode - * If the device in the above example is a device only supporing TELLSTICK_BELL, - * the library will instead return TELLSTICK_TURNON, making the client application - * still able to control the device. - * When you know which features a device supports it is safe to call the - * controlling functions described in \ref sec_bu_controlling_functions. - * - * When calling tdMethods() all of the supported methods should be passed in one - * call. Do not call tdMethods() for each of the supported methods. Look at the - * following example: - * \code - * //Correct - * int methods = tdMethods( id, TELLSTICK_TURNON | TELLSTICK_TURNOFF | TELLSTICK_BELL ); - * - * //Wrong - * int turnOn = tdMethods( id, TELLSTICK_TURNON ); - * int turnOff = tdMethods( id, TELLSTICK_TURNOFF ); - * int bell = tdMethods( id, TELLSTICK_BELL ); - * \endcode - * - * Another thing to note is if you are developing a library intended for - * thirdparty use. You should not hardcode which methods are supported by the - * library. It is always up to the application implementing the methods to - * supply the methods it supports. - * - * \subsubsection sec_bu_controlling_functions Controlling functions - * - * TellStick has a couple of functions for controlling devices. Each of - * them should only be called if the device support the feature. - * - * These functions all return zero if the call was successful and non-zero - * otherwise. - * - * \paragraph tdTurnOn tdTurnOn() - * Devices supporting \c TELLSTICK_TURNON. Most of the normal switches (for lamp - * etc.) support this. - * \paragraph tdTurnOff tdTurnOff() - * Devices supporting \c TELLSTICK_TURNOFF. Almost all of the devices supporting - * \c TELLSTICK_TURNON also support this. - * \paragraph tdDim tdDim() - * Devices supporting \c TELLSTICK_DIM. This is a quite unusual feature for - * dimmers. Many dimmers on the market that are dimmable have no way for sending - * a specific level which means it does not support this feature. - * \paragraph tdBell tdBell() - * Devices supporting \c TELLSTICK_BELL. This is mostly wireless doorbells. - * - * \subsubsection sec_bu_error_codes Error codes - * - * If any of the calls in \ref sec_bu_controlling_functions fails it returns - * a non-zero error code. This values is one of the \c TELLSTICK_ERROR_* defines. - * To translate the error code to a human readable string call the function - * tdGetErrorString(). Example: - * \code - * printf("Error: %s\n", tdGetErrorString( TELLSTICK_METHOD_NOT_SUPPORTED ) ); - * //Error: The method you tried to use is not supported by the device - * - * int retval = tdTurnOn( deviceID ); - * if (retval != TELLSTICK_SUCCESS ) { - * char *errorString = tdGetErrorString( retval ); - * printf("Error: %s\n", errorString ); - * tdReleaseString(errorString); - * } - * \endcode - * - * \subsection sec_bu_device_state Device states - * - * Since controllable devices only have a receiver and not a transmitter the communication is - * one-way. This means that telldus-core will never know for sure which - * state a reciever has. Instead, the library remembers which command was last - * sent. Either sent from the TellStick itself, or sent from another controller (e.g. a remote control) - * captured by the Tellstick Duo. In this way it "emulates" a two-way communication. - * - * To query the device state, use the function tdLastSentCommand() - * - * Example: - * \code - * char *name = tdGetName( id ); - * int state = tdLastSentCommand( id ); - * if (state == TELLSTICK_TURNON) { - * printf("%s is on\n", name); - * } else if (state == TELLSTICK_TURNOFF) { - * printf("%s is off\n", name); - * } else { - * printf("%s is in an unknown state\n", name); - * } - * tdReleaseString(name); - * \endcode - * - * \subsection sec_bu_sensors Sensors - * - * Retrieving sensor values can be done in two ways. Either by a polling - * interface or by callbacks. The client application can implement one or both - * of these interfaces. For callbacks, read more under \ref sec_events. - * - * Each of the sensors can have one or several value types. Currently only - * temperature and humidity are implemented. - * - * There is no API to add, remove or edit sensors. Each sensor that - * TellStick Duo has got any data from is added to an internal list. It is up to - * the client application to filter and only show the sensors your are - * interested in. - * - * To iterate over the list of sensors, call tdSensor() repeatedly as long as it - * returns \c TELLSTICK_SUCCESS. The parameters \c protocol, \c model, - * \c sensorId, and \c dataTypes are sent by reference and will be filled with - * the values. - * - * Example: - * \code - * char protocol[DATA_LENGTH], model[DATA_LENGTH]; - * int sensorId = 0, dataTypes = 0; - * while(tdSensor(protocol, DATA_LENGTH, model, DATA_LENGTH, &sensorId, &dataTypes) == TELLSTICK_SUCCESS) { - * //Print the sensor - * printf("%s,\t%s,\t%i\n", protocol, model, sensorId); - * } - * \endcode - * - * The type of sensor values the sensor supports are stored as flags in the - * parameter \c sensorId. Call tdSensorValue() for each type. - * - * Example: - * \code - * char value[DATA_LENGTH]; - * char timeBuf[80]; - * time_t timestamp = 0; - * if (dataTypes & TELLSTICK_TEMPERATURE) { - * tdSensorValue(protocol, model, sensorId, TELLSTICK_TEMPERATURE, value, DATA_LENGTH, (int *)×tamp); - * strftime(timeBuf, sizeof(timeBuf), "%Y-%m-%d %H:%M:%S", localtime(×tamp)); - * printf("Temperature:\t%sº\t(%s)\n", value, timeBuf); - * } - * \endcode - * - * \section sec_events Events - * - * To get events from either a TellStick Duo, another software changes the - * status of a device, or new sensors values you have to register for a callback. - * - * \subsection sec_events_registering Registering for callbacks - * - * For each callback there is a corresponding register function: - * \li tdRegisterDeviceEvent() - * \li tdRegisterDeviceChangeEvent() - * \li tdRegisterRawDeviceEvent() - * \li tdRegisterSensorEvent() - * - * These all work in the same way. The first parameter is a function-pointer to - * the callback function. The second parameter is an optional void pointer. This - * can be anything and is dependent on the implementation. This object will be - * sent back to each call to the callback function. The functions return an - * integer which is an id to the specific callback. This is is sent as a - * parameter in each call and should also be used for unregister the callback. - * - * Please note that the callback will be called by another thread than the - * thread used by the application and some measures must be taken to synchronize - * it with the main thread. - * - * Many devices (for example motion detectors) resends their messages many times - * to ensure that they are received correctly. If a deviceeventcallback or - * rawdeviceeventcallback in turn is calling a controlling function, for example - * tdTurnOn, it may be neccessary to implement some solution to wait for the - * device to finish its resending, before executing the controlling function. - * See how this can be done in the python example. - * - * \subsection sec_events_callbacks Callbacks - * - * telldus-core currently implements four different callback function for - * different purposes. - * - * \subsubsection sec_events_callbacks_deviceevent DeviceEvent - * - * This event is fired when the state of a device changes. This can either - * occur via a remote control, but can as well occur via another software on the - * computer. - * - * Parameters: - * - int deviceId - The device id of the device that changed. - * - int method - The new state. Can be TELLSTICK_TURNON, TELLSTICK_TURNOFF - * etc. - * - const char *data - For some methods this contains data. For TELLSTICK_DIM - * this hold the current value. - * - int callbackId - id of callback - * - void *context - see \ref sec_events_registering for description - * - * \subsubsection sec_events_callbacks_devicechangeevent DeviceChangeEvent - * - * This event is fired when the data around a device is changed. It can only be - * triggered by another software. Use this callback to keep your list of devices - * in sync. - * - * Parameters: - * - int deviceId - The device id of the device that changed. - * - int changeEvent - What was changed. This can be: - * - TELLSTICK_DEVICE_ADDED - A new device was added. The parameter deviceId - * holds the id of the new device. - * - TELLSTICK_DEVICE_REMOVED - A device was removed, the parameter deviceId - * holds the id of the removed device. - * - TELLSTICK_DEVICE_CHANGED - The settings of a device changed. The next - * parameter holds what was changed. - * - int changeType - If changeEvent is TELLSTICK_DEVICE_CHANGED this parameter - * holds what was changed. It can be one of the following: - * - TELLSTICK_CHANGE_NAME - Use tdGetName() to read the new name. - * - TELLSTICK_CHANGE_PROTOCOL - Use tdGetProtocol() to read the new value. - * - TELLSTICK_CHANGE_MODEL - Use tdGetModel() to read the new value. - * - int callbackId - id of callback - * - void *context - see \ref sec_events_registering for description - * - * \subsubsection sec_events_callbacks_rawdeviceevent RawDeviceEvent - * - * Use this callback with caution. It outputs everything from a TellStick Duo - * without any preprocessing. This can be used to get events from devices not - * already configured. - * - * Parameters: - * - const char *data - raw device data - * - int controllerId - id of receiving controller, can identify the TellStick if several exists in the system - * - int callbackId - id of callback - * - void *context - see \ref sec_events_registering for description - * - * \subsubsection sec_events_callbacks_sensorevent SensorEvent - * - * This event is fired when a new sensor value is retrieved. - * - * Parameters: - * - const char *protocol - The sensors protocol - * - const char *model - The model of the sensor - * - int id - The unique id for the sensor. - * - int dataType - Flags for which types of data the sensor supports - * - const char *value - A human readable string of the data - * - int timestamp - The timestamp when the latest value was received - * - int callbackId - id of callback - * - void *context - See \ref sec_events_registering for description - * - * \subsection sec_events_example Example - * - * \section sec_other_languages Notes using other languages than C/C++ - * - * \subsection sec_ol_pyhon Python - * - * To use telldus-core in Python, - * please have look at the ctypes library. It contains cdll and - * windll to load any dynamic link libraries. - * - * There is also a third party library available: - * https://github.com/erijo/tellcore-py - * - */ diff --git a/docs/02-tellstick-protocol.dox b/docs/02-tellstick-protocol.dox deleted file mode 100644 index 854dee0a..00000000 --- a/docs/02-tellstick-protocol.dox +++ /dev/null @@ -1,122 +0,0 @@ -/** - * @page TellStick TellStick protocol - * - * \section Introduction - * - * Telldus TellStick protocol looks like:
- * [prefix[prefix parameters]][command][parameter 1]..[parameter n]['+'] - * - * Each value in [ and ] is representing one byte. - * - * Command is one ascii character. Not all commands have parameters which - * makes it optional. Prefix is always optional. - * Note: Due to memory limitations, the parameters is limited in length to 79 - * bytes. - * - * An example command to turn on a ArcTech codeswitch A1 may look like: - * S$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$kk$$kk$$kk$$}+ - * - * TellStick returns to a known command like this:
- * ['+'][command][parameters][13][10] - * - * [13] and [10] are the ascii characters 10 and 13. - * - * An example to query a TellStick on its firmware version:
- * Command:
- * V+
- * Response:
- * +V2
- * The TellStick in the example has the firmware version 2. - * - * \section Commands - * - * \subsection sec_send S - Send command - * This command tells TellStick to send a command. The parameters to this - * command is the data-packet to send. - * - * Each of the characters in the parameters makes the antenna alternate - * high/low/high etc. The time before the alternation is 10 us timer the ASCII - * value. For example, $ has the ascii-value 36 and k has 107. The command: - * ['S']['$']['k']['$']['k']['$']['+'] makes the following wavepattern on the antenna: - *
- *  _____                 _____                 _____
- * |     |               |     |               |     |
- * |     |               |     |               |     |
- * |     |_______________|     |_______________|     |
- *
- * |<===>|<=============>|<===>|<=============>|<===>|
- *  360us      1070us     360us      1070us     360us
- * 
- * - * - * \subsection sec_send_extended T - Send command, extended - * - * The extended command was developed to overcome the limitations och the - * length of the data to 79 bytes. - * The idea is to have four fixed times on the pulses so the information about - * what to send only needs 2 bits instead of 8 in the command S - * - * The parameters to the command is:
- * [t0][t1][t2][t3][length][d1]..[dn] - * - * t0-t3: Times 1 to 4. The times are in the same form as S. - * Each time is multiplied with the factor of 10. - * - * length: How many pulses to send. Since the data sent to TellStick - * is sent in groups of four pulses (one byte) and the actual data might not - * have pulses even divided with four. - * - * d1..dn: Each byte is the description for four pulses. - * - * Example:
- * ['T'][127][255][24][1][6][98][80]['+'] - * - * T: Send extended. - * - * 127,255,24,1: Times 1270 us, 2550 us, 24 us and 10 us - * - * 6: Six pulses to send. - * - * 98,80: The data in binary is 10011000,10000000. If - * we group it in groups of two bits we get 10 01 10 00 10 00 00 00. - * Since the length is only six pulses the last two pulses is discarded, giving: - * 10 01 10 00 10 00. - * - * Matching those bits to the times gives the following times:
- * 10 => 2 => t2 => 240 us
- * 01 => 1 => t1 => 2550 us
- * 10 => 2 => t2 => 240 us
- * 00 => 0 => t0 => 1270 us
- * 10 => 2 => t2 => 240 us
- * 00 => 0 => t0 => 1270 us
- * - * This is equal if you used S:
- * ['S'][24][255][24][127][24][127]['+'] - * - * \subsection sec_version V - Firmware version - * This command queries the TellStick on its firmware version. - * - * Example:
- * » V+
- * « +V2
- * \section Prefixes - * The prefixes are commands that can be prepended before some of the commands - * and cannot be used standalone. They are used to alter the behavior of the - * command. - * - * \subsection sec_debug D - Debug - * \subsection sec_pause P - Pause - * The pause is how low TellStick will wait between two packets. The value is - * in ms. - * - * Example, % has the ascii-value 37. The following packet will be sent with a - * pause of 37 ms between the packets:
- * » P\%S$k$k$+ - * - * \subsection sec_repeat R - Repeat - * This tells TellStick how many times to send the packet. - * - * Example, ! has the ascii-value 33. The following packet will be sent 33 - * times:
- * » R!S$k$k$+ - */ diff --git a/docs/03-tellstick-net-protocol.dox b/docs/03-tellstick-net-protocol.dox deleted file mode 100644 index e077f063..00000000 --- a/docs/03-tellstick-net-protocol.dox +++ /dev/null @@ -1,94 +0,0 @@ -/** - * @page TellStickNet TellStick Net protocol - * - * \section Introduction - * - * TellStick Net will eventually support local access through the LAN. This is - * unsupported by Telldus Technologies but can be useful in some cases. For - * instance in mobile devices or when the internet is not available. Using - * TellStick Net through Telldus Live! is still the prefered and supported - * method. - * - * This interface is still under development and is not ready for - * production. - * - * \section autodiscovery Auto discovery - * - * The TellStick Net can be auto discovered on the LAN using UDP broadcast. - * Sending a package to the broadcast address 255.255.255.255 port 30303 will - * be responded by any TellStick Net on the network. The packet should only - * contain the single character 'D' (ascii number 68). - * - * The response from the device will be sent back to the same host and port as - * the originated packet. So any dynamically port can be assigned by the host - * implementing the auto discovery. - * The returning packet is constructed in the following way: - * product:mac address:activation code:firmware - * - * Example:
- * TellStickNet:ABCDEFGHIJKL:ABDCEFGHIJ:2
- * Product: TellStick Net (TSNET)
- * Mac address: AB:CD:EF:GH:IJ:KL
- * Code for activation: ABCDEFGHIJ
- * Firmware version: 2 - * - * Use the source ip-address to determine the address to the device. - * - * \section messageformat Message format - * - * The message format used to communicate with TellStick Net is designed to be - * easily parsed but still be flexible. It can be converted to and from json - * without losing information. - * - * There exists four datatypes; string, integer, list and dictionary: - * - * - Strings are length-prefixed base sixteen (upper case) followed by a colon - * and the string. For example 6:FooBar corresponds to 'FooBar'. - * - * - Integers are represented by an 'i' followed by the number in base 16 - * followed by an 's'. For example i3s corresponds to 3 and i-3s corresponds - * to -3. Integers have no size limitation. i-0s is invalid. All encodings - * with a leading zero, such as i03s, are invalid, other than i0s, which of - * course corresponds to 0. - * - * - Lists are encoded as an 'l' followed by their elements (also encoded) - * followed by an 's'. For example l3:foo3:bars corresponds to ['foo', 'bar']. - * - * - Dictionaries are encoded as a 'h' followed by a list of alternating keys and - * their corresponding values followed by an 's'. For example, - * h3:foo3:bar5:hello5:worlds corresponds to {'foo': 'bar', 'hello': 'world'} - * and h3:fool3:bar3:bazss corresponds to {'foo': ['bar', 'baz']}. Keys must - * be strings. - * - * Communication with TellStick Net is done over UDP on port 42314. - * The first string sent contains the command to execute. The following python - * example sends a disconnection command to a TellStick Net. This will reboot - * the device. - * \code - * from socket import * - * UDPSock = socket(AF_INET,SOCK_DGRAM) - * UDPSock.sendto("A:disconnect", ("192.168.0.155",42314)) - * \endcode - * \section tellstick_net_command_send Send command - * - * For readability the examples will be displayed in json format in this - * documentation. They must be encoded using the TellStick Net message format - * before sending to an actual TellStick Net. - * - * Sending RF-data uses the same encoding as TellStick \ref sec_send with the - * difference that prefixes should be sent as a parameter and not in the - * RF-data. - * - * The parameters are sent encoded in a dictionary, with the RF-data in the key - * 'S'. Example sending Arctech Code switch A1 ON:
- * {'S': '$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$kk$$kk$$kk$$k'} - * The string sent will be encoded like this:
- * 4:sendh1:S32:$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$kk$$kk$$k$k$ks - * - * The same example as above but with a 20 ms pause between the 15 packages:
- * {'S': '$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$kk$$kk$$kk$$k', - * 'P': 20, 'R': 15} - * - * The command \ref sec_send_extended "\"Send extended\" (T)" is not implemented - * since a TellStick Net can handle packages over 255 pulses. - */ diff --git a/driver/CMakeLists.txt b/driver/CMakeLists.txt new file mode 100644 index 00000000..99033075 --- /dev/null +++ b/driver/CMakeLists.txt @@ -0,0 +1,15 @@ +PROJECT( tellstick ) + +if(BUILD_LIBTELLDUS-CORE) + ADD_SUBDIRECTORY(libtelldus-core) +endif(BUILD_LIBTELLDUS-CORE) + + +IF (WIN32) + SET(BUILD_TELLUSBD101 TRUE CACHE BOOL "Build wrapper TellUsbD101.dll") + IF (BUILD_TELLUSBD101) + ADD_SUBDIRECTORY(TellUsbD101) + ENDIF (BUILD_TELLUSBD101) +ENDIF (WIN32) + +ADD_SUBDIRECTORY(bindings) \ No newline at end of file diff --git a/driver/TellUsbD101.sln b/driver/TellUsbD101.sln new file mode 100644 index 00000000..1b22fbc9 --- /dev/null +++ b/driver/TellUsbD101.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual C++ Express 2005 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TellUsbD101", "TellUsbD101\TellUsbD101.vcproj", "{2A868E40-88D9-4800-A83F-21D0F8DCB611}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {2A868E40-88D9-4800-A83F-21D0F8DCB611}.Debug|Win32.ActiveCfg = Release|Win32 + {2A868E40-88D9-4800-A83F-21D0F8DCB611}.Debug|Win32.Build.0 = Release|Win32 + {2A868E40-88D9-4800-A83F-21D0F8DCB611}.Release|Win32.ActiveCfg = Release|Win32 + {2A868E40-88D9-4800-A83F-21D0F8DCB611}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/driver/TellUsbD101/CMakeLists.txt b/driver/TellUsbD101/CMakeLists.txt new file mode 100644 index 00000000..0d6c38dc --- /dev/null +++ b/driver/TellUsbD101/CMakeLists.txt @@ -0,0 +1,38 @@ + +if(COMMAND cmake_policy) + cmake_policy(SET CMP0003 NEW) +endif(COMMAND cmake_policy) + +SET( tellusbd101_SRCS + TellUsbD101.cpp + TellUsbD101.def +) + +SET( tellusbd101_HDRS + TellUsbD101.h +) + +SET( tellusbd101_TARGET TellUsbD101 ) + ADD_DEFINITIONS( + -D_WINDOWS + -DTellUsbD101_EXPORTS +) + +SET( tellusbd101_LIBRARIES + "${LIBRARY_OUTPUT_PATH}/Release/TelldusCore.lib" +) + + +######## Configuring ######## + +ADD_LIBRARY(${tellusbd101_TARGET} SHARED + ${tellusbd101_SRCS} + ${tellusbd101_HDRS} +) + +TARGET_LINK_LIBRARIES( ${tellusbd101_TARGET} ${tellusbd101_LIBRARIES} ) + +SET_PROPERTY(TARGET ${tellusbd101_TARGET} + PROPERTY PUBLIC_HEADER ${tellusbd101_HDRS} +) + diff --git a/driver/TellUsbD101/TellUsbD101.cpp b/driver/TellUsbD101/TellUsbD101.cpp new file mode 100644 index 00000000..3765e4c4 --- /dev/null +++ b/driver/TellUsbD101/TellUsbD101.cpp @@ -0,0 +1,85 @@ +//DLL entry point + +#include "TellUsbD101.h" +#include "../libtelldus-core/telldus-core.h" +#include +#include +#include +#include + + +int __stdcall devGetNumberOfDevices(void){ + return tdGetNumberOfDevices(); +} + +int __stdcall devGetDeviceId(int intDeviceIndex){ + return tdGetDeviceId(intDeviceIndex); +} + +char * __stdcall devGetName(int intDeviceId){ + return tdGetName(intDeviceId); +} + +char* __stdcall devGetVendor(int intDeviceId){ + return tdGetProtocol(intDeviceId); +} + +char* __stdcall devGetModel(int intDeviceId){ + return tdGetModel(intDeviceId); +} + +int __stdcall devGetNumberOfArguments(int intDeviceId){ + return 0; +} + +int __stdcall devGetArgument(int intDeviceId, int intArgumentIndex){ + return 0; +} + +bool __stdcall devSetName(int intDeviceId, char* strNewName){ + return tdSetName(intDeviceId, strNewName); +} + +bool __stdcall devSetVendor(int intDeviceId, char* strVendor) { + if (_stricmp(strVendor, "nexa") == 0) { + return tdSetProtocol(intDeviceId, "arctech"); + } else { + return tdSetProtocol(intDeviceId, strVendor); + } +} + +bool __stdcall devSetModel(int intDeviceId, char* strNewModel){ + return tdSetModel(intDeviceId, strNewModel); +} + +bool __stdcall devSetArguments(int intDeviceId, char* strArguments){ + return false; +} + +int __stdcall devAddDevice(){ + return tdAddDevice(); +} + +bool __stdcall devRemoveDevice(int intDeviceId){ + return tdRemoveDevice(intDeviceId); +} + +int __stdcall devMethods(int id){ + return tdMethods(id, TELLSTICK_TURNON | TELLSTICK_TURNOFF | TELLSTICK_DIM | TELLSTICK_BELL); +} + +bool __stdcall devTurnOn(int intDeviceId){ + return (tdTurnOn(intDeviceId) == TELLSTICK_SUCCESS ? true : false); +} + +bool __stdcall devTurnOff(int intDeviceId){ + return (tdTurnOff(intDeviceId) == TELLSTICK_SUCCESS ? true : false); +} + +bool __stdcall devBell(int intDeviceId){ + return (tdBell(intDeviceId) == TELLSTICK_SUCCESS ? true : false); +} + +bool __stdcall devDim(int intDeviceId, unsigned char level){ + return (tdDim(intDeviceId, level) == TELLSTICK_SUCCESS ? true : false); +} diff --git a/driver/TellUsbD101/TellUsbD101.def b/driver/TellUsbD101/TellUsbD101.def new file mode 100644 index 00000000..fc32ffca --- /dev/null +++ b/driver/TellUsbD101/TellUsbD101.def @@ -0,0 +1,24 @@ +LIBRARY TellUsbD101 +EXPORTS + devGetNumberOfDevices @1 + devGetDeviceId @2 + + devGetName @3 + devGetVendor @4 + devGetModel @5 + devGetNumberOfArguments @6 + devGetArgument @7 + + devSetName @8 + devSetVendor @9 + devSetModel @10 + devSetArguments @11 + + devAddDevice @12 + devRemoveDevice @13 + + devMethods @14 + devTurnOn @16 + devTurnOff @17 + devBell @18 + devDim @19 diff --git a/driver/TellUsbD101/TellUsbD101.h b/driver/TellUsbD101/TellUsbD101.h new file mode 100644 index 00000000..4868c964 --- /dev/null +++ b/driver/TellUsbD101/TellUsbD101.h @@ -0,0 +1,45 @@ +#ifndef TELLUSBD101_H +#define TELLUSBD101_H + +// The following ifdef block is the standard way of creating macros +// which make exporting from a DLL simpler. All files within this DLL +// are compiled with the TellUsbD101_EXPORTS symbol defined on the command line. +// This symbol should not be defined on any project that uses this DLL. +// This way any other project whose source files include this file see +// TELLUSBD101_API functions as being imported from a DLL, whereas this DLL +// sees symbols defined with this macro as being exported. + +#ifdef TellUsbD101_EXPORTS + #define TELLUSBD101_API __declspec(dllexport) +#else + #define TELLUSBD101_API __declspec(dllimport) +#endif +#ifdef _WINDOWS + #define WINAPI __stdcall +#else + #define WINAPI +#endif + + +extern "C" { + TELLUSBD101_API bool WINAPI devTurnOn(int intDeviceId); + TELLUSBD101_API bool WINAPI devTurnOff(int intDeviceId); + TELLUSBD101_API bool WINAPI devBell(int intDeviceId); + TELLUSBD101_API bool WINAPI devDim(int intDeviceId, unsigned char level); + TELLUSBD101_API int WINAPI devGetNumberOfDevices(); + TELLUSBD101_API char * WINAPI devGetName(int intDeviceId); + TELLUSBD101_API bool WINAPI devSetName(int intDeviceId, const char* chNewName); + TELLUSBD101_API char* WINAPI devGetVendor(int intDeviceId); + TELLUSBD101_API bool WINAPI devSetVendor(int intDeviceId, const char* chNewName); + TELLUSBD101_API char* WINAPI devGetModel(int intDeviceId); + TELLUSBD101_API bool WINAPI devSetModel(int intDeviceId, const char* chNewName); + TELLUSBD101_API int WINAPI devGetArgument(int intDeviceId, int intArgumentIndex); + TELLUSBD101_API int WINAPI devGetNumberOfArguments(int intDeviceId); + TELLUSBD101_API bool WINAPI devSetArguments(int intDeviceId, const char* strArguments); + TELLUSBD101_API int WINAPI devAddDevice(); + TELLUSBD101_API bool WINAPI devRemoveDevice(int intDeviceId); + TELLUSBD101_API int WINAPI devGetDeviceId(int intDeviceIndex); + TELLUSBD101_API int WINAPI devMethods(int id); +} + +#endif diff --git a/driver/TellUsbD101/TellUsbD101.vcproj b/driver/TellUsbD101/TellUsbD101.vcproj new file mode 100644 index 00000000..c25d6338 --- /dev/null +++ b/driver/TellUsbD101/TellUsbD101.vcproj @@ -0,0 +1,215 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/driver/bindings/CMakeLists.txt b/driver/bindings/CMakeLists.txt new file mode 100644 index 00000000..6127fb9d --- /dev/null +++ b/driver/bindings/CMakeLists.txt @@ -0,0 +1,15 @@ + +SET(BUILD_EXTENSION_JAVA FALSE CACHE BOOL "Build extension for Java") +IF(BUILD_EXTENSION_JAVA) + ADD_SUBDIRECTORY(java) +ENDIF(BUILD_EXTENSION_JAVA) + +# ADD_SUBDIRECTORY(php) + +SET(BUILD_EXTENSION_PYTHON FALSE CACHE BOOL "Build extension for Python") +IF(BUILD_EXTENSION_PYTHON) + ADD_SUBDIRECTORY(python) +ENDIF(BUILD_EXTENSION_PYTHON) + +# ADD_SUBDIRECTORY(ruby) + diff --git a/driver/bindings/java/CMakeLists.txt b/driver/bindings/java/CMakeLists.txt new file mode 100644 index 00000000..5ffcd261 --- /dev/null +++ b/driver/bindings/java/CMakeLists.txt @@ -0,0 +1,18 @@ + +#### JAVA #### +FIND_PACKAGE(SWIG REQUIRED) +FIND_PACKAGE(Java) +FIND_PACKAGE(JNI) + +INCLUDE(${SWIG_USE_FILE}) + +INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR} ${JAVA_INCLUDE_PATH} ${JNI_INCLUDE_DIRS}) + +SET(CMAKE_SWIG_FLAGS "") + +SET_SOURCE_FILES_PROPERTIES(../tellduscore.i PROPERTIES CPLUSPLUS OFF) +SET_SOURCE_FILES_PROPERTIES(../tellduscore.i PROPERTIES SWIG_FLAGS "-includeall") + +SWIG_ADD_MODULE(tellduscore java ../tellduscore.i) +SWIG_LINK_LIBRARIES(tellduscore telldus-core ${JNI_LIBRARIES}) + diff --git a/driver/bindings/python/CMakeLists.txt b/driver/bindings/python/CMakeLists.txt new file mode 100644 index 00000000..efbb153f --- /dev/null +++ b/driver/bindings/python/CMakeLists.txt @@ -0,0 +1,22 @@ + +#### PYTHON #### +FIND_PACKAGE(SWIG REQUIRED) +FIND_PACKAGE(PythonInterp) +FIND_PACKAGE(PythonLibs) + +INCLUDE(${SWIG_USE_FILE}) + +INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR} ${PYTHON_INCLUDE_PATH}) + +SET(CMAKE_SWIG_FLAGS "") + +SET_SOURCE_FILES_PROPERTIES(../tellduscore.i PROPERTIES CPLUSPLUS OFF) +SET_SOURCE_FILES_PROPERTIES(../tellduscore.i PROPERTIES SWIG_FLAGS "-includeall") + +SWIG_ADD_MODULE(tellduscore python ../tellduscore.i) +SWIG_LINK_LIBRARIES(tellduscore telldus-core ${PYTHON_LIBRARIES}) + +EXECUTE_PROCESS( COMMAND ${PYTHON_EXECUTABLE} -c "from distutils.sysconfig import get_python_lib; print get_python_lib()" OUTPUT_VARIABLE PYTHON_SITE_PACKAGES OUTPUT_STRIP_TRAILING_WHITESPACE) +INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/${SWIG_MODULE_tellduscore_REAL_NAME}.so DESTINATION ${PYTHON_SITE_PACKAGES}) +INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/tellduscore.py DESTINATION ${PYTHON_SITE_PACKAGES}) + diff --git a/driver/bindings/tellduscore.i b/driver/bindings/tellduscore.i new file mode 100644 index 00000000..25203d39 --- /dev/null +++ b/driver/bindings/tellduscore.i @@ -0,0 +1,6 @@ +%module tellduscore +%{ +#include "../../libtelldus-core/telldus-core.h" +%} + +%include "../../libtelldus-core/telldus-core.h" diff --git a/driver/libtelldus-core/99-tellstick.rules b/driver/libtelldus-core/99-tellstick.rules new file mode 100644 index 00000000..0fd29965 --- /dev/null +++ b/driver/libtelldus-core/99-tellstick.rules @@ -0,0 +1,2 @@ +KERNEL=="ttyUSB*", BUS=="usb", SYSFS{idVendor}=="1781", SYSFS{idProduct}=="0c30", NAME="tellstick", GROUP="plugdev" + diff --git a/driver/libtelldus-core/CMakeLists.txt b/driver/libtelldus-core/CMakeLists.txt new file mode 100644 index 00000000..2a081a37 --- /dev/null +++ b/driver/libtelldus-core/CMakeLists.txt @@ -0,0 +1,205 @@ +FIND_PACKAGE( Qt4 REQUIRED ) +SET( QT_DONT_USE_QTGUI TRUE ) +INCLUDE( ${QT_USE_FILE} ) + +if(COMMAND cmake_policy) + cmake_policy(SET CMP0003 NEW) +endif(COMMAND cmake_policy) + +######## Non configurable options ######## +SET( telldus-core_SRCS + Device.cpp + DeviceBrateck.cpp + DeviceEverflourish.cpp + DeviceGroup.cpp + DeviceIkea.cpp + DeviceNexa.cpp + DeviceRisingSun.cpp + DeviceSartano.cpp + DeviceUndefined.cpp + DeviceUpm.cpp + DeviceWaveman.cpp + DeviceX10.cpp + Controller.cpp + Manager.cpp + Settings.cpp + telldus-core.cpp + ) + +SET( telldus-core_HDRS + telldus-core.h + ${CMAKE_CURRENT_BINARY_DIR}/include/config.h +) + +SET( telldus-core_MOC_HDRS + ) + +QT4_WRAP_CPP( telldus-core_MOC_SRCS ${telldus-core_MOC_HDRS} ) +QT4_AUTOMOC ( ${telldus-core_SRCS} ) + + +SET( telldus-core_LIBRARIES + ${QT_LIBRARIES} +) + +IF (SUPPORT_USB) + FIND_LIBRARY(FTD2XX_LIBRARY ftd2xx) + + SET( telldus-core_LIBRARIES + ${telldus-core_LIBRARIES} + ${FTD2XX_LIBRARY} + ) +ENDIF (SUPPORT_USB) + +CONFIGURE_FILE( + ${CMAKE_CURRENT_SOURCE_DIR}/config.h.in + ${CMAKE_CURRENT_BINARY_DIR}/include/config.h +) +INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR}/include) + +######## Configurable options for the platform ######## + +#### TellStickDuo #### +IF (SUPPORT_TELLSTICK_DUO) + #Only build library agains libftdi for TellStick Duo + FIND_LIBRARY(FTDI_LIBRARY ftdi) + SET( telldus-core_LIBRARIES + ${telldus-core_LIBRARIES} + ${FTDI_LIBRARY} + ) + + ADD_DEFINITIONS( -DTELLSTICK_DUO ) + SET( telldus-core_SRCS + ${telldus-core_SRCS} + TellStickDuo.cpp + ) +ENDIF(SUPPORT_TELLSTICK_DUO) + +#### Settings backend #### +IF(USE_QT_SETTINGS_BACKEND) + SET( telldus-core_SRCS + ${telldus-core_SRCS} + SettingsQt.cpp + ) +ELSE (USE_QT_SETTINGS_BACKEND) + IF (APPLE) + FIND_LIBRARY(COREFOUNDATION_LIBRARY CoreFoundation) + + SET( telldus-core_LIBRARIES + ${telldus-core_LIBRARIES} + ${COREFOUNDATION_LIBRARY} + ) + SET( telldus-core_SRCS + ${telldus-core_SRCS} + SettingsCoreFoundationPreferences.cpp + ) + ELSEIF (WIN32) + SET( telldus-core_SRCS + ${telldus-core_SRCS} + SettingsWinRegistry.cpp + ) + ELSE (APPLE) + SET( telldus-core_LIBRARIES + ${telldus-core_LIBRARIES} + confuse + ) + SET( telldus-core_SRCS + ${telldus-core_SRCS} + SettingsConfuse.cpp + ) + ADD_DEFINITIONS( -D_CONFUSE ) + ENDIF (APPLE) +ENDIF(USE_QT_SETTINGS_BACKEND) + + + +######## Platforms-specific, non configurable ######## + +IF (APPLE) + #### Mac OS X #### + SET( telldus-core_TARGET TelldusCore ) + SET( telldus-core_SRCS + ${telldus-core_SRCS} + win/Device.cpp + ) + ADD_DEFINITIONS( + -D_MACOSX + ) +ELSEIF (WIN32) + #### Windows #### + SET( telldus-core_TARGET TelldusCore ) + SET( telldus-core_SRCS + ${telldus-core_SRCS} + win/Device.cpp + libtelldus-core.def + ) + ADD_DEFINITIONS( + -D_WINDOWS + -DTELLDUSCORE_EXPORTS + ) +ELSE (APPLE) + #### Linux #### + SET( telldus-core_TARGET telldus-core ) + SET( telldus-core_SRCS + ${telldus-core_SRCS} + linux/Device.cpp + ) + ADD_DEFINITIONS( + -D_LINUX + ) +ENDIF (APPLE) + + + +######## Configuring ######## + +ADD_LIBRARY(${telldus-core_TARGET} SHARED + ${telldus-core_SRCS} + ${telldus-core_HDRS} + ${telldus-core_MOC_SRCS} +) + +TARGET_LINK_LIBRARIES( ${telldus-core_TARGET} ${telldus-core_LIBRARIES} ) + +SET_PROPERTY(TARGET ${telldus-core_TARGET} + PROPERTY FRAMEWORK TRUE +) +SET_PROPERTY(TARGET ${telldus-core_TARGET} + PROPERTY PUBLIC_HEADER ${telldus-core_HDRS} +) + +SET_PROPERTY(TARGET ${telldus-core_TARGET} + PROPERTY VERSION ${PACKAGE_VERSION} +) +SET_PROPERTY(TARGET ${telldus-core_TARGET} + PROPERTY SOVERSION ${PACKAGE_SOVERSION} +) + +IF (NOT LIBRARY_DIR) + SET(LIBRARY_DIR "lib") +ENDIF (NOT LIBRARY_DIR) + +IF (UNIX) + INSTALL(TARGETS ${telldus-core_TARGET} + LIBRARY DESTINATION ${LIBRARY_DIR} + FRAMEWORK DESTINATION "/Library/Frameworks" + PUBLIC_HEADER DESTINATION include + ) +ENDIF (UNIX) + +IF (UNIX AND NOT APPLE) + SET(SYSCONF_INSTALL_DIR "/etc" CACHE PATH "The sysconfig install dir (default prefix/etc)" ) + SET(STATE_INSTALL_DIR "/var/state" CACHE PATH "The directory to store state information of the devices" ) + SET(UDEV_RULES_DIR "/etc/udev/rules.d" CACHE PATH "The directory where udev store its rules" ) + + INSTALL(FILES tellstick.conf + DESTINATION ${SYSCONF_INSTALL_DIR} + ) + INSTALL(FILES telldus-core.conf + DESTINATION ${STATE_INSTALL_DIR} + PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ GROUP_WRITE WORLD_READ WORLD_WRITE + ) + INSTALL(FILES 99-tellstick.rules + DESTINATION ${UDEV_RULES_DIR} + ) +ENDIF (UNIX AND NOT APPLE) diff --git a/driver/libtelldus-core/Controller.cpp b/driver/libtelldus-core/Controller.cpp new file mode 100644 index 00000000..04d6225e --- /dev/null +++ b/driver/libtelldus-core/Controller.cpp @@ -0,0 +1,25 @@ +// +// C++ Implementation: controller +// +// Description: +// +// +// Author: Micke Prag , (C) 2009 +// +// Copyright: See COPYING file that comes with this distribution +// +// +#include "Controller.h" + +using namespace TelldusCore; + +Controller::Controller() +{ +} + + +Controller::~Controller() +{ +} + + diff --git a/driver/libtelldus-core/Controller.h b/driver/libtelldus-core/Controller.h new file mode 100644 index 00000000..f7d32c37 --- /dev/null +++ b/driver/libtelldus-core/Controller.h @@ -0,0 +1,34 @@ +// +// C++ Interface: controller +// +// Description: +// +// +// Author: Micke Prag , (C) 2009 +// +// Copyright: See COPYING file that comes with this distribution +// +// +#ifndef CONTROLLER_H +#define CONTROLLER_H + +#include +#include + +/** + @author Micke Prag +*/ +namespace TelldusCore { + class Controller { + public: + virtual ~Controller(); + + virtual int firmwareVersion() = 0; + virtual int send( const std::string &message ) = 0; + + protected: + Controller(); + }; +} + +#endif diff --git a/driver/libtelldus-core/Device.cpp b/driver/libtelldus-core/Device.cpp new file mode 100644 index 00000000..7c207218 --- /dev/null +++ b/driver/libtelldus-core/Device.cpp @@ -0,0 +1,160 @@ +#include "Device.h" +#include "Manager.h" +#include +#include + +using namespace TelldusCore; +/* +* Constructor +*/ +Device::Device(int id, const std::string m, const std::string &name) + : deviceId(id), + deviceName(name), + model(m) +{ +} + +/* +* Destructor +*/ +Device::~Device(void) { +} + +int Device::switchState( int newState, const std::string &value ) { + int retVal = TELLSTICK_ERROR_METHOD_NOT_SUPPORTED; + if (!Device::maskUnsupportedMethods(this->methods(), newState)) { + return retVal; + } + std::string stateValue = ""; + + switch (newState) { + case TELLSTICK_TURNON: + retVal = turnOn(); + break; + case TELLSTICK_TURNOFF: + retVal = turnOff(); + break; + case TELLSTICK_BELL: + retVal = bell(); + break; + case TELLSTICK_LEARN: + retVal = learn(); + break; + case TELLSTICK_DIM: + //Convert value to string + unsigned char v = value[0]; + std::stringstream st; + st << (int)v; + stateValue = st.str(); + + retVal = dim( v ); + break; + } + if (retVal == TELLSTICK_SUCCESS) { + Manager *manager = Manager::getInstance(); + manager->setDeviceState(deviceId, newState, stateValue); + } + return retVal; +} + +std::string Device::getModel() const { + std::string strModel = model; + //Strip anything after : if it is found + size_t pos = strModel.find(":"); + if (pos != std::string::npos) { + strModel = strModel.substr(0, pos); + } + + return strModel; +} + +std::string Device::getFullModel() const { + return model; +} + +bool Device::setModel( const std::string &strModel ) { + Manager *manager = Manager::getInstance(); + if (manager->setDeviceModel( deviceId, strModel )) { + model = strModel; + return true; + } + return false; +} + +bool Device::setParameter(const std::string &strName, const std::string &strValue) { + if (setDeviceParameter( strName, strValue )) { + Manager *manager = Manager::getInstance(); + return manager->setDeviceParameter(deviceId, strName, strValue); + } + return false; +} + +/* +* Turn on, virtual +*/ +int Device::turnOn(void){ + return TELLSTICK_ERROR_METHOD_NOT_SUPPORTED; +} + +/* +* Turn off, virtual +*/ +int Device::turnOff(void){ + return TELLSTICK_ERROR_METHOD_NOT_SUPPORTED; +} + +/* +* Bell, virtual +*/ +int Device::bell(void){ + return TELLSTICK_ERROR_METHOD_NOT_SUPPORTED; +} + +/* +* Dim, virtual +*/ +int Device::dim(unsigned char level){ + return TELLSTICK_ERROR_METHOD_NOT_SUPPORTED; +} + +int Device::learn(void) { + return TELLSTICK_ERROR_METHOD_NOT_SUPPORTED; +} + +int Device::methodId( const std::string &methodName ) { + if (methodName.compare("turnon") == 0) { + return TELLSTICK_TURNON; + } + if (methodName.compare("turnoff") == 0) { + return TELLSTICK_TURNOFF; + } + if (methodName.compare("bell") == 0) { + return TELLSTICK_BELL; + } + if (methodName.compare("dim") == 0) { + return TELLSTICK_DIM; + } + return 0; +} + +std::string Device::getName() const { + return deviceName; +} + +bool Device::setName(const std::string & newName) { + Manager *manager = Manager::getInstance(); + if (manager->setDeviceName(deviceId, newName)) { + deviceName = newName; + return true; + } + return false; +} + +int TelldusCore::Device::maskUnsupportedMethods(int methods, int supportedMethods) { + // Bell -> On + if ((methods & TELLSTICK_BELL) && !(supportedMethods & TELLSTICK_BELL)) { + methods |= TELLSTICK_TURNON; + } + //Cut of the rest of the unsupported methods we don't have a fallback for + return methods & supportedMethods; +} diff --git a/driver/libtelldus-core/Device.h b/driver/libtelldus-core/Device.h new file mode 100644 index 00000000..426fcab8 --- /dev/null +++ b/driver/libtelldus-core/Device.h @@ -0,0 +1,51 @@ +#pragma once + +#include "telldus-core.h" +#include +//#include + +namespace TelldusCore { + + class Device + { + public: + Device(int id, const std::string model, const std::string &name); + virtual ~Device(void); + + int switchState( int newState, const std::string &value = "" ); + virtual int methods() = 0; + virtual std::string getProtocol() const = 0; + virtual bool parameterMatches( const std::string &name, const std::string &value ) const = 0; + bool setParameter(const std::string &strName, const std::string &strValue); + + std::string getModel() const; + std::string getFullModel() const; + bool setModel( const std::string & strModel ); + std::string getName() const; + bool setName( const std::string &newName ); + + static int methodId( const std::string &methodName ); + static int maskUnsupportedMethods( int methods, int supportedMethods ); + + #ifdef _LINUX + void setDevice(const std::string &device); + protected: + std::string strDevice; + #endif + + protected: + virtual bool setDeviceParameter(const std::string &strName, const std::string &strValue) = 0; + virtual int turnOn(void); + virtual int turnOff(void); + virtual int bell(void); + virtual int dim(unsigned char level); + virtual int learn(void); + int send(const std::string &strMessage); + + private: + int deviceId; + std::string deviceName, model; + // static QMutex deviceMutex; + }; + +} diff --git a/driver/libtelldus-core/DeviceBrateck.cpp b/driver/libtelldus-core/DeviceBrateck.cpp new file mode 100644 index 00000000..b8afebc8 --- /dev/null +++ b/driver/libtelldus-core/DeviceBrateck.cpp @@ -0,0 +1,119 @@ +#include "DeviceBrateck.h" +#include +#include +#include +#include + +using namespace TelldusCore; + +const char S = '!'; +const char L = 'V'; +const char B1[] = {L,S,L,S,0}; +const char BX[] = {S,L,L,S,0}; +const char B0[] = {S,L,S,L,0}; +const char BUP[] = {L,S,L,S,S,L,S,L,S,L,S,L,S,L,S,L,S,0}; +const char BSTOP[] = {S,L,S,L,L,S,L,S,S,L,S,L,S,L,S,L,S,0}; +const char BDOWN[] = {S,L,S,L,S,L,S,L,S,L,S,L,L,S,L,S,S,0}; + +/* +* Constructor +*/ +DeviceBrateck::DeviceBrateck(int id, const std::string &model, const std::string &name) + :Device(id, model, name) +{ +} + + +DeviceBrateck::~DeviceBrateck(void) +{ +} + +bool DeviceBrateck::setHouse(const std::string &strNewHouse) { + strHouse = strNewHouse; + return true; +} + +bool DeviceBrateck::setDeviceParameter(const std::string &strName, const std::string &strValue) { + if (strName.compare("house") == 0) { + return setHouse(strValue); + } + return false; +} + +/* +* Turn on this device +*/ +int DeviceBrateck::turnOn(void){ + + try{ + std::string strCode = getStringCode(); + + strCode.insert(0, "S"); + strCode.append(BUP); + strCode.append("+"); //the "turn on"-code! + + return Device::send(strCode); + } + catch(...){ + throw; + } + return TELLSTICK_ERROR_UNKNOWN; +} + +/* +* Turn off this device +*/ +int DeviceBrateck::turnOff(void){ + + try{ + std::string strCode = getStringCode(); + + strCode.insert(0, "S"); + strCode.append(BDOWN); + strCode.append("+"); //the "turn off"-code! + + return Device::send(strCode); + } + catch(...){ + throw; + } + return TELLSTICK_ERROR_UNKNOWN; +} + +bool DeviceBrateck::parameterMatches( const std::string &name, const std::string &value ) const { + return false; +} + +/* +* Has the device got the method? +*/ +int DeviceBrateck::methods(){ + return (TELLSTICK_TURNON | TELLSTICK_TURNOFF); +} + +std::string DeviceBrateck::getStringCode(void){ + + std::string strReturn; + + try{ + for( size_t i = 0; i < strHouse.length(); ++i ) { + if (strHouse[i] == '1') { + strReturn.insert(0, B1); + } else if (strHouse[i] == '-') { + strReturn.insert(0, BX); + } else if (strHouse[i] == '0') { + strReturn.insert(0, B0); + } + } + } + catch(...){ + throw; + } + return strReturn; + +} + +std::string DeviceBrateck::getProtocol() const { + return "brateck"; +} + diff --git a/driver/libtelldus-core/DeviceBrateck.h b/driver/libtelldus-core/DeviceBrateck.h new file mode 100644 index 00000000..2a8f7954 --- /dev/null +++ b/driver/libtelldus-core/DeviceBrateck.h @@ -0,0 +1,29 @@ +#pragma once +#include "Device.h" +#include + +namespace TelldusCore { + + class DeviceBrateck : public Device + { + public: + DeviceBrateck(int id, const std::string &model, const std::string &name); + virtual ~DeviceBrateck(void); + + virtual int methods(); + virtual std::string getProtocol() const; + virtual bool parameterMatches( const std::string &name, const std::string &value ) const; + + bool setHouse(const std::string &strNewHouse); + + protected: + virtual bool setDeviceParameter(const std::string &strName, const std::string &strValue); + + virtual int turnOn(void); + virtual int turnOff(void); + + std::string getStringCode(void); + std::string strHouse; + }; + +} diff --git a/driver/libtelldus-core/DeviceEverflourish.cpp b/driver/libtelldus-core/DeviceEverflourish.cpp new file mode 100644 index 00000000..3bd7c87c --- /dev/null +++ b/driver/libtelldus-core/DeviceEverflourish.cpp @@ -0,0 +1,184 @@ +#include "DeviceEverflourish.h" +#include "common.h" + +using namespace TelldusCore; + +const unsigned char ON = 15; +const unsigned char OFF = 0; +const unsigned char LEARN = 10; + +/* +* Constructor +*/ +DeviceEverflourish::DeviceEverflourish(int id, const std::string &model, const std::string &name) + :Device(id, model, name), + intHouse(0), + intCode(0) +{ +} + +/* +* Destructor +*/ +DeviceEverflourish::~DeviceEverflourish(void) +{} + +bool DeviceEverflourish::setHouse(const std::string &newHouse) { + if (newHouse.length() > 0) { + intHouse = atoi(newHouse.c_str()); + } else { + intHouse = 0; + } + if (intHouse < 0) { + intHouse = 0; + } else if (intHouse > 16383) { + intHouse = 16383; + } + return true; +} + +bool DeviceEverflourish::setUnit(const std::string &newUnit) { + if (newUnit.length() > 0) { + intCode = atoi(newUnit.c_str()) - 1; + } else { + intCode = 0; + } + if (intCode < 0) { + intCode = 0; + } else if (intCode > 3) { + intCode = 3; + } + return true; +} + +bool DeviceEverflourish::setDeviceParameter(const std::string &strName, const std::string &strValue) { + if (strName.compare("house") == 0) { + return setHouse(strValue); + } else if (strName.compare("unit") == 0) { + return setUnit(strValue); + } + return false; +} + +/* +* Turn on this device +*/ +int DeviceEverflourish::turnOn(void){ + try{ + std::string strCode = getCode(ON); + return Device::send(strCode); + } + catch(...){ + throw; + } + return TELLSTICK_ERROR_UNKNOWN; +} + +/* +* Turn off this device +*/ +int DeviceEverflourish::turnOff(void){ + try{ + std::string strCode = getCode(OFF); + return Device::send(strCode); + } + catch(...){ + throw; + } + return TELLSTICK_ERROR_UNKNOWN; +} + +int DeviceEverflourish::learn(void){ + try{ + std::string strCode = getCode(LEARN); + return Device::send(strCode); + } + catch(...){ + throw; + } + return TELLSTICK_ERROR_UNKNOWN; +} + + +bool DeviceEverflourish::parameterMatches( const std::string &name, const std::string &value ) const { + return false; +} + +/* +* Has the device got the method? +*/ +int DeviceEverflourish::methods(){ + return (TELLSTICK_TURNON | TELLSTICK_TURNOFF | TELLSTICK_LEARN); +} + +std::string DeviceEverflourish::getProtocol() const { + return "arctech"; +} + +std::string DeviceEverflourish::getCode(unsigned char action) { + unsigned int deviceCode = intHouse; + + const char ssss = 85; + const char sssl = 84; // 0 + const char slss = 69; // 1 + + const char bits[2] = {sssl,slss}; + int i, check; + + std::string strCode; + + deviceCode = (deviceCode << 2) | intCode; + + check = calculateChecksum(deviceCode); + + char preamble[] = {'R', 5, 'T', 114,60,1,1,105,ssss,ssss,0}; + strCode.append(preamble); + + for(i=15;i>=0;i--) { + strCode.append(1, bits[(deviceCode>>i)&0x01]); + } + for(i=3;i>=0;i--) { + strCode.append(1, bits[(check>>i)&0x01]); + } + for(i=3;i>=0;i--) { + strCode.append(1, bits[(action>>i)&0x01]); + } + + strCode.append(1, ssss); + strCode.append(1, '+'); + + return strCode; +} + +// The calculation used in this function is provided by Frank Stevenson +unsigned int DeviceEverflourish::calculateChecksum(unsigned int x) { + unsigned int bits[16] = { + 0xf ,0xa ,0x7 ,0xe, + 0xf ,0xd ,0x9 ,0x1, + 0x1 ,0x2 ,0x4 ,0x8, + 0x3 ,0x6 ,0xc ,0xb + }; + unsigned int bit = 1; + unsigned int res = 0x5; + int i; + unsigned int lo,hi; + + if ((x&0x3)==3) { + lo = x & 0x00ff; + hi = x & 0xff00; + lo += 4; + if (lo>0x100) { + lo = 0x12; + } + x = lo | hi; + } + + for(i=0;i<16;i++) { + if (x&bit) { + res = res ^ bits[i]; + } + bit = bit << 1; + } + + return res; +} diff --git a/driver/libtelldus-core/DeviceEverflourish.h b/driver/libtelldus-core/DeviceEverflourish.h new file mode 100644 index 00000000..a8713be0 --- /dev/null +++ b/driver/libtelldus-core/DeviceEverflourish.h @@ -0,0 +1,38 @@ +#ifndef DEVICEEVERFLOURISH_H +#define DEVICEEVERFLOURISH_H + +#include "Device.h" +#include + +namespace TelldusCore { + + class DeviceEverflourish : public Device + { + public: + DeviceEverflourish(int id, const std::string &model, const std::string &name); + virtual int methods(); + virtual std::string getProtocol() const; + virtual bool parameterMatches( const std::string &name, const std::string &value ) const; + + bool setHouse(const std::string &newHouse); + bool setUnit(const std::string &newUnit); + + public: + ~DeviceEverflourish(void); + + protected: + virtual bool setDeviceParameter(const std::string &strName, const std::string &strValue); + virtual int turnOn(void); + virtual int turnOff(void); + virtual int learn(void); + + int intHouse; + int intCode; + + std::string getCode(unsigned char action); + static unsigned int calculateChecksum(unsigned int x); + }; + +} + +#endif //DEVICEEVERFLOURISH_H \ No newline at end of file diff --git a/driver/libtelldus-core/DeviceGroup.cpp b/driver/libtelldus-core/DeviceGroup.cpp new file mode 100644 index 00000000..1831bec8 --- /dev/null +++ b/driver/libtelldus-core/DeviceGroup.cpp @@ -0,0 +1,145 @@ +#include + +#include "DeviceGroup.h" +#include "Manager.h" + +using namespace TelldusCore; + +/* +* Constructor +*/ +DeviceGroup::DeviceGroup(int id, const std::string &model, const std::string &name) + :Device(id, model, name) +{ +} + +/* +* Destructor +*/ +DeviceGroup::~DeviceGroup(void) { +} + +bool DeviceGroup::setDeviceParameter(const std::string &strName, const std::string &strValue) { + if (strName.compare("devices") == 0) { + return setDevices(strValue); + } + return false; +} + +bool DeviceGroup::setDevices(const std::string &newDevices) { +/* if (strDevices.length() > 0) { + char *tempDevices = new char[strDevices.size()+1]; + #ifdef _WINDOWS + strcpy_s(tempDevices, strDevices.size()+1, strDevices.c_str()); + #else + strcpy(tempDevices, strDevices.c_str()); + #endif + + Manager *manager = Manager::getInstance(); + char *strToken = strtok(tempDevices, ","); + do { + int intDevice = atoi(strToken); + Device *device = manager->getDevice(intDevice); + if (device != NULL) { + deviceList.push_back( device ); + } + } while ( (strToken = strtok(NULL, ",")) != NULL ); + + free(tempDevices); + }*/ + return true; +} + +/* +* Turn on this device +*/ +int DeviceGroup::turnOn(void) { + int retVal = TELLSTICK_ERROR_UNKNOWN; + + for (DeviceList::const_iterator it = deviceList.begin(); it != deviceList.end(); ++it) { + int methods = (*it)->methods(); + if (methods & TELLSTICK_TURNON) { + int success = (*it)->switchState( TELLSTICK_TURNON ); + if (retVal != TELLSTICK_SUCCESS) { + retVal = success; + } + } + } + return retVal; +} + +/* +* Turn off this device +*/ +int DeviceGroup::turnOff(void) { + int retVal = TELLSTICK_ERROR_UNKNOWN; + + for (DeviceList::const_iterator it = deviceList.begin(); it != deviceList.end(); ++it) { + int methods = (*it)->methods(); + if (methods & TELLSTICK_TURNOFF) { + int success = (*it)->switchState( TELLSTICK_TURNOFF ); + if (retVal != TELLSTICK_SUCCESS) { + retVal = success; + } + } + } + return retVal; +} + +/* +* Send a bell +*/ +int DeviceGroup::bell(void){ + int retVal = TELLSTICK_ERROR_UNKNOWN; + + for (DeviceList::const_iterator it = deviceList.begin(); it != deviceList.end(); ++it) { + int methods = (*it)->methods(); + if (methods & TELLSTICK_BELL) { + int success = (*it)->switchState( TELLSTICK_BELL ); + if (retVal != TELLSTICK_SUCCESS) { + retVal = success; + } + } + } + return retVal; +} + +/* +* Turn off this device +*/ +int DeviceGroup::dim(unsigned char level){ + int retVal = TELLSTICK_ERROR_UNKNOWN; + + for (DeviceList::const_iterator it = deviceList.begin(); it != deviceList.end(); ++it) { + int methods = (*it)->methods(); + if (methods & TELLSTICK_DIM) { + int success = (*it)->switchState( TELLSTICK_DIM, (char*)&level); + if (retVal != TELLSTICK_SUCCESS) { + retVal = success; + } + } + } + return retVal; +} + +bool DeviceGroup::parameterMatches( const std::string &name, const std::string &value ) const { + return false; +} + +/* +* Has the device got the method? +*/ +int DeviceGroup::methods(){ + int retVal = 0; + + for (DeviceList::const_iterator it = deviceList.begin(); it != deviceList.end(); ++it) { + retVal = retVal | (*it)->methods(); + } + + return retVal; +} + +std::string DeviceGroup::getProtocol() const { + return "group"; +} + diff --git a/driver/libtelldus-core/DeviceGroup.h b/driver/libtelldus-core/DeviceGroup.h new file mode 100644 index 00000000..b3b1583e --- /dev/null +++ b/driver/libtelldus-core/DeviceGroup.h @@ -0,0 +1,36 @@ +#pragma once +#include "Device.h" +#include +#include + +class Controller; + +namespace TelldusCore { + + typedef std::list DeviceList; + + class DeviceGroup : public Device + { + public: + DeviceGroup(int id, const std::string &model, const std::string &name); + ~DeviceGroup(void); + + virtual int methods(); + virtual std::string getProtocol() const; + virtual bool parameterMatches( const std::string &name, const std::string &value ) const; + + bool setDevices(const std::string &newDevices); + + protected: + virtual bool setDeviceParameter(const std::string &strName, const std::string &strValue); + + virtual int turnOn(void); + virtual int turnOff(void); + virtual int bell(void); + virtual int dim(unsigned char level); + + private: + DeviceList deviceList; + }; + +} diff --git a/driver/libtelldus-core/DeviceIkea.cpp b/driver/libtelldus-core/DeviceIkea.cpp new file mode 100644 index 00000000..237b9691 --- /dev/null +++ b/driver/libtelldus-core/DeviceIkea.cpp @@ -0,0 +1,233 @@ +// #include "StdAfx.h" //Needed? +#include "DeviceIkea.h" +#include +#include +#include +#include +#include + +#ifdef _WINDOWS +#define strcasecmp(x, y) _strcmpi(x, y) +#endif + +using namespace TelldusCore; + +/* +* Constructor +*/ +DeviceIkea::DeviceIkea(int id, const std::string &model, const std::string &name) + :Device(id, model, name) +{ +} + +bool DeviceIkea::setSystem(const std::string &strSystem) { + if (strSystem.length() > 0) { + intSystem = atoi(strSystem.c_str()) - 1; + } else { + intSystem = 0; + } + return true; +} + +bool DeviceIkea::setUnits(const std::string &strUnits) { + if (strUnits.length() > 0) { + intUnits = 0; //Start without any units + + char *tempUnits = new char[strUnits.size()+1]; +#ifdef _WINDOWS + strcpy_s(tempUnits, strUnits.size()+1, strUnits.c_str()); +#else + strcpy(tempUnits, strUnits.c_str()); +#endif + + char *strToken = strtok(tempUnits, ","); + do { + int intUnit = atoi(strToken); + if (intUnit == 10) { + intUnit = 0; + } + intUnits = intUnits | ( 1<<(9-intUnit) ); + } while ( (strToken = strtok(NULL, ",")) != NULL ); + + free(tempUnits); + } + return true; +} + +bool DeviceIkea::setFade(const std::string &strFadeStyle) { + if (strFadeStyle.length() > 0 && strcasecmp(strFadeStyle.c_str(), "true") == 0) { + intFadeStyle = 1; + } else { + intFadeStyle = 0; + } + return true; +} + +/* +* Destructor +*/ +DeviceIkea::~DeviceIkea(void) +{ + intSystem = -1; + intUnits = -1; + intFadeStyle = -1; +} + +bool DeviceIkea::setDeviceParameter(const std::string &strName, const std::string &strValue) { + if (strName.compare("system") == 0) { + return setSystem(strValue); + } else if (strName.compare("units") == 0) { + return setUnits(strValue); + } else if (strName.compare("fade") == 0) { + return setFade(strValue); + } + return false; +} + +/* +* Turn on this device +*/ +int DeviceIkea::turnOn(void){ + try{ + std::string strMessage = getStringCode(255); + + return Device::send(strMessage); + } + catch(...){ + throw; + } + return TELLSTICK_ERROR_UNKNOWN; +} + +/* +* Turn off this device +*/ +int DeviceIkea::turnOff(void){ + try{ + std::string strMessage = getStringCode(0); + + return Device::send(strMessage); + } + catch(...){ + throw; + } + return TELLSTICK_ERROR_UNKNOWN; +} + +/* +* Turn off this device +*/ +int DeviceIkea::dim(unsigned char level){ + try{ + std::string strMessage = getStringCode(level); + + return Device::send(strMessage); + } + catch(...){ + throw; + } + return TELLSTICK_ERROR_UNKNOWN; +} + +/* +* Convert an integer to byte string where 0 is represented by ª and 1 by TT +*/ +std::string DeviceIkea::getStringCode(unsigned char level){ + + std::string strReturn = "STTTTTTª"; //Startcode, always like this; + + try{ + std::string strChannels = ""; + int intCode = (intSystem << 10) | intUnits; + int checksum1 = 0; + int checksum2 = 0; + for (int i = 13; i >= 0; --i) { + if ((intCode>>i) & 1) { + strChannels.append("TT"); + if (i % 2 == 0) + checksum2++; + else + checksum1++; + } else { + strChannels.append("ª"); + } + } + strReturn.append(strChannels); //System + Units + + strReturn.append(checksum1 %2 == 0 ? "TT" : "ª"); //1st checksum + strReturn.append(checksum2 %2 == 0 ? "TT" : "ª"); //2nd checksum + + int intLevel = 0; + if (level <= 12) { + intLevel = 10; // Level 10 is actually off + } else if (level <= 37) { + intLevel = 1; + } else if (level <= 62) { + intLevel = 2; + } else if (level <= 87) { + intLevel = 3; + } else if (level <= 112) { + intLevel = 4; + } else if (level <= 137) { + intLevel = 5; + } else if (level <= 162) { + intLevel = 6; + } else if (level <= 187) { + intLevel = 7; + } else if (level <= 212) { + intLevel = 8; + } else if (level <= 237) { + intLevel = 9; + } else { + intLevel = 0; // Level 0 is actually full on + } + + int intFade = 0; + if (intFadeStyle == 1) { + intFade = 11 << 4; //Smooth + } else { + intFade = 1 << 4; //Instant + } + + intCode = intLevel | intFade; //Concat level and fade + + checksum1 = 0; + checksum2 = 0; + for (int i = 0; i < 6; ++i) { + if ((intCode>>i) & 1) { + strReturn.append("TT"); + if (i % 2 == 0) + checksum1++; + else + checksum2++; + } else { + strReturn.append("ª"); + } + } + + strReturn.append(checksum1 %2 == 0 ? "TT" : "ª"); //1st checksum + strReturn.append(checksum2 %2 == 0 ? "TT" : "ª"); //2nd checksum + + strReturn.append("+"); + } + catch(...){ + throw; + } + return strReturn; + +} + +bool DeviceIkea::parameterMatches( const std::string &name, const std::string &value ) const { + return false; +} + +/* +* Has the device got the method? +*/ +int DeviceIkea::methods(){ + return (TELLSTICK_TURNON | TELLSTICK_TURNOFF | TELLSTICK_DIM); +} + +std::string DeviceIkea::getProtocol() const { + return "ikea"; +} diff --git a/driver/libtelldus-core/DeviceIkea.h b/driver/libtelldus-core/DeviceIkea.h new file mode 100644 index 00000000..695677de --- /dev/null +++ b/driver/libtelldus-core/DeviceIkea.h @@ -0,0 +1,34 @@ +#pragma once +#include "Device.h" +#include + +namespace TelldusCore { + + class DeviceIkea : public Device + { + public: + DeviceIkea(int id, const std::string &model, const std::string &name); + virtual ~DeviceIkea(void); + + virtual int methods(); + virtual std::string getProtocol() const; + virtual bool parameterMatches( const std::string &name, const std::string &value ) const; + + bool setSystem(const std::string &strSystem); + bool setUnits(const std::string &strUnits); + bool setFade(const std::string &strFade); + + protected: + virtual bool setDeviceParameter(const std::string &strName, const std::string &strValue); + + virtual int turnOn(void); + virtual int turnOff(void); + virtual int dim(unsigned char level); + + int intSystem; + int intUnits; + int intFadeStyle; + std::string getStringCode(unsigned char); + }; + +} diff --git a/driver/libtelldus-core/DeviceNexa.cpp b/driver/libtelldus-core/DeviceNexa.cpp new file mode 100644 index 00000000..52869083 --- /dev/null +++ b/driver/libtelldus-core/DeviceNexa.cpp @@ -0,0 +1,149 @@ +// #include "StdAfx.h" +#include "DeviceNexa.h" +#include +#include +#include +#include +#include "common.h" + +using namespace TelldusCore; + +/* +* Constructor +*/ +DeviceNexa::DeviceNexa(int id, const std::string &model, const std::string &name) + :Device(id, model, name), + intHouse(0), + intCode(0) +{ +} + +/* +* Destructor +*/ +DeviceNexa::~DeviceNexa(void) +{} + +bool DeviceNexa::setHouse(const std::string &newHouse) { + if (newHouse.length() > 0) { + intHouse = atoi(newHouse.c_str()); + } else { + intHouse = 0; + } + return true; +} + +bool DeviceNexa::setUnit(const std::string &newUnit) { + if (newUnit.length() > 0) { + intCode = atoi(newUnit.c_str()) - 1; + } else { + intCode = 0; + } + return true; +} + +bool DeviceNexa::setDeviceParameter(const std::string &strName, const std::string &strValue) { + if (strName.compare("house") == 0) { + return setHouse(strValue); + } else if (strName.compare("unit") == 0) { + return setUnit(strValue); + } + return false; +} + +/* +* Turn on this device +*/ +int DeviceNexa::turnOn(void) { + std::string strCode = ""; + if (isDimmer()) { + return dim(255); + } else { + strCode = getStringSelflearning(false, 0); + strCode.append( 1, 1 ); //On + strCode.append( ":" ); + } + return Device::send(strCode); +} + +/* +* Turn off this device +*/ +int DeviceNexa::turnOff(void){ + std::string strCode = getStringSelflearning(false, 0); + strCode.append( 1, 2 ); //Off + strCode.append( ":" ); + return Device::send(strCode); +} + +/* +* Dim this device +*/ +int DeviceNexa::dim(unsigned char level) { + std::string strCode = getStringSelflearning(true, level); + return Device::send(strCode); +} + + +int DeviceNexa::learn(void) { + std::string strCode = getStringSelflearning(false, 0); + strCode.append( 1, 1 ); //On + strCode.append( ":" ); + return Device::send(strCode); +} + + +std::string DeviceNexa::getStringSelflearning(bool dim, unsigned char level) { + std::string strMessage; + strMessage.append( ":" ); + strMessage.append( 1, 15); + strMessage.append( ":SEND:ATSL:" ); + int c = intHouse << 4; + c = c | (intCode & 0xFF); + strMessage.append( 1, (c >> 24) & 0xFF ); + strMessage.append( 1, (c >> 16) & 0xFF ); + strMessage.append( 1, (c >> 8) & 0xFF ); + strMessage.append( 1, c & 0xFF ); + return strMessage; +} + +bool DeviceNexa::parameterMatches( const std::string &name, const std::string &value ) const { + if (value.length() == 0) { + return false; + } + + if (name.compare("arctech_house") == 0) { + return intHouse == value[0] - 'A'; + } else if (name.compare("arctech_unit") == 0) { + return intCode == atoi(value.c_str()) - 1; + } + return true; +} + +/* +* Has the device got the method? +*/ +int DeviceNexa::methods(){ + std::string strModel = this->getModel(); + + if (strcasecmp(strModel.c_str(), "selflearning-switch") == 0) { + return (TELLSTICK_TURNON | TELLSTICK_TURNOFF | TELLSTICK_LEARN); + + } else if (strcasecmp(strModel.c_str(), "selflearning-dimmer") == 0) { + return (TELLSTICK_TURNON | TELLSTICK_TURNOFF | TELLSTICK_DIM | TELLSTICK_LEARN); + + } + return 0; +} + +bool DeviceNexa::isSelflearning() const { + return true; +} + +bool DeviceNexa::isDimmer() const { + return strcasecmp(getModel().c_str(), "selflearning-dimmer") == 0; +} + +std::string DeviceNexa::getProtocol() const { + return "arctech"; +} diff --git a/driver/libtelldus-core/DeviceNexa.h b/driver/libtelldus-core/DeviceNexa.h new file mode 100644 index 00000000..bfe873be --- /dev/null +++ b/driver/libtelldus-core/DeviceNexa.h @@ -0,0 +1,36 @@ +#pragma once +#include "Device.h" +#include + +namespace TelldusCore { + + class DeviceNexa : public Device + { + public: + DeviceNexa(int id, const std::string &model, const std::string &name); + virtual int methods(); + virtual std::string getProtocol() const; + virtual bool parameterMatches( const std::string &name, const std::string &value ) const; + + bool setHouse(const std::string &newHouse); + bool setUnit(const std::string &newUnit); + + public: + ~DeviceNexa(void); + + protected: + virtual bool setDeviceParameter(const std::string &strName, const std::string &strValue); + virtual int turnOn(void); + virtual int turnOff(void); + virtual int dim(unsigned char level); + virtual int learn(void); + + bool isSelflearning() const; + bool isDimmer() const; + + int intHouse; + int intCode; + std::string getStringSelflearning(bool dim, unsigned char level); + }; + +} diff --git a/driver/libtelldus-core/DeviceRisingSun.cpp b/driver/libtelldus-core/DeviceRisingSun.cpp new file mode 100644 index 00000000..fbd4dee3 --- /dev/null +++ b/driver/libtelldus-core/DeviceRisingSun.cpp @@ -0,0 +1,220 @@ +// #include "StdAfx.h" +#include "DeviceRisingSun.h" +#include +#include +#include +#include +#include +#include "common.h" + +using namespace TelldusCore; + +/* +* Constructor +*/ +DeviceRisingSun::DeviceRisingSun(int id, const std::string &model, const std::string &name) + :Device(id, model, name), + intHouse(0), + intCode(0) +{ +} + +/* +* Destructor +*/ +DeviceRisingSun::~DeviceRisingSun(void) +{} + +bool DeviceRisingSun::setHouse(const std::string &newHouse) { + if (newHouse.length() > 0) { + intHouse = atoi(newHouse.c_str()) - 1; + } else { + intHouse = 0; + } + return true; +} + +bool DeviceRisingSun::setUnit(const std::string &newUnit) { + if (newUnit.length() > 0) { + intCode = atoi(newUnit.c_str()) - 1; + } else { + intCode = 0; + } + return true; +} + +bool DeviceRisingSun::setDeviceParameter(const std::string &strName, const std::string &strValue) { + if (strName.compare("house") == 0) { + return setHouse(strValue); + } else if (strName.compare("unit") == 0) { + return setUnit(strValue); + } + return false; +} + +/* +* Turn on this device +*/ +int DeviceRisingSun::turnOn(void){ + + try{ + if (isSelflearning()) { + return Device::send(getStringSelflearning(true)); + + } else { + std::string strCode = getStringCodeswitch(intHouse); + std::string strUnit = getStringCodeswitch(intCode); + strCode.append(strUnit); + + strCode.insert(0, "S.e"); + strCode.append("e..ee..ee..ee..e+"); //the "turn on"-code, keeps it like this, doesn't have to be regenerated each time + + return Device::send(strCode); + } + } + catch(...){ + throw; + } + return TELLSTICK_ERROR_UNKNOWN; +} + +/* +* Turn off this device +*/ +int DeviceRisingSun::turnOff(void){ + + try{ + if (isSelflearning()) { + return Device::send(getStringSelflearning(false)); + + } else { + std::string strCode = getStringCodeswitch(intHouse); + std::string strUnit = getStringCodeswitch(intCode); + strCode.append(strUnit); + + strCode.insert(0, "S.e"); + strCode.append("e..ee..ee..e.e.e+"); //the "turn off"-code, keeps it like this, doesn't have to be regenerated each time + + return Device::send(strCode); + } + } + catch(...){ + throw; + } + return TELLSTICK_ERROR_UNKNOWN; +} + +int DeviceRisingSun::learn(void){ + std::string strCode = "R"; + strCode.append( 1, 50 ); + strCode.append(getStringSelflearning(true)); + return Device::send(strCode); +} + +/* +* Convert an integer to byte string where 0 is represented by $k and 1 by k$, reversed and padded with 0's as needed +*/ +std::string DeviceRisingSun::getStringCodeswitch(int intToConvert){ + + std::string strReturn = ""; + + try{ + for(int i = 0; i < 4; ++i) { + if (i == intToConvert) { + strReturn.append( ".e.e" ); + } else { + strReturn.append( "e..e" ); + } + } + } + catch(...){ + throw; + } + return strReturn; + +} + +std::string DeviceRisingSun::getStringSelflearning(bool on){ + const char code_on[][7] = { + "110110", "001110", "100110", "010110", + "111001", "000101", "101001", "011001", + "110000", "001000", "100000", "010000", + "111100", "000010", "101100", "011100" + }; + const char code_off[][7] = { + "111110", "000001", "101110", "011110", + "110101", "001101", "100101", "010101", + "111000", "000100", "101000", "011000", + "110010", "001010", "100010", "010010" + }; + const char l = 120; + const char s = 51; + + std::string strCode = "10"; + int code = intCode; + code = (code < 0 ? 0 : code); + code = (code > 15 ? 15 : code); + if (on) { + strCode.append(code_on[code]); + } else { + strCode.append(code_off[code]); + } + + int house = intHouse; + for(int i = 0; i < 25; ++i) { + if (house & 1) { + strCode.append(1, '1'); + } else { + strCode.append(1, '0'); + } + house >>= 1; + } + + std::string strReturn; + for(unsigned int i = 0; i < strCode.length(); ++i) { + if (strCode[i] == '1') { + strReturn.append(1, l); + strReturn.append(1, s); + } else { + strReturn.append(1, s); + strReturn.append(1, l); + } + } + + std::string prefix = "P"; + prefix.append(1, 5); + prefix.append("S"); + strReturn.insert(0, prefix); + strReturn.append(1, '+'); + return strReturn; +} + +bool DeviceRisingSun::parameterMatches( const std::string &name, const std::string &value ) const { + if (value.length() == 0) { + return false; + } + + return false; +} + +/* +* Has the device got the method? +*/ +int DeviceRisingSun::methods() { + std::string strModel = this->getModel(); + + if (strcasecmp(strModel.c_str(), "selflearning") == 0) { + return (TELLSTICK_TURNON | TELLSTICK_TURNOFF | TELLSTICK_LEARN); + } + + return (TELLSTICK_TURNON | TELLSTICK_TURNOFF); +} + +std::string DeviceRisingSun::getProtocol() const { + return "risingsun"; +} + +bool DeviceRisingSun::isSelflearning() const { + return (strcasecmp(getModel().c_str(), "selflearning") == 0); +} + diff --git a/driver/libtelldus-core/DeviceRisingSun.h b/driver/libtelldus-core/DeviceRisingSun.h new file mode 100644 index 00000000..745d9338 --- /dev/null +++ b/driver/libtelldus-core/DeviceRisingSun.h @@ -0,0 +1,35 @@ +#pragma once +#include "Device.h" +#include + +namespace TelldusCore { + + class DeviceRisingSun : public Device + { + public: + DeviceRisingSun(int id, const std::string &model, const std::string &name); + virtual int methods(); + virtual std::string getProtocol() const; + virtual bool parameterMatches( const std::string &name, const std::string &value ) const; + + bool setHouse(const std::string &newHouse); + bool setUnit(const std::string &newUnit); + + public: + ~DeviceRisingSun(void); + + protected: + virtual bool setDeviceParameter(const std::string &strName, const std::string &strValue); + virtual int turnOn(void); + virtual int turnOff(void); + virtual int learn(void); + + int intHouse; + int intCode; + bool isSelflearning() const; + + std::string getStringCodeswitch(int); + std::string getStringSelflearning(bool on); + }; + +} diff --git a/driver/libtelldus-core/DeviceSartano.cpp b/driver/libtelldus-core/DeviceSartano.cpp new file mode 100644 index 00000000..f0f7c4d5 --- /dev/null +++ b/driver/libtelldus-core/DeviceSartano.cpp @@ -0,0 +1,114 @@ +#include "DeviceSartano.h" +#include "DeviceNexa.h" +#include +#include +#include +#include + +using namespace TelldusCore; + +/* +* Constructor +*/ +DeviceSartano::DeviceSartano(int id, const std::string &model, const std::string &name) + :Device(id, model, name) +{ +} + + +DeviceSartano::~DeviceSartano(void) +{ +} + +bool DeviceSartano::setCode(const std::string &strNewCode) { + strCode = strNewCode; + return true; +} + +bool DeviceSartano::setDeviceParameter(const std::string &strName, const std::string &strValue) { + if (strName.compare("code") == 0) { + return setCode(strValue); + } + return false; +} + +/* +* Turn on this device +*/ +int DeviceSartano::turnOn(void){ + + try{ + std::string strCode = getStringCode(); + + strCode.insert(0, "S"); + strCode.append("$k$k$kk$$k+"); //the "turn on"-code, keeps it like this, doesn't have to be regenerated each time + + return Device::send(strCode); + } + catch(...){ + throw; + } + return TELLSTICK_ERROR_UNKNOWN; +} + +/* +* Turn off this device +*/ +int DeviceSartano::turnOff(void){ + + try{ + std::string strCode = getStringCode(); + + strCode.insert(0, "S"); + strCode.append("$kk$$k$k$k+"); //the "turn off"-code, keeps it like this, doesn't have to be regenerated each time + + return Device::send(strCode); + } + catch(...){ + throw; + } + return TELLSTICK_ERROR_UNKNOWN; +} + +bool DeviceSartano::parameterMatches( const std::string &name, const std::string &value ) const { + return false; +} + +/* +* Has the device got the method? +*/ +int DeviceSartano::methods(){ + return (TELLSTICK_TURNON | TELLSTICK_TURNOFF); +} + +/* +* Convert an integer to byte string where 0 is represented by $k and 1 by k$, reversed and padded with 0's as needed +*/ +std::string DeviceSartano::getStringCode(void){ + + std::string strReturn = strCode; + + try{ + size_t intPos = strReturn.find("0"); + while (intPos < std::string::npos){ + strReturn.replace(intPos, 1, "$kk$"); + intPos = strReturn.find("0", intPos + 1); + } + + intPos = strReturn.find("1"); + while (intPos < std::string::npos){ + strReturn.replace(intPos, 1, "$k$k"); + intPos = strReturn.find("1", intPos + 1); + } + } + catch(...){ + throw; + } + return strReturn; + +} + +std::string DeviceSartano::getProtocol() const { + return "sartano"; +} + diff --git a/driver/libtelldus-core/DeviceSartano.h b/driver/libtelldus-core/DeviceSartano.h new file mode 100644 index 00000000..a849fb33 --- /dev/null +++ b/driver/libtelldus-core/DeviceSartano.h @@ -0,0 +1,29 @@ +#pragma once +#include "Device.h" +#include + +namespace TelldusCore { + + class DeviceSartano : public Device + { + public: + DeviceSartano(int id, const std::string &model, const std::string &name); + virtual ~DeviceSartano(void); + + virtual int methods(); + virtual std::string getProtocol() const; + virtual bool parameterMatches( const std::string &name, const std::string &value ) const; + + bool setCode(const std::string &strNewCode); + + protected: + virtual bool setDeviceParameter(const std::string &strName, const std::string &strValue); + + virtual int turnOn(void); + virtual int turnOff(void); + + std::string getStringCode(void); + std::string strCode; + }; + +} diff --git a/driver/libtelldus-core/DeviceUndefined.cpp b/driver/libtelldus-core/DeviceUndefined.cpp new file mode 100644 index 00000000..2f95ccb9 --- /dev/null +++ b/driver/libtelldus-core/DeviceUndefined.cpp @@ -0,0 +1,41 @@ +#include "DeviceUndefined.h" + +using namespace TelldusCore; + +/* +* Constructor +*/ +DeviceUndefined::DeviceUndefined(int id, const std::string &model, const std::string &name) + :Device(id, model, name) +{ +} + +/* +* Destructor +*/ +DeviceUndefined::~DeviceUndefined(void) +{} + +bool DeviceUndefined::setDeviceParameter(const std::string &strName, const std::string &strValue) { + return true; +} + +bool DeviceUndefined::parameterMatches( const std::string &name, const std::string &value ) const { + return false; +} + +/* +* Has the device got the method? +*/ +int DeviceUndefined::methods(){ + return 0; +} + +std::string DeviceUndefined::getProtocol() const { + return "undefined"; +} + + +int TelldusCore::DeviceUndefined::sendRawCommand(const std::string & strMessage) { + return send(strMessage); +} diff --git a/driver/libtelldus-core/DeviceUndefined.h b/driver/libtelldus-core/DeviceUndefined.h new file mode 100644 index 00000000..034f3d86 --- /dev/null +++ b/driver/libtelldus-core/DeviceUndefined.h @@ -0,0 +1,25 @@ +#pragma once +#include "Device.h" +#include + +namespace TelldusCore { + + class DeviceUndefined : public Device + { + public: + DeviceUndefined(int id, const std::string &model, const std::string &name); + virtual int methods(); + virtual std::string getProtocol() const; + virtual bool parameterMatches( const std::string &name, const std::string &value ) const; + + int sendRawCommand(const std::string &strMessage); + + + public: + ~DeviceUndefined(void); + + protected: + virtual bool setDeviceParameter(const std::string &strName, const std::string &strValue); + }; + +} diff --git a/driver/libtelldus-core/DeviceUpm.cpp b/driver/libtelldus-core/DeviceUpm.cpp new file mode 100644 index 00000000..3b27a3cf --- /dev/null +++ b/driver/libtelldus-core/DeviceUpm.cpp @@ -0,0 +1,170 @@ +#include "DeviceUpm.h" +#include +#include +#include +#include + +using namespace TelldusCore; + +const char S = ';'; +const char L = '~'; +const char START[] = {S,0}; +const char B1[] = {L,S,0}; +const char B0[] = {S,L,0}; +const char BON[] = {S,L,L,S,0}; +const char BOFF[] = {S,L,S,L,0}; + +/* +* Constructor +*/ +DeviceUpm::DeviceUpm(int id, const std::string &model, const std::string &name) + :Device(id, model, name) +{ +} + + +DeviceUpm::~DeviceUpm(void) +{ +} + +bool DeviceUpm::setHouse(const std::string &strHouse) { + if (strHouse.length() > 0) { + intHouse = atoi(strHouse.c_str()); + } else { + intHouse = 0; + } + return true; +} + +bool DeviceUpm::setUnit(const std::string &strUnit) { + if (strUnit.length() > 0) { + intUnit = atoi(strUnit.c_str()) - 1; + } else { + intUnit = 0; + } + if (intUnit < 0) { + intUnit = 0; + } else if (intUnit > 3) { + intUnit = 3; + } + return true; +} + +bool DeviceUpm::setDeviceParameter(const std::string &strName, const std::string &strValue) { + if (strName.compare("house") == 0) { + return setHouse(strValue); + } + return false; +} + +/* +* Turn on this device +*/ +int DeviceUpm::turnOn(void){ + + try{ + std::string strCode = getStringCode(true); + + strCode.insert(0, "S"); + strCode.append("+"); //the "turn on"-code! + + return Device::send(strCode); + } + catch(...){ + throw; + } + return TELLSTICK_ERROR_UNKNOWN; +} + +/* +* Turn off this device +*/ +int DeviceUpm::turnOff(void){ + + try{ + std::string strCode = getStringCode(false); + + strCode.insert(0, "S"); + strCode.append("+"); //the "turn off"-code! + + return Device::send(strCode); + } + catch(...){ + throw; + } + return TELLSTICK_ERROR_UNKNOWN; +} + +bool DeviceUpm::parameterMatches( const std::string &name, const std::string &value ) const { + return false; +} + +/* +* Has the device got the method? +*/ +int DeviceUpm::methods(){ + return (TELLSTICK_TURNON | TELLSTICK_TURNOFF); +} + +std::string DeviceUpm::getStringCode(bool on){ + + std::string strReturn; + + try{ + int code = intHouse; + for( size_t i = 0; i < 12; ++i ) { + if (code & 1) { + strReturn.insert(0, B1); + } else { + strReturn.insert(0, B0); + } + code >>= 1; + } + strReturn.insert(0, START); //Startcode, first + + code = 0; + if (on) { + code += 2; + } + code <<= 2; + code += intUnit; + + int check1 = 0, check2 = 0; + for( size_t i = 0; i < 6; ++i ) { + if (code & 1) { + if (i % 2 == 0) { + check1++; + } else { + check2++; + } + } + if (code & 1) { + strReturn.append(B1); + } else { + strReturn.append(B0); + } + code >>= 1; + } + + if (check1 % 2 == 0) { + strReturn.append(B0); + } else { + strReturn.append(B1); + } + if (check2 % 2 == 0) { + strReturn.append(B0); + } else { + strReturn.append(B1); + } + } + catch(...){ + throw; + } + return strReturn; + +} + +std::string DeviceUpm::getProtocol() const { + return "upm"; +} + diff --git a/driver/libtelldus-core/DeviceUpm.h b/driver/libtelldus-core/DeviceUpm.h new file mode 100644 index 00000000..d8569a63 --- /dev/null +++ b/driver/libtelldus-core/DeviceUpm.h @@ -0,0 +1,30 @@ +#pragma once +#include "Device.h" +#include + +namespace TelldusCore { + + class DeviceUpm : public Device + { + public: + DeviceUpm(int id, const std::string &model, const std::string &name); + virtual ~DeviceUpm(void); + + virtual int methods(); + virtual std::string getProtocol() const; + virtual bool parameterMatches( const std::string &name, const std::string &value ) const; + + bool setHouse(const std::string &strHouse); + bool setUnit(const std::string &strUnit); + + protected: + virtual bool setDeviceParameter(const std::string &strName, const std::string &strValue); + + virtual int turnOn(void); + virtual int turnOff(void); + + std::string getStringCode(bool on); + int intHouse, intUnit; + }; + +} diff --git a/driver/libtelldus-core/DeviceWaveman.cpp b/driver/libtelldus-core/DeviceWaveman.cpp new file mode 100644 index 00000000..d414440a --- /dev/null +++ b/driver/libtelldus-core/DeviceWaveman.cpp @@ -0,0 +1,70 @@ +// #include "StdAfx.h" +#include "DeviceWaveman.h" +#include +#include +#include +#include +#include + +using namespace TelldusCore; + +/* +* Constructor +*/ +DeviceWaveman::DeviceWaveman(int id, const std::string &model, const std::string &name) + :DeviceNexa(id, model, name){ +} + +/* +* Turn off this device +*/ +int DeviceWaveman::turnOff(void){ + + try{ + std::string strCode = getStringCodeSwitch(intHouse); + std::string strUnit = getStringCodeSwitch(intCode); + strCode.append(strUnit); + + strCode.insert(0, "S"); + strCode.append("$k$k$k$k$k$k$k$k$k+"); //the "turn off"-code, keeps it like this, doesn't have to be regenerated each time + + return Device::send(strCode); + } + catch(...){ + throw; + } + return TELLSTICK_ERROR_UNKNOWN; +} + +std::string DeviceWaveman::getStringCodeSwitch(int intToConvert){ + + std::string strReturn = ""; + + try{ + for( int i = 0; i < 4; ++i ) { + if (intToConvert & 1) { //Convert 1 + strReturn.append("$kk$"); + } else { //Convert 0 + strReturn.append("$k$k"); + } + intToConvert >>= 1; + + } + } + catch(...){ + throw; + } + return strReturn; + +} + +/* +* Has the device got the method? +*/ +int DeviceWaveman::methods(){ + return (TELLSTICK_TURNON | TELLSTICK_TURNOFF); +} + +std::string DeviceWaveman::getProtocol() const { + return "waveman"; +} diff --git a/driver/libtelldus-core/DeviceWaveman.h b/driver/libtelldus-core/DeviceWaveman.h new file mode 100644 index 00000000..3949d6dd --- /dev/null +++ b/driver/libtelldus-core/DeviceWaveman.h @@ -0,0 +1,19 @@ +#pragma once +#include "DeviceNexa.h" +#include + +namespace TelldusCore { + + class DeviceWaveman : public DeviceNexa + { + public: + DeviceWaveman(int id, const std::string &model, const std::string &name); + virtual int methods(); + virtual std::string getProtocol() const; + + protected: + std::string getStringCodeSwitch(int intToConvert); + virtual int turnOff(void); + }; + +} diff --git a/driver/libtelldus-core/DeviceX10.cpp b/driver/libtelldus-core/DeviceX10.cpp new file mode 100644 index 00000000..fd78c668 --- /dev/null +++ b/driver/libtelldus-core/DeviceX10.cpp @@ -0,0 +1,202 @@ +#include "DeviceX10.h" +#include +#include +#include +#include +#include + +using namespace TelldusCore; + +const char S = 59, L = 169; +const char B0[] = {S,S,0}; +const char B1[] = {S,L,0}; +const int HOUSES[] = {6,0xE,2,0xA,1,9,5,0xD,7,0xF,3,0xB,0,8,4,0xC}; +const char START_CODE[] = {255,1,255,1,255,1,100,255,1,180,0}; +const char STOP_CODE[] = {S,0}; + +/* +* Constructor +*/ +DeviceX10::DeviceX10(int id, const std::string &model, const std::string &name) + :Device(id, model, name), + intHouse(0), + intCode(0) +{ +} + +/* +* Destructor +*/ +DeviceX10::~DeviceX10(void) +{} + +bool DeviceX10::setHouse(const std::string &newHouse) { + int house = 0; + if (newHouse.length() > 0) { + house = newHouse[0] - 'A'; + } + if (house > 15) { + house = 15; + } else if (house < 0) { + house = 0; + } + intHouse = HOUSES[house]; + return true; +} + +bool DeviceX10::setUnit(const std::string &newUnit) { + if (newUnit.length() > 0) { + intCode = atoi(newUnit.c_str()) - 1; + } else { + intCode = 0; + } + return true; +} + +bool DeviceX10::setDeviceParameter(const std::string &strName, const std::string &strValue) { + if (strName.compare("house") == 0) { + return setHouse(strValue); + } else if (strName.compare("unit") == 0) { + return setUnit(strValue); + } + return false; +} + +/* +* Turn on this device +*/ +int DeviceX10::turnOn(void){ + + try{ + std::string strCode = getStringCode(true); + + strCode.insert(0, "S"); + strCode.append("+"); + + return Device::send(strCode); + } + catch(...){ + throw; + } + return TELLSTICK_ERROR_UNKNOWN; +} + +/* +* Turn off this device +*/ +int DeviceX10::turnOff(void){ + + try{ + std::string strCode = getStringCode(false); + + strCode.insert(0, "S"); + strCode.append("+"); + + return Device::send(strCode); + } + catch(...){ + throw; + } + return TELLSTICK_ERROR_UNKNOWN; +} + +std::string DeviceX10::getStringCode(bool on){ + + std::string strReturn = START_CODE; + std::string strComplement = ""; + + try{ + int house = intHouse; + for( int i = 0; i < 4; ++i ) { + if (house & 1) { + strReturn.append(B1); + strComplement.append(B0); + } else { + strReturn.append(B0); + strComplement.append(B1); + } + house >>= 1; + } + strReturn.append( B0 ); + strComplement.append( B1 ); + + if (intCode >= 8) { + strReturn.append(B1); + strComplement.append(B0); + } else { + strReturn.append(B0); + strComplement.append(B1); + } + + strReturn.append( B0 ); + strComplement.append( B1 ); + strReturn.append( B0 ); + strComplement.append( B1 ); + + strReturn.append( strComplement ); + strComplement = ""; + + strReturn.append( B0 ); + strComplement.append( B1 ); + + if (intCode >> 2 & 1) { //Bit 2 of intCode + strReturn.append(B1); + strComplement.append(B0); + } else { + strReturn.append(B0); + strComplement.append(B1); + } + + if (on) { + strReturn.append(B0); + strComplement.append(B1); + } else { + strReturn.append(B1); + strComplement.append(B0); + } + + if (intCode & 1) { //Bit 0 of intCode + strReturn.append(B1); + strComplement.append(B0); + } else { + strReturn.append(B0); + strComplement.append(B1); + } + + if (intCode >> 1 & 1) { //Bit 1 of intCode + strReturn.append(B1); + strComplement.append(B0); + } else { + strReturn.append(B0); + strComplement.append(B1); + } + + for( int i = 0; i < 3; ++i ) { + strReturn.append( B0 ); + strComplement.append( B1 ); + } + + strReturn.append( strComplement ); + strReturn.append( STOP_CODE ); + } + catch(...){ + throw; + } + return strReturn; + +} + +bool DeviceX10::parameterMatches( const std::string &name, const std::string &value ) const { + return false; +} + +/* +* Has the device got the method? +*/ +int DeviceX10::methods(){ + return (TELLSTICK_TURNON | TELLSTICK_TURNOFF); +} + +std::string DeviceX10::getProtocol() const { + return "x10"; +} diff --git a/driver/libtelldus-core/DeviceX10.h b/driver/libtelldus-core/DeviceX10.h new file mode 100644 index 00000000..23f111a1 --- /dev/null +++ b/driver/libtelldus-core/DeviceX10.h @@ -0,0 +1,31 @@ +#pragma once +#include "Device.h" +#include + +namespace TelldusCore { + + class DeviceX10 : public Device + { + public: + DeviceX10(int id, const std::string &model, const std::string &name); + virtual int methods(); + virtual std::string getProtocol() const; + virtual bool parameterMatches( const std::string &name, const std::string &value ) const; + + bool setHouse(const std::string &newHouse); + bool setUnit(const std::string &newUnit); + + public: + ~DeviceX10(void); + + protected: + virtual bool setDeviceParameter(const std::string &strName, const std::string &strValue); + virtual int turnOn(void); + virtual int turnOff(void); + + int intHouse; + int intCode; + std::string getStringCode(bool); + }; + +} diff --git a/driver/libtelldus-core/Manager.cpp b/driver/libtelldus-core/Manager.cpp new file mode 100644 index 00000000..4c9f35e4 --- /dev/null +++ b/driver/libtelldus-core/Manager.cpp @@ -0,0 +1,339 @@ +// +// C++ Implementation: controller +// +// Description: +// +// +// Author: Micke Prag , (C) 2009 +// +// Copyright: See COPYING file that comes with this distribution +// +// +#include "Manager.h" +#include "Device.h" + +#include "DeviceBrateck.h" +#include "DeviceEverflourish.h" +#include "DeviceGroup.h" +#include "DeviceNexa.h" +#include "DeviceRisingSun.h" +#include "DeviceWaveman.h" +#include "DeviceSartano.h" +#include "DeviceIkea.h" +#include "DeviceUndefined.h" +#include "DeviceUpm.h" +#include "DeviceX10.h" + +#include "Controller.h" +#ifdef TELLSTICK_DUO +#include "TellStick.h" +#endif +#include "common.h" +#include "config.h" + +#include +#include +#include + +#ifdef _WINDOWS +#define strcasecmp _stricmp +#endif + + +using namespace TelldusCore; + +Manager *Manager::instance = 0; + +Manager::Manager() + : lastCallbackId(0) +{ +#ifdef TELLSTICK_DUO +/* Controller *controller = TellStick::findFirstDevice(); + if (controller) { + controllers[1] = controller; + }*/ +#endif +} + +Manager::~Manager() { + // Clean up the device-map + for (DeviceMap::iterator it = devices.begin(); it != devices.end(); ++it) { + delete( it->second ); + } + // Clean up the controller-map + for (ControllerMap::iterator it = controllers.begin(); it != controllers.end(); ++it) { + delete( it->second ); + } +} + +/** + * Get the requested device + * Note that the Manager keeps ownership of the returned Device + * and should not be deleted when not in use anymore. + **/ +Device *Manager::getDevice(int intDeviceId){ + Device* dev = NULL; + + DeviceMap::iterator iterator = devices.find(intDeviceId); + if (iterator != devices.end()) { + return iterator->second; + } + + try{ + std::string protocol = settings.getProtocol(intDeviceId); + std::string strModel = settings.getModel(intDeviceId); + std::string strName = settings.getName(intDeviceId); + + //each new brand must be added here + if (0) { +#ifdef PROTOCOL_ARCTECH + } else if (strcasecmp(protocol.c_str(), "arctech") == 0){ + dev = new DeviceNexa(intDeviceId, strModel, strName); + ((DeviceNexa*)dev)->setHouse(settings.getDeviceParameter(intDeviceId, "house")); + ((DeviceNexa*)dev)->setUnit(settings.getDeviceParameter(intDeviceId, "unit")); +#endif +#ifdef PROTOCOL_BRATECK + } else if (strcasecmp(protocol.c_str(), "brateck") == 0) { + dev = new DeviceBrateck(intDeviceId, strModel, strName); + ((DeviceBrateck*)dev)->setHouse(settings.getDeviceParameter(intDeviceId, "house")); +#endif +#ifdef PROTOCOL_EVERFLOURISH + } else if (strcasecmp(protocol.c_str(), "everflourish") == 0){ + dev = new DeviceEverflourish(intDeviceId, strModel, strName); + ((DeviceEverflourish*)dev)->setHouse(settings.getDeviceParameter(intDeviceId, "house")); + ((DeviceEverflourish*)dev)->setUnit(settings.getDeviceParameter(intDeviceId, "unit")); +#endif +#ifdef PROTOCOL_GROUP + } else if (strcasecmp(protocol.c_str(), "group") == 0) { + dev = new DeviceGroup(intDeviceId, strModel, strName); + ((DeviceGroup*)dev)->setDevices(settings.getDeviceParameter(intDeviceId, "devices")); +#endif +#ifdef PROTOCOL_RISINGSUN + } else if (strcasecmp(protocol.c_str(), "risingsun") == 0) { + dev = new DeviceRisingSun(intDeviceId, strModel, strName); + ((DeviceRisingSun*)dev)->setHouse(settings.getDeviceParameter(intDeviceId, "house")); + ((DeviceRisingSun*)dev)->setUnit(settings.getDeviceParameter(intDeviceId, "unit")); +#endif +#ifdef PROTOCOL_WAVEMAN + } else if (strcasecmp(protocol.c_str(), "Waveman") == 0) { + dev = new DeviceWaveman(intDeviceId, strModel, strName); + ((DeviceWaveman*)dev)->setHouse(settings.getDeviceParameter(intDeviceId, "house")); + ((DeviceWaveman*)dev)->setUnit(settings.getDeviceParameter(intDeviceId, "unit")); +#endif +#ifdef PROTOCOL_SARTANO + } else if (strcasecmp(protocol.c_str(), "Sartano") == 0) { + dev = new DeviceSartano(intDeviceId, strModel, strName); + ((DeviceSartano*)dev)->setCode(settings.getDeviceParameter(intDeviceId, "code")); +#endif +#ifdef PROTOCOL_IKEA + } else if (strcasecmp(protocol.c_str(), "Ikea") == 0) { + dev = new DeviceIkea(intDeviceId, strModel, strName); + ((DeviceIkea*)dev)->setSystem(settings.getDeviceParameter(intDeviceId, "system")); + ((DeviceIkea*)dev)->setUnits(settings.getDeviceParameter(intDeviceId, "units")); + ((DeviceIkea*)dev)->setFade(settings.getDeviceParameter(intDeviceId, "fade")); +#endif +#ifdef PROTOCOL_UPM + } else if (strcasecmp(protocol.c_str(), "upm") == 0) { + dev = new DeviceUpm(intDeviceId, strModel, strName); + ((DeviceUpm*)dev)->setHouse(settings.getDeviceParameter(intDeviceId, "house")); + ((DeviceUpm*)dev)->setUnit(settings.getDeviceParameter(intDeviceId, "unit")); +#endif +#ifdef PROTOCOL_X10 + } else if (strcasecmp(protocol.c_str(), "x10") == 0) { + dev = new DeviceX10(intDeviceId, strModel, strName); + ((DeviceX10*)dev)->setHouse(settings.getDeviceParameter(intDeviceId, "house")); + ((DeviceX10*)dev)->setUnit(settings.getDeviceParameter(intDeviceId, "unit")); +#endif + } else { + //This is a dummy device needed when the parameters isn't setup correctly. + dev = new DeviceUndefined(intDeviceId, strModel, strName); + } + +#ifdef _LINUX + dev->setDevice( settings.getSetting("deviceNode") ); +#endif + + } + catch(...){ + throw; + } + + if (intDeviceId > 0) { + devices[intDeviceId] = dev; + } + return dev; +} + +int Manager::getNumberOfDevices(void) const { + return settings.getNumberOfDevices(); +} + +int Manager::getDeviceId(int intDeviceIndex) const { + return settings.getDeviceId(intDeviceIndex); +} + +void Manager::loadAllDevices() { + int numberOfDevices = getNumberOfDevices(); + for (int i = 0; i < numberOfDevices; ++i) { + int id = settings.getDeviceId(i); + if (!deviceLoaded(id)) { + getDevice(id); + } + } +} + +bool Manager::setDeviceProtocol(int intDeviceId, const std::string &strProtocol) { + bool retval = settings.setProtocol( intDeviceId, strProtocol ); + + // Delete the device to reload it when the protocol changes + DeviceMap::iterator iterator = devices.find(intDeviceId); + if (iterator != devices.end()) { + Device *device = iterator->second; + devices.erase( iterator ); + delete device; + } + + return retval; +} + +bool Manager::setDeviceModel(int intDeviceId, const std::string &strModel) { + return settings.setModel(intDeviceId, strModel); +} + +bool Manager::setDeviceState( int intDeviceId, int intDeviceState, const std::string &strDeviceStateValue ) { + if (intDeviceState != TELLSTICK_BELL && + intDeviceState != TELLSTICK_LEARN + ) { + bool retval = settings.setDeviceState(intDeviceId, intDeviceState, strDeviceStateValue); + for(CallbackList::const_iterator callback_it = callbacks.begin(); callback_it != callbacks.end(); ++callback_it) { + (*callback_it).event(intDeviceId, intDeviceState, wrapStdString(strDeviceStateValue), (*callback_it).id, (*callback_it).context); + } + + return retval; + } + return true; +} + +int Manager::getDeviceState( int intDeviceId ) const { + return settings.getDeviceState(intDeviceId); +} + +std::string Manager::getDeviceStateValue( int intDeviceId ) const { + return settings.getDeviceStateValue(intDeviceId); +} + +bool Manager::deviceLoaded(int deviceId) const { + DeviceMap::const_iterator iterator = devices.find(deviceId); + if (iterator == devices.end()) { + return false; + } + return true; +} + +void Manager::parseMessage( const std::string &message ) { + loadAllDevices(); //Make sure all devices is loaded before we iterator the list. + + std::map parameters; + std::string protocol; + int method = 0; + + size_t prevPos = 0; + size_t pos = message.find(";"); + while(pos != std::string::npos) { + std::string param = message.substr(prevPos, pos-prevPos); + prevPos = pos+1; + size_t delim = param.find(":"); + if (delim == std::string::npos) { + break; + } + if (param.substr(0, delim).compare("protocol") == 0) { + protocol = param.substr(delim+1, param.length()-delim); + } else if (param.substr(0, delim).compare("method") == 0) { + method = Device::methodId(param.substr(delim+1, param.length()-delim)); + } else { + parameters[param.substr(0, delim)] = param.substr(delim+1, param.length()-delim); + } + pos = message.find(";", pos+1); + } + for (DeviceMap::const_iterator it = devices.begin(); it != devices.end(); ++it) { + if (it->second->getProtocol().compare(protocol) != 0) { + continue; + } + if (! (it->second->methods() & method)) { + continue; + } + bool found = true; + for (std::map::const_iterator p_it = parameters.begin(); p_it != parameters.end(); ++p_it) { + if (!it->second->parameterMatches(p_it->first, p_it->second)) { + found = false; + break; + } + } + if (found) { + //First save the last sent command, this also triggers the callback to the client + setDeviceState(it->first, method, ""); + } + } + + for(RawCallbackList::const_iterator it = rawCallbacks.begin(); it != rawCallbacks.end(); ++it) { + (*it).event(message.c_str(), (*it).id, (*it).context); + } +} + +int Manager::registerDeviceEvent( TDDeviceEvent eventFunction, void *context ) { + int id = ++lastCallbackId; + CallbackStruct callback = {eventFunction, id, context}; + callbacks.push_back(callback); + return id; +} + +int Manager::registerRawDeviceEvent( TDRawDeviceEvent eventFunction, void *context ) { + int id = ++lastCallbackId; + RawCallbackStruct callback = {eventFunction, id, context}; + rawCallbacks.push_back(callback); + return id; +} + +Manager *Manager::getInstance() { + if (Manager::instance == 0) { + Manager::instance = new Manager(); + } + return Manager::instance; +} + +void Manager::close() { + if (Manager::instance != 0) { + delete Manager::instance; + } +} + +bool TelldusCore::Manager::setDeviceParameter(int intDeviceId, const std::string & strName, const std::string & strValue) { + return settings.setDeviceParameter(intDeviceId, strName, strValue); +} + +std::string TelldusCore::Manager::getDeviceParameter(int intDeviceId, const std::string & strName) const { + return settings.getDeviceParameter( intDeviceId, strName ); +} + +int TelldusCore::Manager::addDevice() { + return settings.addDevice(); +} + +bool TelldusCore::Manager::removeDevice(int intDeviceId) { + if (deviceLoaded(intDeviceId)) { + DeviceMap::iterator iterator = devices.find(intDeviceId); + if (iterator == devices.end()) { // Should not be possible since deviceLoaded() returned true + return false; + } + Device *dev = iterator->second; + devices.erase(iterator); + delete dev; + } + + return settings.removeDevice(intDeviceId); +} + +bool TelldusCore::Manager::setDeviceName(int intDeviceId, const std::string & strNewName) { + return settings.setName(intDeviceId, strNewName); +} + diff --git a/driver/libtelldus-core/Manager.h b/driver/libtelldus-core/Manager.h new file mode 100644 index 00000000..536459e2 --- /dev/null +++ b/driver/libtelldus-core/Manager.h @@ -0,0 +1,89 @@ +// +// C++ Interface: controller +// +// Description: +// +// +// Author: Micke Prag , (C) 2009 +// +// Copyright: See COPYING file that comes with this distribution +// +// +#ifndef MANAGER_H +#define MANAGER_H + +#include +#include "Settings.h" +#include + +namespace TelldusCore { + class Device; + class Controller; + + struct CallbackStruct { + TDDeviceEvent event; + int id; + void *context; + }; + struct RawCallbackStruct { + TDRawDeviceEvent event; + int id; + void *context; + }; + + typedef std::map DeviceMap; + typedef std::map ControllerMap; + typedef std::list CallbackList; + typedef std::list RawCallbackList; + + /** + @author Micke Prag + */ + class Manager { + public: + ~Manager(); + + Device *getDevice(int deviceId); + + bool deviceLoaded(int deviceId) const; + + int getNumberOfDevices(void) const; + int getDeviceId(int intDeviceIndex) const; + bool setDeviceProtocol(int intDeviceId, const std::string &strProtocol); + bool setDeviceName(int intDeviceId, const std::string &strNewName); + bool setDeviceModel(int intDeviceId, const std::string &strModel); + bool setDeviceParameter(int intDeviceId, const std::string &strName, const std::string &strValue); + std::string getDeviceParameter(int intDeviceId, const std::string &strName) const; + bool setDeviceState( int intDeviceId, int intDeviceState, const std::string &strDeviceStateValue ); + int getDeviceState( int intDeviceId ) const; + std::string getDeviceStateValue( int intDeviceId ) const; + + int addDevice(); + bool removeDevice(int intDeviceId); + + static Manager *getInstance(); + static void close(); + + int registerDeviceEvent( TDDeviceEvent eventFunction, void *context ); + int registerRawDeviceEvent( TDRawDeviceEvent eventFunction, void *context ); + void parseMessage( const std::string &message ); + + protected: + void loadAllDevices(); + + private: + Manager(); + + Settings settings; + DeviceMap devices; + ControllerMap controllers; + CallbackList callbacks; + RawCallbackList rawCallbacks; + + int lastCallbackId; + + static Manager *instance; + }; +} + +#endif diff --git a/driver/libtelldus-core/Resource.h b/driver/libtelldus-core/Resource.h new file mode 100644 index 00000000..0c5cdd60 --- /dev/null +++ b/driver/libtelldus-core/Resource.h @@ -0,0 +1,31 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by testruntelldus3.rc +// + +#define IDS_APP_TITLE 103 + +#define IDR_MAINFRAME 128 +#define IDD_TESTRUNTELLDUS3_DIALOG 102 +#define IDD_ABOUTBOX 103 +#define IDM_ABOUT 104 +#define IDM_EXIT 105 +#define IDI_TESTRUNTELLDUS3 107 +#define IDI_SMALL 108 +#define IDC_TESTRUNTELLDUS3 109 +#define IDC_MYICON 2 +#ifndef IDC_STATIC +#define IDC_STATIC -1 +#endif +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS + +#define _APS_NO_MFC 130 +#define _APS_NEXT_RESOURCE_VALUE 129 +#define _APS_NEXT_COMMAND_VALUE 32771 +#define _APS_NEXT_CONTROL_VALUE 1000 +#define _APS_NEXT_SYMED_VALUE 110 +#endif +#endif diff --git a/driver/libtelldus-core/Settings.cpp b/driver/libtelldus-core/Settings.cpp new file mode 100644 index 00000000..af4c200f --- /dev/null +++ b/driver/libtelldus-core/Settings.cpp @@ -0,0 +1,75 @@ +#include "Settings.h" + +/* +* Get the name of the device +*/ +std::string Settings::getName(int intDeviceId) const { + return getStringSetting(intDeviceId, "name", false); +} + +/* +* Set the name of the device +*/ +bool Settings::setName(int intDeviceId, const std::string &strNewName){ + return setStringSetting(intDeviceId, "name", strNewName, false); +} + +/* +* Get the device vendor +*/ +std::string Settings::getProtocol(int intDeviceId) const { + return getStringSetting(intDeviceId, "protocol", false); +} + +/* +* Set the device vendor +*/ +bool Settings::setProtocol(int intDeviceId, const std::string &strVendor){ + return setStringSetting(intDeviceId, "protocol", strVendor, false); +} + +/* +* Get the device model +*/ +std::string Settings::getModel(int intDeviceId) const { + return getStringSetting(intDeviceId, "model", false); +} + +/* +* Set the device model +*/ +bool Settings::setModel(int intDeviceId, const std::string &strModel){ + return setStringSetting(intDeviceId, "model", strModel, false); +} + +/* +* Set device argument +*/ +bool Settings::setDeviceParameter(int intDeviceId, const std::string &strName, const std::string &strValue){ + return setStringSetting(intDeviceId, strName, strValue, true); +} + +/* +* Get device argument +*/ +std::string Settings::getDeviceParameter(int intDeviceId, const std::string &strName) const { + return getStringSetting(intDeviceId, strName, true); +} + +#ifndef _CONFUSE + +bool Settings::setDeviceState( int intDeviceId, int intDeviceState, const std::string &strDeviceStateValue ) { + bool retval = setIntSetting( intDeviceId, "state", intDeviceState, true ); + setStringSetting( intDeviceId, "stateValue", strDeviceStateValue, true ); + return retval; +} + +int Settings::getDeviceState( int intDeviceId ) const { + return getIntSetting( intDeviceId, "state", true ); +} + +std::string Settings::getDeviceStateValue( int intDeviceId ) const { + return getStringSetting( intDeviceId, "stateValue", true ); +} + +#endif diff --git a/driver/libtelldus-core/Settings.h b/driver/libtelldus-core/Settings.h new file mode 100644 index 00000000..977fe9d8 --- /dev/null +++ b/driver/libtelldus-core/Settings.h @@ -0,0 +1,44 @@ +#ifndef SETTINGS_H +#define SETTINGS_H + +#include "Device.h" + +class privateVars; + +class Settings +{ +public: + Settings(void); + std::string getSetting(const std::string &strName) const; + int getNumberOfDevices(void) const; + std::string getName(int intDeviceId) const; + bool setName(int intDeviceId, const std::string &strNewName); + std::string getProtocol(int intDeviceId) const; + bool setProtocol(int intDeviceId, const std::string &strVendor); + std::string getModel(int intDeviceId) const; + bool setModel(int intDeviceId, const std::string &strModel); + std::string getDeviceParameter(int intDeviceId, const std::string &strName) const; + bool setDeviceParameter(int intDeviceId, const std::string &strName, const std::string &strValue); + bool setDeviceState( int intDeviceId, int intDeviceState, const std::string &strDeviceStateValue ); + int getDeviceState( int intDeviceId ) const; + std::string getDeviceStateValue( int intDeviceId ) const; + + int addDevice(); + int getDeviceId(int intDeviceIndex) const; + bool removeDevice(int intDeviceId); + + ~Settings(void); + +protected: + std::string getStringSetting(int intDeviceId, const std::string &name, bool parameter) const; + bool setStringSetting(int intDeviceId, const std::string &name, const std::string &value, bool parameter); + int getIntSetting(int intDeviceId, const std::string &name, bool parameter) const; + bool setIntSetting(int intDeviceId, const std::string &name, int value, bool parameter); + +private: + int getNextDeviceId() const; + + privateVars *d; +}; + +#endif diff --git a/driver/libtelldus-core/SettingsConfuse.cpp b/driver/libtelldus-core/SettingsConfuse.cpp new file mode 100644 index 00000000..9ca76c61 --- /dev/null +++ b/driver/libtelldus-core/SettingsConfuse.cpp @@ -0,0 +1,363 @@ +// +// C++ Implementation: telldussettingsconfuse +// +// Description: +// +// +// Author: Micke Prag , (C) 2008 +// +// Copyright: See COPYING file that comes with this distribution +// +// +#include "Settings.h" +#include +#include +#include + +using namespace std; + +class privateVars { +public: + cfg_t *cfg; + cfg_t *var_cfg; +}; + +bool readConfig(cfg_t **cfg); +bool readVarConfig(cfg_t **cfg); + +const char* CONFIG_FILE = "/etc/tellstick.conf"; +const char* VAR_CONFIG_FILE = "/var/state/telldus-core.conf"; + +/* +* Constructor +*/ +Settings::Settings(void) +{ + d = new privateVars(); + readConfig(&d->cfg); + readVarConfig(&d->var_cfg); +} + +/* +* Destructor +*/ +Settings::~Settings(void) +{ + if (d->cfg > 0) { + cfg_free(d->cfg); + } + if (d->var_cfg > 0) { + cfg_free(d->var_cfg); + } + delete d; +} + +/* +* Return a setting +*/ +std::string Settings::getSetting(const std::string &strName) const { + if (d->cfg > 0) { + return cfg_getstr(d->cfg, strName.c_str()); + } + return ""; +} + +/* +* Return the number of stored devices +*/ +int Settings::getNumberOfDevices(void) const { + if (d->cfg > 0) { + return cfg_size(d->cfg, "device"); + } + return 0; +} + +int Settings::getDeviceId(int intDeviceIndex) const { + if (intDeviceIndex >= getNumberOfDevices()) { //Out of bounds + return -1; + } + cfg_t *cfg_device = cfg_getnsec(d->cfg, "device", intDeviceIndex); + int id = cfg_getint(cfg_device, "id"); + return id; +} + +/* +* Add a new device +*/ +int Settings::addDevice(){ + int intDeviceId = getNextDeviceId(); + + FILE *fp = fopen(CONFIG_FILE, "w"); + cfg_print(d->cfg, fp); //Print the config-file + fprintf(fp, "device {\n id=%d\n}\n", intDeviceId); //Print the new device + fclose(fp); + + //Re-read config-file + cfg_free(d->cfg); + readConfig(&d->cfg); + return intDeviceId; +} + +/* +* Get next available device id +*/ +int Settings::getNextDeviceId() const { + int intDeviceId = 0; + cfg_t *cfg_device; + for (int i = 0; i < cfg_size(d->cfg, "device"); ++i) { + cfg_device = cfg_getnsec(d->cfg, "device", i); + if (cfg_getint(cfg_device, "id") >= intDeviceId) { + intDeviceId = cfg_getint(cfg_device, "id"); + } + } + intDeviceId++; + return intDeviceId; +} + +/* +* Remove a device +*/ +bool Settings::removeDevice(int intDeviceId){ + bool blnSuccess = true; + FILE *fp = fopen(CONFIG_FILE, "w"); + + // Print all opts + for(int i = 0; d->cfg->opts[i].name; i++) { + + // Check if it isn't a device section + if (strcmp(d->cfg->opts[i].name, "device") != 0) { + cfg_opt_print(&d->cfg->opts[i], fp); + } else { + // Print all sections except the one to remove + cfg_t *cfg_device; + for (int i = 0; i < cfg_size(d->cfg, "device"); ++i) { + cfg_device = cfg_getnsec(d->cfg, "device", i); + if (cfg_getint(cfg_device, "id") != intDeviceId) { //This isn't the one to skip + fprintf(fp, "device {\n"); + cfg_print_indent(cfg_device, fp, 1); + fprintf(fp, "}\n"); + } + } + } + } + fclose(fp); + + //Re-read config-file + cfg_free(d->cfg); + readConfig(&d->cfg); + + return blnSuccess; +} + +bool Settings::setDeviceState( int intDeviceId, int intDeviceState, const std::string &strDeviceStateValue ) { + if (d->var_cfg == 0) { + return false; + } + cfg_t *cfg_device; + for (int i = 0; i < cfg_size(d->var_cfg, "device"); ++i) { + cfg_device = cfg_getnsec(d->var_cfg, "device", i); + int deviceId = atoi(cfg_title(cfg_device)); + if (deviceId == intDeviceId) { + cfg_setint(cfg_device, "state", intDeviceState); + cfg_setstr(cfg_device, "stateValue", strDeviceStateValue.c_str()); + + FILE *fp = fopen(VAR_CONFIG_FILE, "w"); + cfg_print(d->var_cfg, fp); + fclose(fp); + return true; + } + } + // The device is not found in the file, we must create it manualy... + FILE *fp = fopen(VAR_CONFIG_FILE, "w"); + cfg_print(d->var_cfg, fp); //Print the config-file + fprintf(fp, "device %d {\n}\n", intDeviceId); //Print the new device + fclose(fp); + + //Re-read config-file + cfg_free(d->var_cfg); + readVarConfig(&d->var_cfg); + + return false; +} + +int Settings::getDeviceState( int intDeviceId ) const { + if (d->var_cfg == 0) { + return false; + } + cfg_t *cfg_device; + for (int i = 0; i < cfg_size(d->var_cfg, "device"); ++i) { + cfg_device = cfg_getnsec(d->var_cfg, "device", i); + int deviceId = atoi(cfg_title(cfg_device)); + if (deviceId == intDeviceId) { + return cfg_getint(cfg_device, "state"); + } + } + return TELLSTICK_TURNOFF; +} + +std::string Settings::getDeviceStateValue( int intDeviceId ) const { + if (d->var_cfg == 0) { + return false; + } + cfg_t *cfg_device; + for (int i = 0; i < cfg_size(d->var_cfg, "device"); ++i) { + cfg_device = cfg_getnsec(d->var_cfg, "device", i); + int deviceId = atoi(cfg_title(cfg_device)); + if (deviceId == intDeviceId) { + char *value = cfg_getstr(cfg_device, "stateValue"); + return value; + } + } + return ""; +} + +std::string Settings::getStringSetting(int intDeviceId, const std::string &name, bool parameter) const { + if (d->cfg == 0) { + return ""; + } + cfg_t *cfg_device; + for (int i = 0; i < cfg_size(d->cfg, "device"); ++i) { + cfg_device = cfg_getnsec(d->cfg, "device", i); + if (cfg_getint(cfg_device, "id") == intDeviceId) { + if (parameter) { + cfg_device = cfg_getsec(cfg_device, "parameters"); + } + char *setting = cfg_getstr(cfg_device, name.c_str()); + if (setting == 0) { //The parameter does not exists + return ""; + } + return setting; + } + } + return ""; +} + +bool Settings::setStringSetting(int intDeviceId, const std::string &name, const std::string &value, bool parameter) { + if (d->cfg == 0) { + return false; + } + cfg_t *cfg_device; + for (int i = 0; i < cfg_size(d->cfg, "device"); ++i) { + cfg_device = cfg_getnsec(d->cfg, "device", i); + if (cfg_getint(cfg_device, "id") == intDeviceId) { + if (parameter) { + cfg_t *cfg_parameters = cfg_getsec(cfg_device, "parameters"); + cfg_setstr(cfg_parameters, name.c_str(), value.c_str()); + } else { + cfg_setstr(cfg_device, name.c_str(), value.c_str()); + } + FILE *fp = fopen(CONFIG_FILE, "w"); + cfg_print(d->cfg, fp); + fclose(fp); + return true; + } + } + return false; +} + +int Settings::getIntSetting(int intDeviceId, const std::string &name, bool parameter) const { + if (d->cfg == 0) { + return 0; + } + cfg_t *cfg_device; + for(int i = 0; i < cfg_size(d->cfg, "device"); ++i) { + cfg_device = cfg_getnsec(d->cfg, "device", i); + if (cfg_getint(cfg_device, "id") == intDeviceId) { + if (parameter) { + cfg_device = cfg_getsec(cfg_device, "parameters"); + } + return cfg_getint(cfg_device, name.c_str()); + } + } + return 0; +} + +bool Settings::setIntSetting(int intDeviceId, const std::string &name, int value, bool parameter) { + if (d->cfg == 0) { + return false; + } + cfg_t *cfg_device; + for (int i = 0; i < cfg_size(d->cfg, "device"); ++i) { + cfg_device = cfg_getnsec(d->cfg, "device", i); + if (cfg_getint(cfg_device, "id") == intDeviceId) { + if (parameter) { + cfg_t *cfg_parameters = cfg_getsec(cfg_device, "parameters"); + cfg_setint(cfg_parameters, name.c_str(), value); + } else { + cfg_setint(cfg_device, name.c_str(), value); + } + FILE *fp = fopen(CONFIG_FILE, "w"); + cfg_print(d->cfg, fp); + fclose(fp); + return true; + } + } + return false; +} + + +bool readConfig(cfg_t **cfg) { + cfg_opt_t controller_opts[] = { + CFG_INT("id", -1, CFGF_NONE), + }; + + cfg_opt_t device_parameter_opts[] = { + //Groups + CFG_STR("devices", 0, CFGF_NONE), + + CFG_STR("house", 0, CFGF_NONE), + CFG_STR("unit", 0, CFGF_NONE), + CFG_STR("code", 0, CFGF_NONE), + CFG_STR("system", 0, CFGF_NONE), + CFG_STR("units", 0, CFGF_NONE), + CFG_STR("fade", 0, CFGF_NONE), + + CFG_END() + }; + + cfg_opt_t device_opts[] = { + CFG_INT("id", -1, CFGF_NONE), + CFG_STR("name", "Unnamed", CFGF_NONE), + CFG_INT("controller", 0, CFGF_NONE), + CFG_STR("protocol", "arctech", CFGF_NONE), + CFG_STR("model", "", CFGF_NONE), + CFG_SEC("parameters", device_parameter_opts, CFGF_NONE), + CFG_END() + }; + + cfg_opt_t opts[] = { + CFG_STR("deviceNode", "/dev/tellstick", CFGF_NONE), + CFG_SEC("device", device_opts, CFGF_MULTI), + CFG_END() + }; + + (*cfg) = cfg_init(opts, CFGF_NOCASE); + if (cfg_parse((*cfg), CONFIG_FILE) == CFG_PARSE_ERROR) { + (*cfg) = 0; + return false; + } + + return true; +} + +bool readVarConfig(cfg_t **cfg) { + + cfg_opt_t device_opts[] = { + CFG_INT("state", 0, CFGF_NONE), + CFG_STR("stateValue", "", CFGF_NONE), + CFG_END() + }; + + cfg_opt_t opts[] = { + CFG_SEC("device", device_opts, CFGF_MULTI | CFGF_TITLE), + CFG_END() + }; + + (*cfg) = cfg_init(opts, CFGF_NOCASE); + if (cfg_parse((*cfg), VAR_CONFIG_FILE) == CFG_PARSE_ERROR) { + (*cfg) = 0; + return false; + } + + return true; +} diff --git a/driver/libtelldus-core/SettingsCoreFoundationPreferences.cpp b/driver/libtelldus-core/SettingsCoreFoundationPreferences.cpp new file mode 100644 index 00000000..0439b2a6 --- /dev/null +++ b/driver/libtelldus-core/SettingsCoreFoundationPreferences.cpp @@ -0,0 +1,240 @@ +// +// C++ Implementation: telldussettingsconfuse +// +// Description: +// +// +// Author: Micke Prag , (C) 2008 +// +// Copyright: See COPYING file that comes with this distribution +// +// +#include "Settings.h" +#include +#include +#include + +using namespace std; + +class privateVars { +public: + CFStringRef app_ID; +}; + + +/* +* Constructor +*/ +Settings::Settings(void) +{ + d = new privateVars(); + d->app_ID = CFSTR( "com.telldus.core" ); +} + +/* +* Destructor +*/ +Settings::~Settings(void) +{ +} + +/* +* Return a setting +*/ +std::string Settings::getSetting(const std::string &strName) const { + return ""; +} + +/* +* Return the number of stored devices +*/ +int Settings::getNumberOfDevices(void) const { + CFArrayRef cfarray = CFPreferencesCopyKeyList( d->app_ID, kCFPreferencesCurrentUser, kCFPreferencesAnyHost ); + if (!cfarray) return 0; + CFIndex size = CFArrayGetCount( cfarray ); + int devices = 0; + for (CFIndex k = 0; k < size; ++k) { + CFStringRef key = (CFStringRef) CFArrayGetValueAtIndex(cfarray, k); + if (CFStringHasPrefix( key, CFSTR("devices.") ) && + CFStringHasSuffix( key, CFSTR(".name") ) ) { + devices++; + } + } + return devices; +} + +int Settings::getDeviceId(int intDeviceIndex) const { + CFArrayRef cfarray = CFPreferencesCopyKeyList( d->app_ID, kCFPreferencesCurrentUser, kCFPreferencesAnyHost ); + if (!cfarray) return 0; + CFIndex size = CFArrayGetCount( cfarray ); + int index = 0; + int id = 0; + for (CFIndex k = 0; k < size; ++k) { + CFStringRef key = (CFStringRef) CFArrayGetValueAtIndex(cfarray, k); + if (CFStringHasPrefix( key, CFSTR("devices.") ) && + CFStringHasSuffix( key, CFSTR(".name") ) ) { + + if (index == intDeviceIndex) { + CFArrayRef split = CFStringCreateArrayBySeparatingStrings( 0, key, CFSTR(".") ); + if ( !split || CFArrayGetCount( split ) != 3 ) continue; + + // This code crashes! + //CFNumberRef cfid = (CFNumberRef) CFArrayGetValueAtIndex( split, 1 ); + //if (cfid) + // CFNumberGetValue( cfid, kCFNumberIntType, &id); + + CFStringRef cfid = (CFStringRef) CFArrayGetValueAtIndex( split, 1 ); + char *cp = NULL; + CFIndex size = CFStringGetMaximumSizeForEncoding( CFStringGetLength( cfid ), kCFStringEncodingUTF8) + 1; + cp = (char *)malloc(size); + CFStringGetCString( cfid, cp, size, kCFStringEncodingUTF8 ); + cp = (char *)realloc( cp, strlen(cp) + 1); + id = atoi(cp); + + + CFRelease(key); + CFRelease(split); + CFRelease(cfid); + break; + } + index++; + } + CFRelease( key ); + } + return id; +} + +/* +* Add a new device +*/ +int Settings::addDevice() { + int id = getNextDeviceId(); + setStringSetting( id, "name", "", false ); //Create a empty name so the device has an entry + setStringSetting( id, "model", "", false ); + return id; +} + +/* +* Get next available device id +*/ +int Settings::getNextDeviceId() const { + int id = 0, max = 0; + int numberOfDevices = getNumberOfDevices(); + for( int i = 0; i < numberOfDevices; i++) { + id = getDeviceId( i ); + if (id > max) { + max = id; + } + } + max++; + return max; +} + +/* +* Remove a device +*/ +bool Settings::removeDevice(int intDeviceId){ + CFStringRef filterKey = CFStringCreateWithFormat(0, NULL, CFSTR("devices.%d."), intDeviceId); // The key to search for + + CFArrayRef cfarray = CFPreferencesCopyKeyList( d->app_ID, kCFPreferencesCurrentUser, kCFPreferencesAnyHost ); + if (!cfarray) return 0; + CFIndex size = CFArrayGetCount( cfarray ); + for (CFIndex k = 0; k < size; ++k) { + CFStringRef key = (CFStringRef) CFArrayGetValueAtIndex(cfarray, k); + if (CFStringHasPrefix( key, filterKey ) ) { + CFPreferencesSetAppValue( key, NULL, d->app_ID ); //Remove the key + } + } + + CFPreferencesAppSynchronize( d->app_ID ); + return true; +} + +std::string Settings::getStringSetting(int intDeviceId, const std::string &name, bool parameter) const { + CFStringRef cfname = CFStringCreateWithCString( 0, name.c_str(), kCFStringEncodingUTF8 ); + + CFStringRef key; + if (parameter) { + key = CFStringCreateWithFormat(0, NULL, CFSTR("devices.%d.parameters.%@"), intDeviceId, cfname); + } else { + key = CFStringCreateWithFormat(0, NULL, CFSTR("devices.%d.%@"), intDeviceId, cfname); + } + + CFStringRef value; + + value = (CFStringRef)CFPreferencesCopyAppValue(key, d->app_ID); + if (!value) { + return ""; + } + + char *cp = NULL; + CFIndex size = CFStringGetMaximumSizeForEncoding( CFStringGetLength( value ), kCFStringEncodingUTF8) + 1; + cp = (char *)malloc(size); + CFStringGetCString( value, cp, size, kCFStringEncodingUTF8 ); + cp = (char *)realloc( cp, strlen(cp) + 1); + + CFRelease(value); + return cp; +} + +bool Settings::setStringSetting(int intDeviceId, const std::string &name, const std::string &value, bool parameter) { + CFStringRef cfname = CFStringCreateWithCString( 0, name.c_str(), kCFStringEncodingUTF8 ); + CFStringRef cfvalue = CFStringCreateWithCString( 0, value.c_str(), kCFStringEncodingUTF8 ); + + CFStringRef key; + if (parameter) { + key = CFStringCreateWithFormat(0, NULL, CFSTR("devices.%d.parameters.%@"), intDeviceId, cfname); + } else { + key = CFStringCreateWithFormat(0, NULL, CFSTR("devices.%d.%@"), intDeviceId, cfname); + } + + CFPreferencesSetAppValue( key, cfvalue, d->app_ID ); + CFPreferencesAppSynchronize( d->app_ID ); + return true; +} + +int Settings::getIntSetting(int intDeviceId, const std::string &name, bool parameter) const { + int retval = 0; + CFStringRef cfname = CFStringCreateWithCString( 0, name.c_str(), kCFStringEncodingUTF8 ); + CFNumberRef cfvalue; + + CFStringRef key; + if (parameter) { + key = CFStringCreateWithFormat(0, NULL, CFSTR("devices.%d.parameters.%@"), intDeviceId, cfname); + } else { + key = CFStringCreateWithFormat(0, NULL, CFSTR("devices.%d.%@"), intDeviceId, cfname); + } + + cfvalue = (CFNumberRef)CFPreferencesCopyAppValue(key, d->app_ID); + + // If the preference exists, use it. + if (cfvalue) { + try { + // Numbers come out of preferences as CFNumber objects. + if (!CFNumberGetValue(cfvalue, kCFNumberIntType, &retval)) { + retval = 0; + } + CFRelease(cfvalue); + } catch (std::exception e) { + retval = 0; + } + } + + return retval; +} + +bool Settings::setIntSetting(int intDeviceId, const std::string &name, int value, bool parameter) { + CFStringRef cfname = CFStringCreateWithCString( 0, name.c_str(), kCFStringEncodingUTF8 ); + CFNumberRef cfvalue = CFNumberCreate(NULL, kCFNumberIntType, &value); + + CFStringRef key; + if (parameter) { + key = CFStringCreateWithFormat(0, NULL, CFSTR("devices.%d.parameters.%@"), intDeviceId, cfname); + } else { + key = CFStringCreateWithFormat(0, NULL, CFSTR("devices.%d.%@"), intDeviceId, cfname); + } + + CFPreferencesSetAppValue( key, cfvalue, d->app_ID ); + CFPreferencesAppSynchronize( d->app_ID ); + return true; +} diff --git a/driver/libtelldus-core/SettingsQt.cpp b/driver/libtelldus-core/SettingsQt.cpp new file mode 100644 index 00000000..42c81cce --- /dev/null +++ b/driver/libtelldus-core/SettingsQt.cpp @@ -0,0 +1,148 @@ +// +// C++ Implementation: telldussettingsconfuse +// +// Description: +// +// +// Author: Micke Prag , (C) 2008 +// +// Copyright: See COPYING file that comes with this distribution +// +// +#include "Settings.h" +#include +#include +#include +#include +#include + +using namespace std; + +class privateVars { +public: + QSettings *settings; +}; + + +/* +* Constructor +*/ +Settings::Settings(void) +{ + d = new privateVars(); + d->settings = new QSettings("Telldus", "Core"); +} + +/* +* Destructor +*/ +Settings::~Settings(void) +{ + delete d->settings; + delete d; +} + +/* +* Return a setting +*/ +std::string Settings::getSetting(const std::string &strName) const { + return ""; +} + +/* +* Return the number of stored devices +*/ +int Settings::getNumberOfDevices(void) const { + int devices = 0; + d->settings->beginGroup("devices"); + devices = d->settings->childGroups().count(); + d->settings->endGroup(); + return devices; +} + +int Settings::getDeviceId(int intDeviceIndex) const { + int id = 0; + d->settings->beginGroup("devices"); + QString strId = d->settings->childGroups().at(intDeviceIndex); + d->settings->endGroup(); + + id = strId.toInt(); + + return id; +} + +/* +* Add a new device +*/ +int Settings::addDevice() { + int id = getNextDeviceId(); + + if (id < 0) { + return -1; + } + + setStringSetting(id, "name", "Unnamed", false); + setStringSetting(id, "protocol", "arctech", false); + + return id; +} + +/* +* Get next available device id +*/ +int Settings::getNextDeviceId() const { + int id = d->settings->value("lastUsedDeviceId", 0).toInt() + 1; + d->settings->setValue("lastUsedDeviceId", id); + return id; +} + +/* +* Remove a device +*/ +bool Settings::removeDevice(int intDeviceId) { + d->settings->remove( QString("devices/%1").arg(intDeviceId) ); + return true; +} + +std::string Settings::getStringSetting(int intDeviceId, const std::string &name, bool parameter) const { + QString key = QString("devices/%1/").arg(intDeviceId); + if (parameter) { + key += "parameters/"; + } + key += name.c_str(); + QString value = d->settings->value(key).toString(); + return value.toStdString(); +} + +bool Settings::setStringSetting(int intDeviceId, const std::string &name, const std::string &value, bool parameter) { + QString key = QString("devices/%1/").arg(intDeviceId); + if (parameter) { + key += "parameters/"; + } + key += name.c_str(); + d->settings->setValue(key, value.c_str()); + d->settings->sync(); + return true; +} + +int Settings::getIntSetting(int intDeviceId, const std::string &name, bool parameter) const { + int retval = 0; + QString key = QString("devices/%1/").arg(intDeviceId); + if (parameter) { + key += "parameters/"; + } + key += name.c_str(); + retval = d->settings->value(key).toInt(); + return retval; +} + +bool Settings::setIntSetting(int intDeviceId, const std::string &name, int value, bool parameter) { + QString key = QString("devices/%1/").arg(intDeviceId); + if (parameter) { + key += "parameters/"; + } + key += name.c_str(); + d->settings->setValue(key, value); + d->settings->sync(); + return true; +} diff --git a/driver/libtelldus-core/SettingsWinRegistry.cpp b/driver/libtelldus-core/SettingsWinRegistry.cpp new file mode 100644 index 00000000..446824ac --- /dev/null +++ b/driver/libtelldus-core/SettingsWinRegistry.cpp @@ -0,0 +1,344 @@ +#include "StdAfx.h" +#include "Settings.h" +#include +#include +#include +#include +#include + +bool storeGlobal(privateVars *d); + +const int intMaxRegValueLength = 1000; + +class privateVars { +public: + HKEY hk; + HKEY rootKey; + std::string strRegPathDevice; + std::string strRegPath; +}; + +/* +* Constructor +*/ +Settings::Settings(void) +{ + d = new privateVars(); + d->strRegPathDevice = "SOFTWARE\\Telldus\\Devices\\"; + d->strRegPath = "SOFTWARE\\Telldus\\"; + if (storeGlobal(d)) { + d->rootKey = HKEY_LOCAL_MACHINE; + } else { + d->rootKey = HKEY_CURRENT_USER; + } +} + +/* +* Destructor +*/ +Settings::~Settings(void) +{ + //RegCloseKey(hk); //close all, if still open //TODO: Need some way to know if open or closed + d->strRegPath = ""; + d->strRegPathDevice = ""; + delete d; +} + +/* +* Return the number of stored devices +*/ +int Settings::getNumberOfDevices(void) const { + + int intNumberOfDevices = 0; + + try{ + + long lnExists = RegOpenKeyEx(d->rootKey, d->strRegPathDevice.c_str(), 0, KEY_QUERY_VALUE, &d->hk); + + if(lnExists == ERROR_SUCCESS){ + + std::string strNumSubKeys; + DWORD dNumSubKeys; + RegQueryInfoKey(d->hk, NULL, NULL, NULL, &dNumSubKeys, NULL, NULL, NULL, NULL, NULL, NULL, NULL); + + intNumberOfDevices = (int)dNumSubKeys; + + RegCloseKey(d->hk); + } + else{ + throw std::exception(); //couldn't open reg key + } + } + catch(...){ + intNumberOfDevices = -1; + } + return intNumberOfDevices; +} + + +int Settings::getDeviceId(int intDeviceIndex) const { + int intReturn = -1; + + try{ + + long lnExists = RegOpenKeyEx(d->rootKey, d->strRegPathDevice.c_str(), 0, KEY_READ, &d->hk); + + if(lnExists == ERROR_SUCCESS){ + + char* Buff = new char[intMaxRegValueLength]; + DWORD size = intMaxRegValueLength; + if (RegEnumKeyEx(d->hk, intDeviceIndex, (LPSTR)Buff, &size, NULL, NULL, NULL, NULL) == ERROR_SUCCESS) { + intReturn = (int)_atoi64(Buff); + } + + delete Buff; + + RegCloseKey(d->hk); + } else { + throw std::exception(); //couldn't open reg key + } + } + catch(...){ + intReturn = -1; + } + return intReturn; + + +} + +/* +* Add a new device +*/ +int Settings::addDevice(){ + + int intDeviceId = -1; + try{ + + DWORD dwDisp; + intDeviceId = getNextDeviceId(); + + std::ostringstream ssRegPath; + ssRegPath << d->strRegPathDevice << intDeviceId; + std::string strCompleteRegPath = ssRegPath.str(); + + if(RegCreateKeyEx(d->rootKey, + strCompleteRegPath.c_str(), + 0, + NULL, + REG_OPTION_NON_VOLATILE, + KEY_ALL_ACCESS, + NULL, + &d->hk, + &dwDisp)){ + //fail + throw std::exception("Create Key failed"); + } + + RegCloseKey(d->hk); + + } + catch(...){ + intDeviceId = -1; + } + return intDeviceId; +} + +/* +* Get next available device id +*/ +int Settings::getNextDeviceId() const { + + int intReturn = -1; + try{ + DWORD dwDisp; + long lnExists = RegCreateKeyEx(d->rootKey, d->strRegPathDevice.c_str(), 0, NULL, REG_OPTION_NON_VOLATILE, + KEY_ALL_ACCESS, + NULL, + &d->hk, + &dwDisp); //create or open if already created + + if(lnExists == ERROR_SUCCESS){ + + DWORD dwLength; + char* Buff = new char[intMaxRegValueLength]; + + long lngStatus = RegQueryValueEx(d->hk, "LastUsedId", NULL, NULL, (LPBYTE)Buff, &dwLength); + + if(lngStatus == ERROR_MORE_DATA){ + //The buffer is to small, recreate it + delete Buff; + Buff = new char[dwLength]; + lngStatus = RegQueryValueEx(d->hk, "LastUsedId", NULL, NULL, (LPBYTE)Buff, &dwLength); + } + + if(lngStatus == ERROR_SUCCESS){ + + int intLast = (int)Buff[0]; + intReturn = intLast + 1; + } + else{ + intReturn = 1; + } + delete Buff; + + DWORD dwVal = intReturn; + + RegSetValueEx (d->hk, "LastUsedId", 0L, REG_DWORD, (CONST BYTE*) &dwVal, sizeof(DWORD)); + + } + RegCloseKey(d->hk); + } + catch(...){ + intReturn = -1; + } + return intReturn; +} + +/* +* Remove a device +*/ +bool Settings::removeDevice(int intDeviceId){ + + bool blnSuccess = true; + try{ + std::ostringstream ssRegPath; + ssRegPath << d->strRegPathDevice << intDeviceId; + std::string strCompleteRegPath = ssRegPath.str(); + + long lngSuccess = RegDeleteKey(d->rootKey, strCompleteRegPath.c_str()); + if(lngSuccess != ERROR_SUCCESS){ + blnSuccess = false; + } + } + catch(...){ + blnSuccess = false; + } + + return blnSuccess; +} + +std::string Settings::getStringSetting(int intDeviceId, const std::string &name, bool parameter) const { + std::string strReturn = ""; + + try{ + std::ostringstream ssRegPath; + ssRegPath << d->strRegPathDevice << intDeviceId; + std::string strCompleteRegPath = ssRegPath.str(); + long lnExists = RegOpenKeyEx(d->rootKey, strCompleteRegPath.c_str(), 0, KEY_QUERY_VALUE, &d->hk); + + if(lnExists == ERROR_SUCCESS){ + DWORD dwLength; + char* Buff = new char[intMaxRegValueLength]; + + long lngStatus = RegQueryValueEx(d->hk, name.c_str(), NULL, NULL, (LPBYTE)Buff, &dwLength); + if(lngStatus == ERROR_MORE_DATA){ + //The buffer is to small, recreate it + delete Buff; + Buff = new char[dwLength]; + lngStatus = RegQueryValueEx(d->hk, name.c_str(), NULL, NULL, (LPBYTE)Buff, &dwLength); + } + if (lngStatus == ERROR_SUCCESS) { + strReturn = Buff; + } + delete Buff; + } + else{ + throw std::exception(); //couldn't open reg key + } + RegCloseKey(d->hk); + } + catch(...){ + strReturn = ""; + } + return strReturn; +} + +bool Settings::setStringSetting(int intDeviceId, const std::string &name, const std::string &value, bool parameter) { + + bool blnSuccess = true; + try{ + + std::ostringstream ssRegPath; + ssRegPath << d->strRegPathDevice << intDeviceId; + std::string strCompleteRegPath = ssRegPath.str(); + long lnExists = RegOpenKeyEx(d->rootKey, strCompleteRegPath.c_str(), 0, KEY_WRITE, &d->hk); + + if(lnExists == ERROR_SUCCESS){ + int length = (int)value.length(); + RegSetValueEx(d->hk, name.c_str(), 0, REG_SZ, (LPBYTE)value.c_str(), length); + } + else{ + throw std::exception(); //couldn't open reg key + } + RegCloseKey(d->hk); + + } + catch(...){ + blnSuccess = false; + } + return blnSuccess; + +} + +int Settings::getIntSetting(int intDeviceId, const std::string &name, bool parameter) const { + int intReturn = 0; + + std::string strSetting = getStringSetting(intDeviceId, name, parameter); + if (strSetting.length()) { + intReturn = (int)strSetting[0]; + } + + return intReturn; +} + +bool Settings::setIntSetting(int intDeviceId, const std::string &name, int value, bool parameter) { + bool blnReturn = false; + + std::ostringstream ssRegPath; + ssRegPath << d->strRegPathDevice << intDeviceId; + std::string strCompleteRegPath = ssRegPath.str(); + long lnExists = RegOpenKeyEx(d->rootKey, strCompleteRegPath.c_str(), 0, KEY_WRITE, &d->hk); + if (lnExists == ERROR_SUCCESS) { + DWORD dwVal = value; + lnExists = RegSetValueEx (d->hk, name.c_str(), 0L, REG_DWORD, (CONST BYTE*) &dwVal, sizeof(DWORD)); + if (lnExists == ERROR_SUCCESS) { + blnReturn = true; + } + } + RegCloseKey(d->hk); + return blnReturn; +} + +bool storeGlobal(privateVars *d) { + bool blnReturn = false; + try{ + long lnExists = RegOpenKeyEx(HKEY_LOCAL_MACHINE, d->strRegPathDevice.c_str(), 0, KEY_QUERY_VALUE, &d->hk); + + if(lnExists == ERROR_SUCCESS){ + + DWORD dwLength; + char* Buff = new char[intMaxRegValueLength]; + + long lngStatus = RegQueryValueEx(d->hk, "SharedDevices", NULL, NULL, (LPBYTE)Buff, &dwLength); + + if(lngStatus == ERROR_MORE_DATA){ + //The buffer is to small, recreate it + delete Buff; + Buff = new char[dwLength]; + + lngStatus = RegQueryValueEx(d->hk, "SharedDevices", NULL, NULL, (LPBYTE)Buff, &dwLength); + } + + if(lngStatus == ERROR_SUCCESS){ + + int intValue = (int)Buff[0]; + blnReturn = (intValue == 1); + } + delete Buff; + } + RegCloseKey(d->hk); + } + catch(...){ + } + return blnReturn; +} diff --git a/driver/libtelldus-core/TellStick.cpp b/driver/libtelldus-core/TellStick.cpp new file mode 100644 index 00000000..d0dd6db3 --- /dev/null +++ b/driver/libtelldus-core/TellStick.cpp @@ -0,0 +1,103 @@ +// +// C++ Implementation: TellStick +// +// Description: +// +// +// Author: Micke Prag , (C) 2009 +// +// Copyright: See COPYING file that comes with this distribution +// +// +#include "TellStick.h" +#include "ftd2xx.h" +#include + + +using namespace TelldusCore; + +TellStick::TellStick() { +} + + +TellStick::~TellStick() { +} + + +int TellStick::findFirstDevice() { + //TellStick + std::string serial = findByVIDPID(0x1781, 0x0C30); + if (serial.length() > 0) { + return 1; + } + //TellStick Duo + serial = findByVIDPID(0x1781, 0x0C31); + if (serial.length() > 0) { + return 2; + } + return 0; +} + +std::string TellStick::findByVIDPID( int vid, int pid ) { + std::string retval = ""; + +#ifdef _LINUX + ftdi_context ftdic; + ftdi_init(&ftdic); + + int ret = ftdi_usb_open(&ftdic, vid, pid); + if (ret == 0) { + retval = "1"; + + ftdi_usb_close(&ftdic); + } + + ftdi_deinit(&ftdic); + +#else + FT_HANDLE fthHandle = 0; + FT_STATUS ftStatus = FT_OK; + + try{ + DWORD dwNumberOfDevices = 0; + +#ifndef _WINDOWS + FT_SetVIDPID(vid, pid); +#endif + ftStatus = FT_CreateDeviceInfoList(&dwNumberOfDevices); + if (ftStatus == FT_OK) { + for (int i = 0; i < (int)dwNumberOfDevices; i++) { + + FT_PROGRAM_DATA pData; + char ManufacturerBuf[32]; + char ManufacturerIdBuf[16]; + char DescriptionBuf[64]; + char SerialNumberBuf[16]; + + pData.Signature1 = 0x00000000; + pData.Signature2 = 0xffffffff; + pData.Version = 0x00000002; // EEPROM structure with FT232R extensions + pData.Manufacturer = ManufacturerBuf; + pData.ManufacturerId = ManufacturerIdBuf; + pData.Description = DescriptionBuf; + pData.SerialNumber = SerialNumberBuf; + + ftStatus = FT_Open(i, &fthHandle); + ftStatus = FT_EE_Read(fthHandle, &pData); + if(ftStatus == FT_OK){ + if(pData.VendorId == vid && pData.ProductId == pid){ + ftStatus = FT_Close(fthHandle); + retval = pData.SerialNumber; + break; + } + } + ftStatus = FT_Close(fthHandle); + } + } + } + catch(...){ + throw; + } +#endif + return retval; +} diff --git a/driver/libtelldus-core/TellStick.h b/driver/libtelldus-core/TellStick.h new file mode 100644 index 00000000..4b80fb81 --- /dev/null +++ b/driver/libtelldus-core/TellStick.h @@ -0,0 +1,35 @@ +// +// C++ Interface: TellStick +// +// Description: +// +// +// Author: Micke Prag , (C) 2009 +// +// Copyright: See COPYING file that comes with this distribution +// +// +#ifndef TELLSTICK_H +#define TELLSTICK_H + +#include "Controller.h" + +/** + @author Micke Prag +*/ +namespace TelldusCore { + class TellStick : public Controller { + public: + virtual ~TellStick(); + + static int findFirstDevice(); + + protected: + TellStick(); + + private: + static std::string findByVIDPID( int vid, int pid ); + }; +} + +#endif diff --git a/driver/libtelldus-core/TellStickDuo.cpp b/driver/libtelldus-core/TellStickDuo.cpp new file mode 100644 index 00000000..406d88d1 --- /dev/null +++ b/driver/libtelldus-core/TellStickDuo.cpp @@ -0,0 +1,172 @@ +// +// C++ Implementation: controller +// +// Description: +// +// +// Author: Micke Prag , (C) 2009 +// +// Copyright: See COPYING file that comes with this distribution +// +// +#include "TellStickDuo.h" +#include "Manager.h" +#include +#include + +#ifdef _WINDOWS +typedef HANDLE EVENT_HANDLE; +#endif + +using namespace TelldusCore; + +namespace TelldusCore { + class PrivateTellStickDuoListener: public QThread { + public: + PrivateTellStickDuoListener( TellStickDuo *parent ); + ~PrivateTellStickDuoListener(); + void stop(); + protected: + void run(); + private: + void processData( const std::string &data ); + + TellStickDuo *parent; + EVENT_HANDLE eh; + bool running; + QMutex mutex; + std::string message; + }; +} + +TellStickDuo::TellStickDuo(const std::string &serial) + : Controller(), + ftHandle(0), + open(false), + listener(0), + fwVersion(0) +{ + FT_STATUS ftStatus = FT_OK; + + char *tempSerial = new char[serial.size()+1]; +#ifdef _WINDOWS + strcpy_s(tempSerial, serial.size()+1, serial.c_str()); +#else + strcpy(tempSerial, serial.c_str()); +#endif + + ftStatus = FT_OpenEx(tempSerial, FT_OPEN_BY_SERIAL_NUMBER, &ftHandle); + delete tempSerial; + + + if (ftStatus == FT_OK) { + open = true; + FT_SetBaudRate(ftHandle, 9600); + FT_SetFlowControl(ftHandle, FT_FLOW_NONE, 0, 0); + + listener = new PrivateTellStickDuoListener(this); + listener->start(); + + char message[] = "V+"; + DWORD bytesWritten; + FT_Write(ftHandle, message, sizeof(message), &bytesWritten); + } else { + printf("Open: %d - %d\n", (int)ftStatus, connected()); + } +} + + +TellStickDuo::~TellStickDuo() { + if (listener) { + listener->stop(); + delete listener; + } + if (connected()) { + FT_Close(ftHandle); + } +} + +int TellStickDuo::firmwareVersion() { + return fwVersion; +} + +int TellStickDuo::send( const std::string &message ) { + return TELLSTICK_SUCCESS; +} + +bool TellStickDuo::connected() const { + return open; +} + +PrivateTellStickDuoListener::PrivateTellStickDuoListener( TellStickDuo *p ) + : QThread(), + parent(p), + running(false) +{ +} + +PrivateTellStickDuoListener::~PrivateTellStickDuoListener() { + if (running) { + stop(); + } +} + +void PrivateTellStickDuoListener::stop() { + if (running) { + QMutexLocker locker(&mutex); + running = false; + //Unlock the wait-condition + pthread_cond_broadcast(&eh.eCondVar); + } + wait(); +} + +void PrivateTellStickDuoListener::run() { + DWORD dwBytesInQueue = 0; + DWORD dwBytesRead = 0; + char *buf = 0; + + pthread_mutex_init(&eh.eMutex, NULL); + pthread_cond_init(&eh.eCondVar, NULL); + + { + QMutexLocker locker(&mutex); + running = true; + } + + while(running) { + FT_SetEventNotification(parent->ftHandle, FT_EVENT_RXCHAR, (PVOID)&eh); + pthread_mutex_lock(&eh.eMutex); + pthread_cond_wait(&eh.eCondVar, &eh.eMutex); + pthread_mutex_unlock(&eh.eMutex); + + FT_GetQueueStatus(parent->ftHandle, &dwBytesInQueue); + if (dwBytesInQueue <= 1) { + continue; + } + + buf = (char*)malloc(sizeof(buf) * (dwBytesInQueue+1)); + memset(buf, 0, dwBytesInQueue+1); + FT_Read(parent->ftHandle, buf, dwBytesInQueue, &dwBytesRead); + processData( buf ); + free(buf); + } +} + +void PrivateTellStickDuoListener::processData( const std::string &data ) { + for (uint i = 0; i < data.length(); ++i) { + if (data[i] == 13) { // Skip \r + continue; + } else if (data[i] == 10) { // \n found + if (message.substr(0,2).compare("+V") == 0) { + parent->fwVersion = atoi(message.substr(2).c_str()); + } else if (message.substr(0,2).compare("+R") == 0) { + Manager *manager = Manager::getInstance(); + manager->parseMessage(message.substr(2)); + } + message.clear(); + } else { // Append the character + message.append( 1, data[i] ); + } + } +} diff --git a/driver/libtelldus-core/TellStickDuo.h b/driver/libtelldus-core/TellStickDuo.h new file mode 100644 index 00000000..22aa5172 --- /dev/null +++ b/driver/libtelldus-core/TellStickDuo.h @@ -0,0 +1,49 @@ +// +// C++ Interface: controller +// +// Description: +// +// +// Author: Micke Prag , (C) 2009 +// +// Copyright: See COPYING file that comes with this distribution +// +// +#ifndef TELLSTICKDUO_H +#define TELLSTICKDUO_H + +#include +#include + +#include "Controller.h" +#include "ftd2xx.h" + +/** + @author Micke Prag +*/ +namespace TelldusCore { + class PrivateTellStickDuoListener; + + class TellStickDuo : public Controller { + friend class PrivateTellStickDuoListener; + + public: + TellStickDuo(const std::string &serial); + + ~TellStickDuo(); + + virtual int firmwareVersion(); + virtual int send( const std::string &message ); + + bool connected() const; + + private: + + FT_HANDLE ftHandle; + bool open; + PrivateTellStickDuoListener *listener; + int fwVersion; + }; +} + +#endif diff --git a/driver/libtelldus-core/common.h b/driver/libtelldus-core/common.h new file mode 100644 index 00000000..d97408e1 --- /dev/null +++ b/driver/libtelldus-core/common.h @@ -0,0 +1,35 @@ +// +// Author: Micke Prag , (C) 2009 +// +// Copyright: See COPYING file that comes with this distribution +// +// + +#ifdef _WINDOWS +#include "stdafx.h" +#include +#define strcasecmp _stricmp +#define strncasecmp _strnicmp + +#endif +#include +#include + +inline void msleep( const int msec) { +#ifdef _WINDOWS + Sleep(msec); +#else + usleep(msec*1000); +#endif +} + +inline char *wrapStdString( const std::string &string) { + char *returnVal; +#ifdef _WINDOWS + returnVal = (char *)SysAllocStringByteLen(string.c_str(), string.size()); +#else + returnVal = (char *)malloc(sizeof(char) * (string.size()+1)); + strcpy(returnVal, string.c_str()); +#endif + return returnVal; +} diff --git a/driver/libtelldus-core/config.h.in b/driver/libtelldus-core/config.h.in new file mode 100644 index 00000000..2a4e31c3 --- /dev/null +++ b/driver/libtelldus-core/config.h.in @@ -0,0 +1,24 @@ + +#define BRANDING "${BRANDING}" +#define BRANDING_${BRANDING} + +#if defined(BRANDING_byron) + #define PROTOCOL_ARCTECH +#elif defined(BRANDING_chacon) + #define PROTOCOL_ARCTECH +#elif defined(BRANDING_coco) + #define PROTOCOL_ARCTECH +#elif defined(BRANDING_intertechno) + #define PROTOCOL_ARCTECH +#else + #define PROTOCOL_ARCTECH + #define PROTOCOL_BRATECK + #define PROTOCOL_EVERFLOURISH + #define PROTOCOL_GROUP + #define PROTOCOL_RISINGSUN + #define PROTOCOL_WAVEMAN + #define PROTOCOL_SARTANO + #define PROTOCOL_IKEA + #define PROTOCOL_UPM + #define PROTOCOL_X10 +#endif \ No newline at end of file diff --git a/telldus-gui/Plugins/Controllers/ftd2xx.h b/driver/libtelldus-core/ftd2xx.h similarity index 59% rename from telldus-gui/Plugins/Controllers/ftd2xx.h rename to driver/libtelldus-core/ftd2xx.h index 344e1605..450126f5 100644 --- a/telldus-gui/Plugins/Controllers/ftd2xx.h +++ b/driver/libtelldus-core/ftd2xx.h @@ -1,7 +1,11 @@ -#ifdef _WINDOWS - #include - #include "win\ftd2xx.h" -#else - #include "osx/WinTypes.h" - #include "osx/ftd2xx.h" -#endif +#ifdef _WINDOWS + #include "stdafx.h" + #include "win\ftd2xx.h" +#else + #include "osx/WinTypes.h" + #include "osx/ftd2xx.h" +#endif + +#ifdef _LINUX +#include +#endif diff --git a/telldus-core/client/libtelldus-core.def b/driver/libtelldus-core/libtelldus-core.def similarity index 60% rename from telldus-core/client/libtelldus-core.def rename to driver/libtelldus-core/libtelldus-core.def index 57c3976e..495a1d5e 100644 --- a/telldus-core/client/libtelldus-core.def +++ b/driver/libtelldus-core/libtelldus-core.def @@ -1,60 +1,40 @@ -LIBRARY tellduscore -EXPORTS - tdGetNumberOfDevices @1 - tdGetDeviceId @2 - - tdGetName @3 - tdGetProtocol @4 - tdGetModel @5 - tdGetDeviceParameter @6 - - tdSetName @7 - tdSetProtocol @8 - tdSetModel @9 - tdSetDeviceParameter @10 - - tdAddDevice @11 - tdRemoveDevice @12 - - tdMethods @13 - tdTurnOn @14 - tdTurnOff @15 - tdBell @16 - tdDim @17 - - tdGetErrorString @18 - - tdClose @19 - - tdInit @20 - tdRegisterDeviceEvent @21 - tdLastSentCommand @22 - tdGetDeviceType @23 - - tdSendRawCommand @24 - tdRegisterRawDeviceEvent @25 - - tdLearn @26 - tdLastSentValue @27 - - tdReleaseString @28 - tdUnregisterCallback @29 - - tdConnectTellStickController @30 - tdDisconnectTellStickController @31 - - tdRegisterDeviceChangeEvent @32 - tdExecute @33 - tdUp @34 - tdDown @35 - tdStop @36 - - tdRegisterSensorEvent @37 - tdSensor @38 - tdSensorValue @39 - - tdController @40 - tdControllerValue @41 - tdSetControllerValue @42 - tdRemoveController @43 - tdRegisterControllerEvent @44 +LIBRARY tellduscore +EXPORTS + tdGetNumberOfDevices @1 + tdGetDeviceId @2 + + tdGetName @3 + tdGetProtocol @4 + tdGetModel @5 + tdGetDeviceParameter @6 + + tdSetName @7 + tdSetProtocol @8 + tdSetModel @9 + tdSetDeviceParameter @10 + + tdAddDevice @11 + tdRemoveDevice @12 + + tdMethods @13 + tdTurnOn @14 + tdTurnOff @15 + tdBell @16 + tdDim @17 + + tdGetErrorString @18 + + tdClose @19 + + tdInit @20 + tdRegisterDeviceEvent @21 + tdLastSentCommand @22 + tdGetDeviceType @23 + + tdSendRawCommand @24 + tdRegisterRawDeviceEvent @25 + + tdLearn @26 + tdLastSentValue @27 + + tdReleaseString @28 diff --git a/driver/libtelldus-core/libtelldus-core.vcproj b/driver/libtelldus-core/libtelldus-core.vcproj new file mode 100644 index 00000000..74af9954 --- /dev/null +++ b/driver/libtelldus-core/libtelldus-core.vcproj @@ -0,0 +1,354 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/driver/libtelldus-core/linux/Device.cpp b/driver/libtelldus-core/linux/Device.cpp new file mode 100644 index 00000000..b1f20648 --- /dev/null +++ b/driver/libtelldus-core/linux/Device.cpp @@ -0,0 +1,60 @@ +#include "../Device.h" +#include +#include +#include +#include +#include + +using namespace TelldusCore; + +/* +* Send message to the USB dongle +*/ +int Device::send(const std::string &strMessage) { + int fd = -1; + struct termios tio; + char in; + + if( 0 > ( fd = open( strDevice.c_str(), O_RDWR ) ) ) { + if (errno == ENOENT) { + return TELLSTICK_ERROR_NOT_FOUND; + } else if (errno == EACCES) { + return TELLSTICK_ERROR_PERMISSION_DENIED; + } + return TELLSTICK_ERROR_UNKNOWN; + } + + /* adjust serial port parameters */ + bzero(&tio, sizeof(tio)); /* clear struct for new port settings */ + tio.c_cflag = B4800 | CS8 | CLOCAL | CREAD; /* CREAD not used yet */ + tio.c_iflag = IGNPAR; + tio.c_oflag = 0; + tcflush(fd, TCIFLUSH); + tcsetattr(fd,TCSANOW,&tio); + + write(fd, strMessage.c_str(), strMessage.length()); + + ssize_t bytes = 0; + int c = 5000; + while(--c) { + bytes = read(fd, &in, 1); + if (bytes > 0) { + if (in == '\n') { + break; + } + } + usleep(1000); //Don't eat 100% cpu + } + + close(fd); + + if (c == 0) { + return TELLSTICK_ERROR_COMMUNICATION; + } + + return TELLSTICK_SUCCESS; +} + +void Device::setDevice(const std::string &device) { + strDevice = device; +} diff --git a/telldus-core/service/osx/WinTypes.h b/driver/libtelldus-core/osx/WinTypes.h similarity index 65% rename from telldus-core/service/osx/WinTypes.h rename to driver/libtelldus-core/osx/WinTypes.h index e8b5b090..c37d66ff 100755 --- a/telldus-core/service/osx/WinTypes.h +++ b/driver/libtelldus-core/osx/WinTypes.h @@ -4,34 +4,34 @@ #define MAX_NUM_DEVICES 50 #include -typedef unsigned int DWORD; -typedef unsigned int ULONG; -typedef unsigned short USHORT; -typedef unsigned short SHORT; -typedef unsigned char UCHAR; -typedef unsigned short WORD; -typedef unsigned char BYTE; -typedef BYTE *LPBYTE; -typedef unsigned int BOOL; -typedef unsigned char BOOLEAN; -typedef unsigned char CHAR; -typedef BOOL *LPBOOL; -typedef UCHAR *PUCHAR; -typedef const char *LPCSTR; -typedef char *PCHAR; -typedef void *PVOID; -typedef void *HANDLE; -typedef unsigned int LONG; -typedef int INT; -typedef unsigned int UINT; -typedef char *LPSTR; -typedef char *LPTSTR; -typedef DWORD *LPDWORD; -typedef WORD *LPWORD; -typedef ULONG *PULONG; -typedef PVOID LPVOID; -typedef void VOID; -typedef unsigned long long int ULONGLONG; +typedef unsigned long DWORD; +typedef unsigned long ULONG; +typedef unsigned short USHORT; +typedef short SHORT; +typedef unsigned char UCHAR; +typedef unsigned short WORD; +typedef unsigned char BYTE; +typedef unsigned char *LPBYTE; +typedef int BOOL; +typedef char BOOLEAN; +typedef char CHAR; +typedef int *LPBOOL; +typedef unsigned char *PUCHAR; +typedef const char *LPCSTR; +typedef char *PCHAR; +typedef void *PVOID; +typedef void *HANDLE; +typedef long LONG; +typedef int INT; +typedef unsigned int UINT; +typedef char *LPSTR; +typedef char *LPTSTR; +typedef DWORD *LPDWORD; +typedef WORD *LPWORD; +typedef ULONG *PULONG; +typedef PVOID LPVOID; +typedef void VOID; +typedef unsigned long long int ULONGLONG; typedef struct _OVERLAPPED { DWORD Internal; diff --git a/telldus-core/service/osx/ftd2xx.h b/driver/libtelldus-core/osx/ftd2xx.h similarity index 78% rename from telldus-core/service/osx/ftd2xx.h rename to driver/libtelldus-core/osx/ftd2xx.h index 04b65274..67969cfe 100755 --- a/telldus-core/service/osx/ftd2xx.h +++ b/driver/libtelldus-core/osx/ftd2xx.h @@ -1,41 +1,33 @@ /*++ - Copyright (c) 2001-2011 Future Technology Devices International Limited - - THIS SOFTWARE IS PROVIDED BY FUTURE TECHNOLOGY DEVICES INTERNATIONAL LIMITED "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL - FUTURE TECHNOLOGY DEVICES INTERNATIONAL LIMITED BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - OF SUBSTITUTE GOODS OR SERVICES LOSS OF USE, DATA, OR PROFITS OR BUSINESS INTERRUPTION) - HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR - TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, - EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - FTDI DRIVERS MAY BE USED ONLY IN CONJUNCTION WITH PRODUCTS BASED ON FTDI PARTS. - - FTDI DRIVERS MAY BE DISTRIBUTED IN ANY FORM AS LONG AS LICENSE INFORMATION IS NOT MODIFIED. - - IF A CUSTOM VENDOR ID AND/OR PRODUCT ID OR DESCRIPTION STRING ARE USED, IT IS THE - RESPONSIBILITY OF THE PRODUCT MANUFACTURER TO MAINTAIN ANY CHANGES AND SUBSEQUENT WHQL - RE-CERTIFICATION AS A RESULT OF MAKING THESE CHANGES. - - - Module Name: - - ftd2xx.h - - Abstract: - - Native USB device driver for FTDI FT232x, FT245x, FT2232x and FT4232x devices - FTD2XX library definitions - - Environment: - - user mode - - - --*/ +Copyright (c) 2001-2003 Future Technology Devices International Ltd. + +Module Name: + + ftd2xx.h + +Abstract: + + Native USB interface for FTDI FT8U232/245/2232C + FTD2XX library definitions + +Environment: + + kernel & user mode + +Revision History: + + 13/03/01 awm Created. + 13/01/03 awm Added device information support. + 19/03/03 awm Added FT_W32_CancelIo. + 12/06/03 awm Added FT_StopInTask and FT_RestartInTask. + 18/09/03 awm Added FT_SetResetPipeRetryCount. + 10/10/03 awm Added FT_ResetPort. + /03/04 st modified for linux users + 12/10/04 st added FT_SetVIDPID + + +--*/ #ifndef FTD2XX_H @@ -74,8 +66,11 @@ typedef struct _EVENT_HANDLE{ int iVar; } EVENT_HANDLE; -typedef PVOID FT_HANDLE; -typedef ULONG FT_STATUS; +typedef DWORD *FT_HANDLE; +//typedef unsigned int FT_HANDLE; +//typedef struct ftdi_device * FT_HANDLE; + +typedef ULONG FT_STATUS; // // Device status @@ -112,7 +107,6 @@ enum { #define FT_OPEN_BY_SERIAL_NUMBER 1 #define FT_OPEN_BY_DESCRIPTION 2 -#define FT_OPEN_BY_LOCATION 4 // // FT_ListDevices Flags (used in conjunction with FT_OpenEx Flags @@ -120,7 +114,7 @@ enum { #define FT_LIST_NUMBER_ONLY 0x80000000 #define FT_LIST_BY_INDEX 0x40000000 -#define FT_LIST_ALL 0x20000000 +#define FT_LIST_ALL 0x20000000 #define FT_LIST_MASK (FT_LIST_NUMBER_ONLY|FT_LIST_BY_INDEX|FT_LIST_ALL) @@ -149,12 +143,15 @@ enum { #define FT_BITS_8 (UCHAR) 8 #define FT_BITS_7 (UCHAR) 7 +#define FT_BITS_6 (UCHAR) 6 +#define FT_BITS_5 (UCHAR) 5 // // Stop Bits // #define FT_STOP_BITS_1 (UCHAR) 0 +#define FT_STOP_BITS_1_5 (UCHAR) 1 #define FT_STOP_BITS_2 (UCHAR) 2 // @@ -188,9 +185,8 @@ enum { typedef void (*PFT_EVENT_HANDLER)(DWORD,DWORD); -#define FT_EVENT_RXCHAR 1 -#define FT_EVENT_MODEM_STATUS 2 -#define FT_EVENT_LINE_STATUS 4 +#define FT_EVENT_RXCHAR 1 +#define FT_EVENT_MODEM_STATUS 2 // // Timeouts @@ -211,24 +207,9 @@ enum { FT_DEVICE_100AX, FT_DEVICE_UNKNOWN, FT_DEVICE_2232C, - FT_DEVICE_232R, - FT_DEVICE_2232H, - FT_DEVICE_4232H + FT_DEVICE_232R }; -// -// Bit Modes -// - -#define FT_BITMODE_RESET 0x00 -#define FT_BITMODE_ASYNC_BITBANG 0x01 -#define FT_BITMODE_MPSSE 0x02 -#define FT_BITMODE_SYNC_BITBANG 0x04 -#define FT_BITMODE_MCU_HOST 0x08 -#define FT_BITMODE_FAST_SERIAL 0x10 -#define FT_BITMODE_CBUS_BITBANG 0x20 -#define FT_BITMODE_SYNC_FIFO 0x40 - #ifdef __cplusplus extern "C" { @@ -459,8 +440,7 @@ typedef struct ft_program_data { // 0 = original // 1 = FT2232C extensions // 2 = FT232R extensions - // 3 = FT2232H extensions - // 4 = FT4232H extensions + WORD VendorId; // 0x0403 WORD ProductId; // 0x6001 char *Manufacturer; // "FTDI" @@ -472,7 +452,7 @@ typedef struct ft_program_data { WORD SelfPowered; // 0 = bus powered, 1 = self powered WORD RemoteWakeup; // 0 = not capable, 1 = capable // - // Rev4 (FT232B) extensions + // Rev4 extensions // UCHAR Rev4; // non-zero if Rev4 chip, zero otherwise UCHAR IsoIn; // non-zero if in endpoint is isochronous @@ -482,7 +462,7 @@ typedef struct ft_program_data { UCHAR USBVersionEnable; // non-zero if chip uses USBVersion WORD USBVersion; // BCD (0x0200 => USB2) // - // Rev 5 (FT2232) extensions + // FT2232C extensions // UCHAR Rev5; // non-zero if Rev5 chip, zero otherwise UCHAR IsoInA; // non-zero if in endpoint is isochronous @@ -504,13 +484,15 @@ typedef struct ft_program_data { UCHAR IFBIsFastSer; // non-zero if interface is Fast serial UCHAR BIsVCP; // non-zero if interface is to use VCP drivers // - // Rev 6 (FT232R) extensions + // FT232R extensions // UCHAR UseExtOsc; // Use External Oscillator UCHAR HighDriveIOs; // High Drive I/Os UCHAR EndpointSize; // Endpoint size + UCHAR PullDownEnableR; // non-zero if pull down enabled UCHAR SerNumEnableR; // non-zero if serial number to be used + UCHAR InvertTXD; // non-zero if invert TXD UCHAR InvertRXD; // non-zero if invert RXD UCHAR InvertRTS; // non-zero if invert RTS @@ -519,67 +501,18 @@ typedef struct ft_program_data { UCHAR InvertDSR; // non-zero if invert DSR UCHAR InvertDCD; // non-zero if invert DCD UCHAR InvertRI; // non-zero if invert RI + UCHAR Cbus0; // Cbus Mux control UCHAR Cbus1; // Cbus Mux control UCHAR Cbus2; // Cbus Mux control UCHAR Cbus3; // Cbus Mux control UCHAR Cbus4; // Cbus Mux control - UCHAR RIsD2XX; // non-zero if using D2XX drivers - // - // Rev 7 (FT2232H) Extensions - // - UCHAR PullDownEnable7; // non-zero if pull down enabled - UCHAR SerNumEnable7; // non-zero if serial number to be used - UCHAR ALSlowSlew; // non-zero if AL pins have slow slew - UCHAR ALSchmittInput; // non-zero if AL pins are Schmitt input - UCHAR ALDriveCurrent; // valid values are 4mA, 8mA, 12mA, 16mA - UCHAR AHSlowSlew; // non-zero if AH pins have slow slew - UCHAR AHSchmittInput; // non-zero if AH pins are Schmitt input - UCHAR AHDriveCurrent; // valid values are 4mA, 8mA, 12mA, 16mA - UCHAR BLSlowSlew; // non-zero if BL pins have slow slew - UCHAR BLSchmittInput; // non-zero if BL pins are Schmitt input - UCHAR BLDriveCurrent; // valid values are 4mA, 8mA, 12mA, 16mA - UCHAR BHSlowSlew; // non-zero if BH pins have slow slew - UCHAR BHSchmittInput; // non-zero if BH pins are Schmitt input - UCHAR BHDriveCurrent; // valid values are 4mA, 8mA, 12mA, 16mA - UCHAR IFAIsFifo7; // non-zero if interface is 245 FIFO - UCHAR IFAIsFifoTar7; // non-zero if interface is 245 FIFO CPU target - UCHAR IFAIsFastSer7; // non-zero if interface is Fast serial - UCHAR AIsVCP7; // non-zero if interface is to use VCP drivers - UCHAR IFBIsFifo7; // non-zero if interface is 245 FIFO - UCHAR IFBIsFifoTar7; // non-zero if interface is 245 FIFO CPU target - UCHAR IFBIsFastSer7; // non-zero if interface is Fast serial - UCHAR BIsVCP7; // non-zero if interface is to use VCP drivers - UCHAR PowerSaveEnable; // non-zero if using BCBUS7 to save power for self-powered designs - // - // Rev 8 (FT4232H) Extensions - // - UCHAR PullDownEnable8; // non-zero if pull down enabled - UCHAR SerNumEnable8; // non-zero if serial number to be used - UCHAR ASlowSlew; // non-zero if AL pins have slow slew - UCHAR ASchmittInput; // non-zero if AL pins are Schmitt input - UCHAR ADriveCurrent; // valid values are 4mA, 8mA, 12mA, 16mA - UCHAR BSlowSlew; // non-zero if AH pins have slow slew - UCHAR BSchmittInput; // non-zero if AH pins are Schmitt input - UCHAR BDriveCurrent; // valid values are 4mA, 8mA, 12mA, 16mA - UCHAR CSlowSlew; // non-zero if BL pins have slow slew - UCHAR CSchmittInput; // non-zero if BL pins are Schmitt input - UCHAR CDriveCurrent; // valid values are 4mA, 8mA, 12mA, 16mA - UCHAR DSlowSlew; // non-zero if BH pins have slow slew - UCHAR DSchmittInput; // non-zero if BH pins are Schmitt input - UCHAR DDriveCurrent; // valid values are 4mA, 8mA, 12mA, 16mA - UCHAR ARIIsTXDEN; // non-zero if port A uses RI as RS485 TXDEN - UCHAR BRIIsTXDEN; // non-zero if port B uses RI as RS485 TXDEN - UCHAR CRIIsTXDEN; // non-zero if port C uses RI as RS485 TXDEN - UCHAR DRIIsTXDEN; // non-zero if port D uses RI as RS485 TXDEN - UCHAR AIsVCP8; // non-zero if interface is to use VCP drivers - UCHAR BIsVCP8; // non-zero if interface is to use VCP drivers - UCHAR CIsVCP8; // non-zero if interface is to use VCP drivers - UCHAR DIsVCP8; // non-zero if interface is to use VCP drivers + + UCHAR RIsVCP; // zero if using VCP drivers } FT_PROGRAM_DATA, *PFT_PROGRAM_DATA; - + FTD2XX_API FT_STATUS WINAPI FT_EE_Program( FT_HANDLE ftHandle, @@ -674,12 +607,6 @@ FT_STATUS WINAPI FT_GetDeviceInfo( PCHAR Description, LPVOID Dummy ); - -FTD2XX_API -FT_STATUS WINAPI FT_GetDeviceLocId( - FT_HANDLE ftHandle, - LPDWORD lpdwLocId - ); FTD2XX_API FT_STATUS WINAPI FT_StopInTask( @@ -909,12 +836,6 @@ typedef struct _ft_device_list_info_node { FT_HANDLE ftHandle; } FT_DEVICE_LIST_INFO_NODE; -// Device information flags -enum { - FT_FLAGS_OPENED = 1, - FT_FLAGS_HISPEED = 2 -}; - FTD2XX_API FT_STATUS WINAPI FT_CreateDeviceInfoList( LPDWORD lpdwNumDevs @@ -938,11 +859,6 @@ FT_STATUS WINAPI FT_GetDeviceInfoDetail( FT_HANDLE *pftHandle ); - -// -// Version information -// - FTD2XX_API FT_STATUS WINAPI FT_GetDriverVersion( FT_HANDLE ftHandle, diff --git a/driver/libtelldus-core/stdafx.cpp b/driver/libtelldus-core/stdafx.cpp new file mode 100644 index 00000000..54385d7a --- /dev/null +++ b/driver/libtelldus-core/stdafx.cpp @@ -0,0 +1,8 @@ +// stdafx.cpp : source file that includes just the standard includes +// testruntelldus3.pch will be the pre-compiled header +// stdafx.obj will contain the pre-compiled type information + +#include "stdafx.h" + +// TODO: reference any additional headers you need in STDAFX.H +// and not in this file diff --git a/driver/libtelldus-core/stdafx.h b/driver/libtelldus-core/stdafx.h new file mode 100644 index 00000000..5df7bbe1 --- /dev/null +++ b/driver/libtelldus-core/stdafx.h @@ -0,0 +1,37 @@ +// stdafx.h : include file for standard system include files, +// or project specific include files that are used frequently, but +// are changed infrequently +// + +#pragma once + +// Modify the following defines if you have to target a platform prior to the ones specified below. +// Refer to MSDN for the latest info on corresponding values for different platforms. +#ifndef WINVER // Allow use of features specific to Windows XP or later. +#define WINVER 0x0501 // Change this to the appropriate value to target other versions of Windows. +#endif + +#ifndef _WIN32_WINNT // Allow use of features specific to Windows XP or later. +#define _WIN32_WINNT 0x0501 // Change this to the appropriate value to target other versions of Windows. +#endif + +#ifndef _WIN32_WINDOWS // Allow use of features specific to Windows 98 or later. +#define _WIN32_WINDOWS 0x0410 // Change this to the appropriate value to target Windows Me or later. +#endif + +#ifndef _WIN32_IE // Allow use of features specific to IE 6.0 or later. +#define _WIN32_IE 0x0600 // Change this to the appropriate value to target other versions of IE. +#endif + +#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers +// Windows Header Files: +#include + +// C RunTime Header Files +#include +#include +#include +#include + + +// TODO: reference additional headers your program requires here diff --git a/driver/libtelldus-core/telldus-core.conf b/driver/libtelldus-core/telldus-core.conf new file mode 100644 index 00000000..71f45b3d --- /dev/null +++ b/driver/libtelldus-core/telldus-core.conf @@ -0,0 +1,11 @@ +deviceNode = "/dev/tellstick" +device { + id = 1 + name = "Example device" + protocol = "arctech" + model = "codeswitch" + parameters { + house = "A" + unit = "1" + } +} diff --git a/driver/libtelldus-core/telldus-core.cpp b/driver/libtelldus-core/telldus-core.cpp new file mode 100644 index 00000000..2ccb2693 --- /dev/null +++ b/driver/libtelldus-core/telldus-core.cpp @@ -0,0 +1,595 @@ +/** + * @defgroup core telldus-core + * Telldus Core is the base module used to interface a Telldus TellStick. + * @{ + */ + +#include "telldus-core.h" +#include "Manager.h" +#include "Device.h" +#include "DeviceGroup.h" +#include "DeviceUndefined.h" +#ifdef TELLSTICK_DUO + #include "TellStickDuo.h" +#endif +#include "common.h" +#include +#include +#include +#include +#include + +void handleException(std::exception e); +using namespace std; +using namespace TelldusCore; + + +/** + * @def TELLSTICK_TURNON + * Device-flag for devices supporting the tdTurnOn() call. + * + * @def TELLSTICK_TURNOFF + * Device-flag for devices supporting the tdTurnOff() call. + * + * @def TELLSTICK_BELL + * Device-flag for devices supporting the tdBell() call. + * + * @def TELLSTICK_TOGGLE + * This method is currently unimplemented. + * + * @def TELLSTICK_DIM + * Device-flag for devices supporting the tdDim() call. + * + * @def TELLSTICK_LEARN + * Device-flag for devices supporting the tdLearn() call. + * + * @def TELLSTICK_TYPE_DEVICE + * Device type of a single device. + * + * @def TELLSTICK_TYPE_GROUP + * Device type of a device which contains other devices. + * + * @def TELLSTICK_SUCCESS + * Error code. Returned when the command succeeded. + * + * @def TELLSTICK_ERROR_NOT_FOUND + * Error code. Returned if a TellStick was not found on the system. + * + * @def TELLSTICK_ERROR_PERMISSION_DENIED + * Error code. Returned if the user doesn't have privileges to open + * the TellStick device. + * + * @def TELLSTICK_ERROR_DEVICE_NOT_FOUND + * Error code. The supplied device id was not found. + * + * @def TELLSTICK_ERROR_METHOD_NOT_SUPPORTED + * Error code. The requested method is not supported by the device. + * This should be avoided by a call to tdMethods(). + * + * @def TELLSTICK_ERROR_COMMUNICATION + * Error code. An error occurred when communicating with TellStick + * + * @def TELLSTICK_ERROR_UNKNOWN + * Error code. An unkown error has occurred. + */ + +#define MAX_LOADSTRING 100 + +void WINAPI tdInit(void) { + Manager::getInstance(); //Create the manager-object +} + +int WINAPI tdRegisterDeviceEvent( TDDeviceEvent eventFunction, void *context ) { + Manager *manager = Manager::getInstance(); + return manager->registerDeviceEvent( eventFunction, context ); +} + +int WINAPI tdRegisterRawDeviceEvent( TDRawDeviceEvent eventFunction, void *context ) { + Manager *manager = Manager::getInstance(); + return manager->registerRawDeviceEvent( eventFunction, context ); +} + +/** + * Close the library and clean up the cache it uses. + * This should be called when the library is not supposed to be used anymore + **/ +void WINAPI tdClose(void) { + Manager::close(); +} + +/** + * This method releases resources allocated by telldus-core. + * It should be called on the returned value from all functions return char * + **/ +void WINAPI tdReleaseString(char *string) { +#ifdef _WINDOWS + SysFreeString((BSTR)string); +#else + free(string); +#endif +} + + +/** + * Turns a device on. + * Make sure the device supports this by calling tdMethods() before any + * call to this function. + * @param intDeviceId The device id to turn on. + **/ +int WINAPI tdTurnOn(int intDeviceId){ + + try{ + Manager *manager = Manager::getInstance(); + Device* dev = manager->getDevice(intDeviceId); + if(dev != NULL){ + return dev->switchState(TELLSTICK_TURNON); + } else{ + return TELLSTICK_ERROR_DEVICE_NOT_FOUND; + } + } + catch(exception e){ + handleException(e); + } + return TELLSTICK_ERROR_UNKNOWN; +} + +/** + * Turns a device off. + * Make sure the device supports this by calling tdMethods() before any + * call to this function. + * @param intDeviceId The device id to turn off. + */ +int WINAPI tdTurnOff(int intDeviceId){ + + try{ + Manager *manager = Manager::getInstance(); + Device* dev = manager->getDevice(intDeviceId); + if(dev != NULL){ + return dev->switchState(TELLSTICK_TURNOFF); + } else { + return TELLSTICK_ERROR_DEVICE_NOT_FOUND; + } + } + catch(exception e){ + handleException(e); + } + return TELLSTICK_ERROR_UNKNOWN; +} + +/** + * Sends bell command to devices supporting this. + * Make sure the device supports this by calling tdMethods() before any + * call to this function. + * @param intDeviceId The device id to send bell to + */ +int WINAPI tdBell(int intDeviceId){ + + try{ + Manager *manager = Manager::getInstance(); + Device* dev = manager->getDevice(intDeviceId); + if (dev != NULL){ + return dev->switchState( TELLSTICK_BELL ); + } else { + return TELLSTICK_ERROR_DEVICE_NOT_FOUND; + } + } + catch(exception e){ + handleException(e); + } + return TELLSTICK_ERROR_UNKNOWN; +} + +/** + * Dims a device. + * Make sure the device supports this by calling tdMethods() before any + * call to this function. + * @param intDeviceId The device id to dim + * @param level The level the device should dim to. This value should be 0-255 + */ +int WINAPI tdDim(int intDeviceId, unsigned char level){ + try{ + Manager *manager = Manager::getInstance(); + Device* dev = manager->getDevice(intDeviceId); + if(dev != NULL){ + int retval = 0; + + if (level == 0) { + retval = dev->switchState( TELLSTICK_TURNOFF ); + } else if (level == 255) { + retval = dev->switchState( TELLSTICK_TURNON ); + } else { + retval = dev->switchState( TELLSTICK_DIM, (char *)&level); + } + return retval; + } else { + return TELLSTICK_ERROR_DEVICE_NOT_FOUND; + } + } + catch(exception e){ + handleException(e); + } + return TELLSTICK_ERROR_UNKNOWN; +} + +/** + * Sends a special learn command to some devices that need a special learn-command + * to be used from TellStick + * Make sure the device supports this by calling tdMethods() before any + * call to this function. + * @param intDeviceId The device id to learn. + */ +int WINAPI tdLearn(int intDeviceId) { + + try{ + Manager *manager = Manager::getInstance(); + Device* dev = manager->getDevice(intDeviceId); + if(dev != NULL){ + return dev->switchState(TELLSTICK_LEARN); + } else{ + return TELLSTICK_ERROR_DEVICE_NOT_FOUND; + } + } + catch(exception e){ + handleException(e); + } + return TELLSTICK_ERROR_UNKNOWN; +} + +/** + * Returns the last sent command to a specific device + * @param intDeviceId The device id to query + * @param methodsSupported The methods supported by the client. See tdMethods() for more information. + * @returns the last sent command as integer, example TELLSTICK_TURNON or TELLSTICK_TURNOFF + */ +int WINAPI tdLastSentCommand( int intDeviceId, int methodsSupported ) { + Manager *manager = Manager::getInstance(); + int lastSentCommand = Device::maskUnsupportedMethods(manager->getDeviceState( intDeviceId ), methodsSupported); + + if (lastSentCommand == TELLSTICK_BELL) { + //Bell is not a state + lastSentCommand = TELLSTICK_TURNOFF; + } + if (lastSentCommand == 0) { + lastSentCommand = TELLSTICK_TURNOFF; + } + return lastSentCommand; +} + +/** + * If the last sent command it TELLSTICK_DIM this returns the dimmed value. + * @param intDeviceId The device id to query + * @returns the the value as a human readable string, example "128" for 50% + */ +char * WINAPI tdLastSentValue( int intDeviceId ) { + Manager *manager = Manager::getInstance(); + std::string strReturn = manager->getDeviceStateValue( intDeviceId ); + return wrapStdString(strReturn); +} + +/** + * This function returns the number of devices configured + * @returns an integer of the total number of devices configured + */ +int WINAPI tdGetNumberOfDevices(void){ + int intReturn = -1; + try{ + Manager *manager = Manager::getInstance(); + intReturn = manager->getNumberOfDevices(); + } + catch(exception e){ + intReturn = -1; + handleException(e); + } + return intReturn; +} + +/** + * This function returns the unique id of a device with a specific index. + * To get all the id numbers you should loop over all the devices: + * \code + * int intNumberOfDevices = tdGetNumberOfDevices(); + * for (int i = 0; i < intNumberOfDevices; i++) { + * int id = tdGetDeviceId( i ); + * // id now contains the id number of the device with index of i + * } + * \endcode + * @param intDeviceIndex The device index to query. The index starts from 0. + * @returns the unique id for the device or -1 if the device is not found. + */ +int WINAPI tdGetDeviceId(int intDeviceIndex){ + int intReturn = -1; + try{ + Manager *manager = Manager::getInstance(); + intReturn = manager->getDeviceId(intDeviceIndex); + } + catch(exception e){ + intReturn = -1; + handleException(e); + } + return intReturn; +} + +/** + * Returns which type the device is. The device could be either + * TELLSTICK_TYPE_DEVICE or TELLSTICK_TYPE_GROUP + */ +int WINAPI tdGetDeviceType(int intDeviceId) { + try{ + Manager *manager = Manager::getInstance(); + Device* dev = manager->getDevice(intDeviceId); + if (dev != NULL) { + DeviceGroup *deviceGroup = dynamic_cast(dev); + if (deviceGroup) { + return TELLSTICK_TYPE_GROUP; + } + } + } + catch(exception e){ + handleException(e); + } + return TELLSTICK_TYPE_DEVICE; +} + +/** + * Query a device for it's name. + * @param intDeviceId The unique id of the device to query + * @returns The name of the device or an empty string if the device is not found. + */ +char * WINAPI tdGetName(int intDeviceId){ + std::string strReturn = ""; + try { + Manager *manager = Manager::getInstance(); + Device *dev = manager->getDevice( intDeviceId ); + if (dev != NULL) { + strReturn = dev->getName(); + } + } + catch(exception e){ + strReturn = ""; + handleException(e); + } + return wrapStdString(strReturn); +} + +bool WINAPI tdSetName(int intDeviceId, const char* strNewName){ + bool blnSuccess = false; + try{ + Manager *manager = Manager::getInstance(); + Device *dev = manager->getDevice( intDeviceId ); + if (dev != NULL) { + blnSuccess = dev->setName(strNewName); + } + } + catch(exception e){ + blnSuccess = false; + handleException(e); + } + return blnSuccess; +} + +char* WINAPI tdGetProtocol(int intDeviceId){ + std::string strReturn = ""; + try{ + Manager *manager = Manager::getInstance(); + Device* dev = manager->getDevice(intDeviceId); + if (dev != NULL) { + strReturn = dev->getProtocol(); + } + } + catch(exception e){ + handleException(e); + } + return wrapStdString(strReturn); +} + +bool WINAPI tdSetProtocol(int intDeviceId, const char* strProtocol){ + bool blnSuccess = false; + try{ + Manager *manager = Manager::getInstance(); + blnSuccess = manager->setDeviceProtocol(intDeviceId, strProtocol); + } + catch(exception e){ + blnSuccess = false; + handleException(e); + } + return blnSuccess; +} + +char* WINAPI tdGetModel(int intDeviceId){ + std::string strReturn = ""; + try{ + Manager *manager = Manager::getInstance(); + Device* dev = manager->getDevice(intDeviceId); + if (dev != NULL) { + strReturn = dev->getFullModel(); + } + } + catch(exception e){ + handleException(e); + } + return wrapStdString(strReturn); +} + +bool WINAPI tdSetModel(int intDeviceId, const char *strModel){ + bool blnSuccess = false; + try{ + Manager *manager = Manager::getInstance(); + Device* dev = manager->getDevice(intDeviceId); + if (dev != NULL) { + blnSuccess = dev->setModel(strModel); + } + } + catch(exception e){ + blnSuccess = false; + handleException(e); + } + return blnSuccess; +} + +bool WINAPI tdSetDeviceParameter(int intDeviceId, const char *strName, const char *strValue){ + + try{ + Manager *manager = Manager::getInstance(); + Device *dev = manager->getDevice( intDeviceId ); + if (dev != NULL) { + return dev->setParameter(strName, strValue); + } + } + catch(exception e){ + handleException(e); + } + return false; +} + +char * WINAPI tdGetDeviceParameter(int intDeviceId, const char *strName, const char *defaultValue){ + std::string strReturn = ""; + try{ + Manager *manager = Manager::getInstance(); + strReturn = manager->getDeviceParameter(intDeviceId, strName); + if (strReturn.empty()) { + strReturn = defaultValue; + } + } + catch(exception e){ + handleException(e); + } + return wrapStdString(strReturn); +} + +int WINAPI tdAddDevice(){ + int intNewDeviceId = -1; + try{ + Manager *manager = Manager::getInstance(); + intNewDeviceId = manager->addDevice(); + } + catch(exception e){ + intNewDeviceId = -1; + handleException(e); + } + return intNewDeviceId; +} + +bool WINAPI tdRemoveDevice(int intDeviceId){ + bool blnSuccess = false; + try{ + Manager *manager = Manager::getInstance(); + blnSuccess = manager->removeDevice(intDeviceId); + } + catch(exception e){ + blnSuccess = false; + handleException(e); + } + return blnSuccess; +} + +/** + * Query a device for which methods it supports. By supplying the methods you support + * the library could remap the methods a device support for better fit the application. + * Example of querying a device supporting TELLSTICK_BELL: + * \code + * int methods = tdMethods(id, TELLSTICK_TURNON | TELLSTICK_TURNOFF | TELLSTICK_BELL); + * //methods is now TELLSTICK_BELL + * int methods = tdMethods(idm TELLSTICK_TURNON | TELLSTICK_TURNOFF); + * //methods is now TELLSTICK_TURNON because the client application doesn't support TELLSTICK_BELL + * \endcode + * @param id The device id to query + * @param methodsSupported The methods the client application supports + * @returns The method-flags OR'ed into an integer. + * @sa TELLSTICK_TURNON + * @sa TELLSTICK_TURNOFF + * @sa TELLSTICK_BELL + * @sa TELLSTICK_TOGGLE + * @sa TELLSTICK_DIM + */ +int WINAPI tdMethods(int id, int methodsSupported){ + + int intMethods = 0; + try{ + Manager *manager = Manager::getInstance(); + Device* dev = manager->getDevice(id); + if (dev != NULL) { + intMethods = dev->methods(); + } + } + catch(exception e){ + intMethods = 0; + handleException(e); + } + intMethods = Device::maskUnsupportedMethods(intMethods, methodsSupported); //Strip the methods not supported by client. + return intMethods; +} + +/** + * Get a human readable string from an error code returned + * from a function in telldus-core. + * @param intErrorNo The error code to translate. + * @returns a string ready to show to the user. + * @sa TELLSTICK_SUCCESS + * @sa TELLSTICK_ERROR_NOT_FOUND + * @sa TELLSTICK_ERROR_PERMISSION_DENIED + * @sa TELLSTICK_ERROR_DEVICE_NOT_FOUND + * @sa TELLSTICK_ERROR_METHOD_NOT_SUPPORTED + * @sa TELLSTICK_ERROR_UNKNOWN + */ +char * WINAPI tdGetErrorString(int intErrorNo) { + const int numResponses = 6; + const char *responses[numResponses] = { + "Success", + "TellStick not found", + "Permission denied", + "Device not found", + "The method you tried to use is not supported by the device", + "An error occurred when communication with TellStick" + }; + std::string strReturn; + intErrorNo = abs(intErrorNo); //We don't use negative values here. + if (intErrorNo >= numResponses) { + strReturn = "Unknown error"; + } else { + // Copy the error string to strReturn + strReturn = responses[intErrorNo]; + } + return wrapStdString(strReturn); +} + +/** + * Send a raw command to TellStick. Please read the TellStick protocol + * definition on how the command should be constructed. + * @param command The command for TellStick in its native format + * @returns TELLSTICK_SUCCESS on success or one of the errorcodes on failure + */ +int WINAPI tdSendRawCommand(const char *command, int reserved) { + try{ + Manager *manager = Manager::getInstance(); + Device* dev = manager->getDevice(0); + DeviceUndefined *udev = dynamic_cast(dev); + if(udev){ + return udev->sendRawCommand(command); + } else{ + return TELLSTICK_ERROR_DEVICE_NOT_FOUND; + } + } + catch(exception e){ + handleException(e); + } + return TELLSTICK_ERROR_UNKNOWN; +} + +//******** +//* Error management, set strLogName to "" to turn off +//* +void handleException(exception e){ + +// std::string strLogName = "errorlog.txt"; + std::string strLogName = ""; + + if(strLogName.length() > 0){ + ofstream errorfile(strLogName.c_str(), ios::app); + if(errorfile){ + errorfile << e.what() << endl; + errorfile.close(); + } + } +} + +/*\@}*/ diff --git a/driver/libtelldus-core/telldus-core.h b/driver/libtelldus-core/telldus-core.h new file mode 100644 index 00000000..6a717853 --- /dev/null +++ b/driver/libtelldus-core/telldus-core.h @@ -0,0 +1,125 @@ +#ifndef TELLDUSCORE_H +#define TELLDUSCORE_H + +// The following ifdef block is the standard way of creating macros +// which make exporting from a DLL simpler. All files within this DLL +// are compiled with the TELLDUSCORE_EXPORTS symbol defined on the command line. +// This symbol should not be defined on any project that uses this DLL. +// This way any other project whose source files include this file see +// TELLSTICK_API functions as being imported from a DLL, whereas this DLL +// sees symbols defined with this macro as being exported. + +#ifdef _WINDOWS + #ifdef TELLDUSCORE_EXPORTS + #define TELLSTICK_API __declspec(dllexport) + #else + #define TELLSTICK_API __declspec(dllimport) + #endif + #define WINAPI __stdcall +#else + #define WINAPI + #define TELLSTICK_API +#endif + +typedef void (WINAPI *TDDeviceEvent)(int deviceId, int method, const char *data, int callbackId, void *context); +typedef void (WINAPI *TDRawDeviceEvent)(const char *data, int callbackId, void *context); + +#ifndef __cplusplus + #define bool char +#endif + +#ifdef __cplusplus +extern "C" { +#endif + TELLSTICK_API void WINAPI tdInit(void); + TELLSTICK_API int WINAPI tdRegisterDeviceEvent( TDDeviceEvent eventFunction, void *context ); + TELLSTICK_API int WINAPI tdRegisterRawDeviceEvent( TDRawDeviceEvent eventFunction, void *context ); + TELLSTICK_API void WINAPI tdClose(void); + TELLSTICK_API void WINAPI tdReleaseString(char *string); + + TELLSTICK_API int WINAPI tdTurnOn(int intDeviceId); + TELLSTICK_API int WINAPI tdTurnOff(int intDeviceId); + TELLSTICK_API int WINAPI tdBell(int intDeviceId); + TELLSTICK_API int WINAPI tdDim(int intDeviceId, unsigned char level); + TELLSTICK_API int WINAPI tdLearn(int intDeviceId); + TELLSTICK_API int WINAPI tdMethods(int id, int methodsSupported); + TELLSTICK_API int WINAPI tdLastSentCommand( int intDeviceId, int methodsSupported ); + TELLSTICK_API char *WINAPI tdLastSentValue( int intDeviceId ); + + TELLSTICK_API int WINAPI tdGetNumberOfDevices(); + TELLSTICK_API int WINAPI tdGetDeviceId(int intDeviceIndex); + TELLSTICK_API int WINAPI tdGetDeviceType(int intDeviceId); + + TELLSTICK_API char * WINAPI tdGetErrorString(int intErrorNo); + + TELLSTICK_API char * WINAPI tdGetName(int intDeviceId); + TELLSTICK_API bool WINAPI tdSetName(int intDeviceId, const char* chNewName); + TELLSTICK_API char * WINAPI tdGetProtocol(int intDeviceId); + TELLSTICK_API bool WINAPI tdSetProtocol(int intDeviceId, const char* strProtocol); + TELLSTICK_API char * WINAPI tdGetModel(int intDeviceId); + TELLSTICK_API bool WINAPI tdSetModel(int intDeviceId, const char *intModel); + + TELLSTICK_API char * WINAPI tdGetDeviceParameter(int intDeviceId, const char *strName, const char *defaultValue); + TELLSTICK_API bool WINAPI tdSetDeviceParameter(int intDeviceId, const char *strName, const char* strValue); + + TELLSTICK_API int WINAPI tdAddDevice(); + TELLSTICK_API bool WINAPI tdRemoveDevice(int intDeviceId); + + TELLSTICK_API int WINAPI tdSendRawCommand(const char *command, int reserved); + +#ifdef __cplusplus +} +#endif + +//Device methods +#define TELLSTICK_TURNON 1 +#define TELLSTICK_TURNOFF 2 +#define TELLSTICK_BELL 4 +#define TELLSTICK_TOGGLE 8 +#define TELLSTICK_DIM 16 +#define TELLSTICK_LEARN 32 + +//Error codes +#define TELLSTICK_SUCCESS 0 +#define TELLSTICK_ERROR_NOT_FOUND -1 +#define TELLSTICK_ERROR_PERMISSION_DENIED -2 +#define TELLSTICK_ERROR_DEVICE_NOT_FOUND -3 +#define TELLSTICK_ERROR_METHOD_NOT_SUPPORTED -4 +#define TELLSTICK_ERROR_COMMUNICATION -5 +#define TELLSTICK_ERROR_UNKNOWN -99 + +//Device typedef +#define TELLSTICK_TYPE_DEVICE 1 +#define TELLSTICK_TYPE_GROUP 2 + +//Protocol Nexa +#define TELLSTICK_DEVICE_YCR3500 1 +#define TELLSTICK_DEVICE_YCR300D 2 +#define TELLSTICK_DEVICE_WSR1000 3 +#define TELLSTICK_DEVICE_CMR1000 4 +#define TELLSTICK_DEVICE_CMR300 5 +#define TELLSTICK_DEVICE_PA33300 6 +#define TELLSTICK_DEVICE_EL2000 8 +#define TELLSTICK_DEVICE_EL2005 9 +#define TELLSTICK_DEVICE_EL2006 10 +#define TELLSTICK_DEVICE_SYCR3500 12 +#define TELLSTICK_DEVICE_SYCR300 13 +#define TELLSTICK_DEVICE_HDR105 14 +#define TELLSTICK_DEVICE_ML7100 15 +#define TELLSTICK_DEVICE_EL2004 16 +#define TELLSTICK_DEVICE_EL2016 17 +#define TELLSTICK_DEVICE_EL2010 18 +#define TELLSTICK_DEVICE_LYCR1000 20 +#define TELLSTICK_DEVICE_LYCR300 21 +#define TELLSTICK_DEVICE_LCMR1000 22 +#define TELLSTICK_DEVICE_LCMR300 23 +#define TELLSTICK_DEVICE_EL2023 24 +#define TELLSTICK_DEVICE_EL2024 25 +#define TELLSTICK_DEVICE_EL2021 26 +#define TELLSTICK_DEVICE_EL2017 27 +#define TELLSTICK_DEVICE_EL2019 28 + +//Protocol Ikea +#define TELLSTICK_DEVICE_KOPPLA 19 + +#endif diff --git a/telldus-core/service/tellstick.conf b/driver/libtelldus-core/tellstick.conf similarity index 66% rename from telldus-core/service/tellstick.conf rename to driver/libtelldus-core/tellstick.conf index fed9c66f..71f45b3d 100644 --- a/telldus-core/service/tellstick.conf +++ b/driver/libtelldus-core/tellstick.conf @@ -1,6 +1,4 @@ -user = "nobody" -group = "plugdev" -ignoreControllerConfirmation = "false" +deviceNode = "/dev/tellstick" device { id = 1 name = "Example device" diff --git a/driver/libtelldus-core/win/Device.cpp b/driver/libtelldus-core/win/Device.cpp new file mode 100644 index 00000000..41a3fbbc --- /dev/null +++ b/driver/libtelldus-core/win/Device.cpp @@ -0,0 +1,117 @@ +#include "../Device.h" +#include +#include +#include +#include +#include + +#include "../ftd2xx.h" + +int getDongleIndex(); + +using namespace TelldusCore; + +/* +* Send message to the USB dongle +*/ +int Device::send(const std::string &strMessage){ + std::string msgBack; + ULONG bytesWritten, bytesRead; + char *tempMessage; + int intDongleIndex; + char in; + + FT_STATUS ftStatus = FT_OK; + FT_HANDLE fthHandle = 0; + + intDongleIndex = getDongleIndex(); + if (intDongleIndex < 0) { + return TELLSTICK_ERROR_NOT_FOUND; + } + + ftStatus = FT_Open(intDongleIndex, &fthHandle); + ftStatus = FT_SetBaudRate(fthHandle, 9600); //always 9600 + FT_SetTimeouts(fthHandle,5000,0); + + tempMessage = (char *)malloc(sizeof(char) * (strMessage.size())); + for(unsigned int i = 0; i < strMessage.size(); ++i) { + tempMessage[i] = strMessage[i]; + } + ftStatus = FT_Write(fthHandle, tempMessage, (DWORD)strMessage.length(), &bytesWritten); + free(tempMessage); + + bool c = true; + while(c) { + ftStatus = FT_Read(fthHandle,&in,1,&bytesRead); + if (ftStatus == FT_OK) { + if (bytesRead == 1) { + msgBack.append(1, in); + if (in == '\n') { + break; + } + } else { //Timeout + c = false; + } + } else { //Error + c = false; + } + } + ftStatus = FT_Close(fthHandle); + if (!c) { + return TELLSTICK_ERROR_COMMUNICATION; + } + return TELLSTICK_SUCCESS; +} + +/* +* Get the device index of the Telldus dongle (the first one if many are connected) +* -1 if no such device exists +*/ +int getDongleIndex(){ + int intReturn = -1; + FT_HANDLE fthHandle = 0; + FT_STATUS ftStatus = FT_OK; + + try{ + DWORD dwNumberOfDevices = 0; + +#ifndef _WINDOWS + FT_SetVIDPID(0x1781, 0x0C30); +#endif + ftStatus = FT_CreateDeviceInfoList(&dwNumberOfDevices); + if (ftStatus == FT_OK) { + for (int i = 0; i < (int)dwNumberOfDevices; i++) { + + FT_PROGRAM_DATA pData; + char ManufacturerBuf[32]; + char ManufacturerIdBuf[16]; + char DescriptionBuf[64]; + char SerialNumberBuf[16]; + + pData.Signature1 = 0x00000000; + pData.Signature2 = 0xffffffff; + pData.Version = 0x00000002; // EEPROM structure with FT232R extensions + pData.Manufacturer = ManufacturerBuf; + pData.ManufacturerId = ManufacturerIdBuf; + pData.Description = DescriptionBuf; + pData.SerialNumber = SerialNumberBuf; + + ftStatus = FT_Open(i, &fthHandle); + ftStatus = FT_EE_Read(fthHandle, &pData); + if(ftStatus == FT_OK){ + if(pData.VendorId == 6017 && pData.ProductId == 3120){ + intReturn = i; + ftStatus = FT_Close(fthHandle); + break; + } + } + ftStatus = FT_Close(fthHandle); + } + } + } + catch(...){ + throw; + } + return intReturn; +} + diff --git a/telldus-gui/Plugins/Controllers/win/ftd2xx.h b/driver/libtelldus-core/win/ftd2xx.h old mode 100644 new mode 100755 similarity index 95% rename from telldus-gui/Plugins/Controllers/win/ftd2xx.h rename to driver/libtelldus-core/win/ftd2xx.h index d5bc3bff..96a4d318 --- a/telldus-gui/Plugins/Controllers/win/ftd2xx.h +++ b/driver/libtelldus-core/win/ftd2xx.h @@ -1,963 +1,963 @@ -/*++ - -Copyright (c) 2001-2007 Future Technology Devices International Ltd. - -Module Name: - - ftd2xx.h - -Abstract: - - Native USB device driver for FTDI FT8U232/245 - FTD2XX library definitions - -Environment: - - kernel & user mode - -Revision History: - - 13/03/01 awm Created. - 13/01/03 awm Added device information support. - 19/03/03 awm Added FT_W32_CancelIo. - 12/06/03 awm Added FT_StopInTask and FT_RestartInTask. - 18/09/03 awm Added FT_SetResetPipeRetryCount. - 10/10/03 awm Added FT_ResetPort. - 23/01/04 awm Added support for open-by-location. - 16/03/04 awm Added support for FT2232C. - 23/09/04 awm Added support for FT232R. - 20/10/04 awm Added FT_CyclePort. - 18/01/05 awm Added FT_DEVICE_LIST_INFO_NODE type. - 11/02/05 awm Added LocId to FT_DEVICE_LIST_INFO_NODE. - 25/08/05 awm Added FT_SetDeadmanTimeout. - 02/12/05 awm Removed obsolete references. - 05/12/05 awm Added FT_GetVersion, FT_GetVersionEx. - 08/09/06 awm Added FT_W32_GetCommMask. - 11/09/06 awm Added FT_Rescan. - 11/07/07 awm Added support for FT2232H and FT4232H. - 10/08/07 awm Added flags definitions. - 21/11/07 mja Added FT_GetComPortNumber. - 05/06/08 mja Added EEPROM extensions for FT2232H. - - ---*/ - - -#ifndef FTD2XX_H -#define FTD2XX_H - -// The following ifdef block is the standard way of creating macros -// which make exporting from a DLL simpler. All files within this DLL -// are compiled with the FTD2XX_EXPORTS symbol defined on the command line. -// This symbol should not be defined on any project that uses this DLL. -// This way any other project whose source files include this file see -// FTD2XX_API functions as being imported from a DLL, whereas this DLL -// sees symbols defined with this macro as being exported. - -#ifdef FTD2XX_EXPORTS -#define FTD2XX_API __declspec(dllexport) -#else -#define FTD2XX_API __declspec(dllimport) -#endif - - -typedef PVOID FT_HANDLE; -typedef ULONG FT_STATUS; - -// -// Device status -// -enum { - FT_OK, - FT_INVALID_HANDLE, - FT_DEVICE_NOT_FOUND, - FT_DEVICE_NOT_OPENED, - FT_IO_ERROR, - FT_INSUFFICIENT_RESOURCES, - FT_INVALID_PARAMETER, - FT_INVALID_BAUD_RATE, - - FT_DEVICE_NOT_OPENED_FOR_ERASE, - FT_DEVICE_NOT_OPENED_FOR_WRITE, - FT_FAILED_TO_WRITE_DEVICE, - FT_EEPROM_READ_FAILED, - FT_EEPROM_WRITE_FAILED, - FT_EEPROM_ERASE_FAILED, - FT_EEPROM_NOT_PRESENT, - FT_EEPROM_NOT_PROGRAMMED, - FT_INVALID_ARGS, - FT_NOT_SUPPORTED, - FT_OTHER_ERROR, - FT_DEVICE_LIST_NOT_READY, -}; - - -#define FT_SUCCESS(status) ((status) == FT_OK) - -// -// FT_OpenEx Flags -// - -#define FT_OPEN_BY_SERIAL_NUMBER 1 -#define FT_OPEN_BY_DESCRIPTION 2 -#define FT_OPEN_BY_LOCATION 4 - -// -// FT_ListDevices Flags (used in conjunction with FT_OpenEx Flags -// - -#define FT_LIST_NUMBER_ONLY 0x80000000 -#define FT_LIST_BY_INDEX 0x40000000 -#define FT_LIST_ALL 0x20000000 - -#define FT_LIST_MASK (FT_LIST_NUMBER_ONLY|FT_LIST_BY_INDEX|FT_LIST_ALL) - -// -// Baud Rates -// - -#define FT_BAUD_300 300 -#define FT_BAUD_600 600 -#define FT_BAUD_1200 1200 -#define FT_BAUD_2400 2400 -#define FT_BAUD_4800 4800 -#define FT_BAUD_9600 9600 -#define FT_BAUD_14400 14400 -#define FT_BAUD_19200 19200 -#define FT_BAUD_38400 38400 -#define FT_BAUD_57600 57600 -#define FT_BAUD_115200 115200 -#define FT_BAUD_230400 230400 -#define FT_BAUD_460800 460800 -#define FT_BAUD_921600 921600 - -// -// Word Lengths -// - -#define FT_BITS_8 (UCHAR) 8 -#define FT_BITS_7 (UCHAR) 7 -#define FT_BITS_6 (UCHAR) 6 -#define FT_BITS_5 (UCHAR) 5 - -// -// Stop Bits -// - -#define FT_STOP_BITS_1 (UCHAR) 0 -#define FT_STOP_BITS_1_5 (UCHAR) 1 -#define FT_STOP_BITS_2 (UCHAR) 2 - -// -// Parity -// - -#define FT_PARITY_NONE (UCHAR) 0 -#define FT_PARITY_ODD (UCHAR) 1 -#define FT_PARITY_EVEN (UCHAR) 2 -#define FT_PARITY_MARK (UCHAR) 3 -#define FT_PARITY_SPACE (UCHAR) 4 - -// -// Flow Control -// - -#define FT_FLOW_NONE 0x0000 -#define FT_FLOW_RTS_CTS 0x0100 -#define FT_FLOW_DTR_DSR 0x0200 -#define FT_FLOW_XON_XOFF 0x0400 - -// -// Purge rx and tx buffers -// -#define FT_PURGE_RX 1 -#define FT_PURGE_TX 2 - -// -// Events -// - -typedef void (*PFT_EVENT_HANDLER)(DWORD,DWORD); - -#define FT_EVENT_RXCHAR 1 -#define FT_EVENT_MODEM_STATUS 2 -#define FT_EVENT_LINE_STATUS 4 - -// -// Timeouts -// - -#define FT_DEFAULT_RX_TIMEOUT 300 -#define FT_DEFAULT_TX_TIMEOUT 300 - -// -// Device types -// - -typedef ULONG FT_DEVICE; - -enum { - FT_DEVICE_BM, - FT_DEVICE_AM, - FT_DEVICE_100AX, - FT_DEVICE_UNKNOWN, - FT_DEVICE_2232C, - FT_DEVICE_232R, - FT_DEVICE_2232H, - FT_DEVICE_4232H -}; - - -#ifdef __cplusplus -extern "C" { -#endif - - -FTD2XX_API -FT_STATUS WINAPI FT_Open( - int deviceNumber, - FT_HANDLE *pHandle - ); - -FTD2XX_API -FT_STATUS WINAPI FT_OpenEx( - PVOID pArg1, - DWORD Flags, - FT_HANDLE *pHandle - ); - -FTD2XX_API -FT_STATUS WINAPI FT_ListDevices( - PVOID pArg1, - PVOID pArg2, - DWORD Flags - ); - -FTD2XX_API -FT_STATUS WINAPI FT_Close( - FT_HANDLE ftHandle - ); - -FTD2XX_API -FT_STATUS WINAPI FT_Read( - FT_HANDLE ftHandle, - LPVOID lpBuffer, - DWORD dwBytesToRead, - LPDWORD lpBytesReturned - ); - -FTD2XX_API -FT_STATUS WINAPI FT_Write( - FT_HANDLE ftHandle, - LPVOID lpBuffer, - DWORD dwBytesToWrite, - LPDWORD lpBytesWritten - ); - -FTD2XX_API -FT_STATUS WINAPI FT_IoCtl( - FT_HANDLE ftHandle, - DWORD dwIoControlCode, - LPVOID lpInBuf, - DWORD nInBufSize, - LPVOID lpOutBuf, - DWORD nOutBufSize, - LPDWORD lpBytesReturned, - LPOVERLAPPED lpOverlapped - ); - -FTD2XX_API -FT_STATUS WINAPI FT_SetBaudRate( - FT_HANDLE ftHandle, - ULONG BaudRate - ); - -FTD2XX_API -FT_STATUS WINAPI FT_SetDivisor( - FT_HANDLE ftHandle, - USHORT Divisor - ); - -FTD2XX_API -FT_STATUS WINAPI FT_SetDataCharacteristics( - FT_HANDLE ftHandle, - UCHAR WordLength, - UCHAR StopBits, - UCHAR Parity - ); - -FTD2XX_API -FT_STATUS WINAPI FT_SetFlowControl( - FT_HANDLE ftHandle, - USHORT FlowControl, - UCHAR XonChar, - UCHAR XoffChar - ); - -FTD2XX_API -FT_STATUS WINAPI FT_ResetDevice( - FT_HANDLE ftHandle - ); - -FTD2XX_API -FT_STATUS WINAPI FT_SetDtr( - FT_HANDLE ftHandle - ); - -FTD2XX_API -FT_STATUS WINAPI FT_ClrDtr( - FT_HANDLE ftHandle - ); - -FTD2XX_API -FT_STATUS WINAPI FT_SetRts( - FT_HANDLE ftHandle - ); - -FTD2XX_API -FT_STATUS WINAPI FT_ClrRts( - FT_HANDLE ftHandle - ); - -FTD2XX_API -FT_STATUS WINAPI FT_GetModemStatus( - FT_HANDLE ftHandle, - ULONG *pModemStatus - ); - -FTD2XX_API -FT_STATUS WINAPI FT_SetChars( - FT_HANDLE ftHandle, - UCHAR EventChar, - UCHAR EventCharEnabled, - UCHAR ErrorChar, - UCHAR ErrorCharEnabled - ); - -FTD2XX_API -FT_STATUS WINAPI FT_Purge( - FT_HANDLE ftHandle, - ULONG Mask - ); - -FTD2XX_API -FT_STATUS WINAPI FT_SetTimeouts( - FT_HANDLE ftHandle, - ULONG ReadTimeout, - ULONG WriteTimeout - ); - -FTD2XX_API -FT_STATUS WINAPI FT_GetQueueStatus( - FT_HANDLE ftHandle, - DWORD *dwRxBytes - ); - -FTD2XX_API -FT_STATUS WINAPI FT_SetEventNotification( - FT_HANDLE ftHandle, - DWORD Mask, - PVOID Param - ); - -FTD2XX_API -FT_STATUS WINAPI FT_GetStatus( - FT_HANDLE ftHandle, - DWORD *dwRxBytes, - DWORD *dwTxBytes, - DWORD *dwEventDWord - ); - -FTD2XX_API -FT_STATUS WINAPI FT_SetBreakOn( - FT_HANDLE ftHandle - ); - -FTD2XX_API -FT_STATUS WINAPI FT_SetBreakOff( - FT_HANDLE ftHandle - ); - -FTD2XX_API -FT_STATUS WINAPI FT_SetWaitMask( - FT_HANDLE ftHandle, - DWORD Mask - ); - -FTD2XX_API -FT_STATUS WINAPI FT_WaitOnMask( - FT_HANDLE ftHandle, - DWORD *Mask - ); - -FTD2XX_API -FT_STATUS WINAPI FT_GetEventStatus( - FT_HANDLE ftHandle, - DWORD *dwEventDWord - ); - -FTD2XX_API -FT_STATUS WINAPI FT_ReadEE( - FT_HANDLE ftHandle, - DWORD dwWordOffset, - LPWORD lpwValue - ); - -FTD2XX_API -FT_STATUS WINAPI FT_WriteEE( - FT_HANDLE ftHandle, - DWORD dwWordOffset, - WORD wValue - ); - -FTD2XX_API -FT_STATUS WINAPI FT_EraseEE( - FT_HANDLE ftHandle - ); - -// -// structure to hold program data for FT_Program function -// -typedef struct ft_program_data { - - DWORD Signature1; // Header - must be 0x00000000 - DWORD Signature2; // Header - must be 0xffffffff - DWORD Version; // Header - FT_PROGRAM_DATA version - // 0 = original - // 1 = FT2232C extensions - // 2 = FT232R extensions - // 3 = FT2232H extensions - // 4 = FT4232H extensions - - WORD VendorId; // 0x0403 - WORD ProductId; // 0x6001 - char *Manufacturer; // "FTDI" - char *ManufacturerId; // "FT" - char *Description; // "USB HS Serial Converter" - char *SerialNumber; // "FT000001" if fixed, or NULL - WORD MaxPower; // 0 < MaxPower <= 500 - WORD PnP; // 0 = disabled, 1 = enabled - WORD SelfPowered; // 0 = bus powered, 1 = self powered - WORD RemoteWakeup; // 0 = not capable, 1 = capable - // - // Rev4 (FT232B) extensions - // - UCHAR Rev4; // non-zero if Rev4 chip, zero otherwise - UCHAR IsoIn; // non-zero if in endpoint is isochronous - UCHAR IsoOut; // non-zero if out endpoint is isochronous - UCHAR PullDownEnable; // non-zero if pull down enabled - UCHAR SerNumEnable; // non-zero if serial number to be used - UCHAR USBVersionEnable; // non-zero if chip uses USBVersion - WORD USBVersion; // BCD (0x0200 => USB2) - // - // Rev 5 (FT2232) extensions - // - UCHAR Rev5; // non-zero if Rev5 chip, zero otherwise - UCHAR IsoInA; // non-zero if in endpoint is isochronous - UCHAR IsoInB; // non-zero if in endpoint is isochronous - UCHAR IsoOutA; // non-zero if out endpoint is isochronous - UCHAR IsoOutB; // non-zero if out endpoint is isochronous - UCHAR PullDownEnable5; // non-zero if pull down enabled - UCHAR SerNumEnable5; // non-zero if serial number to be used - UCHAR USBVersionEnable5; // non-zero if chip uses USBVersion - WORD USBVersion5; // BCD (0x0200 => USB2) - UCHAR AIsHighCurrent; // non-zero if interface is high current - UCHAR BIsHighCurrent; // non-zero if interface is high current - UCHAR IFAIsFifo; // non-zero if interface is 245 FIFO - UCHAR IFAIsFifoTar; // non-zero if interface is 245 FIFO CPU target - UCHAR IFAIsFastSer; // non-zero if interface is Fast serial - UCHAR AIsVCP; // non-zero if interface is to use VCP drivers - UCHAR IFBIsFifo; // non-zero if interface is 245 FIFO - UCHAR IFBIsFifoTar; // non-zero if interface is 245 FIFO CPU target - UCHAR IFBIsFastSer; // non-zero if interface is Fast serial - UCHAR BIsVCP; // non-zero if interface is to use VCP drivers - // - // Rev 6 (FT232R) extensions - // - UCHAR UseExtOsc; // Use External Oscillator - UCHAR HighDriveIOs; // High Drive I/Os - UCHAR EndpointSize; // Endpoint size - UCHAR PullDownEnableR; // non-zero if pull down enabled - UCHAR SerNumEnableR; // non-zero if serial number to be used - UCHAR InvertTXD; // non-zero if invert TXD - UCHAR InvertRXD; // non-zero if invert RXD - UCHAR InvertRTS; // non-zero if invert RTS - UCHAR InvertCTS; // non-zero if invert CTS - UCHAR InvertDTR; // non-zero if invert DTR - UCHAR InvertDSR; // non-zero if invert DSR - UCHAR InvertDCD; // non-zero if invert DCD - UCHAR InvertRI; // non-zero if invert RI - UCHAR Cbus0; // Cbus Mux control - UCHAR Cbus1; // Cbus Mux control - UCHAR Cbus2; // Cbus Mux control - UCHAR Cbus3; // Cbus Mux control - UCHAR Cbus4; // Cbus Mux control - UCHAR RIsD2XX; // non-zero if using D2XX driver - // - // Rev 7 (FT2232H) Extensions - // - UCHAR PullDownEnable7; // non-zero if pull down enabled - UCHAR SerNumEnable7; // non-zero if serial number to be used - UCHAR ALSlowSlew; // non-zero if AL pins have slow slew - UCHAR ALSchmittInput; // non-zero if AL pins are Schmitt input - UCHAR ALDriveCurrent; // valid values are 4mA, 8mA, 12mA, 16mA - UCHAR AHSlowSlew; // non-zero if AH pins have slow slew - UCHAR AHSchmittInput; // non-zero if AH pins are Schmitt input - UCHAR AHDriveCurrent; // valid values are 4mA, 8mA, 12mA, 16mA - UCHAR BLSlowSlew; // non-zero if BL pins have slow slew - UCHAR BLSchmittInput; // non-zero if BL pins are Schmitt input - UCHAR BLDriveCurrent; // valid values are 4mA, 8mA, 12mA, 16mA - UCHAR BHSlowSlew; // non-zero if BH pins have slow slew - UCHAR BHSchmittInput; // non-zero if BH pins are Schmitt input - UCHAR BHDriveCurrent; // valid values are 4mA, 8mA, 12mA, 16mA - UCHAR IFAIsFifo7; // non-zero if interface is 245 FIFO - UCHAR IFAIsFifoTar7; // non-zero if interface is 245 FIFO CPU target - UCHAR IFAIsFastSer7; // non-zero if interface is Fast serial - UCHAR AIsVCP7; // non-zero if interface is to use VCP drivers - UCHAR IFBIsFifo7; // non-zero if interface is 245 FIFO - UCHAR IFBIsFifoTar7; // non-zero if interface is 245 FIFO CPU target - UCHAR IFBIsFastSer7; // non-zero if interface is Fast serial - UCHAR BIsVCP7; // non-zero if interface is to use VCP drivers - UCHAR PowerSaveEnable; // non-zero if using BCBUS7 to save power for self-powered designs - // - // Rev 8 (FT4232H) Extensions - // - UCHAR PullDownEnable8; // non-zero if pull down enabled - UCHAR SerNumEnable8; // non-zero if serial number to be used - UCHAR ASlowSlew; // non-zero if AL pins have slow slew - UCHAR ASchmittInput; // non-zero if AL pins are Schmitt input - UCHAR ADriveCurrent; // valid values are 4mA, 8mA, 12mA, 16mA - UCHAR BSlowSlew; // non-zero if AH pins have slow slew - UCHAR BSchmittInput; // non-zero if AH pins are Schmitt input - UCHAR BDriveCurrent; // valid values are 4mA, 8mA, 12mA, 16mA - UCHAR CSlowSlew; // non-zero if BL pins have slow slew - UCHAR CSchmittInput; // non-zero if BL pins are Schmitt input - UCHAR CDriveCurrent; // valid values are 4mA, 8mA, 12mA, 16mA - UCHAR DSlowSlew; // non-zero if BH pins have slow slew - UCHAR DSchmittInput; // non-zero if BH pins are Schmitt input - UCHAR DDriveCurrent; // valid values are 4mA, 8mA, 12mA, 16mA - UCHAR ARIIsTXDEN; // non-zero if port A uses RI as RS485 TXDEN - UCHAR BRIIsTXDEN; // non-zero if port B uses RI as RS485 TXDEN - UCHAR CRIIsTXDEN; // non-zero if port C uses RI as RS485 TXDEN - UCHAR DRIIsTXDEN; // non-zero if port D uses RI as RS485 TXDEN - UCHAR AIsVCP8; // non-zero if interface is to use VCP drivers - UCHAR BIsVCP8; // non-zero if interface is to use VCP drivers - UCHAR CIsVCP8; // non-zero if interface is to use VCP drivers - UCHAR DIsVCP8; // non-zero if interface is to use VCP drivers - -} FT_PROGRAM_DATA, *PFT_PROGRAM_DATA; - -FTD2XX_API -FT_STATUS WINAPI FT_EE_Program( - FT_HANDLE ftHandle, - PFT_PROGRAM_DATA pData - ); - -FTD2XX_API -FT_STATUS WINAPI FT_EE_ProgramEx( - FT_HANDLE ftHandle, - PFT_PROGRAM_DATA pData, - char *Manufacturer, - char *ManufacturerId, - char *Description, - char *SerialNumber - ); - -FTD2XX_API -FT_STATUS WINAPI FT_EE_Read( - FT_HANDLE ftHandle, - PFT_PROGRAM_DATA pData - ); - -FTD2XX_API -FT_STATUS WINAPI FT_EE_ReadEx( - FT_HANDLE ftHandle, - PFT_PROGRAM_DATA pData, - char *Manufacturer, - char *ManufacturerId, - char *Description, - char *SerialNumber - ); - -FTD2XX_API -FT_STATUS WINAPI FT_EE_UASize( - FT_HANDLE ftHandle, - LPDWORD lpdwSize - ); - -FTD2XX_API -FT_STATUS WINAPI FT_EE_UAWrite( - FT_HANDLE ftHandle, - PUCHAR pucData, - DWORD dwDataLen - ); - -FTD2XX_API -FT_STATUS WINAPI FT_EE_UARead( - FT_HANDLE ftHandle, - PUCHAR pucData, - DWORD dwDataLen, - LPDWORD lpdwBytesRead - ); - -FTD2XX_API -FT_STATUS WINAPI FT_SetLatencyTimer( - FT_HANDLE ftHandle, - UCHAR ucLatency - ); - -FTD2XX_API -FT_STATUS WINAPI FT_GetLatencyTimer( - FT_HANDLE ftHandle, - PUCHAR pucLatency - ); - -FTD2XX_API -FT_STATUS WINAPI FT_SetBitMode( - FT_HANDLE ftHandle, - UCHAR ucMask, - UCHAR ucEnable - ); - -FTD2XX_API -FT_STATUS WINAPI FT_GetBitMode( - FT_HANDLE ftHandle, - PUCHAR pucMode - ); - -FTD2XX_API -FT_STATUS WINAPI FT_SetUSBParameters( - FT_HANDLE ftHandle, - ULONG ulInTransferSize, - ULONG ulOutTransferSize - ); - -FTD2XX_API -FT_STATUS WINAPI FT_SetDeadmanTimeout( - FT_HANDLE ftHandle, - ULONG ulDeadmanTimeout - ); - -FTD2XX_API -FT_STATUS WINAPI FT_GetDeviceInfo( - FT_HANDLE ftHandle, - FT_DEVICE *lpftDevice, - LPDWORD lpdwID, - PCHAR SerialNumber, - PCHAR Description, - LPVOID Dummy - ); - -FTD2XX_API -FT_STATUS WINAPI FT_StopInTask( - FT_HANDLE ftHandle - ); - -FTD2XX_API -FT_STATUS WINAPI FT_RestartInTask( - FT_HANDLE ftHandle - ); - -FTD2XX_API -FT_STATUS WINAPI FT_SetResetPipeRetryCount( - FT_HANDLE ftHandle, - DWORD dwCount - ); - -FTD2XX_API -FT_STATUS WINAPI FT_ResetPort( - FT_HANDLE ftHandle - ); - -FTD2XX_API -FT_STATUS WINAPI FT_CyclePort( - FT_HANDLE ftHandle - ); - - -// -// Win32-type functions -// - -FTD2XX_API -FT_HANDLE WINAPI FT_W32_CreateFile( - LPCTSTR lpszName, - DWORD dwAccess, - DWORD dwShareMode, - LPSECURITY_ATTRIBUTES lpSecurityAttributes, - DWORD dwCreate, - DWORD dwAttrsAndFlags, - HANDLE hTemplate - ); - -FTD2XX_API -BOOL WINAPI FT_W32_CloseHandle( - FT_HANDLE ftHandle - ); - -FTD2XX_API -BOOL WINAPI FT_W32_ReadFile( - FT_HANDLE ftHandle, - LPVOID lpBuffer, - DWORD nBufferSize, - LPDWORD lpBytesReturned, - LPOVERLAPPED lpOverlapped - ); - -FTD2XX_API -BOOL WINAPI FT_W32_WriteFile( - FT_HANDLE ftHandle, - LPVOID lpBuffer, - DWORD nBufferSize, - LPDWORD lpBytesWritten, - LPOVERLAPPED lpOverlapped - ); - -FTD2XX_API -DWORD WINAPI FT_W32_GetLastError( - FT_HANDLE ftHandle - ); - -FTD2XX_API -BOOL WINAPI FT_W32_GetOverlappedResult( - FT_HANDLE ftHandle, - LPOVERLAPPED lpOverlapped, - LPDWORD lpdwBytesTransferred, - BOOL bWait - ); - -FTD2XX_API -BOOL WINAPI FT_W32_CancelIo( - FT_HANDLE ftHandle - ); - - -// -// Win32 COMM API type functions -// -typedef struct _FTCOMSTAT { - DWORD fCtsHold : 1; - DWORD fDsrHold : 1; - DWORD fRlsdHold : 1; - DWORD fXoffHold : 1; - DWORD fXoffSent : 1; - DWORD fEof : 1; - DWORD fTxim : 1; - DWORD fReserved : 25; - DWORD cbInQue; - DWORD cbOutQue; -} FTCOMSTAT, *LPFTCOMSTAT; - -typedef struct _FTDCB { - DWORD DCBlength; /* sizeof(FTDCB) */ - DWORD BaudRate; /* Baudrate at which running */ - DWORD fBinary: 1; /* Binary Mode (skip EOF check) */ - DWORD fParity: 1; /* Enable parity checking */ - DWORD fOutxCtsFlow:1; /* CTS handshaking on output */ - DWORD fOutxDsrFlow:1; /* DSR handshaking on output */ - DWORD fDtrControl:2; /* DTR Flow control */ - DWORD fDsrSensitivity:1; /* DSR Sensitivity */ - DWORD fTXContinueOnXoff: 1; /* Continue TX when Xoff sent */ - DWORD fOutX: 1; /* Enable output X-ON/X-OFF */ - DWORD fInX: 1; /* Enable input X-ON/X-OFF */ - DWORD fErrorChar: 1; /* Enable Err Replacement */ - DWORD fNull: 1; /* Enable Null stripping */ - DWORD fRtsControl:2; /* Rts Flow control */ - DWORD fAbortOnError:1; /* Abort all reads and writes on Error */ - DWORD fDummy2:17; /* Reserved */ - WORD wReserved; /* Not currently used */ - WORD XonLim; /* Transmit X-ON threshold */ - WORD XoffLim; /* Transmit X-OFF threshold */ - BYTE ByteSize; /* Number of bits/byte, 4-8 */ - BYTE Parity; /* 0-4=None,Odd,Even,Mark,Space */ - BYTE StopBits; /* 0,1,2 = 1, 1.5, 2 */ - char XonChar; /* Tx and Rx X-ON character */ - char XoffChar; /* Tx and Rx X-OFF character */ - char ErrorChar; /* Error replacement char */ - char EofChar; /* End of Input character */ - char EvtChar; /* Received Event character */ - WORD wReserved1; /* Fill for now. */ -} FTDCB, *LPFTDCB; - -typedef struct _FTTIMEOUTS { - DWORD ReadIntervalTimeout; /* Maximum time between read chars. */ - DWORD ReadTotalTimeoutMultiplier; /* Multiplier of characters. */ - DWORD ReadTotalTimeoutConstant; /* Constant in milliseconds. */ - DWORD WriteTotalTimeoutMultiplier; /* Multiplier of characters. */ - DWORD WriteTotalTimeoutConstant; /* Constant in milliseconds. */ -} FTTIMEOUTS,*LPFTTIMEOUTS; - - -FTD2XX_API -BOOL WINAPI FT_W32_ClearCommBreak( - FT_HANDLE ftHandle - ); - -FTD2XX_API -BOOL WINAPI FT_W32_ClearCommError( - FT_HANDLE ftHandle, - LPDWORD lpdwErrors, - LPFTCOMSTAT lpftComstat - ); - -FTD2XX_API -BOOL WINAPI FT_W32_EscapeCommFunction( - FT_HANDLE ftHandle, - DWORD dwFunc - ); - -FTD2XX_API -BOOL WINAPI FT_W32_GetCommModemStatus( - FT_HANDLE ftHandle, - LPDWORD lpdwModemStatus - ); - -FTD2XX_API -BOOL WINAPI FT_W32_GetCommState( - FT_HANDLE ftHandle, - LPFTDCB lpftDcb - ); - -FTD2XX_API -BOOL WINAPI FT_W32_GetCommTimeouts( - FT_HANDLE ftHandle, - FTTIMEOUTS *pTimeouts - ); - -FTD2XX_API -BOOL WINAPI FT_W32_PurgeComm( - FT_HANDLE ftHandle, - DWORD dwMask - ); - -FTD2XX_API -BOOL WINAPI FT_W32_SetCommBreak( - FT_HANDLE ftHandle - ); - -FTD2XX_API -BOOL WINAPI FT_W32_SetCommMask( - FT_HANDLE ftHandle, - ULONG ulEventMask - ); - -FTD2XX_API -BOOL WINAPI FT_W32_GetCommMask( - FT_HANDLE ftHandle, - LPDWORD lpdwEventMask - ); - -FTD2XX_API -BOOL WINAPI FT_W32_SetCommState( - FT_HANDLE ftHandle, - LPFTDCB lpftDcb - ); - -FTD2XX_API -BOOL WINAPI FT_W32_SetCommTimeouts( - FT_HANDLE ftHandle, - FTTIMEOUTS *pTimeouts - ); - -FTD2XX_API -BOOL WINAPI FT_W32_SetupComm( - FT_HANDLE ftHandle, - DWORD dwReadBufferSize, - DWORD dwWriteBufferSize - ); - -FTD2XX_API -BOOL WINAPI FT_W32_WaitCommEvent( - FT_HANDLE ftHandle, - PULONG pulEvent, - LPOVERLAPPED lpOverlapped - ); - - -// -// Device information -// - -typedef struct _ft_device_list_info_node { - ULONG Flags; - ULONG Type; - ULONG ID; - DWORD LocId; - char SerialNumber[16]; - char Description[64]; - FT_HANDLE ftHandle; -} FT_DEVICE_LIST_INFO_NODE; - -// Device information flags -enum { - FT_FLAGS_OPENED = 1, - FT_FLAGS_HISPEED = 2 -}; - - -FTD2XX_API -FT_STATUS WINAPI FT_CreateDeviceInfoList( - LPDWORD lpdwNumDevs - ); - -FTD2XX_API -FT_STATUS WINAPI FT_GetDeviceInfoList( - FT_DEVICE_LIST_INFO_NODE *pDest, - LPDWORD lpdwNumDevs - ); - -FTD2XX_API -FT_STATUS WINAPI FT_GetDeviceInfoDetail( - DWORD dwIndex, - LPDWORD lpdwFlags, - LPDWORD lpdwType, - LPDWORD lpdwID, - LPDWORD lpdwLocId, - LPVOID lpSerialNumber, - LPVOID lpDescription, - FT_HANDLE *pftHandle - ); - - -// -// Version information -// - -FTD2XX_API -FT_STATUS WINAPI FT_GetDriverVersion( - FT_HANDLE ftHandle, - LPDWORD lpdwVersion - ); - -FTD2XX_API -FT_STATUS WINAPI FT_GetLibraryVersion( - LPDWORD lpdwVersion - ); - - -FTD2XX_API -FT_STATUS WINAPI FT_Rescan( - void - ); - -FTD2XX_API -FT_STATUS WINAPI FT_Reload( - WORD wVid, - WORD wPid - ); - -FTD2XX_API -FT_STATUS WINAPI FT_GetComPortNumber( - FT_HANDLE ftHandle, - LPLONG lpdwComPortNumber - ); - - - -#ifdef __cplusplus -} -#endif - - -#endif /* FTD2XX_H */ - +/*++ + +Copyright (c) 2001-2007 Future Technology Devices International Ltd. + +Module Name: + + ftd2xx.h + +Abstract: + + Native USB device driver for FTDI FT8U232/245 + FTD2XX library definitions + +Environment: + + kernel & user mode + +Revision History: + + 13/03/01 awm Created. + 13/01/03 awm Added device information support. + 19/03/03 awm Added FT_W32_CancelIo. + 12/06/03 awm Added FT_StopInTask and FT_RestartInTask. + 18/09/03 awm Added FT_SetResetPipeRetryCount. + 10/10/03 awm Added FT_ResetPort. + 23/01/04 awm Added support for open-by-location. + 16/03/04 awm Added support for FT2232C. + 23/09/04 awm Added support for FT232R. + 20/10/04 awm Added FT_CyclePort. + 18/01/05 awm Added FT_DEVICE_LIST_INFO_NODE type. + 11/02/05 awm Added LocId to FT_DEVICE_LIST_INFO_NODE. + 25/08/05 awm Added FT_SetDeadmanTimeout. + 02/12/05 awm Removed obsolete references. + 05/12/05 awm Added FT_GetVersion, FT_GetVersionEx. + 08/09/06 awm Added FT_W32_GetCommMask. + 11/09/06 awm Added FT_Rescan. + 11/07/07 awm Added support for FT2232H and FT4232H. + 10/08/07 awm Added flags definitions. + 21/11/07 mja Added FT_GetComPortNumber. + 05/06/08 mja Added EEPROM extensions for FT2232H. + + +--*/ + + +#ifndef FTD2XX_H +#define FTD2XX_H + +// The following ifdef block is the standard way of creating macros +// which make exporting from a DLL simpler. All files within this DLL +// are compiled with the FTD2XX_EXPORTS symbol defined on the command line. +// This symbol should not be defined on any project that uses this DLL. +// This way any other project whose source files include this file see +// FTD2XX_API functions as being imported from a DLL, whereas this DLL +// sees symbols defined with this macro as being exported. + +#ifdef FTD2XX_EXPORTS +#define FTD2XX_API __declspec(dllexport) +#else +#define FTD2XX_API __declspec(dllimport) +#endif + + +typedef PVOID FT_HANDLE; +typedef ULONG FT_STATUS; + +// +// Device status +// +enum { + FT_OK, + FT_INVALID_HANDLE, + FT_DEVICE_NOT_FOUND, + FT_DEVICE_NOT_OPENED, + FT_IO_ERROR, + FT_INSUFFICIENT_RESOURCES, + FT_INVALID_PARAMETER, + FT_INVALID_BAUD_RATE, + + FT_DEVICE_NOT_OPENED_FOR_ERASE, + FT_DEVICE_NOT_OPENED_FOR_WRITE, + FT_FAILED_TO_WRITE_DEVICE, + FT_EEPROM_READ_FAILED, + FT_EEPROM_WRITE_FAILED, + FT_EEPROM_ERASE_FAILED, + FT_EEPROM_NOT_PRESENT, + FT_EEPROM_NOT_PROGRAMMED, + FT_INVALID_ARGS, + FT_NOT_SUPPORTED, + FT_OTHER_ERROR, + FT_DEVICE_LIST_NOT_READY, +}; + + +#define FT_SUCCESS(status) ((status) == FT_OK) + +// +// FT_OpenEx Flags +// + +#define FT_OPEN_BY_SERIAL_NUMBER 1 +#define FT_OPEN_BY_DESCRIPTION 2 +#define FT_OPEN_BY_LOCATION 4 + +// +// FT_ListDevices Flags (used in conjunction with FT_OpenEx Flags +// + +#define FT_LIST_NUMBER_ONLY 0x80000000 +#define FT_LIST_BY_INDEX 0x40000000 +#define FT_LIST_ALL 0x20000000 + +#define FT_LIST_MASK (FT_LIST_NUMBER_ONLY|FT_LIST_BY_INDEX|FT_LIST_ALL) + +// +// Baud Rates +// + +#define FT_BAUD_300 300 +#define FT_BAUD_600 600 +#define FT_BAUD_1200 1200 +#define FT_BAUD_2400 2400 +#define FT_BAUD_4800 4800 +#define FT_BAUD_9600 9600 +#define FT_BAUD_14400 14400 +#define FT_BAUD_19200 19200 +#define FT_BAUD_38400 38400 +#define FT_BAUD_57600 57600 +#define FT_BAUD_115200 115200 +#define FT_BAUD_230400 230400 +#define FT_BAUD_460800 460800 +#define FT_BAUD_921600 921600 + +// +// Word Lengths +// + +#define FT_BITS_8 (UCHAR) 8 +#define FT_BITS_7 (UCHAR) 7 +#define FT_BITS_6 (UCHAR) 6 +#define FT_BITS_5 (UCHAR) 5 + +// +// Stop Bits +// + +#define FT_STOP_BITS_1 (UCHAR) 0 +#define FT_STOP_BITS_1_5 (UCHAR) 1 +#define FT_STOP_BITS_2 (UCHAR) 2 + +// +// Parity +// + +#define FT_PARITY_NONE (UCHAR) 0 +#define FT_PARITY_ODD (UCHAR) 1 +#define FT_PARITY_EVEN (UCHAR) 2 +#define FT_PARITY_MARK (UCHAR) 3 +#define FT_PARITY_SPACE (UCHAR) 4 + +// +// Flow Control +// + +#define FT_FLOW_NONE 0x0000 +#define FT_FLOW_RTS_CTS 0x0100 +#define FT_FLOW_DTR_DSR 0x0200 +#define FT_FLOW_XON_XOFF 0x0400 + +// +// Purge rx and tx buffers +// +#define FT_PURGE_RX 1 +#define FT_PURGE_TX 2 + +// +// Events +// + +typedef void (*PFT_EVENT_HANDLER)(DWORD,DWORD); + +#define FT_EVENT_RXCHAR 1 +#define FT_EVENT_MODEM_STATUS 2 +#define FT_EVENT_LINE_STATUS 4 + +// +// Timeouts +// + +#define FT_DEFAULT_RX_TIMEOUT 300 +#define FT_DEFAULT_TX_TIMEOUT 300 + +// +// Device types +// + +typedef ULONG FT_DEVICE; + +enum { + FT_DEVICE_BM, + FT_DEVICE_AM, + FT_DEVICE_100AX, + FT_DEVICE_UNKNOWN, + FT_DEVICE_2232C, + FT_DEVICE_232R, + FT_DEVICE_2232H, + FT_DEVICE_4232H +}; + + +#ifdef __cplusplus +extern "C" { +#endif + + +FTD2XX_API +FT_STATUS WINAPI FT_Open( + int deviceNumber, + FT_HANDLE *pHandle + ); + +FTD2XX_API +FT_STATUS WINAPI FT_OpenEx( + PVOID pArg1, + DWORD Flags, + FT_HANDLE *pHandle + ); + +FTD2XX_API +FT_STATUS WINAPI FT_ListDevices( + PVOID pArg1, + PVOID pArg2, + DWORD Flags + ); + +FTD2XX_API +FT_STATUS WINAPI FT_Close( + FT_HANDLE ftHandle + ); + +FTD2XX_API +FT_STATUS WINAPI FT_Read( + FT_HANDLE ftHandle, + LPVOID lpBuffer, + DWORD dwBytesToRead, + LPDWORD lpBytesReturned + ); + +FTD2XX_API +FT_STATUS WINAPI FT_Write( + FT_HANDLE ftHandle, + LPVOID lpBuffer, + DWORD dwBytesToWrite, + LPDWORD lpBytesWritten + ); + +FTD2XX_API +FT_STATUS WINAPI FT_IoCtl( + FT_HANDLE ftHandle, + DWORD dwIoControlCode, + LPVOID lpInBuf, + DWORD nInBufSize, + LPVOID lpOutBuf, + DWORD nOutBufSize, + LPDWORD lpBytesReturned, + LPOVERLAPPED lpOverlapped + ); + +FTD2XX_API +FT_STATUS WINAPI FT_SetBaudRate( + FT_HANDLE ftHandle, + ULONG BaudRate + ); + +FTD2XX_API +FT_STATUS WINAPI FT_SetDivisor( + FT_HANDLE ftHandle, + USHORT Divisor + ); + +FTD2XX_API +FT_STATUS WINAPI FT_SetDataCharacteristics( + FT_HANDLE ftHandle, + UCHAR WordLength, + UCHAR StopBits, + UCHAR Parity + ); + +FTD2XX_API +FT_STATUS WINAPI FT_SetFlowControl( + FT_HANDLE ftHandle, + USHORT FlowControl, + UCHAR XonChar, + UCHAR XoffChar + ); + +FTD2XX_API +FT_STATUS WINAPI FT_ResetDevice( + FT_HANDLE ftHandle + ); + +FTD2XX_API +FT_STATUS WINAPI FT_SetDtr( + FT_HANDLE ftHandle + ); + +FTD2XX_API +FT_STATUS WINAPI FT_ClrDtr( + FT_HANDLE ftHandle + ); + +FTD2XX_API +FT_STATUS WINAPI FT_SetRts( + FT_HANDLE ftHandle + ); + +FTD2XX_API +FT_STATUS WINAPI FT_ClrRts( + FT_HANDLE ftHandle + ); + +FTD2XX_API +FT_STATUS WINAPI FT_GetModemStatus( + FT_HANDLE ftHandle, + ULONG *pModemStatus + ); + +FTD2XX_API +FT_STATUS WINAPI FT_SetChars( + FT_HANDLE ftHandle, + UCHAR EventChar, + UCHAR EventCharEnabled, + UCHAR ErrorChar, + UCHAR ErrorCharEnabled + ); + +FTD2XX_API +FT_STATUS WINAPI FT_Purge( + FT_HANDLE ftHandle, + ULONG Mask + ); + +FTD2XX_API +FT_STATUS WINAPI FT_SetTimeouts( + FT_HANDLE ftHandle, + ULONG ReadTimeout, + ULONG WriteTimeout + ); + +FTD2XX_API +FT_STATUS WINAPI FT_GetQueueStatus( + FT_HANDLE ftHandle, + DWORD *dwRxBytes + ); + +FTD2XX_API +FT_STATUS WINAPI FT_SetEventNotification( + FT_HANDLE ftHandle, + DWORD Mask, + PVOID Param + ); + +FTD2XX_API +FT_STATUS WINAPI FT_GetStatus( + FT_HANDLE ftHandle, + DWORD *dwRxBytes, + DWORD *dwTxBytes, + DWORD *dwEventDWord + ); + +FTD2XX_API +FT_STATUS WINAPI FT_SetBreakOn( + FT_HANDLE ftHandle + ); + +FTD2XX_API +FT_STATUS WINAPI FT_SetBreakOff( + FT_HANDLE ftHandle + ); + +FTD2XX_API +FT_STATUS WINAPI FT_SetWaitMask( + FT_HANDLE ftHandle, + DWORD Mask + ); + +FTD2XX_API +FT_STATUS WINAPI FT_WaitOnMask( + FT_HANDLE ftHandle, + DWORD *Mask + ); + +FTD2XX_API +FT_STATUS WINAPI FT_GetEventStatus( + FT_HANDLE ftHandle, + DWORD *dwEventDWord + ); + +FTD2XX_API +FT_STATUS WINAPI FT_ReadEE( + FT_HANDLE ftHandle, + DWORD dwWordOffset, + LPWORD lpwValue + ); + +FTD2XX_API +FT_STATUS WINAPI FT_WriteEE( + FT_HANDLE ftHandle, + DWORD dwWordOffset, + WORD wValue + ); + +FTD2XX_API +FT_STATUS WINAPI FT_EraseEE( + FT_HANDLE ftHandle + ); + +// +// structure to hold program data for FT_Program function +// +typedef struct ft_program_data { + + DWORD Signature1; // Header - must be 0x00000000 + DWORD Signature2; // Header - must be 0xffffffff + DWORD Version; // Header - FT_PROGRAM_DATA version + // 0 = original + // 1 = FT2232C extensions + // 2 = FT232R extensions + // 3 = FT2232H extensions + // 4 = FT4232H extensions + + WORD VendorId; // 0x0403 + WORD ProductId; // 0x6001 + char *Manufacturer; // "FTDI" + char *ManufacturerId; // "FT" + char *Description; // "USB HS Serial Converter" + char *SerialNumber; // "FT000001" if fixed, or NULL + WORD MaxPower; // 0 < MaxPower <= 500 + WORD PnP; // 0 = disabled, 1 = enabled + WORD SelfPowered; // 0 = bus powered, 1 = self powered + WORD RemoteWakeup; // 0 = not capable, 1 = capable + // + // Rev4 (FT232B) extensions + // + UCHAR Rev4; // non-zero if Rev4 chip, zero otherwise + UCHAR IsoIn; // non-zero if in endpoint is isochronous + UCHAR IsoOut; // non-zero if out endpoint is isochronous + UCHAR PullDownEnable; // non-zero if pull down enabled + UCHAR SerNumEnable; // non-zero if serial number to be used + UCHAR USBVersionEnable; // non-zero if chip uses USBVersion + WORD USBVersion; // BCD (0x0200 => USB2) + // + // Rev 5 (FT2232) extensions + // + UCHAR Rev5; // non-zero if Rev5 chip, zero otherwise + UCHAR IsoInA; // non-zero if in endpoint is isochronous + UCHAR IsoInB; // non-zero if in endpoint is isochronous + UCHAR IsoOutA; // non-zero if out endpoint is isochronous + UCHAR IsoOutB; // non-zero if out endpoint is isochronous + UCHAR PullDownEnable5; // non-zero if pull down enabled + UCHAR SerNumEnable5; // non-zero if serial number to be used + UCHAR USBVersionEnable5; // non-zero if chip uses USBVersion + WORD USBVersion5; // BCD (0x0200 => USB2) + UCHAR AIsHighCurrent; // non-zero if interface is high current + UCHAR BIsHighCurrent; // non-zero if interface is high current + UCHAR IFAIsFifo; // non-zero if interface is 245 FIFO + UCHAR IFAIsFifoTar; // non-zero if interface is 245 FIFO CPU target + UCHAR IFAIsFastSer; // non-zero if interface is Fast serial + UCHAR AIsVCP; // non-zero if interface is to use VCP drivers + UCHAR IFBIsFifo; // non-zero if interface is 245 FIFO + UCHAR IFBIsFifoTar; // non-zero if interface is 245 FIFO CPU target + UCHAR IFBIsFastSer; // non-zero if interface is Fast serial + UCHAR BIsVCP; // non-zero if interface is to use VCP drivers + // + // Rev 6 (FT232R) extensions + // + UCHAR UseExtOsc; // Use External Oscillator + UCHAR HighDriveIOs; // High Drive I/Os + UCHAR EndpointSize; // Endpoint size + UCHAR PullDownEnableR; // non-zero if pull down enabled + UCHAR SerNumEnableR; // non-zero if serial number to be used + UCHAR InvertTXD; // non-zero if invert TXD + UCHAR InvertRXD; // non-zero if invert RXD + UCHAR InvertRTS; // non-zero if invert RTS + UCHAR InvertCTS; // non-zero if invert CTS + UCHAR InvertDTR; // non-zero if invert DTR + UCHAR InvertDSR; // non-zero if invert DSR + UCHAR InvertDCD; // non-zero if invert DCD + UCHAR InvertRI; // non-zero if invert RI + UCHAR Cbus0; // Cbus Mux control + UCHAR Cbus1; // Cbus Mux control + UCHAR Cbus2; // Cbus Mux control + UCHAR Cbus3; // Cbus Mux control + UCHAR Cbus4; // Cbus Mux control + UCHAR RIsD2XX; // non-zero if using D2XX driver + // + // Rev 7 (FT2232H) Extensions + // + UCHAR PullDownEnable7; // non-zero if pull down enabled + UCHAR SerNumEnable7; // non-zero if serial number to be used + UCHAR ALSlowSlew; // non-zero if AL pins have slow slew + UCHAR ALSchmittInput; // non-zero if AL pins are Schmitt input + UCHAR ALDriveCurrent; // valid values are 4mA, 8mA, 12mA, 16mA + UCHAR AHSlowSlew; // non-zero if AH pins have slow slew + UCHAR AHSchmittInput; // non-zero if AH pins are Schmitt input + UCHAR AHDriveCurrent; // valid values are 4mA, 8mA, 12mA, 16mA + UCHAR BLSlowSlew; // non-zero if BL pins have slow slew + UCHAR BLSchmittInput; // non-zero if BL pins are Schmitt input + UCHAR BLDriveCurrent; // valid values are 4mA, 8mA, 12mA, 16mA + UCHAR BHSlowSlew; // non-zero if BH pins have slow slew + UCHAR BHSchmittInput; // non-zero if BH pins are Schmitt input + UCHAR BHDriveCurrent; // valid values are 4mA, 8mA, 12mA, 16mA + UCHAR IFAIsFifo7; // non-zero if interface is 245 FIFO + UCHAR IFAIsFifoTar7; // non-zero if interface is 245 FIFO CPU target + UCHAR IFAIsFastSer7; // non-zero if interface is Fast serial + UCHAR AIsVCP7; // non-zero if interface is to use VCP drivers + UCHAR IFBIsFifo7; // non-zero if interface is 245 FIFO + UCHAR IFBIsFifoTar7; // non-zero if interface is 245 FIFO CPU target + UCHAR IFBIsFastSer7; // non-zero if interface is Fast serial + UCHAR BIsVCP7; // non-zero if interface is to use VCP drivers + UCHAR PowerSaveEnable; // non-zero if using BCBUS7 to save power for self-powered designs + // + // Rev 8 (FT4232H) Extensions + // + UCHAR PullDownEnable8; // non-zero if pull down enabled + UCHAR SerNumEnable8; // non-zero if serial number to be used + UCHAR ASlowSlew; // non-zero if AL pins have slow slew + UCHAR ASchmittInput; // non-zero if AL pins are Schmitt input + UCHAR ADriveCurrent; // valid values are 4mA, 8mA, 12mA, 16mA + UCHAR BSlowSlew; // non-zero if AH pins have slow slew + UCHAR BSchmittInput; // non-zero if AH pins are Schmitt input + UCHAR BDriveCurrent; // valid values are 4mA, 8mA, 12mA, 16mA + UCHAR CSlowSlew; // non-zero if BL pins have slow slew + UCHAR CSchmittInput; // non-zero if BL pins are Schmitt input + UCHAR CDriveCurrent; // valid values are 4mA, 8mA, 12mA, 16mA + UCHAR DSlowSlew; // non-zero if BH pins have slow slew + UCHAR DSchmittInput; // non-zero if BH pins are Schmitt input + UCHAR DDriveCurrent; // valid values are 4mA, 8mA, 12mA, 16mA + UCHAR ARIIsTXDEN; // non-zero if port A uses RI as RS485 TXDEN + UCHAR BRIIsTXDEN; // non-zero if port B uses RI as RS485 TXDEN + UCHAR CRIIsTXDEN; // non-zero if port C uses RI as RS485 TXDEN + UCHAR DRIIsTXDEN; // non-zero if port D uses RI as RS485 TXDEN + UCHAR AIsVCP8; // non-zero if interface is to use VCP drivers + UCHAR BIsVCP8; // non-zero if interface is to use VCP drivers + UCHAR CIsVCP8; // non-zero if interface is to use VCP drivers + UCHAR DIsVCP8; // non-zero if interface is to use VCP drivers + +} FT_PROGRAM_DATA, *PFT_PROGRAM_DATA; + +FTD2XX_API +FT_STATUS WINAPI FT_EE_Program( + FT_HANDLE ftHandle, + PFT_PROGRAM_DATA pData + ); + +FTD2XX_API +FT_STATUS WINAPI FT_EE_ProgramEx( + FT_HANDLE ftHandle, + PFT_PROGRAM_DATA pData, + char *Manufacturer, + char *ManufacturerId, + char *Description, + char *SerialNumber + ); + +FTD2XX_API +FT_STATUS WINAPI FT_EE_Read( + FT_HANDLE ftHandle, + PFT_PROGRAM_DATA pData + ); + +FTD2XX_API +FT_STATUS WINAPI FT_EE_ReadEx( + FT_HANDLE ftHandle, + PFT_PROGRAM_DATA pData, + char *Manufacturer, + char *ManufacturerId, + char *Description, + char *SerialNumber + ); + +FTD2XX_API +FT_STATUS WINAPI FT_EE_UASize( + FT_HANDLE ftHandle, + LPDWORD lpdwSize + ); + +FTD2XX_API +FT_STATUS WINAPI FT_EE_UAWrite( + FT_HANDLE ftHandle, + PUCHAR pucData, + DWORD dwDataLen + ); + +FTD2XX_API +FT_STATUS WINAPI FT_EE_UARead( + FT_HANDLE ftHandle, + PUCHAR pucData, + DWORD dwDataLen, + LPDWORD lpdwBytesRead + ); + +FTD2XX_API +FT_STATUS WINAPI FT_SetLatencyTimer( + FT_HANDLE ftHandle, + UCHAR ucLatency + ); + +FTD2XX_API +FT_STATUS WINAPI FT_GetLatencyTimer( + FT_HANDLE ftHandle, + PUCHAR pucLatency + ); + +FTD2XX_API +FT_STATUS WINAPI FT_SetBitMode( + FT_HANDLE ftHandle, + UCHAR ucMask, + UCHAR ucEnable + ); + +FTD2XX_API +FT_STATUS WINAPI FT_GetBitMode( + FT_HANDLE ftHandle, + PUCHAR pucMode + ); + +FTD2XX_API +FT_STATUS WINAPI FT_SetUSBParameters( + FT_HANDLE ftHandle, + ULONG ulInTransferSize, + ULONG ulOutTransferSize + ); + +FTD2XX_API +FT_STATUS WINAPI FT_SetDeadmanTimeout( + FT_HANDLE ftHandle, + ULONG ulDeadmanTimeout + ); + +FTD2XX_API +FT_STATUS WINAPI FT_GetDeviceInfo( + FT_HANDLE ftHandle, + FT_DEVICE *lpftDevice, + LPDWORD lpdwID, + PCHAR SerialNumber, + PCHAR Description, + LPVOID Dummy + ); + +FTD2XX_API +FT_STATUS WINAPI FT_StopInTask( + FT_HANDLE ftHandle + ); + +FTD2XX_API +FT_STATUS WINAPI FT_RestartInTask( + FT_HANDLE ftHandle + ); + +FTD2XX_API +FT_STATUS WINAPI FT_SetResetPipeRetryCount( + FT_HANDLE ftHandle, + DWORD dwCount + ); + +FTD2XX_API +FT_STATUS WINAPI FT_ResetPort( + FT_HANDLE ftHandle + ); + +FTD2XX_API +FT_STATUS WINAPI FT_CyclePort( + FT_HANDLE ftHandle + ); + + +// +// Win32-type functions +// + +FTD2XX_API +FT_HANDLE WINAPI FT_W32_CreateFile( + LPCTSTR lpszName, + DWORD dwAccess, + DWORD dwShareMode, + LPSECURITY_ATTRIBUTES lpSecurityAttributes, + DWORD dwCreate, + DWORD dwAttrsAndFlags, + HANDLE hTemplate + ); + +FTD2XX_API +BOOL WINAPI FT_W32_CloseHandle( + FT_HANDLE ftHandle + ); + +FTD2XX_API +BOOL WINAPI FT_W32_ReadFile( + FT_HANDLE ftHandle, + LPVOID lpBuffer, + DWORD nBufferSize, + LPDWORD lpBytesReturned, + LPOVERLAPPED lpOverlapped + ); + +FTD2XX_API +BOOL WINAPI FT_W32_WriteFile( + FT_HANDLE ftHandle, + LPVOID lpBuffer, + DWORD nBufferSize, + LPDWORD lpBytesWritten, + LPOVERLAPPED lpOverlapped + ); + +FTD2XX_API +DWORD WINAPI FT_W32_GetLastError( + FT_HANDLE ftHandle + ); + +FTD2XX_API +BOOL WINAPI FT_W32_GetOverlappedResult( + FT_HANDLE ftHandle, + LPOVERLAPPED lpOverlapped, + LPDWORD lpdwBytesTransferred, + BOOL bWait + ); + +FTD2XX_API +BOOL WINAPI FT_W32_CancelIo( + FT_HANDLE ftHandle + ); + + +// +// Win32 COMM API type functions +// +typedef struct _FTCOMSTAT { + DWORD fCtsHold : 1; + DWORD fDsrHold : 1; + DWORD fRlsdHold : 1; + DWORD fXoffHold : 1; + DWORD fXoffSent : 1; + DWORD fEof : 1; + DWORD fTxim : 1; + DWORD fReserved : 25; + DWORD cbInQue; + DWORD cbOutQue; +} FTCOMSTAT, *LPFTCOMSTAT; + +typedef struct _FTDCB { + DWORD DCBlength; /* sizeof(FTDCB) */ + DWORD BaudRate; /* Baudrate at which running */ + DWORD fBinary: 1; /* Binary Mode (skip EOF check) */ + DWORD fParity: 1; /* Enable parity checking */ + DWORD fOutxCtsFlow:1; /* CTS handshaking on output */ + DWORD fOutxDsrFlow:1; /* DSR handshaking on output */ + DWORD fDtrControl:2; /* DTR Flow control */ + DWORD fDsrSensitivity:1; /* DSR Sensitivity */ + DWORD fTXContinueOnXoff: 1; /* Continue TX when Xoff sent */ + DWORD fOutX: 1; /* Enable output X-ON/X-OFF */ + DWORD fInX: 1; /* Enable input X-ON/X-OFF */ + DWORD fErrorChar: 1; /* Enable Err Replacement */ + DWORD fNull: 1; /* Enable Null stripping */ + DWORD fRtsControl:2; /* Rts Flow control */ + DWORD fAbortOnError:1; /* Abort all reads and writes on Error */ + DWORD fDummy2:17; /* Reserved */ + WORD wReserved; /* Not currently used */ + WORD XonLim; /* Transmit X-ON threshold */ + WORD XoffLim; /* Transmit X-OFF threshold */ + BYTE ByteSize; /* Number of bits/byte, 4-8 */ + BYTE Parity; /* 0-4=None,Odd,Even,Mark,Space */ + BYTE StopBits; /* 0,1,2 = 1, 1.5, 2 */ + char XonChar; /* Tx and Rx X-ON character */ + char XoffChar; /* Tx and Rx X-OFF character */ + char ErrorChar; /* Error replacement char */ + char EofChar; /* End of Input character */ + char EvtChar; /* Received Event character */ + WORD wReserved1; /* Fill for now. */ +} FTDCB, *LPFTDCB; + +typedef struct _FTTIMEOUTS { + DWORD ReadIntervalTimeout; /* Maximum time between read chars. */ + DWORD ReadTotalTimeoutMultiplier; /* Multiplier of characters. */ + DWORD ReadTotalTimeoutConstant; /* Constant in milliseconds. */ + DWORD WriteTotalTimeoutMultiplier; /* Multiplier of characters. */ + DWORD WriteTotalTimeoutConstant; /* Constant in milliseconds. */ +} FTTIMEOUTS,*LPFTTIMEOUTS; + + +FTD2XX_API +BOOL WINAPI FT_W32_ClearCommBreak( + FT_HANDLE ftHandle + ); + +FTD2XX_API +BOOL WINAPI FT_W32_ClearCommError( + FT_HANDLE ftHandle, + LPDWORD lpdwErrors, + LPFTCOMSTAT lpftComstat + ); + +FTD2XX_API +BOOL WINAPI FT_W32_EscapeCommFunction( + FT_HANDLE ftHandle, + DWORD dwFunc + ); + +FTD2XX_API +BOOL WINAPI FT_W32_GetCommModemStatus( + FT_HANDLE ftHandle, + LPDWORD lpdwModemStatus + ); + +FTD2XX_API +BOOL WINAPI FT_W32_GetCommState( + FT_HANDLE ftHandle, + LPFTDCB lpftDcb + ); + +FTD2XX_API +BOOL WINAPI FT_W32_GetCommTimeouts( + FT_HANDLE ftHandle, + FTTIMEOUTS *pTimeouts + ); + +FTD2XX_API +BOOL WINAPI FT_W32_PurgeComm( + FT_HANDLE ftHandle, + DWORD dwMask + ); + +FTD2XX_API +BOOL WINAPI FT_W32_SetCommBreak( + FT_HANDLE ftHandle + ); + +FTD2XX_API +BOOL WINAPI FT_W32_SetCommMask( + FT_HANDLE ftHandle, + ULONG ulEventMask + ); + +FTD2XX_API +BOOL WINAPI FT_W32_GetCommMask( + FT_HANDLE ftHandle, + LPDWORD lpdwEventMask + ); + +FTD2XX_API +BOOL WINAPI FT_W32_SetCommState( + FT_HANDLE ftHandle, + LPFTDCB lpftDcb + ); + +FTD2XX_API +BOOL WINAPI FT_W32_SetCommTimeouts( + FT_HANDLE ftHandle, + FTTIMEOUTS *pTimeouts + ); + +FTD2XX_API +BOOL WINAPI FT_W32_SetupComm( + FT_HANDLE ftHandle, + DWORD dwReadBufferSize, + DWORD dwWriteBufferSize + ); + +FTD2XX_API +BOOL WINAPI FT_W32_WaitCommEvent( + FT_HANDLE ftHandle, + PULONG pulEvent, + LPOVERLAPPED lpOverlapped + ); + + +// +// Device information +// + +typedef struct _ft_device_list_info_node { + ULONG Flags; + ULONG Type; + ULONG ID; + DWORD LocId; + char SerialNumber[16]; + char Description[64]; + FT_HANDLE ftHandle; +} FT_DEVICE_LIST_INFO_NODE; + +// Device information flags +enum { + FT_FLAGS_OPENED = 1, + FT_FLAGS_HISPEED = 2 +}; + + +FTD2XX_API +FT_STATUS WINAPI FT_CreateDeviceInfoList( + LPDWORD lpdwNumDevs + ); + +FTD2XX_API +FT_STATUS WINAPI FT_GetDeviceInfoList( + FT_DEVICE_LIST_INFO_NODE *pDest, + LPDWORD lpdwNumDevs + ); + +FTD2XX_API +FT_STATUS WINAPI FT_GetDeviceInfoDetail( + DWORD dwIndex, + LPDWORD lpdwFlags, + LPDWORD lpdwType, + LPDWORD lpdwID, + LPDWORD lpdwLocId, + LPVOID lpSerialNumber, + LPVOID lpDescription, + FT_HANDLE *pftHandle + ); + + +// +// Version information +// + +FTD2XX_API +FT_STATUS WINAPI FT_GetDriverVersion( + FT_HANDLE ftHandle, + LPDWORD lpdwVersion + ); + +FTD2XX_API +FT_STATUS WINAPI FT_GetLibraryVersion( + LPDWORD lpdwVersion + ); + + +FTD2XX_API +FT_STATUS WINAPI FT_Rescan( + void + ); + +FTD2XX_API +FT_STATUS WINAPI FT_Reload( + WORD wVid, + WORD wPid + ); + +FTD2XX_API +FT_STATUS WINAPI FT_GetComPortNumber( + FT_HANDLE ftHandle, + LPLONG lpdwComPortNumber + ); + + + +#ifdef __cplusplus +} +#endif + + +#endif /* FTD2XX_H */ + diff --git a/examples/c/sensors/callback/Makefile b/examples/c/sensors/callback/Makefile deleted file mode 100644 index 20509a12..00000000 --- a/examples/c/sensors/callback/Makefile +++ /dev/null @@ -1,13 +0,0 @@ -CC=gcc -CFLAGS=-Wall -ltelldus-core - -OBJS = main.o - -all: ${OBJS} - ${CC} -o sensor ${CFLAGS} ${OBJS} - -main.c: - ${CC} ${CFLAGS} -c main.c - -clean: - rm -f sensor main.o diff --git a/examples/c/sensors/callback/main.c b/examples/c/sensors/callback/main.c deleted file mode 100644 index 907c8d08..00000000 --- a/examples/c/sensors/callback/main.c +++ /dev/null @@ -1,43 +0,0 @@ -#include -#include -#include -#include - -void WINAPI sensorEvent(const char *protocol, const char *model, int sensorId, int dataType, const char *value, int ts, int callbackId, void *context) { - char timeBuf[80]; - time_t timestamp = ts; - - //Print the sensor - printf("%s,\t%s,\t%i\n", protocol, model, sensorId); - - //Retrieve the values the sensor supports - if (dataType == TELLSTICK_TEMPERATURE) { - strftime(timeBuf, sizeof(timeBuf), "%Y-%m-%d %H:%M:%S", localtime(×tamp)); - printf("Temperature:\t%sº\t(%s)\n", value, timeBuf); - - } else if (dataType == TELLSTICK_HUMIDITY) { - strftime(timeBuf, sizeof(timeBuf), "%Y-%m-%d %H:%M:%S", localtime(×tamp)); - printf("Humidity:\t%s%%\t(%s)\n", value, timeBuf); - } - printf("\n"); -} - -int main(void) { - int callbackId = 0; - - tdInit(); - - //Register for callback - callbackId = tdRegisterSensorEvent( (TDSensorEvent)&sensorEvent, 0 ); - - //Our own simple eventloop - while(1) { - sleep(100); - } - - //Cleanup - tdUnregisterCallback( callbackId ); - tdClose(); - - return 0; -} diff --git a/examples/c/sensors/polling/Makefile b/examples/c/sensors/polling/Makefile deleted file mode 100644 index 20509a12..00000000 --- a/examples/c/sensors/polling/Makefile +++ /dev/null @@ -1,13 +0,0 @@ -CC=gcc -CFLAGS=-Wall -ltelldus-core - -OBJS = main.o - -all: ${OBJS} - ${CC} -o sensor ${CFLAGS} ${OBJS} - -main.c: - ${CC} ${CFLAGS} -c main.c - -clean: - rm -f sensor main.o diff --git a/examples/c/sensors/polling/main.c b/examples/c/sensors/polling/main.c deleted file mode 100644 index 953ef188..00000000 --- a/examples/c/sensors/polling/main.c +++ /dev/null @@ -1,38 +0,0 @@ -#include -#include -#include - -const int DATA_LENGTH = 20; - -int main(void) { - char protocol[DATA_LENGTH], model[DATA_LENGTH]; - int sensorId = 0, dataTypes = 0; - char value[DATA_LENGTH]; - char timeBuf[80]; - time_t timestamp = 0; - - - tdInit(); - - while(tdSensor(protocol, DATA_LENGTH, model, DATA_LENGTH, &sensorId, &dataTypes) == TELLSTICK_SUCCESS) { - //Print the sensor - printf("%s,\t%s,\t%i\n", protocol, model, sensorId); - - //Retrieve the values the sensor supports - if (dataTypes & TELLSTICK_TEMPERATURE) { - tdSensorValue(protocol, model, sensorId, TELLSTICK_TEMPERATURE, value, DATA_LENGTH, (int *)×tamp); - strftime(timeBuf, sizeof(timeBuf), "%Y-%m-%d %H:%M:%S", localtime(×tamp)); - printf("Temperature:\t%sº\t(%s)\n", value, timeBuf); - } - if (dataTypes & TELLSTICK_HUMIDITY) { - tdSensorValue(protocol, model, sensorId, TELLSTICK_HUMIDITY, value, DATA_LENGTH, (int *)×tamp); - strftime(timeBuf, sizeof(timeBuf), "%Y-%m-%d %H:%M:%S", localtime(×tamp)); - printf("Humidity:\t%s%%\t(%s)\n", value, timeBuf); - } - printf("\n"); - } - - tdClose(); - - return 0; -} diff --git a/examples/cpp/callbacks/Makefile b/examples/cpp/callbacks/Makefile deleted file mode 100644 index 84b4955a..00000000 --- a/examples/cpp/callbacks/Makefile +++ /dev/null @@ -1,13 +0,0 @@ -CC=gcc -CFLAGS=-Wall -ltelldus-core - -OBJS = main.o - -all: ${OBJS} - ${CC} -o callbacks ${CFLAGS} ${OBJS} - -main.cpp: - ${CC} ${CFLAGS} -c main.cpp - -clean: - rm -f callbacks main.o diff --git a/examples/cpp/callbacks/main.cpp b/examples/cpp/callbacks/main.cpp deleted file mode 100644 index 5afeeaaf..00000000 --- a/examples/cpp/callbacks/main.cpp +++ /dev/null @@ -1,77 +0,0 @@ -#include -#include -#include -#include - -bool running; - -class Events { -public: - Events(); - ~Events(); - void deviceEvent(int deviceId, int method, const char *data); - - static void deviceEventCallback(int deviceId, int method, const char *data, int callbackId, void *context); - -private: - int callbackId; -}; - -Events::Events() { - callbackId = tdRegisterDeviceEvent( reinterpret_cast(&Events::deviceEventCallback), this ); -} - -Events::~Events() { - tdUnregisterCallback(callbackId); -} - -void Events::deviceEvent(int deviceId, int method, const char *data) { - if (method == TELLSTICK_TURNON) { - printf("ON event from device %i\n", deviceId); - } else if (method == TELLSTICK_TURNOFF) { - printf("OFF event from device %i\n", deviceId); - } else { - printf("Unknown event from device %i\n", deviceId); - } -} - -void Events::deviceEventCallback(int deviceId, int method, const char *data, int callbackId, void *context) { - Events *e = reinterpret_cast(context); - if (e) { - /** Please note! - * We are here in another thread than the main. Some measures to syncronize - * this must be taken! - **/ - e->deviceEvent(deviceId, method, data); - } -} - -void signalHandler(int sig) { - if (sig == SIGINT) { - printf("Shutting down\n"); - running = false; - } -} - -void run() { - Events ev; - - running = true; - - printf("Listening for events, press control-c to quit...\n"); - //Our own simple eventloop - while(running) { - sleep(1); - } -} - -int main(void) { - tdInit(); - - signal(SIGINT, signalHandler); - run(); - - tdClose(); - - return 0; -} diff --git a/examples/dotnet/sensors/SensorPollWin.sln b/examples/dotnet/sensors/SensorPollWin.sln deleted file mode 100644 index c10d19d6..00000000 --- a/examples/dotnet/sensors/SensorPollWin.sln +++ /dev/null @@ -1,26 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 10.00 -# Visual Studio 2008 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SensorPollWin", "SensorPollWin\SensorPollWin.csproj", "{47D37594-BFDD-4A4E-9736-32EDAE2E22F0}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Debug|x86 = Debug|x86 - Release|Any CPU = Release|Any CPU - Release|x86 = Release|x86 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {47D37594-BFDD-4A4E-9736-32EDAE2E22F0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {47D37594-BFDD-4A4E-9736-32EDAE2E22F0}.Debug|Any CPU.Build.0 = Debug|Any CPU - {47D37594-BFDD-4A4E-9736-32EDAE2E22F0}.Debug|x86.ActiveCfg = Debug|x86 - {47D37594-BFDD-4A4E-9736-32EDAE2E22F0}.Debug|x86.Build.0 = Debug|x86 - {47D37594-BFDD-4A4E-9736-32EDAE2E22F0}.Release|Any CPU.ActiveCfg = Release|Any CPU - {47D37594-BFDD-4A4E-9736-32EDAE2E22F0}.Release|Any CPU.Build.0 = Release|Any CPU - {47D37594-BFDD-4A4E-9736-32EDAE2E22F0}.Release|x86.ActiveCfg = Release|x86 - {47D37594-BFDD-4A4E-9736-32EDAE2E22F0}.Release|x86.Build.0 = Release|x86 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/examples/dotnet/sensors/SensorPollWin/Program.cs b/examples/dotnet/sensors/SensorPollWin/Program.cs deleted file mode 100644 index ad4a5c26..00000000 --- a/examples/dotnet/sensors/SensorPollWin/Program.cs +++ /dev/null @@ -1,69 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Runtime.InteropServices; - -namespace SensorPollWin -{ - unsafe class Program - { - [DllImport("TelldusCore.dll")] - public static extern void tdInit(); - - [DllImport("TelldusCore.dll")] - public static extern void tdClose(); - - [DllImport("TelldusCore.dll")] - public static extern int tdSensor(char* protocol, int protocolLength, char* model, int modelLength, int* id, int* dataTypes); - - [DllImport("TelldusCore.dll")] - public static extern int tdSensorValue(char* protocol, char* model, int id, int dataType, char* value, int valueLength, int* timestamp); - - static unsafe void Main(string[] args) - { - int protocolstringsize = 20; - int modelstringsize = 30; - int valuestringsize = 20; - char* protocol = (char*)Marshal.AllocHGlobal(Marshal.SystemDefaultCharSize * protocolstringsize); - char* model = (char*)Marshal.AllocHGlobal(Marshal.SystemDefaultCharSize * modelstringsize); - IntPtr id = Marshal.AllocHGlobal(sizeof(int)); - IntPtr dataType = Marshal.AllocHGlobal(sizeof(int)); - Console.WriteLine("getting sensors"); - - tdInit(); - while (tdSensor(protocol, protocolstringsize, model, modelstringsize, (int*)id, (int*)dataType) == 0) - { - Console.WriteLine("Sensor: " + System.Text.Encoding.UTF8.GetString(System.Text.Encoding.Unicode.GetBytes(new string(protocol))) + " " + System.Text.Encoding.UTF8.GetString(System.Text.Encoding.Unicode.GetBytes(new string(model)))); - - char* value = (char*)Marshal.AllocHGlobal(Marshal.SystemDefaultCharSize * valuestringsize); - IntPtr timestamp = Marshal.AllocHGlobal(sizeof(int)); - if ((Marshal.ReadIntPtr(dataType).ToInt32() & 1) != 0) - { - tdSensorValue(protocol, model, Marshal.ReadIntPtr(id).ToInt32(), 1, value, valuestringsize, (int*)timestamp); - Console.WriteLine("Temperature: " + System.Text.Encoding.UTF8.GetString(System.Text.Encoding.Unicode.GetBytes(new string(value))) + "C, " + datify(Marshal.ReadIntPtr(timestamp).ToInt32())); - } - if ((Marshal.ReadIntPtr(dataType).ToInt32() & 2) != 0) - { - tdSensorValue(protocol, model, Marshal.ReadIntPtr(id).ToInt32(), 2, value, valuestringsize, (int*)timestamp); - Console.WriteLine("Humidity: " + System.Text.Encoding.UTF8.GetString(System.Text.Encoding.Unicode.GetBytes(new string(value))) + "%, " + datify(Marshal.ReadIntPtr(timestamp).ToInt32())); - } - Console.WriteLine(""); - Marshal.FreeHGlobal((IntPtr)value); - Marshal.FreeHGlobal(timestamp); - } - Marshal.FreeHGlobal((IntPtr)protocol); - Marshal.FreeHGlobal((IntPtr)model); - Marshal.FreeHGlobal(id); - Marshal.FreeHGlobal(dataType); - tdClose(); - } - - private static string datify(int timestamp){ - System.DateTime dateTime = new System.DateTime(1970, 1, 1, 0, 0, 0, 0); - dateTime = dateTime.AddSeconds(timestamp); - dateTime = dateTime.ToLocalTime(); - return dateTime.ToString(); - } - } -} diff --git a/examples/dotnet/sensors/SensorPollWin/Properties/AssemblyInfo.cs b/examples/dotnet/sensors/SensorPollWin/Properties/AssemblyInfo.cs deleted file mode 100644 index 8b921453..00000000 --- a/examples/dotnet/sensors/SensorPollWin/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("SensorPollWin")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Microsoft")] -[assembly: AssemblyProduct("SensorPollWin")] -[assembly: AssemblyCopyright("Copyright © Microsoft 2011")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("31424c50-2c39-4b7c-a4e8-5a11bd6b8c1d")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/examples/dotnet/sensors/SensorPollWin/SensorPollWin.csproj b/examples/dotnet/sensors/SensorPollWin/SensorPollWin.csproj deleted file mode 100644 index 7d50d1a7..00000000 --- a/examples/dotnet/sensors/SensorPollWin/SensorPollWin.csproj +++ /dev/null @@ -1,77 +0,0 @@ - - - - Debug - AnyCPU - 9.0.30729 - 2.0 - {47D37594-BFDD-4A4E-9736-32EDAE2E22F0} - Exe - Properties - SensorPollWin - SensorPollWin - v3.5 - 512 - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - true - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - true - bin\x86\Debug\ - DEBUG;TRACE - full - x86 - prompt - true - - - bin\x86\Release\ - TRACE - true - pdbonly - x86 - prompt - - - - - 3.5 - - - 3.5 - - - 3.5 - - - - - - - - - - - \ No newline at end of file diff --git a/examples/java/sensors/SensorsJNACallback.java b/examples/java/sensors/SensorsJNACallback.java deleted file mode 100644 index f0740292..00000000 --- a/examples/java/sensors/SensorsJNACallback.java +++ /dev/null @@ -1,94 +0,0 @@ -import java.io.*; -import com.sun.jna.Library; -import com.sun.jna.Native; -import com.sun.jna.ptr.*; -import com.sun.jna.Callback; -import com.sun.jna.Pointer; -import com.sun.jna.Structure; -import com.sun.jna.Memory; - -import java.util.Date; - -public class SensorsJNACallback -{ - public interface CLibrary extends Library { - - static int TELLSTICK_TEMPERATURE = 1; - static int TELLSTICK_HUMIDITY = 2; - - void tdInit(); - void tdClose(); - int tdRegisterSensorEvent(SensorCallback function, Pointer context); - int tdUnregisterCallback(int callbackID); - - public interface SensorCallback extends Callback{ - public void callbackfunction(Pointer protocol, Pointer model, int id, int dataType, Pointer value, int timestamp, int callbackId, Pointer context); - } - } - - int callbackID; - CLibrary lib; - CLibrary.SensorCallback callback; - - public SensorsJNACallback(){ - lib = (CLibrary)Native.loadLibrary("libtelldus-core.so.2", CLibrary.class); - } - - public void startListening(){ - - lib.tdInit(); - - //save reference to callback to avoid garbage collection - CLibrary.SensorCallback callback = new CLibrary.SensorCallback(){ - - public void callbackfunction(Pointer protocol, Pointer model, int id, int dataType, Pointer value, int timestamp, int callbackId, Pointer context){ - System.out.println("Sensor: " + protocol.getString(0) + " " + model.getString(0)); - long timestampvalue = (long)timestamp * 1000; - Date date = new Date(timestampvalue); - - if(dataType == CLibrary.TELLSTICK_TEMPERATURE){ - System.out.println("Temperature: " + value.getString(0) + "C, " + date.toString()); - } - else if(dataType == CLibrary.TELLSTICK_HUMIDITY){ - System.out.println("Humidity: " + value.getString(0) + "%, " + date.toString()); - } - System.out.println(""); - } - }; - - //register callback function for sensor events - callbackID = lib.tdRegisterSensorEvent(callback, (Pointer)null); - - while(true){ - try{ - //just wait for sensor callbacks - Thread.currentThread().sleep(1000); - } - catch(InterruptedException e){ - System.exit(0); - } - } - } - - public void stopListening(){ - System.out.println("Exiting"); - lib.tdUnregisterCallback(callbackID); - callback = null; - lib.tdClose(); - } - - public static void main(String[] args) - { - final SensorsJNACallback sensorsjnacallback = new SensorsJNACallback(); - - //add shutdown hook to allow callback unregistration - Runtime.getRuntime().addShutdownHook(new Thread(){ - public void run(){ - sensorsjnacallback.stopListening(); - Runtime.getRuntime().halt(0); - } - }); - - sensorsjnacallback.startListening(); - } -} \ No newline at end of file diff --git a/examples/java/sensors/SensorsJNAPoll.java b/examples/java/sensors/SensorsJNAPoll.java deleted file mode 100644 index 51512936..00000000 --- a/examples/java/sensors/SensorsJNAPoll.java +++ /dev/null @@ -1,60 +0,0 @@ -import java.io.*; -import com.sun.jna.Library; -import com.sun.jna.Native; -import com.sun.jna.ptr.*; - -import java.util.Date; - -public class SensorsJNAPoll -{ - public interface CLibrary extends Library { - - static int TELLSTICK_TEMPERATURE = 1; - static int TELLSTICK_HUMIDITY = 2; - - void tdInit(); - void tdClose(); - int tdTurnOn(int deviceId); - int tdTurnOff(int deviceId); - int tdSensor(byte[] protocol, int protocolLength, byte[] model, int modelLength, IntByReference id,IntByReference dataTypes); - int tdSensorValue(byte[] protocol, byte[] model, int id, int dataType, byte[] value, int valueLength, IntByReference timestamp); - } - - public static void main(String[] args) - { - CLibrary lib = (CLibrary)Native.loadLibrary("libtelldus-core.so.2", CLibrary.class); - lib.tdInit(); - - IntByReference id = new IntByReference(); - IntByReference dataTypes = new IntByReference(); - - System.out.println("getting sensors"); - System.out.println(""); - - byte protocol[] = new byte[20]; - byte model[] = new byte[20]; - - //check every sensor - while(lib.tdSensor(protocol, 20, model, 20, id, dataTypes) == 0){ - System.out.println("Sensor: " + Native.toString(protocol) + " " + Native.toString(model)); - - byte value[] = new byte[20]; - IntByReference timestamp = new IntByReference(); - if((dataTypes.getValue() & CLibrary.TELLSTICK_TEMPERATURE) != 0){ - lib.tdSensorValue(protocol, model, id.getValue(), 1, value, 20, timestamp); - long timestampvalue = (long)timestamp.getValue() * 1000; - Date date = new Date(timestampvalue); - System.out.println("Temperature: " + Native.toString(value) + "C, " + date.toString()); - } - if((dataTypes.getValue() & CLibrary.TELLSTICK_HUMIDITY) != 0){ - lib.tdSensorValue(protocol, model, id.getValue(), 2, value, 20, timestamp); - long timestampvalue = (long)timestamp.getValue() * 1000; - Date date = new Date(timestampvalue); - System.out.println("Humidity: " + Native.toString(value) + "%, " + date.toString()); - } - System.out.println(""); - } - lib.tdClose(); - } - -} \ No newline at end of file diff --git a/examples/php/live/authentication/common.php b/examples/php/live/authentication/common.php deleted file mode 100644 index 3256b9b7..00000000 --- a/examples/php/live/authentication/common.php +++ /dev/null @@ -1,19 +0,0 @@ -getAccessToken(constant('ACCESS_TOKEN')); - - $_SESSION['accessToken'] = $consumer->getToken(); - $_SESSION['accessTokenSecret'] = $consumer->getTokenSecret(); - - header('Location:index.php'); -} catch (Exception $e) { - ?> -

Authorization failed!

-

Go back

- getRequestToken(constant('REQUEST_TOKEN'), constant('BASE_URL').'/getAccessToken.php'); - -$_SESSION['token'] = $consumer->getToken(); -$_SESSION['tokenSecret'] = $consumer->getTokenSecret(); - -$url = $consumer->getAuthorizeUrl(constant('AUTHORIZE_TOKEN')); -header('Location:'.$url); diff --git a/examples/php/live/authentication/index.php b/examples/php/live/authentication/index.php deleted file mode 100644 index a0a78db9..00000000 --- a/examples/php/live/authentication/index.php +++ /dev/null @@ -1,47 +0,0 @@ -We have no access token, connect us -

We have access!

-

- In your system, store these values to do requests for this user:
- Token:
- Secret: -

-

Clear the token and restart

-

List users devices

- constant('TELLSTICK_TURNON') | constant('TELLSTICK_TURNOFF'), - ); - $response = $consumer->sendRequest(constant('REQUEST_URI').'/devices/list', $params, 'GET'); - echo '
';
-	echo( htmlentities($response->getBody()));
-}
-
-?>

List users clients

sendRequest(constant('REQUEST_URI').'/clients/list', $params, 'GET'); - echo '
';
-	echo( htmlentities($response->getBody()));
-}
-
-
diff --git a/examples/python/callbacks.py b/examples/python/callbacks.py
deleted file mode 100644
index a5a02a27..00000000
--- a/examples/python/callbacks.py
+++ /dev/null
@@ -1,76 +0,0 @@
-from ctypes import c_int, c_ubyte, c_void_p, POINTER, string_at #imports allowing the use of our library
-from threading import Timer
-import time
-import platform
-
-#platform specific imports:
-if (platform.system() == 'Windows'):
-	#Windows
-	from ctypes import windll, WINFUNCTYPE
-	lib = windll.LoadLibrary('TelldusCore.dll') #import our library
-else:
-	#Linux
-	from ctypes import cdll, CFUNCTYPE
-	lib = cdll.LoadLibrary('libtelldus-core.so.2') #import our library
-
-timers = {} #timerlist
-
-def turnOn():
-	print "turning on"
-	lib.tdTurnOn(1)
-
-def turnOff():
-	print "turning off"
-	lib.tdTurnOff(1)
-	
-#function to be called when a device event occurs		
-def callbackfunction(deviceId, method, value, callbackId, context):
-	global timers
-	
-	print "callback!"
-
-	if (deviceId == 1):
-		# is turning on deviceId 1 here, so just return if events for that device are picked up
-		return
-		
-	t = 0
-	print "Received event for device %d" % (deviceId,)
-	if (deviceId in timers):
-		# a timer already exists for this device, it might be running so interrupt it
-		# Many devices (for example motion detectors) resends their messages many times to ensure that they
-		# are received correctly. In this example, we don't want to run the turnOn/turnOff methods every time, instead we
-		# start a timer, and run the method when the timer is finished. For every incoming event on this device, the timer
-		# is restarted.
-		t = timers[deviceId] 
-		t.cancel()
-	if (method == 1):
-		#on
-		t = Timer(0.5, turnOn) #start timer with 0.5 second delay (adjust the delay to suit your needs), then turn on
-	else:
-		#off
-		t = Timer(0.5, turnOff) #start timer with 0.5 second delay (adjust the delay to suit your needs), then turn off
-
-	t.start()
-	timers[deviceId] = t #put timer in list, to allow later cancellation
-
-#function to be called when device event occurs, even for unregistered devices
-def rawcallbackfunction(data, controllerId, callbackId, context):
-	print string_at(data)
-
-if (platform.system() == 'Windows'):
-	CMPFUNC = WINFUNCTYPE(None, c_int, c_int, POINTER(c_ubyte), c_int, c_void_p) #first is return type
-	CMPFUNCRAW = WINFUNCTYPE(None, POINTER(c_ubyte), c_int, c_int, c_void_p)
-else:
-	CMPFUNC = CFUNCTYPE(None, c_int, c_int, POINTER(c_ubyte), c_int, c_void_p)
-	CMPFUNCRAW = CFUNCTYPE(None, POINTER(c_ubyte), c_int, c_int, c_void_p)
-
-cmp_func = CMPFUNC(callbackfunction)
-cmp_funcraw = CMPFUNCRAW(rawcallbackfunction)
-
-lib.tdInit()
-lib.tdRegisterDeviceEvent(cmp_func, 0)
-#lib.tdRegisterRawDeviceEvent(cmp_funcraw, 0) #uncomment this, and comment out tdRegisterDeviceEvent, to see data for not registered devices
-
-print "Waiting for events..."
-while(1):
-	time.sleep(0.5) #don't exit
diff --git a/examples/python/live/server/Client.py b/examples/python/live/server/Client.py
deleted file mode 100644
index f73ced4c..00000000
--- a/examples/python/live/server/Client.py
+++ /dev/null
@@ -1,136 +0,0 @@
-# -*- coding: utf-8 -*-
-
-import socket, ssl
-import time, os
-
-from configobj import ConfigObj
-
-from ServerList import *
-from TelldusCore import *
-from LiveMessage import *
-
-class Client():
-	def __init__(self):
-		self.publicKey = ''
-		self.privateKey = ''
-		self.hashMethod = 'sha1'
-		self.pongTimer = 0
-		self.pingTimer = 0
-		self.supportedMethods = 0
-		self.tellduscore = TelldusCore()
-		self.serverList = ServerList()
-
-		self.configPath = os.environ['HOME'] + '/.config/Telldus'
-		self.configFilename = 'TelldusLive.conf'
-		self.config = ConfigObj(self.configPath + '/' + self.configFilename)
-		self.connect(self.serverList.popServer())
-
-	def __del__(self):
-		try:
-			os.makedirs(self.configPath)
-		except:
-			pass
-		self.config.write()
-
-	def connect(self, server):
-		s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
-		self.socket = ssl.wrap_socket(s, ssl_version=ssl.PROTOCOL_TLSv1, ca_certs="/etc/ssl/certs/ca-certificates.crt",cert_reqs=ssl.CERT_REQUIRED)
-		self.socket.settimeout(5)
-		self.socket.connect((server['address'], int(server['port'])))
-
-		uuid = ''
-		try:
-			uuid = self.config['uuid']
-		except:
-			pass
-
-		msg = LiveMessage('Register')
-		msg.append({
-			'key': self.publicKey,
-			'uuid': uuid,
-			'hash': self.hashMethod
-		})
-		msg.append({
-			'protocol': 2,
-			'version': '1',
-			'os': 'linux',
-			'os-version': 'unknown'
-		})
-
-		self.socket.write(self.signedMessage(msg))
-		self.pongTimer = time.time()
-		self.pingTimer = time.time()
-		while(1):
-			try:
-				resp = self.socket.read(1024)
-			except ssl.SSLError:
-				# Timeout, try again after some maintenance
-				if (time.time() - self.pongTimer >= 360):  # No pong received
-					print("No pong received, disconnecting")
-					break
-				if (time.time() - self.pingTimer >= 120):
-					# Time to ping
-					msg = LiveMessage("Ping")
-					self.socket.write(self.signedMessage(msg))
-					self.pingTimer = time.time()
-
-				continue
-
-			if (resp == ''):
-				print("no response")
-				break
-
-			envelope = LiveMessage.fromByteArray(resp)
-			if (not envelope.verifySignature(self.hashMethod, self.privateKey)):
-				print "Signature failed"
-				continue
-
-			self.pongTimer = time.time()
-			self.handleMessage(LiveMessage.fromByteArray(envelope.argument(0).stringVal))
-
-	def handleCommand(self, args):
-		if (args['action'].stringVal == 'turnon'):
-			self.tellduscore.turnon(args['id'].intVal)
-		elif (args['action'].stringVal == 'turnoff'):
-			self.tellduscore.turnoff(args['id'].intVal)
-		else:
-			return
-
-		if ('ACK' in args):
-			#Respond to ack
-			msg = LiveMessage("ACK")
-			msg.append(args['ACK'].intVal)
-			self.socket.write(self.signedMessage(msg))
-
-	def handleMessage(self, message):
-		if (message.name() == "notregistered"):
-			params = message.argument(0).dictVal
-			self.config['uuid'] = params['uuid'].stringVal
-			self.config['activationUrl'] = params['url'].stringVal
-			print "This client isn't activated, please activate it using this url:\n%s" % params['url'].stringVal
-			return
-
-		if (message.name() == "registered"):
-			params = message.argument(0).dictVal
-			self.supportedMethods = params['supportedMethods'].intVal
-			self.tellduscore.setSupportedMethods(self.supportedMethods)
-			self.sendDevicesReport()
-			return
-
-		if (message.name() == "command"):
-			self.handleCommand(message.argument(0).dictVal)
-			return
-
-		if (message.name() == "pong"):
-			return
-
-		print "Did not understand: %s" % message.toByteArray()
-
-
-	def sendDevicesReport(self):
-		msg = LiveMessage("DevicesReport")
-		msg.append(self.tellduscore.getList())
-		self.socket.write(self.signedMessage(msg))
-
-	def signedMessage(self, message):
-		return message.toSignedMessage(self.hashMethod, self.privateKey)
diff --git a/examples/python/live/server/LiveMessage.py b/examples/python/live/server/LiveMessage.py
deleted file mode 100644
index 1741f256..00000000
--- a/examples/python/live/server/LiveMessage.py
+++ /dev/null
@@ -1,71 +0,0 @@
-# -*- coding: utf-8 -*-
-
-import hashlib
-from LiveMessageToken import *
-
-class LiveMessage():
-	def __init__(self, name = ""):
-		if (name != ""):
-			self.args = [LiveMessageToken(name)]
-		else:
-			self.args = []
-
-	def append(self, argument):
-		self.args.append(LiveMessageToken(argument))
-
-	def argument(self,index):
-		if (len(self.args) > index+1):
-			return self.args[index+1]
-
-		return LiveMessageToken()
-
-	def count(self):
-		return len(self.args)-1
-
-	def name(self):
-		return self.argument(-1).stringVal.lower()
-
-	def toByteArray(self):
-		retval = ''
-		for arg in self.args:
-			retval = retval + arg.toByteArray()
-		return retval
-
-	def toSignedMessage(self, hashMethod, privateKey):
-		message = self.toByteArray()
-		envelope = LiveMessage(LiveMessage.signatureForMessage(message, hashMethod, privateKey))
-		envelope.append(message)
-		return envelope.toByteArray()
-
-	def verifySignature(self, hashMethod, privateKey):
-		signature = self.name()
-		rawMessage = self.argument(0).stringVal
-		return (self.signatureForMessage(rawMessage, hashMethod, privateKey) == signature)
-
-	@staticmethod
-	def fromByteArray(rawString):
-		list = []
-		start = 0
-		while (start < len(rawString)):
-			start, token = LiveMessageToken.parseToken(rawString, start)
-			if (token.valueType == LiveMessageToken.TYPE_INVALID):
-				break
-			list.append(token)
-
-		msg = LiveMessage()
-		msg.args = list
-		return msg
-
-	@staticmethod
-	def signatureForMessage(msg, hashMethod, privateKey):
-		h = 0
-		if (hashMethod == "sha512"):
-			h = hashlib.sha512()
-		elif (hashMethod == "sha256"):
-			h = hashlib.sha256()
-		else:
-			h = hashlib.sha1()
-
-		h.update(msg)
-		h.update(privateKey)
-		return h.hexdigest().lower()
diff --git a/examples/python/live/server/LiveMessageToken.py b/examples/python/live/server/LiveMessageToken.py
deleted file mode 100644
index 8064cc7e..00000000
--- a/examples/python/live/server/LiveMessageToken.py
+++ /dev/null
@@ -1,114 +0,0 @@
-# -*- coding: utf-8 -*-
-
-import base64
-
-class LiveMessageToken():
-	TYPE_INVALID, TYPE_INT, TYPE_STRING, TYPE_BASE64, TYPE_LIST, TYPE_DICTIONARY = range(6)
-
-	def __init__(self, value = None):
-		self.valueType = LiveMessageToken.TYPE_INVALID
-		self.stringVal = ''
-		self.intVal = 0
-		self.dictVal = {}
-		self.listVal = []
-		if (type(value) is int):
-			self.valueType = self.TYPE_INT
-			self.intVal = value
-
-		elif (type(value) is str):
-			self.valueType = self.TYPE_STRING
-			self.stringVal = value
-
-		elif (type(value) is list):
-			self.valueType = self.TYPE_LIST
-			for v in value:
-				self.listVal.append(LiveMessageToken(v))
-
-		elif (type(value) is dict):
-			self.valueType = self.TYPE_DICTIONARY
-			for key in value:
-				self.dictVal[key] = LiveMessageToken(value[key])
-
-
-	def toByteArray(self):
-		if (self.valueType == LiveMessageToken.TYPE_INT):
-			return 'i%Xs' % self.intVal
-
-		if (self.valueType == LiveMessageToken.TYPE_LIST):
-			retval = 'l'
-			for token in self.listVal:
-				retval = retval + token.toByteArray()
-			return retval + 's'
-
-		if (self.valueType == LiveMessageToken.TYPE_DICTIONARY):
-			retval = 'h'
-			for key in self.dictVal:
-				retval = retval + LiveMessageToken(key).toByteArray() + self.dictVal[key].toByteArray()
-			return retval + 's'
-
-		return '%X:%s' % (len(self.stringVal), self.stringVal,)
-
-	@staticmethod
-	def parseToken(string, start):
-		token = LiveMessageToken()
-		if (start >= len(string)):
-			return (start, token)
-
-		if (string[start] == 'i'):
-			start+=1
-			index = string.find('s', start)
-			if (index < 0):
-				return (start, token)
-
-			try:
-				token.intVal = int(string[start:index], 16)
-				token.valueType = LiveMessageToken.TYPE_INT
-				start = index + 1
-			except:
-				return (start, token)
-
-		elif (string[start] == 'l'):
-			start+=1
-			while (start < len(string) and string[start] != 's'):
-				start, listToken = LiveMessageToken.parseToken(string, start)
-				if (listToken.valueType == LiveMessageToken.TYPE_INVALID):
-					break
-				token.valueType = LiveMessageToken.TYPE_LIST
-				token.listVal.append(listToken)
-			start+=1
-
-		elif (string[start] == 'h'):
-			start+=1
-			while (start < len(string) and string[start] != 's'):
-				start, keyToken = LiveMessageToken.parseToken(string, start)
-				if (keyToken.valueType == LiveMessageToken.TYPE_INVALID):
-					break
-				start, valueToken = LiveMessageToken.parseToken(string, start)
-				if (valueToken.valueType == LiveMessageToken.TYPE_INVALID):
-					break
-				token.valueType = LiveMessageToken.TYPE_DICTIONARY
-				token.dictVal[keyToken.stringVal] = valueToken
-			start+=1
-
-		elif (string[start] == 'u'): #Base64
-			start+=1
-			start, token = LiveMessageToken.parseToken(string, start)
-			token.valueType = LiveMessageToken.TYPE_BASE64
-			token.stringVal = base64.decodestring(token.stringVal)
-
-		else: #String
-			index = string.find(':', start)
-			if (index < 0):
-				return (start, token)
-
-			try:
-				length = int(string[start:index], 16)
-			except:
-				return (start, token)
-
-			start = index + length + 1
-			token.stringVal = string[index+1:start]
-			token.valueType = LiveMessageToken.TYPE_STRING
-
-		return (start, token)
-
diff --git a/examples/python/live/server/ServerList.py b/examples/python/live/server/ServerList.py
deleted file mode 100644
index 00ebcb10..00000000
--- a/examples/python/live/server/ServerList.py
+++ /dev/null
@@ -1,34 +0,0 @@
-# -*- coding: utf-8 -*-
-
-import httplib
-import xml.parsers.expat
-
-class ServerList():
-
-	def __init__(self):
-		self.list = []
-		self.retrieveServerList()
-
-	def popServer(self):
-		if (self.list == []):
-			self.retrieveServerList()
-
-		if (self.list == []):
-			return False
-
-		return self.list.pop(0)
-
-
-	def retrieveServerList(self):
-		conn = httplib.HTTPConnection("api.telldus.com:80")
-		conn.request('GET', "/server/assign?protocolVersion=2")
-		response = conn.getresponse()
-
-		p = xml.parsers.expat.ParserCreate()
-
-		p.StartElementHandler = self._startElement
-		p.Parse(response.read())
-
-	def _startElement(self, name, attrs):
-		if (name == 'server'):
-			self.list.append(attrs)
diff --git a/examples/python/live/server/TelldusCore.py b/examples/python/live/server/TelldusCore.py
deleted file mode 100644
index 43667dde..00000000
--- a/examples/python/live/server/TelldusCore.py
+++ /dev/null
@@ -1,40 +0,0 @@
-# -*- coding: utf-8 -*-
-
-import ctypes
-
-class TelldusCore():
-
-	def __init__(self):
-		self.supportedMethods = 0
-		self.lib = ctypes.cdll.LoadLibrary('libtelldus-core.so')
-		self.list = []
-		for i in range(self.lib.tdGetNumberOfDevices()):
-			id = self.lib.tdGetDeviceId(i)
-			device = {'id': id}
-			namePtr = self.lib.tdGetName(id)
-			device['name'] = ctypes.c_char_p(namePtr).value
-			self.lib.tdReleaseString(namePtr)
-			stateValuePtr = self.lib.tdLastSentValue(id)
-			device['stateValue'] = ctypes.c_char_p(stateValuePtr).value
-			self.lib.tdReleaseString(stateValuePtr)
-			self.list.append(device)
-
-	def getList(self):
-		return self.list
-
-	def setSupportedMethods(self, supportedMethods):
-		if (self.supportedMethods == supportedMethods):
-			return
-
-		self.supportedMethods = supportedMethods
-		for device in self.list:
-			device['methods'] = self.lib.tdMethods(device['id'], supportedMethods)
-			device['state'] = self.lib.tdLastSentCommand(device['id'], supportedMethods)
-
-	def turnoff(self, id):
-		print "Turning off: %i" % id
-		self.lib.tdTurnOff(id)
-
-	def turnon(self, id):
-		print "Turning on: %i" % id
-		self.lib.tdTurnOn(id)
diff --git a/examples/python/live/server/run-client.py b/examples/python/live/server/run-client.py
deleted file mode 100755
index 4153955e..00000000
--- a/examples/python/live/server/run-client.py
+++ /dev/null
@@ -1,10 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-
-import signal
-from Client import *
-
-if __name__ == "__main__":
-	c = Client()
-	#signal.signal(signal.SIGINT, c.shutdown)
-	#c.start()
diff --git a/examples/python/live/tdtool/tdtool.py b/examples/python/live/tdtool/tdtool.py
deleted file mode 100755
index 4c52d8ee..00000000
--- a/examples/python/live/tdtool/tdtool.py
+++ /dev/null
@@ -1,239 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-
-import sys, getopt, httplib, urllib, json, os
-import oauth.oauth as oauth
-from configobj import ConfigObj
-
-PUBLIC_KEY = ''
-PRIVATE_KEY = ''
-
-TELLSTICK_TURNON = 1
-TELLSTICK_TURNOFF = 2
-TELLSTICK_BELL = 4
-TELLSTICK_DIM = 16
-TELLSTICK_UP = 128
-TELLSTICK_DOWN = 256
-
-SUPPORTED_METHODS = TELLSTICK_TURNON | TELLSTICK_TURNOFF | TELLSTICK_BELL | TELLSTICK_DIM | TELLSTICK_UP | TELLSTICK_DOWN;
-
-def printUsage():
-	print("Usage: %s [ options ]" % sys.argv[0])
-	print("")
-	print("Options:")
-	print("         -[lnfdbvh] [ --list ] [ --help ]")
-	print("                      [ --on device ] [ --off device ] [ --bell device ]")
-	print("                      [ --dimlevel level --dim device ]")
-	print("                      [ --up device --down device ]")
-	print("")
-	print("       --list (-l short option)")
-	print("             List currently configured devices.")
-	print("")
-	print("       --help (-h short option)")
-	print("             Shows this screen.")
-	print("")
-	print("       --on device (-n short option)")
-	print("             Turns on device. 'device' must be an integer of the device-id")
-	print("             Device-id and name is outputed with the --list option")
-	print("")
-	print("       --off device (-f short option)")
-	print("             Turns off device. 'device' must be an integer of the device-id")
-	print("             Device-id and name is outputed with the --list option")
-	print("")
-	print("       --dim device (-d short option)")
-	print("             Dims device. 'device' must be an integer of the device-id")
-	print("             Device-id and name is outputed with the --list option")
-	print("             Note: The dimlevel parameter must be set before using this option.")
-	print("")
-	print("       --dimlevel level (-v short option)")
-	print("             Set dim level. 'level' should an integer, 0-255.")
-	print("             Note: This parameter must be set before using dim.")
-	print("")
-	print("       --bell device (-b short option)")
-	print("             Sends bell command to devices supporting this. 'device' must")
-	print("             be an integer of the device-id")
-	print("             Device-id and name is outputed with the --list option")
-	print("")
-	print("       --up device")
-	print("             Sends up command to devices supporting this. 'device' must")
-	print("             be an integer of the device-id")
-	print("             Device-id and name is outputed with the --list option")
-	print("")
-	print("       --down device")
-	print("             Sends down command to devices supporting this. 'device' must")
-	print("             be an integer of the device-id")
-	print("             Device-id and name is outputed with the --list option")
-	print("")
-	print("Report bugs to ")
-
-def listDevices():
-	response = doRequest('devices/list', {'supportedMethods': SUPPORTED_METHODS})
-	print("Number of devices: %i" % len(response['device']));
-	for device in response['device']:
-		if (device['state'] == TELLSTICK_TURNON):
-			state = 'ON'
-		elif (device['state'] == TELLSTICK_TURNOFF):
-			state = 'OFF'
-		elif (device['state'] == TELLSTICK_DIM):
-			state = "DIMMED"
-		elif (device['state'] == TELLSTICK_UP):
-			state = "UP"
-		elif (device['state'] == TELLSTICK_DOWN):
-			state = "DOWN"
-		else:
-			state = 'Unknown state'
-
-		print("%s\t%s\t%s" % (device['id'], device['name'], state));
-
-def doMethod(deviceId, methodId, methodValue = 0):
-	response = doRequest('device/info', {'id': deviceId})
-
-	if (methodId == TELLSTICK_TURNON):
-		method = 'on'
-	elif (methodId == TELLSTICK_TURNOFF):
-		method = 'off'
-	elif (methodId == TELLSTICK_BELL):
-		method = 'bell'
-	elif (methodId == TELLSTICK_UP):
-		method = 'up'
-	elif (methodId == TELLSTICK_DOWN):
-		method = 'down'
-
-	if ('error' in response):
-		name = ''
-		retString = response['error']
-	else:
-		name = response['name']
-		response = doRequest('device/command', {'id': deviceId, 'method': methodId, 'value': methodValue})
-		if ('error' in response):
-			retString = response['error']
-		else:
-			retString = response['status']
-
-	if (methodId in (TELLSTICK_TURNON, TELLSTICK_TURNOFF)):
-		print("Turning %s device %s, %s - %s" % ( method, deviceId, name, retString));
-	elif (methodId in (TELLSTICK_BELL, TELLSTICK_UP, TELLSTICK_DOWN)):
-		print("Sending %s to: %s %s - %s" % (method, deviceId, name, retString))
-	elif (methodId == TELLSTICK_DIM):
-		print("Dimming device: %s %s to %s - %s" % (deviceId, name, methodValue, retString))
-
-
-def doRequest(method, params):
-	global config
-	consumer = oauth.OAuthConsumer(PUBLIC_KEY, PRIVATE_KEY)
-	token = oauth.OAuthToken(config['token'], config['tokenSecret'])
-
-	oauth_request = oauth.OAuthRequest.from_consumer_and_token(consumer, token=token, http_method='GET', http_url="http://api.telldus.com/json/" + method, parameters=params)
-	oauth_request.sign_request(oauth.OAuthSignatureMethod_HMAC_SHA1(), consumer, token)
-	headers = oauth_request.to_header()
-	headers['Content-Type'] = 'application/x-www-form-urlencoded'
-
-	conn = httplib.HTTPConnection("api.telldus.com:80")
-	conn.request('GET', "/json/" + method + "?" + urllib.urlencode(params, True).replace('+', '%20'), headers=headers)
-
-	response = conn.getresponse()
-	return json.load(response)
-
-def requestToken():
-	global config
-	consumer = oauth.OAuthConsumer(PUBLIC_KEY, PRIVATE_KEY)
-	request = oauth.OAuthRequest.from_consumer_and_token(consumer, http_url='http://api.telldus.com/oauth/requestToken')
-	request.sign_request(oauth.OAuthSignatureMethod_HMAC_SHA1(), consumer, None)
-	conn = httplib.HTTPConnection('api.telldus.com:80')
-	conn.request(request.http_method, '/oauth/requestToken', headers=request.to_header())
-
-	resp = conn.getresponse().read()
-	token = oauth.OAuthToken.from_string(resp)
-	print 'Open the following url in your webbrowser:\nhttp://api.telldus.com/oauth/authorize?oauth_token=%s\n' % token.key
-	print 'After logging in and accepting to use this application run:\n%s --authenticate' % (sys.argv[0])
-	config['requestToken'] = str(token.key)
-	config['requestTokenSecret'] = str(token.secret)
-	saveConfig()
-
-def getAccessToken():
-	global config
-	consumer = oauth.OAuthConsumer(PUBLIC_KEY, PRIVATE_KEY)
-	token = oauth.OAuthToken(config['requestToken'], config['requestTokenSecret'])
-	request = oauth.OAuthRequest.from_consumer_and_token(consumer, token=token, http_method='GET', http_url='http://api.telldus.com/oauth/accessToken')
-	request.sign_request(oauth.OAuthSignatureMethod_HMAC_SHA1(), consumer, token)
-	conn = httplib.HTTPConnection('api.telldus.com:80')
-	conn.request(request.http_method, request.to_url(), headers=request.to_header())
-
-	resp = conn.getresponse()
-	if resp.status != 200:
-		print 'Error retreiving access token, the server replied:\n%s' % resp.read()
-		return
-	token = oauth.OAuthToken.from_string(resp.read())
-	config['requestToken'] = None
-	config['requestTokenSecret'] = None
-	config['token'] = str(token.key)
-	config['tokenSecret'] = str(token.secret)
-	print 'Authentication successful, you can now use tdtool'
-	saveConfig()
-
-def authenticate():
-	try:
-		opts, args = getopt.getopt(sys.argv[1:], '', ['authenticate'])
-		for opt, arg in opts:
-			if opt in ('--authenticate'):
-				getAccessToken()
-				return
-	except getopt.GetoptError:
-		pass
-	requestToken()
-
-def saveConfig():
-	global config
-	try:
-		os.makedirs(os.environ['HOME'] + '/.config/Telldus')
-	except:
-		pass
-	config.write()
-
-def main(argv):
-	global config
-	if ('token' not in config or config['token'] == ''):
-		authenticate()
-		return
-	try:
-		opts, args = getopt.getopt(argv, "ln:f:d:b:v:h", ["list", "on=", "off=", "dim=", "bell=", "dimlevel=", "up=", "down=", "help"])
-	except getopt.GetoptError:
-		printUsage()
-		sys.exit(2)
-
-	dimlevel = -1
-
-	for opt, arg in opts:
-		if opt in ("-h", "--help"):
-			printUsage()
-
-		elif opt in ("-l", "--list"):
-			listDevices()
-
-		elif opt in ("-n", "--on"):
-			doMethod(arg, TELLSTICK_TURNON)
-
-		elif opt in ("-f", "--off"):
-			doMethod(arg, TELLSTICK_TURNOFF)
-
-		elif opt in ("-b", "--bell"):
-			doMethod(arg, TELLSTICK_BELL)
-
-		elif opt in ("-d", "--dim"):
-			if (dimlevel < 0):
-				print("Dimlevel must be set with --dimlevel before --dim")
-			else:
-				doMethod(arg, TELLSTICK_DIM, dimlevel)
-
-		elif opt in ("-v", "--dimlevel"):
-			dimlevel = arg
-
-		elif opt in ("--up"):
-			doMethod(arg, TELLSTICK_UP)
-
-		elif opt in ("--down"):
-			doMethod(arg, TELLSTICK_DOWN)
-
-if __name__ == "__main__":
-	config = ConfigObj(os.environ['HOME'] + '/.config/Telldus/tdtool.conf')
-	main(sys.argv[1:])
diff --git a/examples/python/sensors/sensorscallback.py b/examples/python/sensors/sensorscallback.py
deleted file mode 100644
index 8dc5ffd8..00000000
--- a/examples/python/sensors/sensorscallback.py
+++ /dev/null
@@ -1,48 +0,0 @@
- 
-from ctypes import c_int, c_ubyte, c_void_p, POINTER, string_at, create_string_buffer, c_char_p, c_int, byref #imports allowing the use of our library
-import time
-import platform
-from datetime import datetime
-
-#platform specific imports:
-if (platform.system() == 'Windows'):
-	#Windows
-	from ctypes import windll, WINFUNCTYPE
-	lib = windll.LoadLibrary('TelldusCore.dll') #import our library
-else:
-	#Linux
-	from ctypes import cdll, CFUNCTYPE
-	lib = cdll.LoadLibrary('libtelldus-core.so.2') #import our library
-
-TELLSTICK_TEMPERATURE = 1;
-TELLSTICK_HUMIDITY = 2;
-
-#function to be called when a sensor event occurs		
-def callbackfunction(protocol, model, id, dataType, value, timestamp, callbackId, context):
-	
-	print "Sensor:", string_at(protocol), string_at(model), "id:", id
-	if(dataType == TELLSTICK_TEMPERATURE):
-		print "Temperature:", string_at(value), "C,", datetime.fromtimestamp(timestamp)
-	elif(dataType == TELLSTICK_HUMIDITY):
-		print "Humidity:", string_at(value), "%,", datetime.fromtimestamp(timestamp)
-	print ""
-
-
-if (platform.system() == 'Windows'):
-	CMPFUNC = WINFUNCTYPE(None, POINTER(c_ubyte), POINTER(c_ubyte), c_int, c_int, POINTER(c_ubyte), c_int, c_int, c_void_p) #first is return type
-else:
-	CMPFUNC = CFUNCTYPE(None, POINTER(c_ubyte), POINTER(c_ubyte), c_int, c_int, POINTER(c_ubyte), c_int, c_int, c_void_p)
-
-cmp_func = CMPFUNC(callbackfunction)
-
-lib.tdInit()
-callbackid = lib.tdRegisterSensorEvent(cmp_func, 0)
-
-print "Waiting for events..."
-try:
-	while(1):
-		time.sleep(0.5) #don't exit
-except KeyboardInterrupt:
-	print "Exiting"
-	lib.tdUnregisterCallback(callbackid)
-	lib.tdClose()
diff --git a/examples/python/sensors/sensorspoll.py b/examples/python/sensors/sensorspoll.py
deleted file mode 100644
index 042bebec..00000000
--- a/examples/python/sensors/sensorspoll.py
+++ /dev/null
@@ -1,49 +0,0 @@
- 
-from ctypes import c_int, c_ubyte, c_void_p, POINTER, string_at, create_string_buffer, c_char_p, c_int, byref #imports allowing the use of our library
-from threading import Timer
-import time
-import platform
-from datetime import datetime
-
-#platform specific imports:
-if (platform.system() == 'Windows'):
-	#Windows
-	from ctypes import windll, WINFUNCTYPE
-	lib = windll.LoadLibrary('TelldusCore.dll') #import our library
-else:
-	#Linux
-	from ctypes import cdll, CFUNCTYPE
-	lib = cdll.LoadLibrary('libtelldus-core.so.2') #import our library
-
-TELLSTICK_TEMPERATURE = 1;
-TELLSTICK_HUMIDITY = 2;
-
-def poll():
-	print "getting sensors"
-	
-	protocollength = 20
-	modellength = 20
-	valuelength = 20
-	
-	protocol = create_string_buffer(protocollength)
-	model = create_string_buffer(modellength)
-	idvalue = c_int()
-	dataTypes = c_int()
-	while(lib.tdSensor(protocol, protocollength, model, modellength, byref(idvalue), byref(dataTypes)) == 0):
-		print "Sensor: ", protocol.value, model.value, "id:", idvalue.value
-		value = create_string_buffer(valuelength)
-		timestampvalue = c_int()
-	
-		if((dataTypes.value & TELLSTICK_TEMPERATURE) != 0):
-			success = lib.tdSensorValue(protocol.value, model.value, idvalue.value, TELLSTICK_TEMPERATURE, value, valuelength, byref(timestampvalue))
-			print "Temperature: ", value.value, "C,", datetime.fromtimestamp(timestampvalue.value)
-		
-		if((dataTypes.value & TELLSTICK_HUMIDITY) != 0):
-			success = lib.tdSensorValue(protocol.value, model.value, idvalue.value, TELLSTICK_HUMIDITY, value, valuelength, byref(timestampvalue))
-			print "Humidity: ", value.value, "%,", datetime.fromtimestamp(timestampvalue.value)
-			
-		print " "
-
-lib.tdInit()
-poll()
-lib.tdClose()
\ No newline at end of file
diff --git a/rfcmd/CMakeLists.txt b/rfcmd/CMakeLists.txt
index af4b4484..4b7e4fd1 100644
--- a/rfcmd/CMakeLists.txt
+++ b/rfcmd/CMakeLists.txt
@@ -28,20 +28,15 @@ IF (BUILD_RFCMD_WITH_LIBFTDI)
 		ftdi.c
 	)
 ENDIF (BUILD_RFCMD_WITH_LIBFTDI)
+
 ADD_EXECUTABLE(rfcmd
   ${rfcmd_SRCS}
 )
 
-IF (BUILD_RFCMD_WITH_SEMAPHORES)
-	FIND_LIBRARY(SEM_LIBRARY rt)
-	TARGET_LINK_LIBRARIES(rfcmd
-		${SEM_LIBRARY}
-	)
-ELSE (BUILD_RFCMD_WITH_SEMAPHORES)
-	ADD_DEFINITIONS( -DNO_SEMAPHORES )
-ENDIF (BUILD_RFCMD_WITH_SEMAPHORES)
-
-
+FIND_LIBRARY(SEM_LIBRARY rt)
+TARGET_LINK_LIBRARIES(rfcmd
+	${SEM_LIBRARY}
+)
 
 IF (BUILD_RFCMD_WITH_LIBFTDI)
 	FIND_LIBRARY(FTDI_LIBRARY ftdi)
@@ -84,5 +79,4 @@ IF (BUILD_RFCMD_WITH_LIBFTDI)
 	)
 
 	INSTALL(TARGETS find_telldus RUNTIME DESTINATION bin)
-
 ENDIF (BUILD_RFCMD_WITH_LIBFTDI)
diff --git a/rfcmd/ftdi.c b/rfcmd/ftdi.c
index c229f2cb..399bc469 100644
--- a/rfcmd/ftdi.c
+++ b/rfcmd/ftdi.c
@@ -10,11 +10,6 @@
 
 #define BAUD 4800
 
-void ftdiCleanup(struct ftdi_context *ctx) {
-	ftdi_usb_close( ctx );
-	ftdi_deinit( ctx );
-}
-
 /*
  * use libftdi and libusb to send command
  * no kernel driver needed
@@ -23,88 +18,34 @@ int usbWriteFtdi(char *cmdstr)
 {
 	struct ftdi_context ctx;
 	int device=0x0c30, vendor=0x1781;
-	int retrycnt;
-	int retval = 0;
 
 	if (ftdi_init( &ctx )) {
-		char *err = ftdi_get_error_string(&ctx);
-		fprintf(stderr,  "usb - init error: %s\n", err);
+		fprintf(stderr,  "usb - init error !\n");
 		return 1;
 	}
 
-	retval = ftdi_usb_open(&ctx, vendor, device);
-	if (retval) {
-		char *err = ftdi_get_error_string(&ctx);
-		// FreeBSD says -3 when another rfcmd is running...
-		// Same on other systems?
-		if(retval == -3) {
-			fprintf(stderr,  "usb - open error: %s. Is it busy?\n", err);
-		} else {
-			fprintf(stderr,  "usb - open error: %s\n", err);
-		}
-
+	if (ftdi_usb_open(&ctx, vendor, device)) {
+		fprintf(stderr,  "usb - open error (cannot find?) !\n");
 		ftdi_deinit( &ctx );
 		return 2;
 	}
 
 	if (ftdi_usb_reset( &ctx )) {
-		char *err = ftdi_get_error_string(&ctx);
-		fprintf(stderr,  "usb - reset error: %s\n", err);
-		retval = 3;
-		ftdiCleanup(&ctx);
-		return retval;
+		fprintf(stderr,  "usb - reset error !\n");
+		ftdi_usb_close( &ctx );
+		ftdi_deinit( &ctx );
+		return 3;
 	}
 
-	if (ftdi_disable_bitbang( &ctx ) || ftdi_set_baudrate(&ctx, BAUD)) {
-		char *err = ftdi_get_error_string(&ctx);
-		fprintf(stderr,  "usb - init failed: %s\n", err);
-		ftdiCleanup(&ctx);
-		return 4;
-	}
+	ftdi_disable_bitbang( &ctx );
+	ftdi_set_baudrate(&ctx, BAUD);
 
-	retval = ftdi_write_data( &ctx, cmdstr, strlen(cmdstr) );
-	if (retval < 0) {
-		char *err = ftdi_get_error_string(&ctx);
-		fprintf(stderr,  "usb - write failed: %s\n", err);
-		ftdiCleanup(&ctx);
-		return 5;
-	}	else if(retval != strlen(cmdstr)) {
-		fprintf(stderr,  "usb - warning: %d bytes written instead of %d\n", 
-				retval, (int)strlen(cmdstr));
-	}
+	ftdi_write_data( &ctx, cmdstr, strlen(cmdstr) );
+	sleep(1); /* just for sure */
+	ftdi_usb_close( &ctx );
+	ftdi_deinit( &ctx );
 
-	/**
-	 * Wait for Tellstick to be done with cmd, read back until we've received
-	 * a \n indicating end of response.
-	 * Wait max 5000 * 1000uS.
-	 * XXX: Can the tellstick report errors?
-	 */
-	retval = 0;
-	retrycnt = 5000;
-	while (retrycnt--) {
-		unsigned char inb;
-		int bytes;
-
-		bytes = ftdi_read_data(&ctx, &inb, 1);
-		if (bytes == 0) {
-			usleep(1000);
-		} else if (bytes > 0) {
-			// Done when newline is received
-			if(inb == '\n') {
-				ftdiCleanup(&ctx);
-				return retval;
-			}
-		} else {
-			char *err = ftdi_get_error_string(&ctx);
-			fprintf(stderr,  "usb - read error: %s\n", err);
-			ftdiCleanup(&ctx);
-			return 6;
-		}
-	}
-
-	// if we get here we failed to readback
-	fprintf(stderr,  "usb - warning: never got newline response, giving up on wait\n");
-	return retval;
+	return 0;
 }
 
 
diff --git a/rfcmd/rfcmd.c b/rfcmd/rfcmd.c
index 76901da5..282bea20 100644
--- a/rfcmd/rfcmd.c
+++ b/rfcmd/rfcmd.c
@@ -56,35 +56,6 @@
  *    Arg 5: Level (0=off, 1 = on)
  ******************************************************************************/
 
-/*******************************************************************************
- * Modifications from rfcmd.c ver 2.1.0 based on marvelous work by Snakehand
- * See http://www.telldus.com/forum/viewtopic.php?t=97&start=63
- *  Added support for EVERFLOURISH
- * Note:
- * 1. Command line syntax:
- *    /usr/local/bin/rfcmd  /dev/ttyUSB0  EVERFLOURISH 1 15
- *    Arg 1: device
- *    Arg 2: protocol
- *    Arg 3: device number (0..65535)
- *    Arg 4: Level (0=off, 15=on, 10=learn)
- ******************************************************************************/
-
-/*******************************************************************************
- * Modifications from rfcmd ver 2.1.1 done by Johan Ström
- *  Default disabled semaphores for FreeBSD.
- *  Added status readback in ftdi.c, instead of wasting time in sleep.
- *
- * FreeBSD does not have support in the GENERIC kernel semaphore.
- * To enable usage of them, you'll have have the following option in your
- * kernel configuration:
- *
- *   options P1003_1B_SEMAPHORES
- *
- * However, on FreeBSD only libftdi seems to be working (at least on my system),
- * since the device is not identified as a ucom device. And as we're accessing it
- * via libftdi, libftdi makes sure simultaneous access is impossible.
- ******************************************************************************/
-
 
 #include 
 #include 
@@ -92,13 +63,10 @@
 #include 
 #include 
 #include 
-
-#ifndef NO_SEMAPHORES
 #include 
-#endif
 
 #define PROG_NAME "rfcmd"
-#define PROG_VERSION "2.1.1"
+#define PROG_VERSION "2.1.0"
 /* #define RFCMD_DEBUG */ 
 
 /* Local function declarations */
@@ -111,8 +79,7 @@ int createIkeaString(const char * pSystemStr, const char * pChannelStr,
                      char * pStrReturn);
 int createRisingSunString(const char * pCodeStr, const char* pUnitStr, const char * pOn_offStr,
                         char * pTxStr);
-int createEverFlourishString(const char* pUnitStr, const char * pLevelStr,
-                        char * pTxStr);
+
 void printUsage(void);
 void printVersion(void);
 
@@ -124,10 +91,8 @@ int main( int argc, char **argv )
 {
 	struct termios tio;
 	int fd = -1;
-#ifndef NO_SEMAPHORES
 	sem_t * portMutex;
 	char SEM_NAME[]= "RFCMD_SEM"; /* Semaphore for multiple access ctrl */
-#endif
 
 
 	char txStr[100];
@@ -162,14 +127,7 @@ int main( int argc, char **argv )
 			printUsage();
 			exit(1);
 			}
-		/* else - a send cmd string was created */
-	} else if ( (argc == 5) && (strcmp(*(argv+2),"EVERFLOURISH")==0) ) {
-	//                      Unit,          Level
-		if ( createEverFlourishString(*(argv+3), *(argv+4), txStr) == 0 ) {
-			printUsage();
-			exit(1);
-		}
-		/* else - a send cmd string was created */
+			/* else - a send cmd string was created */
 	} else if ( (argc >= 2) && (strcmp(*(argv+1),"--version")==0) ) {
 		printVersion();
 		exit(1);
@@ -184,40 +142,35 @@ int main( int argc, char **argv )
 #endif
 
 	if(strlen(txStr) > 0) {
-#ifndef NO_SEMAPHORES
 		/* create the semaphore - will reuse an existing one if it exists */
 		portMutex = sem_open(SEM_NAME,O_CREAT,0644,1);
-		if( portMutex == SEM_FAILED) {
+    		if(portMutex == SEM_FAILED)
+    		{
 			fprintf(stderr,  "%s - Error creating port semaphore\n", PROG_NAME);
 			perror("Semaphore open error");
-			sem_unlink(SEM_NAME);
-			exit(1);
+                        sem_unlink(SEM_NAME);
+      			exit(1);
 		}
 
 		/* lock semaphore to protect port from multiple access */
-		if(sem_wait(portMutex) != 0) {
-			fprintf(stderr,  "%s - Error aquiring port semaphore\n", PROG_NAME);
-			sem_unlink(SEM_NAME);
-			sem_close(portMutex);
-			exit(1); 
+    		if(sem_wait(portMutex) != 0)
+		{
+                        fprintf(stderr,  "%s - Error aquiring port semaphore\n", PROG_NAME);
+                        sem_unlink(SEM_NAME);
+                        sem_close(portMutex);
+                        exit(1); 
 		}
-#endif
 
 
 		if (strcmp(*(argv+1), "LIBUSB") != 0) {
 			if( 0 > ( fd = open( *(argv+1), O_RDWR ) ) ) {
-#ifdef __FreeBSD__
-				fprintf(stderr,  "%s - Error opening %s; You're on a FreeBSD system, you should probably use LIBUSB.\n", PROG_NAME, *(argv+1));
-#else
 				fprintf(stderr,  "%s - Error opening %s\n", PROG_NAME, *(argv+1));
-#endif
-#ifndef NO_SEMAPHORES
-				if(sem_post(portMutex) != 0) {
-					fprintf(stderr,  "%s - Error releasing port semaphore\n", PROG_NAME);
+                		if(sem_post(portMutex) != 0)
+                		{
+                        		fprintf(stderr,  "%s - Error releasing port semaphore\n", PROG_NAME);
 				}
-				sem_unlink(SEM_NAME);
-				sem_close(portMutex);
-#endif
+                        	sem_unlink(SEM_NAME);
+                        	sem_close(portMutex);
 				exit(1);
 			}
 
@@ -242,18 +195,19 @@ int main( int argc, char **argv )
 			fprintf(stderr,  "%s - Support for libftdi is not compiled in, please recompile rfcmd with support for libftdi\n", PROG_NAME);
 #endif
 		}
-#ifndef NO_SEMAPHORES
 		/* Unlock semaphore */
-		if (sem_post(portMutex) != 0) {
-			fprintf(stderr,  "%s - Error releasing port semaphore\n", PROG_NAME);
-			sem_unlink(SEM_NAME);
-			sem_close(portMutex);
-			exit(1);
-		} else {
-			sem_unlink(SEM_NAME);
+    		if(sem_post(portMutex) != 0)
+    		{
+                        fprintf(stderr,  "%s - Error releasing port semaphore\n", PROG_NAME);
+                        sem_unlink(SEM_NAME);
+			sem_close(portMutex);          
+        		exit(1);
+    		}
+		else
+		{
+                        sem_unlink(SEM_NAME);
 			sem_close(portMutex);	
 		}
-#endif
 	}
   exit(0);
 }
@@ -546,78 +500,6 @@ int createRisingSunString(const char * pCodeStr, const char * pUnitStr, const ch
 	return strlen(pTxStr);
 }
 
-unsigned int everflourish_find_code(unsigned int x) {
-	unsigned int bits[16] = { 0xf ,0xa ,0x7 ,0xe,
-	                          0xf ,0xd ,0x9 ,0x1,
-	                          0x1 ,0x2 ,0x4 ,0x8,
-	                          0x3 ,0x6 ,0xc ,0xb };
-	unsigned int bit = 1;
-	unsigned int res = 0x5;
-	int i;
-	unsigned int lo,hi;
-
-	if ((x&0x3)==3) {
-		lo = x & 0x00ff;
-		hi = x & 0xff00;
-		lo += 4;
-		if (lo>0x100) lo = 0x12;
-		x = lo | hi;
-	}
-
-	for(i=0;i<16;i++) {
-		if (x&bit) {
-			res = res ^ bits[i];
-		}
-		bit = bit << 1;
-	}
-
-	return res;
-}
-
-
-int createEverFlourishString(const char * pUnitStr, const char * pLevelStr,
-                        char * pTxStr)
-{
-	int len = 0;
-	int level;
-	int unit;
-	unsigned int check;
-	int i;
-
-	unit = atoi(pUnitStr);
-	level = atoi(pLevelStr);                /* ON=15, OFF=0, LEARN=10 */
-	check = everflourish_find_code(unit);
-
-#ifdef RFCMD_DEBUG
-   printf("unit: %d, level: %d\n", unit, level);
-#endif
-
-	/* check converted parameters for validity */
-	if((unit < 0) || (unit > 0xffff) ||
-	  (level < 0) || (level > 15)) {
-	} else {
-		const char ssss = 85;
-		const char sssl = 84; // 0
-		const char slss = 69; // 1
-
-		const char bits[2] = {sssl,slss};
-		int i;
-
-		char preamble[] = {'R', 5, 'T', 114,60,1,1,105,ssss,ssss};
-		memcpy(pTxStr, preamble, sizeof(preamble));
-		len += sizeof(preamble);
-
-		for(i=15;i>=0;i--) pTxStr[len++]=bits[(unit>>i)&0x01];
-		for(i=3;i>=0;i--) pTxStr[len++]=bits[(check>>i)&0x01];
-		for(i=3;i>=0;i--) pTxStr[len++]=bits[(level>>i)&0x01];
-
-		pTxStr[len++] = ssss;
-		pTxStr[len++] = '+';
-	}
-
-	pTxStr[len] = '\0';
-	return strlen(pTxStr);
-}
 
 void printUsage(void)
 {
@@ -628,7 +510,7 @@ void printUsage(void)
 #else
 	printf("\t DEVICE: /dev/ttyUSB[0..n]\n" );
 #endif
-	printf("\t PROTOCOLS: NEXA, SARTANO, WAVEMAN, IKEA, RISINGSUN, EVERFLOURISH\n" );
+	printf("\t PROTOCOLS: NEXA, SARTANO, WAVEMAN, IKEA, RISINGSUN\n" );
 	printf("\n");
 	printf("\t PROTOCOL ARGUMENTS - NEXA, WAVEMAN:\n");
 	printf("\t\tHOUSE_CODE: A..P\n\t\tCHANNEL: 1..16\n\t\tOFF_ON: 0..1\n" );
@@ -644,10 +526,6 @@ void printUsage(void)
 	printf("\t\tCODE: 1..4\n\t\tDEVICE: 1..4\n");
 	printf("\t\tOFF_ON: 0..1\n" );
 	printf("\n");
-	printf("\t PROTOCOL ARGUMENTS - EVERFLOURISH:\n");
-	printf("\t\tDEVICE: 0..65535\n");
-	printf("\t\tLEVEL: 0=off, 10=learn, 15=on\n" );
-	printf("\n");
 	printf("Report bugs to \n");
 }
 
@@ -656,8 +534,6 @@ void printVersion(void) {
 	printf("\n");
 	printf("Copyright (C) Tord Andersson 2007\n");
 	printf("\n");
-	printf("Written by:\n");
-	printf("Tord Andersson, Micke Prag, Gudmund Berggren, Tapani Rintala\n");
-	printf("and Johan Ström\n");
+	printf("Written by Tord Andersson, Micke Prag, Gudmund Berggren and Tapani Rintala\n");
 }
 
diff --git a/scheduler/DeviceHandler/DeviceHandler.csproj b/scheduler/DeviceHandler/DeviceHandler.csproj
deleted file mode 100644
index 8282e078..00000000
--- a/scheduler/DeviceHandler/DeviceHandler.csproj
+++ /dev/null
@@ -1,58 +0,0 @@
-
-  
-    Debug
-    AnyCPU
-    9.0.30729
-    2.0
-    {292E034F-C3B8-4CED-87DD-479040094118}
-    Library
-    Properties
-    DeviceHandler
-    DeviceHandler
-    
-    
-    2.0
-    v2.0
-    
-    
-    
-    
-  
-  
-    true
-    full
-    false
-    bin\Debug\
-    DEBUG;TRACE
-    prompt
-    4
-  
-  
-    pdbonly
-    true
-    bin\Release\
-    TRACE
-    prompt
-    4
-  
-  
-    
-    
-    
-  
-  
-    
-    
-  
-  
-    
-  
-  
-  
-
\ No newline at end of file
diff --git a/scheduler/DeviceHandler/Handler.cs b/scheduler/DeviceHandler/Handler.cs
deleted file mode 100644
index 5efabf15..00000000
--- a/scheduler/DeviceHandler/Handler.cs
+++ /dev/null
@@ -1,236 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Text;
-using System.Runtime.InteropServices;
-using System.Runtime.Serialization;
-
-namespace DeviceHandler
-{
-    public class Handler
-    {
-
-
-        #region Unmanaged Code
-        [DllImport("TelldusCore.dll")]
-        private static extern bool tdTurnOn(int value);
-
-        [DllImport("TelldusCore.dll")]
-        private static extern bool tdTurnOff(int value);
-
-        [DllImport("TelldusCore.dll")]
-        private static extern bool tdBell(int value);
-
-        [DllImport("TelldusCore.dll")]
-        private static extern int tdGetDeviceId(int value);
-
-        [DllImport("TelldusCore.dll")]
-        private static unsafe extern char* tdGetName(int value);
-
-        [DllImport("TelldusCore.dll")]
-        private static unsafe extern char* tdGetProtocol(int value);
-
-        [DllImport("TelldusCore.dll")]
-        private static extern int tdGetNumberOfDevices();
-
-        [DllImport("TelldusCore.dll")]
-        private static extern int tdClose();
-
-		[DllImport("TelldusCore.dll")]
-		private static unsafe extern void tdReleaseString(char* value);
-        #endregion
-
-        private List m_Devices = new List();
-
-        public Device Find(int deviceID)
-        {
-            foreach (Device item in m_Devices)
-            {
-                if (item.ID == deviceID)
-                    return item;
-            }
-
-            return null;
-        }
-
-        /// 
-        /// Turns off a specific device.
-        /// 
-        /// The item in question.
-        /// True if the command was successfull and false if not.
-        public bool TurnOff(Device item)
-        {
-            return tdTurnOff(item.ID);
-        }
-
-        public bool TurnOffWithDelay(Device item)
-        {
-            bool result = tdTurnOff(item.ID);
-            System.Threading.Thread.Sleep(1000);
-            return result;
-        }
-
-        /// 
-        /// Turns on a specific device.
-        /// 
-        /// The device in question.
-        /// True if the command was successfull.
-        public bool TurnOn(Device item)
-        {
-            return tdTurnOn(item.ID);
-        }
-
-
-        public bool TurnOnWithDelay(Device item)
-        {
-            //Makesure that we halt for 1 second so that the Telldus stick have time to send the signal.
-            bool result = tdTurnOn(item.ID);
-            System.Threading.Thread.Sleep(1000);
-            return result;
-        }
-
-
-        /// 
-        /// Sends the bell signal.
-        /// 
-        /// The device in question.
-        /// True if the command was successfull.
-        public bool Bell(Device item)
-        {
-            return tdBell(item.ID);
-        }
-
-        public bool BellWithDelay(Device item)
-        {
-            //Makesure that we halt for 1 second so that the Telldus stick have time to send the signal.
-            bool result = tdBell(item.ID);
-            System.Threading.Thread.Sleep(1000);
-            return result;
-        }
-
-		/// 
-		/// Get name for device, as a string
-		/// 
-		/// 
-		/// 
-		private static unsafe string getName(int deviceId)
-		{
-			char* name = tdGetName(deviceId);
-
-			string returnstring = System.Text.Encoding.UTF8.GetString(System.Text.Encoding.Unicode.GetBytes(new string(name)));
-
-			tdReleaseString(name);
-			return returnstring;
-
-		}
-
-		/// 
-		/// Get protocol for device, as a string
-		/// 
-		/// 
-		/// 
-		private static unsafe string getProtocol(int deviceId)
-		{
-			char* name = tdGetProtocol(deviceId);
-
-			string returnstring = System.Text.Encoding.UTF8.GetString(System.Text.Encoding.Unicode.GetBytes(new string(name)));
-
-			tdReleaseString(name);
-			return returnstring;
-
-		}
-
-        /// 
-        /// Loads all known devices into a collection.
-        /// 
-        /// True if the process was successfull.
-        public bool Load()
-        {
-            try
-            {
-                m_Devices.Clear();
-
-                int count = tdGetNumberOfDevices() - 1;
-                for (int i = 0; i <= count; i++)
-                {
-                    //Collect information from the driver.
-                    int deviceID = tdGetDeviceId(i);
-					string deviceName = getName(deviceID);
-					string deviceProtocol = getProtocol(deviceID);
-
-                    m_Devices.Add(new Device(deviceID, deviceName, deviceProtocol));
-                }
-
-                return true;
-            }
-            catch
-            {
-                return false;
-            }
-        }
-
-        public List Devices
-        {
-            get 
-            {
-                if (m_Devices.Count == 0)
-                    Load();
-
-                return m_Devices; 
-            
-            }
-            set { m_Devices = value; }
-        }
-    }
-
-    [Serializable]
-    public class Device:ISerializable
-    {
-        private int m_ID = -1;
-        private string m_Name = "";
-        private string m_Protocol = "";
-
-        public Device(SerializationInfo info,StreamingContext cntx)
-        { 
-            
-        }
-
-        public Device(int id, string name,string protocol)
-        {
-            m_ID = id;
-            m_Name = name;
-            m_Protocol = protocol;
-        }
-
-        public int ID
-        {
-            get { return m_ID; }
-            set { m_ID = value; }
-        }
-
-        public string Name
-        {
-            get { return m_Name; }
-            set { m_Name = value; }
-        }
-
-        public string Protocol
-        {
-            get { return m_Protocol; }
-            set { m_Protocol = value; }
-        }
-
-        public override string ToString()
-        {
-            return m_Name;
-        }
-
-        #region ISerializable Members
-
-        public void GetObjectData(SerializationInfo info, StreamingContext context)
-        {
-            throw new Exception("The method or operation is not implemented.");
-        }
-
-        #endregion
-    }
-}
diff --git a/scheduler/DeviceHandler/Properties/AssemblyInfo.cs b/scheduler/DeviceHandler/Properties/AssemblyInfo.cs
deleted file mode 100644
index 5c428954..00000000
--- a/scheduler/DeviceHandler/Properties/AssemblyInfo.cs
+++ /dev/null
@@ -1,35 +0,0 @@
-using System.Reflection;
-using System.Runtime.CompilerServices;
-using System.Runtime.InteropServices;
-
-// General Information about an assembly is controlled through the following 
-// set of attributes. Change these attribute values to modify the information
-// associated with an assembly.
-[assembly: AssemblyTitle("DeviceHandler")]
-[assembly: AssemblyDescription("")]
-[assembly: AssemblyConfiguration("")]
-[assembly: AssemblyCompany("Telldus Technologies")]
-[assembly: AssemblyProduct("DeviceHandler")]
-[assembly: AssemblyCopyright("Copyright © Telldus Technologies 2010")]
-[assembly: AssemblyTrademark("")]
-[assembly: AssemblyCulture("")]
-
-// Setting ComVisible to false makes the types in this assembly not visible 
-// to COM components.  If you need to access a type in this assembly from 
-// COM, set the ComVisible attribute to true on that type.
-[assembly: ComVisible(false)]
-
-// The following GUID is for the ID of the typelib if this project is exposed to COM
-[assembly: Guid("f38b6a0f-16f2-4be8-9e86-8706f5335778")]
-
-// Version information for an assembly consists of the following four values:
-//
-//      Major Version
-//      Minor Version 
-//      Build Number
-//      Revision
-//
-// You can specify all the values or you can default the Revision and Build Numbers 
-// by using the '*' as shown below:
-[assembly: AssemblyVersion("2010.10.0.0")]
-[assembly: AssemblyFileVersion("2010.10.0.0")]
diff --git a/scheduler/DeviceScheduler/Alarm.ico b/scheduler/DeviceScheduler/Alarm.ico
deleted file mode 100644
index 2bfa1405..00000000
Binary files a/scheduler/DeviceScheduler/Alarm.ico and /dev/null differ
diff --git a/scheduler/DeviceScheduler/DataStorage.Designer.cs b/scheduler/DeviceScheduler/DataStorage.Designer.cs
deleted file mode 100644
index 17d951d5..00000000
--- a/scheduler/DeviceScheduler/DataStorage.Designer.cs
+++ /dev/null
@@ -1,1244 +0,0 @@
-//------------------------------------------------------------------------------
-// 
-//     This code was generated by a tool.
-//     Runtime Version:2.0.50727.3053
-//
-//     Changes to this file may cause incorrect behavior and will be lost if
-//     the code is regenerated.
-// 
-//------------------------------------------------------------------------------
-
-#pragma warning disable 1591
-
-namespace DeviceScheduler {
-    
-    
-    /// 
-    ///Represents a strongly typed in-memory cache of data.
-    ///
-    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "2.0.0.0")]
-    [global::System.Serializable()]
-    [global::System.ComponentModel.DesignerCategoryAttribute("code")]
-    [global::System.ComponentModel.ToolboxItem(true)]
-    [global::System.Xml.Serialization.XmlSchemaProviderAttribute("GetTypedDataSetSchema")]
-    [global::System.Xml.Serialization.XmlRootAttribute("DataStorage")]
-    [global::System.ComponentModel.Design.HelpKeywordAttribute("vs.data.DataSet")]
-    public partial class DataStorage : global::System.Data.DataSet {
-        
-        private JobDataTable tableJob;
-        
-        private JobActionsDataTable tableJobActions;
-        
-        private global::System.Data.DataRelation relationJob_JobActions;
-        
-        private global::System.Data.SchemaSerializationMode _schemaSerializationMode = global::System.Data.SchemaSerializationMode.IncludeSchema;
-        
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-        public DataStorage() {
-            this.BeginInit();
-            this.InitClass();
-            global::System.ComponentModel.CollectionChangeEventHandler schemaChangedHandler = new global::System.ComponentModel.CollectionChangeEventHandler(this.SchemaChanged);
-            base.Tables.CollectionChanged += schemaChangedHandler;
-            base.Relations.CollectionChanged += schemaChangedHandler;
-            this.EndInit();
-        }
-        
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-        protected DataStorage(global::System.Runtime.Serialization.SerializationInfo info, global::System.Runtime.Serialization.StreamingContext context) : 
-                base(info, context, false) {
-            if ((this.IsBinarySerialized(info, context) == true)) {
-                this.InitVars(false);
-                global::System.ComponentModel.CollectionChangeEventHandler schemaChangedHandler1 = new global::System.ComponentModel.CollectionChangeEventHandler(this.SchemaChanged);
-                this.Tables.CollectionChanged += schemaChangedHandler1;
-                this.Relations.CollectionChanged += schemaChangedHandler1;
-                return;
-            }
-            string strSchema = ((string)(info.GetValue("XmlSchema", typeof(string))));
-            if ((this.DetermineSchemaSerializationMode(info, context) == global::System.Data.SchemaSerializationMode.IncludeSchema)) {
-                global::System.Data.DataSet ds = new global::System.Data.DataSet();
-                ds.ReadXmlSchema(new global::System.Xml.XmlTextReader(new global::System.IO.StringReader(strSchema)));
-                if ((ds.Tables["Job"] != null)) {
-                    base.Tables.Add(new JobDataTable(ds.Tables["Job"]));
-                }
-                if ((ds.Tables["JobActions"] != null)) {
-                    base.Tables.Add(new JobActionsDataTable(ds.Tables["JobActions"]));
-                }
-                this.DataSetName = ds.DataSetName;
-                this.Prefix = ds.Prefix;
-                this.Namespace = ds.Namespace;
-                this.Locale = ds.Locale;
-                this.CaseSensitive = ds.CaseSensitive;
-                this.EnforceConstraints = ds.EnforceConstraints;
-                this.Merge(ds, false, global::System.Data.MissingSchemaAction.Add);
-                this.InitVars();
-            }
-            else {
-                this.ReadXmlSchema(new global::System.Xml.XmlTextReader(new global::System.IO.StringReader(strSchema)));
-            }
-            this.GetSerializationData(info, context);
-            global::System.ComponentModel.CollectionChangeEventHandler schemaChangedHandler = new global::System.ComponentModel.CollectionChangeEventHandler(this.SchemaChanged);
-            base.Tables.CollectionChanged += schemaChangedHandler;
-            this.Relations.CollectionChanged += schemaChangedHandler;
-        }
-        
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-        [global::System.ComponentModel.Browsable(false)]
-        [global::System.ComponentModel.DesignerSerializationVisibility(global::System.ComponentModel.DesignerSerializationVisibility.Content)]
-        public JobDataTable Job {
-            get {
-                return this.tableJob;
-            }
-        }
-        
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-        [global::System.ComponentModel.Browsable(false)]
-        [global::System.ComponentModel.DesignerSerializationVisibility(global::System.ComponentModel.DesignerSerializationVisibility.Content)]
-        public JobActionsDataTable JobActions {
-            get {
-                return this.tableJobActions;
-            }
-        }
-        
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-        [global::System.ComponentModel.BrowsableAttribute(true)]
-        [global::System.ComponentModel.DesignerSerializationVisibilityAttribute(global::System.ComponentModel.DesignerSerializationVisibility.Visible)]
-        public override global::System.Data.SchemaSerializationMode SchemaSerializationMode {
-            get {
-                return this._schemaSerializationMode;
-            }
-            set {
-                this._schemaSerializationMode = value;
-            }
-        }
-        
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-        [global::System.ComponentModel.DesignerSerializationVisibilityAttribute(global::System.ComponentModel.DesignerSerializationVisibility.Hidden)]
-        public new global::System.Data.DataTableCollection Tables {
-            get {
-                return base.Tables;
-            }
-        }
-        
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-        [global::System.ComponentModel.DesignerSerializationVisibilityAttribute(global::System.ComponentModel.DesignerSerializationVisibility.Hidden)]
-        public new global::System.Data.DataRelationCollection Relations {
-            get {
-                return base.Relations;
-            }
-        }
-        
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-        protected override void InitializeDerivedDataSet() {
-            this.BeginInit();
-            this.InitClass();
-            this.EndInit();
-        }
-        
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-        public override global::System.Data.DataSet Clone() {
-            DataStorage cln = ((DataStorage)(base.Clone()));
-            cln.InitVars();
-            cln.SchemaSerializationMode = this.SchemaSerializationMode;
-            return cln;
-        }
-        
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-        protected override bool ShouldSerializeTables() {
-            return false;
-        }
-        
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-        protected override bool ShouldSerializeRelations() {
-            return false;
-        }
-        
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-        protected override void ReadXmlSerializable(global::System.Xml.XmlReader reader) {
-            if ((this.DetermineSchemaSerializationMode(reader) == global::System.Data.SchemaSerializationMode.IncludeSchema)) {
-                this.Reset();
-                global::System.Data.DataSet ds = new global::System.Data.DataSet();
-                ds.ReadXml(reader);
-                if ((ds.Tables["Job"] != null)) {
-                    base.Tables.Add(new JobDataTable(ds.Tables["Job"]));
-                }
-                if ((ds.Tables["JobActions"] != null)) {
-                    base.Tables.Add(new JobActionsDataTable(ds.Tables["JobActions"]));
-                }
-                this.DataSetName = ds.DataSetName;
-                this.Prefix = ds.Prefix;
-                this.Namespace = ds.Namespace;
-                this.Locale = ds.Locale;
-                this.CaseSensitive = ds.CaseSensitive;
-                this.EnforceConstraints = ds.EnforceConstraints;
-                this.Merge(ds, false, global::System.Data.MissingSchemaAction.Add);
-                this.InitVars();
-            }
-            else {
-                this.ReadXml(reader);
-                this.InitVars();
-            }
-        }
-        
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-        protected override global::System.Xml.Schema.XmlSchema GetSchemaSerializable() {
-            global::System.IO.MemoryStream stream = new global::System.IO.MemoryStream();
-            this.WriteXmlSchema(new global::System.Xml.XmlTextWriter(stream, null));
-            stream.Position = 0;
-            return global::System.Xml.Schema.XmlSchema.Read(new global::System.Xml.XmlTextReader(stream), null);
-        }
-        
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-        internal void InitVars() {
-            this.InitVars(true);
-        }
-        
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-        internal void InitVars(bool initTable) {
-            this.tableJob = ((JobDataTable)(base.Tables["Job"]));
-            if ((initTable == true)) {
-                if ((this.tableJob != null)) {
-                    this.tableJob.InitVars();
-                }
-            }
-            this.tableJobActions = ((JobActionsDataTable)(base.Tables["JobActions"]));
-            if ((initTable == true)) {
-                if ((this.tableJobActions != null)) {
-                    this.tableJobActions.InitVars();
-                }
-            }
-            this.relationJob_JobActions = this.Relations["Job_JobActions"];
-        }
-        
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-        private void InitClass() {
-            this.DataSetName = "DataStorage";
-            this.Prefix = "";
-            this.Namespace = "http://tempuri.org/DataStorage.xsd";
-            this.EnforceConstraints = true;
-            this.SchemaSerializationMode = global::System.Data.SchemaSerializationMode.IncludeSchema;
-            this.tableJob = new JobDataTable();
-            base.Tables.Add(this.tableJob);
-            this.tableJobActions = new JobActionsDataTable();
-            base.Tables.Add(this.tableJobActions);
-            this.relationJob_JobActions = new global::System.Data.DataRelation("Job_JobActions", new global::System.Data.DataColumn[] {
-                        this.tableJob.IDColumn}, new global::System.Data.DataColumn[] {
-                        this.tableJobActions.JobIDColumn}, false);
-            this.Relations.Add(this.relationJob_JobActions);
-        }
-        
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-        private bool ShouldSerializeJob() {
-            return false;
-        }
-        
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-        private bool ShouldSerializeJobActions() {
-            return false;
-        }
-        
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-        private void SchemaChanged(object sender, global::System.ComponentModel.CollectionChangeEventArgs e) {
-            if ((e.Action == global::System.ComponentModel.CollectionChangeAction.Remove)) {
-                this.InitVars();
-            }
-        }
-        
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-        public static global::System.Xml.Schema.XmlSchemaComplexType GetTypedDataSetSchema(global::System.Xml.Schema.XmlSchemaSet xs) {
-            DataStorage ds = new DataStorage();
-            global::System.Xml.Schema.XmlSchemaComplexType type = new global::System.Xml.Schema.XmlSchemaComplexType();
-            global::System.Xml.Schema.XmlSchemaSequence sequence = new global::System.Xml.Schema.XmlSchemaSequence();
-            global::System.Xml.Schema.XmlSchemaAny any = new global::System.Xml.Schema.XmlSchemaAny();
-            any.Namespace = ds.Namespace;
-            sequence.Items.Add(any);
-            type.Particle = sequence;
-            global::System.Xml.Schema.XmlSchema dsSchema = ds.GetSchemaSerializable();
-            if (xs.Contains(dsSchema.TargetNamespace)) {
-                global::System.IO.MemoryStream s1 = new global::System.IO.MemoryStream();
-                global::System.IO.MemoryStream s2 = new global::System.IO.MemoryStream();
-                try {
-                    global::System.Xml.Schema.XmlSchema schema = null;
-                    dsSchema.Write(s1);
-                    for (global::System.Collections.IEnumerator schemas = xs.Schemas(dsSchema.TargetNamespace).GetEnumerator(); schemas.MoveNext(); ) {
-                        schema = ((global::System.Xml.Schema.XmlSchema)(schemas.Current));
-                        s2.SetLength(0);
-                        schema.Write(s2);
-                        if ((s1.Length == s2.Length)) {
-                            s1.Position = 0;
-                            s2.Position = 0;
-                            for (; ((s1.Position != s1.Length) 
-                                        && (s1.ReadByte() == s2.ReadByte())); ) {
-                                ;
-                            }
-                            if ((s1.Position == s1.Length)) {
-                                return type;
-                            }
-                        }
-                    }
-                }
-                finally {
-                    if ((s1 != null)) {
-                        s1.Close();
-                    }
-                    if ((s2 != null)) {
-                        s2.Close();
-                    }
-                }
-            }
-            xs.Add(dsSchema);
-            return type;
-        }
-        
-        public delegate void JobRowChangeEventHandler(object sender, JobRowChangeEvent e);
-        
-        public delegate void JobActionsRowChangeEventHandler(object sender, JobActionsRowChangeEvent e);
-        
-        /// 
-        ///Represents the strongly named DataTable class.
-        ///
-        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "2.0.0.0")]
-        [global::System.Serializable()]
-        [global::System.Xml.Serialization.XmlSchemaProviderAttribute("GetTypedTableSchema")]
-        public partial class JobDataTable : global::System.Data.DataTable, global::System.Collections.IEnumerable {
-            
-            private global::System.Data.DataColumn columnID;
-            
-            private global::System.Data.DataColumn columnName;
-            
-            private global::System.Data.DataColumn columnDescription;
-            
-            private global::System.Data.DataColumn columnJobName;
-            
-            private global::System.Data.DataColumn columnUsername;
-            
-            private global::System.Data.DataColumn columnPassword;
-            
-            private global::System.Data.DataColumn columnStartTime;
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public JobDataTable() {
-                this.TableName = "Job";
-                this.BeginInit();
-                this.InitClass();
-                this.EndInit();
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            internal JobDataTable(global::System.Data.DataTable table) {
-                this.TableName = table.TableName;
-                if ((table.CaseSensitive != table.DataSet.CaseSensitive)) {
-                    this.CaseSensitive = table.CaseSensitive;
-                }
-                if ((table.Locale.ToString() != table.DataSet.Locale.ToString())) {
-                    this.Locale = table.Locale;
-                }
-                if ((table.Namespace != table.DataSet.Namespace)) {
-                    this.Namespace = table.Namespace;
-                }
-                this.Prefix = table.Prefix;
-                this.MinimumCapacity = table.MinimumCapacity;
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            protected JobDataTable(global::System.Runtime.Serialization.SerializationInfo info, global::System.Runtime.Serialization.StreamingContext context) : 
-                    base(info, context) {
-                this.InitVars();
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public global::System.Data.DataColumn IDColumn {
-                get {
-                    return this.columnID;
-                }
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public global::System.Data.DataColumn NameColumn {
-                get {
-                    return this.columnName;
-                }
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public global::System.Data.DataColumn DescriptionColumn {
-                get {
-                    return this.columnDescription;
-                }
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public global::System.Data.DataColumn JobNameColumn {
-                get {
-                    return this.columnJobName;
-                }
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public global::System.Data.DataColumn UsernameColumn {
-                get {
-                    return this.columnUsername;
-                }
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public global::System.Data.DataColumn PasswordColumn {
-                get {
-                    return this.columnPassword;
-                }
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public global::System.Data.DataColumn StartTimeColumn {
-                get {
-                    return this.columnStartTime;
-                }
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            [global::System.ComponentModel.Browsable(false)]
-            public int Count {
-                get {
-                    return this.Rows.Count;
-                }
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public JobRow this[int index] {
-                get {
-                    return ((JobRow)(this.Rows[index]));
-                }
-            }
-            
-            public event JobRowChangeEventHandler JobRowChanging;
-            
-            public event JobRowChangeEventHandler JobRowChanged;
-            
-            public event JobRowChangeEventHandler JobRowDeleting;
-            
-            public event JobRowChangeEventHandler JobRowDeleted;
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public void AddJobRow(JobRow row) {
-                this.Rows.Add(row);
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public JobRow AddJobRow(string Name, string Description, string JobName, string Username, string Password, string StartTime) {
-                JobRow rowJobRow = ((JobRow)(this.NewRow()));
-                object[] columnValuesArray = new object[] {
-                        null,
-                        Name,
-                        Description,
-                        JobName,
-                        Username,
-                        Password,
-                        StartTime};
-                rowJobRow.ItemArray = columnValuesArray;
-                this.Rows.Add(rowJobRow);
-                return rowJobRow;
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public JobRow FindByID(int ID) {
-                return ((JobRow)(this.Rows.Find(new object[] {
-                            ID})));
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public virtual global::System.Collections.IEnumerator GetEnumerator() {
-                return this.Rows.GetEnumerator();
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public override global::System.Data.DataTable Clone() {
-                JobDataTable cln = ((JobDataTable)(base.Clone()));
-                cln.InitVars();
-                return cln;
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            protected override global::System.Data.DataTable CreateInstance() {
-                return new JobDataTable();
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            internal void InitVars() {
-                this.columnID = base.Columns["ID"];
-                this.columnName = base.Columns["Name"];
-                this.columnDescription = base.Columns["Description"];
-                this.columnJobName = base.Columns["JobName"];
-                this.columnUsername = base.Columns["Username"];
-                this.columnPassword = base.Columns["Password"];
-                this.columnStartTime = base.Columns["StartTime"];
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            private void InitClass() {
-                this.columnID = new global::System.Data.DataColumn("ID", typeof(int), null, global::System.Data.MappingType.Element);
-                base.Columns.Add(this.columnID);
-                this.columnName = new global::System.Data.DataColumn("Name", typeof(string), null, global::System.Data.MappingType.Element);
-                base.Columns.Add(this.columnName);
-                this.columnDescription = new global::System.Data.DataColumn("Description", typeof(string), null, global::System.Data.MappingType.Element);
-                base.Columns.Add(this.columnDescription);
-                this.columnJobName = new global::System.Data.DataColumn("JobName", typeof(string), null, global::System.Data.MappingType.Element);
-                base.Columns.Add(this.columnJobName);
-                this.columnUsername = new global::System.Data.DataColumn("Username", typeof(string), null, global::System.Data.MappingType.Element);
-                base.Columns.Add(this.columnUsername);
-                this.columnPassword = new global::System.Data.DataColumn("Password", typeof(string), null, global::System.Data.MappingType.Element);
-                base.Columns.Add(this.columnPassword);
-                this.columnStartTime = new global::System.Data.DataColumn("StartTime", typeof(string), null, global::System.Data.MappingType.Element);
-                base.Columns.Add(this.columnStartTime);
-                this.Constraints.Add(new global::System.Data.UniqueConstraint("Constraint1", new global::System.Data.DataColumn[] {
-                                this.columnID}, true));
-                this.Constraints.Add(new global::System.Data.UniqueConstraint("Constraint2", new global::System.Data.DataColumn[] {
-                                this.columnName}, false));
-                this.columnID.AutoIncrement = true;
-                this.columnID.AutoIncrementSeed = 1;
-                this.columnID.AllowDBNull = false;
-                this.columnID.Unique = true;
-                this.columnName.AllowDBNull = false;
-                this.columnName.Unique = true;
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public JobRow NewJobRow() {
-                return ((JobRow)(this.NewRow()));
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            protected override global::System.Data.DataRow NewRowFromBuilder(global::System.Data.DataRowBuilder builder) {
-                return new JobRow(builder);
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            protected override global::System.Type GetRowType() {
-                return typeof(JobRow);
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            protected override void OnRowChanged(global::System.Data.DataRowChangeEventArgs e) {
-                base.OnRowChanged(e);
-                if ((this.JobRowChanged != null)) {
-                    this.JobRowChanged(this, new JobRowChangeEvent(((JobRow)(e.Row)), e.Action));
-                }
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            protected override void OnRowChanging(global::System.Data.DataRowChangeEventArgs e) {
-                base.OnRowChanging(e);
-                if ((this.JobRowChanging != null)) {
-                    this.JobRowChanging(this, new JobRowChangeEvent(((JobRow)(e.Row)), e.Action));
-                }
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            protected override void OnRowDeleted(global::System.Data.DataRowChangeEventArgs e) {
-                base.OnRowDeleted(e);
-                if ((this.JobRowDeleted != null)) {
-                    this.JobRowDeleted(this, new JobRowChangeEvent(((JobRow)(e.Row)), e.Action));
-                }
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            protected override void OnRowDeleting(global::System.Data.DataRowChangeEventArgs e) {
-                base.OnRowDeleting(e);
-                if ((this.JobRowDeleting != null)) {
-                    this.JobRowDeleting(this, new JobRowChangeEvent(((JobRow)(e.Row)), e.Action));
-                }
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public void RemoveJobRow(JobRow row) {
-                this.Rows.Remove(row);
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public static global::System.Xml.Schema.XmlSchemaComplexType GetTypedTableSchema(global::System.Xml.Schema.XmlSchemaSet xs) {
-                global::System.Xml.Schema.XmlSchemaComplexType type = new global::System.Xml.Schema.XmlSchemaComplexType();
-                global::System.Xml.Schema.XmlSchemaSequence sequence = new global::System.Xml.Schema.XmlSchemaSequence();
-                DataStorage ds = new DataStorage();
-                global::System.Xml.Schema.XmlSchemaAny any1 = new global::System.Xml.Schema.XmlSchemaAny();
-                any1.Namespace = "http://www.w3.org/2001/XMLSchema";
-                any1.MinOccurs = new decimal(0);
-                any1.MaxOccurs = decimal.MaxValue;
-                any1.ProcessContents = global::System.Xml.Schema.XmlSchemaContentProcessing.Lax;
-                sequence.Items.Add(any1);
-                global::System.Xml.Schema.XmlSchemaAny any2 = new global::System.Xml.Schema.XmlSchemaAny();
-                any2.Namespace = "urn:schemas-microsoft-com:xml-diffgram-v1";
-                any2.MinOccurs = new decimal(1);
-                any2.ProcessContents = global::System.Xml.Schema.XmlSchemaContentProcessing.Lax;
-                sequence.Items.Add(any2);
-                global::System.Xml.Schema.XmlSchemaAttribute attribute1 = new global::System.Xml.Schema.XmlSchemaAttribute();
-                attribute1.Name = "namespace";
-                attribute1.FixedValue = ds.Namespace;
-                type.Attributes.Add(attribute1);
-                global::System.Xml.Schema.XmlSchemaAttribute attribute2 = new global::System.Xml.Schema.XmlSchemaAttribute();
-                attribute2.Name = "tableTypeName";
-                attribute2.FixedValue = "JobDataTable";
-                type.Attributes.Add(attribute2);
-                type.Particle = sequence;
-                global::System.Xml.Schema.XmlSchema dsSchema = ds.GetSchemaSerializable();
-                if (xs.Contains(dsSchema.TargetNamespace)) {
-                    global::System.IO.MemoryStream s1 = new global::System.IO.MemoryStream();
-                    global::System.IO.MemoryStream s2 = new global::System.IO.MemoryStream();
-                    try {
-                        global::System.Xml.Schema.XmlSchema schema = null;
-                        dsSchema.Write(s1);
-                        for (global::System.Collections.IEnumerator schemas = xs.Schemas(dsSchema.TargetNamespace).GetEnumerator(); schemas.MoveNext(); ) {
-                            schema = ((global::System.Xml.Schema.XmlSchema)(schemas.Current));
-                            s2.SetLength(0);
-                            schema.Write(s2);
-                            if ((s1.Length == s2.Length)) {
-                                s1.Position = 0;
-                                s2.Position = 0;
-                                for (; ((s1.Position != s1.Length) 
-                                            && (s1.ReadByte() == s2.ReadByte())); ) {
-                                    ;
-                                }
-                                if ((s1.Position == s1.Length)) {
-                                    return type;
-                                }
-                            }
-                        }
-                    }
-                    finally {
-                        if ((s1 != null)) {
-                            s1.Close();
-                        }
-                        if ((s2 != null)) {
-                            s2.Close();
-                        }
-                    }
-                }
-                xs.Add(dsSchema);
-                return type;
-            }
-        }
-        
-        /// 
-        ///Represents the strongly named DataTable class.
-        ///
-        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "2.0.0.0")]
-        [global::System.Serializable()]
-        [global::System.Xml.Serialization.XmlSchemaProviderAttribute("GetTypedTableSchema")]
-        public partial class JobActionsDataTable : global::System.Data.DataTable, global::System.Collections.IEnumerable {
-            
-            private global::System.Data.DataColumn columnID;
-            
-            private global::System.Data.DataColumn columnJobID;
-            
-            private global::System.Data.DataColumn columnDeviceID;
-            
-            private global::System.Data.DataColumn columnTurnOn;
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public JobActionsDataTable() {
-                this.TableName = "JobActions";
-                this.BeginInit();
-                this.InitClass();
-                this.EndInit();
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            internal JobActionsDataTable(global::System.Data.DataTable table) {
-                this.TableName = table.TableName;
-                if ((table.CaseSensitive != table.DataSet.CaseSensitive)) {
-                    this.CaseSensitive = table.CaseSensitive;
-                }
-                if ((table.Locale.ToString() != table.DataSet.Locale.ToString())) {
-                    this.Locale = table.Locale;
-                }
-                if ((table.Namespace != table.DataSet.Namespace)) {
-                    this.Namespace = table.Namespace;
-                }
-                this.Prefix = table.Prefix;
-                this.MinimumCapacity = table.MinimumCapacity;
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            protected JobActionsDataTable(global::System.Runtime.Serialization.SerializationInfo info, global::System.Runtime.Serialization.StreamingContext context) : 
-                    base(info, context) {
-                this.InitVars();
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public global::System.Data.DataColumn IDColumn {
-                get {
-                    return this.columnID;
-                }
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public global::System.Data.DataColumn JobIDColumn {
-                get {
-                    return this.columnJobID;
-                }
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public global::System.Data.DataColumn DeviceIDColumn {
-                get {
-                    return this.columnDeviceID;
-                }
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public global::System.Data.DataColumn TurnOnColumn {
-                get {
-                    return this.columnTurnOn;
-                }
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            [global::System.ComponentModel.Browsable(false)]
-            public int Count {
-                get {
-                    return this.Rows.Count;
-                }
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public JobActionsRow this[int index] {
-                get {
-                    return ((JobActionsRow)(this.Rows[index]));
-                }
-            }
-            
-            public event JobActionsRowChangeEventHandler JobActionsRowChanging;
-            
-            public event JobActionsRowChangeEventHandler JobActionsRowChanged;
-            
-            public event JobActionsRowChangeEventHandler JobActionsRowDeleting;
-            
-            public event JobActionsRowChangeEventHandler JobActionsRowDeleted;
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public void AddJobActionsRow(JobActionsRow row) {
-                this.Rows.Add(row);
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public JobActionsRow AddJobActionsRow(JobRow parentJobRowByJob_JobActions, int DeviceID, bool TurnOn) {
-                JobActionsRow rowJobActionsRow = ((JobActionsRow)(this.NewRow()));
-                object[] columnValuesArray = new object[] {
-                        null,
-                        null,
-                        DeviceID,
-                        TurnOn};
-                if ((parentJobRowByJob_JobActions != null)) {
-                    columnValuesArray[1] = parentJobRowByJob_JobActions[0];
-                }
-                rowJobActionsRow.ItemArray = columnValuesArray;
-                this.Rows.Add(rowJobActionsRow);
-                return rowJobActionsRow;
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public JobActionsRow FindByID(int ID) {
-                return ((JobActionsRow)(this.Rows.Find(new object[] {
-                            ID})));
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public virtual global::System.Collections.IEnumerator GetEnumerator() {
-                return this.Rows.GetEnumerator();
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public override global::System.Data.DataTable Clone() {
-                JobActionsDataTable cln = ((JobActionsDataTable)(base.Clone()));
-                cln.InitVars();
-                return cln;
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            protected override global::System.Data.DataTable CreateInstance() {
-                return new JobActionsDataTable();
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            internal void InitVars() {
-                this.columnID = base.Columns["ID"];
-                this.columnJobID = base.Columns["JobID"];
-                this.columnDeviceID = base.Columns["DeviceID"];
-                this.columnTurnOn = base.Columns["TurnOn"];
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            private void InitClass() {
-                this.columnID = new global::System.Data.DataColumn("ID", typeof(int), null, global::System.Data.MappingType.Element);
-                base.Columns.Add(this.columnID);
-                this.columnJobID = new global::System.Data.DataColumn("JobID", typeof(int), null, global::System.Data.MappingType.Element);
-                base.Columns.Add(this.columnJobID);
-                this.columnDeviceID = new global::System.Data.DataColumn("DeviceID", typeof(int), null, global::System.Data.MappingType.Element);
-                base.Columns.Add(this.columnDeviceID);
-                this.columnTurnOn = new global::System.Data.DataColumn("TurnOn", typeof(bool), null, global::System.Data.MappingType.Element);
-                base.Columns.Add(this.columnTurnOn);
-                this.Constraints.Add(new global::System.Data.UniqueConstraint("JobActionsKey1", new global::System.Data.DataColumn[] {
-                                this.columnID}, true));
-                this.columnID.AutoIncrement = true;
-                this.columnID.AutoIncrementSeed = 1;
-                this.columnID.AllowDBNull = false;
-                this.columnID.Unique = true;
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public JobActionsRow NewJobActionsRow() {
-                return ((JobActionsRow)(this.NewRow()));
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            protected override global::System.Data.DataRow NewRowFromBuilder(global::System.Data.DataRowBuilder builder) {
-                return new JobActionsRow(builder);
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            protected override global::System.Type GetRowType() {
-                return typeof(JobActionsRow);
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            protected override void OnRowChanged(global::System.Data.DataRowChangeEventArgs e) {
-                base.OnRowChanged(e);
-                if ((this.JobActionsRowChanged != null)) {
-                    this.JobActionsRowChanged(this, new JobActionsRowChangeEvent(((JobActionsRow)(e.Row)), e.Action));
-                }
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            protected override void OnRowChanging(global::System.Data.DataRowChangeEventArgs e) {
-                base.OnRowChanging(e);
-                if ((this.JobActionsRowChanging != null)) {
-                    this.JobActionsRowChanging(this, new JobActionsRowChangeEvent(((JobActionsRow)(e.Row)), e.Action));
-                }
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            protected override void OnRowDeleted(global::System.Data.DataRowChangeEventArgs e) {
-                base.OnRowDeleted(e);
-                if ((this.JobActionsRowDeleted != null)) {
-                    this.JobActionsRowDeleted(this, new JobActionsRowChangeEvent(((JobActionsRow)(e.Row)), e.Action));
-                }
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            protected override void OnRowDeleting(global::System.Data.DataRowChangeEventArgs e) {
-                base.OnRowDeleting(e);
-                if ((this.JobActionsRowDeleting != null)) {
-                    this.JobActionsRowDeleting(this, new JobActionsRowChangeEvent(((JobActionsRow)(e.Row)), e.Action));
-                }
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public void RemoveJobActionsRow(JobActionsRow row) {
-                this.Rows.Remove(row);
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public static global::System.Xml.Schema.XmlSchemaComplexType GetTypedTableSchema(global::System.Xml.Schema.XmlSchemaSet xs) {
-                global::System.Xml.Schema.XmlSchemaComplexType type = new global::System.Xml.Schema.XmlSchemaComplexType();
-                global::System.Xml.Schema.XmlSchemaSequence sequence = new global::System.Xml.Schema.XmlSchemaSequence();
-                DataStorage ds = new DataStorage();
-                global::System.Xml.Schema.XmlSchemaAny any1 = new global::System.Xml.Schema.XmlSchemaAny();
-                any1.Namespace = "http://www.w3.org/2001/XMLSchema";
-                any1.MinOccurs = new decimal(0);
-                any1.MaxOccurs = decimal.MaxValue;
-                any1.ProcessContents = global::System.Xml.Schema.XmlSchemaContentProcessing.Lax;
-                sequence.Items.Add(any1);
-                global::System.Xml.Schema.XmlSchemaAny any2 = new global::System.Xml.Schema.XmlSchemaAny();
-                any2.Namespace = "urn:schemas-microsoft-com:xml-diffgram-v1";
-                any2.MinOccurs = new decimal(1);
-                any2.ProcessContents = global::System.Xml.Schema.XmlSchemaContentProcessing.Lax;
-                sequence.Items.Add(any2);
-                global::System.Xml.Schema.XmlSchemaAttribute attribute1 = new global::System.Xml.Schema.XmlSchemaAttribute();
-                attribute1.Name = "namespace";
-                attribute1.FixedValue = ds.Namespace;
-                type.Attributes.Add(attribute1);
-                global::System.Xml.Schema.XmlSchemaAttribute attribute2 = new global::System.Xml.Schema.XmlSchemaAttribute();
-                attribute2.Name = "tableTypeName";
-                attribute2.FixedValue = "JobActionsDataTable";
-                type.Attributes.Add(attribute2);
-                type.Particle = sequence;
-                global::System.Xml.Schema.XmlSchema dsSchema = ds.GetSchemaSerializable();
-                if (xs.Contains(dsSchema.TargetNamespace)) {
-                    global::System.IO.MemoryStream s1 = new global::System.IO.MemoryStream();
-                    global::System.IO.MemoryStream s2 = new global::System.IO.MemoryStream();
-                    try {
-                        global::System.Xml.Schema.XmlSchema schema = null;
-                        dsSchema.Write(s1);
-                        for (global::System.Collections.IEnumerator schemas = xs.Schemas(dsSchema.TargetNamespace).GetEnumerator(); schemas.MoveNext(); ) {
-                            schema = ((global::System.Xml.Schema.XmlSchema)(schemas.Current));
-                            s2.SetLength(0);
-                            schema.Write(s2);
-                            if ((s1.Length == s2.Length)) {
-                                s1.Position = 0;
-                                s2.Position = 0;
-                                for (; ((s1.Position != s1.Length) 
-                                            && (s1.ReadByte() == s2.ReadByte())); ) {
-                                    ;
-                                }
-                                if ((s1.Position == s1.Length)) {
-                                    return type;
-                                }
-                            }
-                        }
-                    }
-                    finally {
-                        if ((s1 != null)) {
-                            s1.Close();
-                        }
-                        if ((s2 != null)) {
-                            s2.Close();
-                        }
-                    }
-                }
-                xs.Add(dsSchema);
-                return type;
-            }
-        }
-        
-        /// 
-        ///Represents strongly named DataRow class.
-        ///
-        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "2.0.0.0")]
-        public partial class JobRow : global::System.Data.DataRow {
-            
-            private JobDataTable tableJob;
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            internal JobRow(global::System.Data.DataRowBuilder rb) : 
-                    base(rb) {
-                this.tableJob = ((JobDataTable)(this.Table));
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public int ID {
-                get {
-                    return ((int)(this[this.tableJob.IDColumn]));
-                }
-                set {
-                    this[this.tableJob.IDColumn] = value;
-                }
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public string Name {
-                get {
-                    return ((string)(this[this.tableJob.NameColumn]));
-                }
-                set {
-                    this[this.tableJob.NameColumn] = value;
-                }
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public string Description {
-                get {
-                    try {
-                        return ((string)(this[this.tableJob.DescriptionColumn]));
-                    }
-                    catch (global::System.InvalidCastException e) {
-                        throw new global::System.Data.StrongTypingException("The value for column \'Description\' in table \'Job\' is DBNull.", e);
-                    }
-                }
-                set {
-                    this[this.tableJob.DescriptionColumn] = value;
-                }
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public string JobName {
-                get {
-                    try {
-                        return ((string)(this[this.tableJob.JobNameColumn]));
-                    }
-                    catch (global::System.InvalidCastException e) {
-                        throw new global::System.Data.StrongTypingException("The value for column \'JobName\' in table \'Job\' is DBNull.", e);
-                    }
-                }
-                set {
-                    this[this.tableJob.JobNameColumn] = value;
-                }
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public string Username {
-                get {
-                    try {
-                        return ((string)(this[this.tableJob.UsernameColumn]));
-                    }
-                    catch (global::System.InvalidCastException e) {
-                        throw new global::System.Data.StrongTypingException("The value for column \'Username\' in table \'Job\' is DBNull.", e);
-                    }
-                }
-                set {
-                    this[this.tableJob.UsernameColumn] = value;
-                }
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public string Password {
-                get {
-                    try {
-                        return ((string)(this[this.tableJob.PasswordColumn]));
-                    }
-                    catch (global::System.InvalidCastException e) {
-                        throw new global::System.Data.StrongTypingException("The value for column \'Password\' in table \'Job\' is DBNull.", e);
-                    }
-                }
-                set {
-                    this[this.tableJob.PasswordColumn] = value;
-                }
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public string StartTime {
-                get {
-                    try {
-                        return ((string)(this[this.tableJob.StartTimeColumn]));
-                    }
-                    catch (global::System.InvalidCastException e) {
-                        throw new global::System.Data.StrongTypingException("The value for column \'StartTime\' in table \'Job\' is DBNull.", e);
-                    }
-                }
-                set {
-                    this[this.tableJob.StartTimeColumn] = value;
-                }
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public bool IsDescriptionNull() {
-                return this.IsNull(this.tableJob.DescriptionColumn);
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public void SetDescriptionNull() {
-                this[this.tableJob.DescriptionColumn] = global::System.Convert.DBNull;
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public bool IsJobNameNull() {
-                return this.IsNull(this.tableJob.JobNameColumn);
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public void SetJobNameNull() {
-                this[this.tableJob.JobNameColumn] = global::System.Convert.DBNull;
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public bool IsUsernameNull() {
-                return this.IsNull(this.tableJob.UsernameColumn);
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public void SetUsernameNull() {
-                this[this.tableJob.UsernameColumn] = global::System.Convert.DBNull;
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public bool IsPasswordNull() {
-                return this.IsNull(this.tableJob.PasswordColumn);
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public void SetPasswordNull() {
-                this[this.tableJob.PasswordColumn] = global::System.Convert.DBNull;
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public bool IsStartTimeNull() {
-                return this.IsNull(this.tableJob.StartTimeColumn);
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public void SetStartTimeNull() {
-                this[this.tableJob.StartTimeColumn] = global::System.Convert.DBNull;
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public JobActionsRow[] GetJobActionsRows() {
-                if ((this.Table.ChildRelations["Job_JobActions"] == null)) {
-                    return new JobActionsRow[0];
-                }
-                else {
-                    return ((JobActionsRow[])(base.GetChildRows(this.Table.ChildRelations["Job_JobActions"])));
-                }
-            }
-        }
-        
-        /// 
-        ///Represents strongly named DataRow class.
-        ///
-        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "2.0.0.0")]
-        public partial class JobActionsRow : global::System.Data.DataRow {
-            
-            private JobActionsDataTable tableJobActions;
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            internal JobActionsRow(global::System.Data.DataRowBuilder rb) : 
-                    base(rb) {
-                this.tableJobActions = ((JobActionsDataTable)(this.Table));
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public int ID {
-                get {
-                    return ((int)(this[this.tableJobActions.IDColumn]));
-                }
-                set {
-                    this[this.tableJobActions.IDColumn] = value;
-                }
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public int JobID {
-                get {
-                    try {
-                        return ((int)(this[this.tableJobActions.JobIDColumn]));
-                    }
-                    catch (global::System.InvalidCastException e) {
-                        throw new global::System.Data.StrongTypingException("The value for column \'JobID\' in table \'JobActions\' is DBNull.", e);
-                    }
-                }
-                set {
-                    this[this.tableJobActions.JobIDColumn] = value;
-                }
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public int DeviceID {
-                get {
-                    try {
-                        return ((int)(this[this.tableJobActions.DeviceIDColumn]));
-                    }
-                    catch (global::System.InvalidCastException e) {
-                        throw new global::System.Data.StrongTypingException("The value for column \'DeviceID\' in table \'JobActions\' is DBNull.", e);
-                    }
-                }
-                set {
-                    this[this.tableJobActions.DeviceIDColumn] = value;
-                }
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public bool TurnOn {
-                get {
-                    try {
-                        return ((bool)(this[this.tableJobActions.TurnOnColumn]));
-                    }
-                    catch (global::System.InvalidCastException e) {
-                        throw new global::System.Data.StrongTypingException("The value for column \'TurnOn\' in table \'JobActions\' is DBNull.", e);
-                    }
-                }
-                set {
-                    this[this.tableJobActions.TurnOnColumn] = value;
-                }
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public JobRow JobRow {
-                get {
-                    return ((JobRow)(this.GetParentRow(this.Table.ParentRelations["Job_JobActions"])));
-                }
-                set {
-                    this.SetParentRow(value, this.Table.ParentRelations["Job_JobActions"]);
-                }
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public bool IsJobIDNull() {
-                return this.IsNull(this.tableJobActions.JobIDColumn);
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public void SetJobIDNull() {
-                this[this.tableJobActions.JobIDColumn] = global::System.Convert.DBNull;
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public bool IsDeviceIDNull() {
-                return this.IsNull(this.tableJobActions.DeviceIDColumn);
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public void SetDeviceIDNull() {
-                this[this.tableJobActions.DeviceIDColumn] = global::System.Convert.DBNull;
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public bool IsTurnOnNull() {
-                return this.IsNull(this.tableJobActions.TurnOnColumn);
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public void SetTurnOnNull() {
-                this[this.tableJobActions.TurnOnColumn] = global::System.Convert.DBNull;
-            }
-        }
-        
-        /// 
-        ///Row event argument class
-        ///
-        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "2.0.0.0")]
-        public class JobRowChangeEvent : global::System.EventArgs {
-            
-            private JobRow eventRow;
-            
-            private global::System.Data.DataRowAction eventAction;
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public JobRowChangeEvent(JobRow row, global::System.Data.DataRowAction action) {
-                this.eventRow = row;
-                this.eventAction = action;
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public JobRow Row {
-                get {
-                    return this.eventRow;
-                }
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public global::System.Data.DataRowAction Action {
-                get {
-                    return this.eventAction;
-                }
-            }
-        }
-        
-        /// 
-        ///Row event argument class
-        ///
-        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "2.0.0.0")]
-        public class JobActionsRowChangeEvent : global::System.EventArgs {
-            
-            private JobActionsRow eventRow;
-            
-            private global::System.Data.DataRowAction eventAction;
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public JobActionsRowChangeEvent(JobActionsRow row, global::System.Data.DataRowAction action) {
-                this.eventRow = row;
-                this.eventAction = action;
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public JobActionsRow Row {
-                get {
-                    return this.eventRow;
-                }
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public global::System.Data.DataRowAction Action {
-                get {
-                    return this.eventAction;
-                }
-            }
-        }
-    }
-}
-
-#pragma warning restore 1591
\ No newline at end of file
diff --git a/scheduler/DeviceScheduler/DataStorage.xsc b/scheduler/DeviceScheduler/DataStorage.xsc
deleted file mode 100644
index 8b7f66df..00000000
--- a/scheduler/DeviceScheduler/DataStorage.xsc
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
-  
-  
-
\ No newline at end of file
diff --git a/scheduler/DeviceScheduler/DataStorage.xsd b/scheduler/DeviceScheduler/DataStorage.xsd
deleted file mode 100644
index 574b2772..00000000
--- a/scheduler/DeviceScheduler/DataStorage.xsd
+++ /dev/null
@@ -1,61 +0,0 @@
-
-
-  
-    
-      
-        
-        
-        
-        
-        
-        
-      
-    
-  
-  
-    
-      
-        
-          
-            
-              
-              
-              
-              
-              
-              
-              
-            
-          
-        
-        
-          
-            
-              
-              
-              
-              
-            
-          
-        
-      
-    
-    
-      
-      
-    
-    
-      
-      
-    
-    
-      
-      
-    
-  
-  
-    
-      
-    
-  
-
\ No newline at end of file
diff --git a/scheduler/DeviceScheduler/DataStorage.xss b/scheduler/DeviceScheduler/DataStorage.xss
deleted file mode 100644
index 6ec95ad8..00000000
--- a/scheduler/DeviceScheduler/DataStorage.xss
+++ /dev/null
@@ -1,26 +0,0 @@
-
-
-
-  
-    
-    
-  
-  
-    
-      
-        
-          304
-          129
-        
-        
-          390
-          129
-        
-      
-    
-  
-
\ No newline at end of file
diff --git a/scheduler/DeviceScheduler/DeviceScheduler.csproj b/scheduler/DeviceScheduler/DeviceScheduler.csproj
deleted file mode 100644
index c08a5e63..00000000
--- a/scheduler/DeviceScheduler/DeviceScheduler.csproj
+++ /dev/null
@@ -1,298 +0,0 @@
-
-  
-    Debug
-    AnyCPU
-    9.0.30729
-    2.0
-    {8B613D91-8906-4A60-BAF7-328DA437DF01}
-    WinExe
-    Properties
-    DeviceScheduler
-    DeviceScheduler
-    Alarm.ico
-    
-    
-    2.0
-    v2.0
-    
-    
-    false
-    
-    
-    publish\
-    true
-    Disk
-    false
-    Foreground
-    7
-    Days
-    false
-    false
-    true
-    0
-    1.0.0.%2a
-    false
-    true
-  
-  
-    true
-    full
-    false
-    bin\Debug\
-    DEBUG;TRACE
-    prompt
-    4
-  
-  
-    pdbonly
-    true
-    bin\Release\
-    TRACE
-    prompt
-    4
-  
-  
-    
-    
-    
-    
-    
-    
-    
-    
-      False
-      ..\..\TellScheduler\TaskScheduler.dll
-    
-  
-  
-    
-      True
-      True
-      DataStorage.xsd
-    
-    
-    
-      Form
-    
-    
-      frmAbout.cs
-    
-    
-      Form
-    
-    
-      frmAskSecurityPolicy.cs
-    
-    
-      Form
-    
-    
-      frmAskUsername.cs
-    
-    
-      Form
-    
-    
-      frmMain.cs
-    
-    
-      Form
-    
-    
-      frmSchedule.cs
-    
-    
-      Form
-    
-    
-      frmScheduleAddDevice.cs
-    
-    
-      Form
-    
-    
-      frmSelectDevice.cs
-    
-    
-      Form
-    
-    
-      frmSplash.cs
-    
-    
-    
-    
-    
-      Designer
-      frmAbout.cs
-    
-    
-      Designer
-      frmAskSecurityPolicy.cs
-    
-    
-      Designer
-      frmAskUsername.cs
-    
-    
-      Designer
-      frmMain.cs
-    
-    
-      Designer
-      frmMain.cs
-    
-    
-      Designer
-      frmMain.cs
-    
-    
-      Designer
-      frmSchedule.cs
-    
-    
-      Designer
-      frmScheduleAddDevice.cs
-    
-    
-      Designer
-      frmSelectDevice.cs
-    
-    
-      Designer
-      frmSplash.cs
-    
-    
-      ResXFileCodeGenerator
-      Resources.Designer.cs
-      Designer
-    
-    
-      True
-      Resources.resx
-      True
-    
-    
-    
-      DataStorage.xsd
-    
-    
-      Designer
-      MSDataSetGenerator
-      DataStorage.Designer.cs
-    
-    
-      DataStorage.xsd
-    
-    
-      SettingsSingleFileGenerator
-      Settings.Designer.cs
-    
-    
-      True
-      Settings.settings
-      True
-    
-    
-      True
-      True
-      WinFormStrings.resx
-    
-  
-  
-    
-      {292E034F-C3B8-4CED-87DD-479040094118}
-      DeviceHandler
-    
-  
-  
-    
-    
-      Designer
-      frmAbout.cs
-    
-    
-      Designer
-      frmAbout.cs
-    
-    
-      Designer
-      frmAskSecurityPolicy.cs
-    
-    
-      Designer
-      frmAskSecurityPolicy.cs
-    
-    
-      Designer
-      frmAskUsername.cs
-    
-    
-      Designer
-      frmAskUsername.cs
-    
-    
-      Designer
-      frmSchedule.cs
-    
-    
-      Designer
-      frmSchedule.cs
-    
-    
-      Designer
-      frmScheduleAddDevice.cs
-    
-    
-      Designer
-    
-    
-      Designer
-      ResXFileCodeGenerator
-      WinFormStrings.Designer.cs
-    
-    
-      Designer
-    
-  
-  
-    
-      False
-      .NET Framework Client Profile
-      false
-    
-    
-      False
-      .NET Framework 2.0 %28x86%29
-      false
-    
-    
-      False
-      .NET Framework 3.0 %28x86%29
-      false
-    
-    
-      False
-      .NET Framework 3.5
-      false
-    
-    
-      False
-      .NET Framework 3.5 SP1
-      true
-    
-    
-      False
-      Windows Installer 3.1
-      true
-    
-  
-  
-  
-
\ No newline at end of file
diff --git a/scheduler/DeviceScheduler/EncryptDecrypt.cs b/scheduler/DeviceScheduler/EncryptDecrypt.cs
deleted file mode 100644
index e10080e1..00000000
--- a/scheduler/DeviceScheduler/EncryptDecrypt.cs
+++ /dev/null
@@ -1,338 +0,0 @@
-using System;
-using System.IO;
-using System.Security.Cryptography;
-
-namespace DeviceScheduler
-{
-	/// 
-	/// Summary description for EncryptDecrypt.
-	/// 
-	public class EncryptDecrypt
-	{
-		public EncryptDecrypt()
-		{
-			//
-			// TODO: Add constructor logic here
-			//
-		}
-
-		// Encrypt a byte array into a byte array using a key and an IV 
-		public static byte[] Encrypt(byte[] clearData, byte[] Key, byte[] IV) 
-		{ 
-
-			// Create a MemoryStream that is going to accept the encrypted bytes 
-			MemoryStream ms = new MemoryStream(); 
-
-			// Create a symmetric algorithm. 
-			// We are going to use Rijndael because it is strong and available on all platforms. 
-			// You can use other algorithms, to do so substitute the next line with something like 
-			//                      TripleDES alg = TripleDES.Create(); 
-
-			Rijndael alg = Rijndael.Create(); 
-
-			// Now set the key and the IV. 
-			// We need the IV (Initialization Vector) because the algorithm is operating in its default 
-			// mode called CBC (Cipher Block Chaining). The IV is XORed with the first block (8 byte) 
-			// of the data before it is encrypted, and then each encrypted block is XORed with the 
-			// following block of plaintext. This is done to make encryption more secure. 
-			// There is also a mode called ECB which does not need an IV, but it is much less secure. 
-
-			alg.Key = Key; 
-			alg.IV = IV; 
-
-			// Create a CryptoStream through which we are going to be pumping our data. 
-			// CryptoStreamMode.Write means that we are going to be writing data to the stream 
-			// and the output will be written in the MemoryStream we have provided. 
-			CryptoStream cs = new CryptoStream(ms, alg.CreateEncryptor(), CryptoStreamMode.Write); 
-
-			// Write the data and make it do the encryption 
-			cs.Write(clearData, 0, clearData.Length); 
-
-			// Close the crypto stream (or do FlushFinalBlock). 
-			// This will tell it that we have done our encryption and there is no more data coming in, 
-			// and it is now a good time to apply the padding and finalize the encryption process. 
-			cs.Close(); 
-
-  
-			// Now get the encrypted data from the MemoryStream. 
-			// Some people make a mistake of using GetBuffer() here, which is not the right way. 
-			byte[] encryptedData = ms.ToArray(); 
-
-			return encryptedData; 
-
-		} 
-
-
-		// 
-		//    
-		/// 
-		/// Encrypt a string into a string using a password
-		/// Uses Encrypt(byte[], byte[], byte[])  
-		/// 
-		/// The text to encrypt.
-		/// The password to use.
-		/// An encrypted string.
-		public static string Encrypt(string clearText, string Password) 
-		{ 
-
-			// First we need to turn the input string into a byte array. 
-			byte[] clearBytes = System.Text.Encoding.Unicode.GetBytes(clearText); 
-
-			// Then, we need to turn the password into Key and IV 
-			// We are using salt to make it harder to guess our key using a dictionary attack - 
-			// trying to guess a password by enumerating all possible words. 
-
-			PasswordDeriveBytes pdb = new PasswordDeriveBytes(Password, 
-				new byte[] {0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d,  0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76}); 
-
-
-			// Now get the key/IV and do the encryption using the function that accepts byte arrays. 
-			// Using PasswordDeriveBytes object we are first getting 32 bytes for the Key 
-			// (the default Rijndael key length is 256bit = 32bytes) and then 16 bytes for the IV. 
-			// IV should always be the block size, which is by default 16 bytes (128 bit) for Rijndael. 
-			// If you are using DES/TripleDES/RC2 the block size is 8 bytes and so should be the IV size. 
-			// You can also read KeySize/BlockSize properties off the algorithm to find out the sizes. 
-			byte[] encryptedData = Encrypt(clearBytes, pdb.GetBytes(32), pdb.GetBytes(16)); 
-
-  
-			// Now we need to turn the resulting byte array into a string. 
-			// A common mistake would be to use an Encoding class for that. It does not work 
-			// because not all byte values can be represented by characters. 
-			// We are going to be using Base64 encoding that is designed exactly for what we are 
-			// trying to do. 
-			return Convert.ToBase64String(encryptedData); 
-
-		} 
-
-
-		// Encrypt bytes into bytes using a password 
-		//    Uses Encrypt(byte[], byte[], byte[]) 
-		public static byte[] Encrypt(byte[] clearData, string Password) 
-		{ 
-
-			// We need to turn the password into Key and IV. 
-			// We are using salt to make it harder to guess our key using a dictionary attack - 
-			// trying to guess a password by enumerating all possible words. 
-			PasswordDeriveBytes pdb = new PasswordDeriveBytes(Password, 
-				new byte[] {0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d,  0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76}); 
-
-			// Now get the key/IV and do the encryption using the function that accepts byte arrays. 
-			// Using PasswordDeriveBytes object we are first getting 32 bytes for the Key 
-			// (the default Rijndael key length is 256bit = 32bytes) and then 16 bytes for the IV. 
-			// IV should always be the block size, which is by default 16 bytes (128 bit) for Rijndael. 
-			// If you are using DES/TripleDES/RC2 the block size is 8 bytes and so should be the IV size. 
-			// You can also read KeySize/BlockSize properties off the algorithm to find out the sizes. 
-			return Encrypt(clearData, pdb.GetBytes(32), pdb.GetBytes(16)); 
-
-		} 
-
-  
-		// Encrypt a file into another file using a password 
-		public static void Encrypt(string fileIn, string fileOut, string Password) 
-		{ 
-
-			// First we are going to open the file streams 
-			FileStream fsIn = new FileStream(fileIn, FileMode.Open, FileAccess.Read); 
-			FileStream fsOut = new FileStream(fileOut, FileMode.OpenOrCreate, FileAccess.Write); 
-
-  
-			// Then we are going to derive a Key and an IV from the Password and create an algorithm 
-			PasswordDeriveBytes pdb = new PasswordDeriveBytes(Password, 
-				new byte[] {0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d,  0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76}); 
-
-			Rijndael alg = Rijndael.Create(); 
-
-			alg.Key = pdb.GetBytes(32); 
-			alg.IV = pdb.GetBytes(16); 
-
-			// Now create a crypto stream through which we are going to be pumping data. 
-			// Our fileOut is going to be receiving the encrypted bytes. 
-			CryptoStream cs = new CryptoStream(fsOut, alg.CreateEncryptor(), CryptoStreamMode.Write); 
-
-			// Now will will initialize a buffer and will be processing the input file in chunks. 
-			// This is done to avoid reading the whole file (which can be huge) into memory. 
-
-			int bufferLen = 4096; 
-			byte[] buffer = new byte[bufferLen]; 
-			int bytesRead; 
-
-			do 
-			{ 
-
-				// read a chunk of data from the input file 
-				bytesRead = fsIn.Read(buffer, 0, bufferLen); 
-
-				// encrypt it 
-				cs.Write(buffer, 0, bytesRead); 
-
-			} while(bytesRead != 0); 
-
-  
-			// close everything 
-			cs.Close(); // this will also close the unrelying fsOut stream 
-			fsIn.Close();     
-
-		} 
-
-  
-		// Decrypt a byte array into a byte array using a key and an IV 
-		public static byte[] Decrypt(byte[] cipherData, byte[] Key, byte[] IV) 
-		{ 
-
-			// Create a MemoryStream that is going to accept the decrypted bytes 
-			MemoryStream ms = new MemoryStream(); 
-
-			// Create a symmetric algorithm. 
-			// We are going to use Rijndael because it is strong and available on all platforms. 
-			// You can use other algorithms, to do so substitute the next line with something like 
-			//                      TripleDES alg = TripleDES.Create(); 
-
-			Rijndael alg = Rijndael.Create(); 
-
-			// Now set the key and the IV. 
-			// We need the IV (Initialization Vector) because the algorithm is operating in its default 
-			// mode called CBC (Cipher Block Chaining). The IV is XORed with the first block (8 byte) 
-			// of the data after it is decrypted, and then each decrypted block is XORed with the previous 
-			// cipher block. This is done to make encryption more secure. 
-			// There is also a mode called ECB which does not need an IV, but it is much less secure. 
-
-			alg.Key = Key; 
-			alg.IV = IV; 
-
- 
-			// Create a CryptoStream through which we are going to be pumping our data. 
-			// CryptoStreamMode.Write means that we are going to be writing data to the stream 
-			// and the output will be written in the MemoryStream we have provided. 
-			CryptoStream cs = new CryptoStream(ms, alg.CreateDecryptor(), CryptoStreamMode.Write); 
-
-  
-			// Write the data and make it do the decryption 
-			cs.Write(cipherData, 0, cipherData.Length); 
-
-			// Close the crypto stream (or do FlushFinalBlock). 
-			// This will tell it that we have done our decryption and there is no more data coming in, 
-			// and it is now a good time to remove the padding and finalize the decryption process. 
-			cs.Close(); 
-
-			// Now get the decrypted data from the MemoryStream. 
-			// Some people make a mistake of using GetBuffer() here, which is not the right way. 
-			byte[] decryptedData = ms.ToArray(); 
-
-  
-			return decryptedData; 
-
-		} 
-
-
-		/// 
-		/// Decrypt a string into a string using a password.
-		/// Uses Decrypt(byte[], byte[], byte[])  
-		/// 
-		/// The text to decrypt.
-		/// The password to use.
-		/// A decrypted string.
-		public static string Decrypt(string cipherText, string Password) 
-		{ 
-
-			// First we need to turn the input string into a byte array. 
-			// We presume that Base64 encoding was used 
-			byte[] cipherBytes = Convert.FromBase64String(cipherText); 
-  
-			// Then, we need to turn the password into Key and IV 
-			// We are using salt to make it harder to guess our key using a dictionary attack - 
-			// trying to guess a password by enumerating all possible words. 
-			PasswordDeriveBytes pdb = new PasswordDeriveBytes(Password, 
-				new byte[] {0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d,  0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76}); 
-
-  
-			// Now get the key/IV and do the decryption using the function that accepts byte arrays. 
-			// Using PasswordDeriveBytes object we are first getting 32 bytes for the Key 
-			// (the default Rijndael key length is 256bit = 32bytes) and then 16 bytes for the IV. 
-			// IV should always be the block size, which is by default 16 bytes (128 bit) for Rijndael. 
-			// If you are using DES/TripleDES/RC2 the block size is 8 bytes and so should be the IV size. 
-			// You can also read KeySize/BlockSize properties off the algorithm to find out the sizes. 
-			byte[] decryptedData = Decrypt(cipherBytes, pdb.GetBytes(32), pdb.GetBytes(16)); 
-
-			// Now we need to turn the resulting byte array into a string. 
-			// A common mistake would be to use an Encoding class for that. It does not work 
-			// because not all byte values can be represented by characters. 
-			// We are going to be using Base64 encoding that is designed exactly for what we are 
-			// trying to do. 
-			return System.Text.Encoding.Unicode.GetString(decryptedData); 
-            
-		} 
-
-  
-		// Decrypt bytes into bytes using a password 
-		//    Uses Decrypt(byte[], byte[], byte[]) 
-		public static byte[] Decrypt(byte[] cipherData, string Password) 
-		{ 
-
-			// We need to turn the password into Key and IV. 
-			// We are using salt to make it harder to guess our key using a dictionary attack - 
-			// trying to guess a password by enumerating all possible words. 
-			PasswordDeriveBytes pdb = new PasswordDeriveBytes(Password, 
-				new byte[] {0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d,  0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76}); 
-  
-			// Now get the key/IV and do the Decryption using the function that accepts byte arrays. 
-			// Using PasswordDeriveBytes object we are first getting 32 bytes for the Key 
-			// (the default Rijndael key length is 256bit = 32bytes) and then 16 bytes for the IV. 
-			// IV should always be the block size, which is by default 16 bytes (128 bit) for Rijndael. 
-			// If you are using DES/TripleDES/RC2 the block size is 8 bytes and so should be the IV size. 
-			// You can also read KeySize/BlockSize properties off the algorithm to find out the sizes. 
-
-			return Decrypt(cipherData, pdb.GetBytes(32), pdb.GetBytes(16)); 
-
-		} 
-
-
-		// Decrypt a file into another file using a password 
-		public static void Decrypt(string fileIn, string fileOut, string Password) 
-		{ 
-			// First we are going to open the file streams 
-			FileStream fsIn = new FileStream(fileIn, FileMode.Open, FileAccess.Read); 
-			FileStream fsOut = new FileStream(fileOut, FileMode.OpenOrCreate, FileAccess.Write); 
-
-			// Then we are going to derive a Key and an IV from the Password and create an algorithm 
-			PasswordDeriveBytes pdb = new PasswordDeriveBytes(Password, 
-				new byte[] {0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d,  0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76}); 
- 
-			Rijndael alg = Rijndael.Create(); 
- 
-			alg.Key = pdb.GetBytes(32); 
-			alg.IV = pdb.GetBytes(16); 
-  
-
-			// Now create a crypto stream through which we are going to be pumping data. 
-			// Our fileOut is going to be receiving the Decrypted bytes. 
-
-			CryptoStream cs = new CryptoStream(fsOut, alg.CreateDecryptor(), CryptoStreamMode.Write); 
-
-			// Now will will initialize a buffer and will be processing the input file in chunks. 
-			// This is done to avoid reading the whole file (which can be huge) into memory. 
-
-			int bufferLen = 4096; 
-			byte[] buffer = new byte[bufferLen]; 
-			int bytesRead; 
-
-            
-			do 
-			{ 
-
-				// read a chunk of data from the input file 
-				bytesRead = fsIn.Read(buffer, 0, bufferLen); 
-  
-				// Decrypt it 
-				cs.Write(buffer, 0, bytesRead); 
-        
-			} while(bytesRead != 0); 
-
-			// close everything 
-			cs.Close(); // this will also close the unrelying fsOut stream 
-			fsIn.Close();     
-
-		} 
-
-
-	}
-}
diff --git a/scheduler/DeviceScheduler/Languages/Localization.cs b/scheduler/DeviceScheduler/Languages/Localization.cs
deleted file mode 100644
index 782fad31..00000000
--- a/scheduler/DeviceScheduler/Languages/Localization.cs
+++ /dev/null
@@ -1,100 +0,0 @@
-using System;
-using System.IO;
-using System.Data;
-using System.Collections.Generic;
-using System.Text;
-using System.Windows.Forms;
-using System.Resources;
-using System.Reflection;
-
-namespace DeviceScheduler
-{
-    public enum eLanguage
-    { 
-        Swedish=1053,
-        English=1033
-    }
-
-    /// 
-    /// This class handles all localization such as retrieving specific strings and changing standard locale.
-    /// 
-    class Localization
-    {
-        private static ResourceManager m_Mngr = null;
-        private static Assembly m_Assembly = null;
-        private static eLanguage m_SelectedLanguage = eLanguage.English;
-
-        public static Assembly Assembly
-        {
-            get { return m_Assembly; }
-            set { m_Assembly = value; }
-        }
-
-        public static void GetSelectedLanguage()
-        {
-           
-            Microsoft.Win32.RegistryKey key = Microsoft.Win32.Registry.CurrentUser.OpenSubKey(@"Software\Telldus");
-
-            if (key != null)
-            {
-
-                if (key.GetValue("Language") != null)
-                {
-                    m_SelectedLanguage = (eLanguage)Enum.Parse(typeof(eLanguage), key.GetValue("Language").ToString());
-                }
-                key.Close();
-            }
-            
-        }
-
-        private static ResourceManager ResMngr
-        {
-            get
-            {
-                if (m_Mngr == null)
-                    m_Mngr = new ResourceManager("DeviceScheduler.Languages.WinFormStrings", m_Assembly);
-
-                return m_Mngr;
-            }
-        }
-
-        public static string GetString(string name)
-        {
-            try
-            {
-                
-                return ResMngr.GetString(name);
-
-            }
-            catch
-            {
-                return "";
-            }
-        }
-
-
-        public static void ChangeLanguage()
-        {
-            ChangeLanguage(m_SelectedLanguage);
-        }
-
-        public static void ChangeLanguage(eLanguage language)
-        {
-            m_SelectedLanguage = language;
-
-            if (language == eLanguage.English)
-            {
-                System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-GB");
-                System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("en-GB");//en
-            }
-            else if (language == eLanguage.Swedish)
-            {
-                System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("sv-SE");//sv
-                System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("sv-SE");
-            }
-            
-        }
-
-       
-    }
-}
diff --git a/scheduler/DeviceScheduler/Languages/WinFormStrings.en.resx b/scheduler/DeviceScheduler/Languages/WinFormStrings.en.resx
deleted file mode 100644
index 4152607a..00000000
--- a/scheduler/DeviceScheduler/Languages/WinFormStrings.en.resx
+++ /dev/null
@@ -1,160 +0,0 @@
-
-
-  
-  
-    
-    
-      
-        
-          
-            
-              
-                
-              
-              
-              
-              
-              
-            
-          
-          
-            
-              
-              
-            
-          
-          
-            
-              
-                
-                
-              
-              
-              
-              
-              
-            
-          
-          
-            
-              
-                
-              
-              
-            
-          
-        
-      
-    
-  
-  
-    text/microsoft-resx
-  
-  
-    2.0
-  
-  
-    System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    could not be found in the system and has probably been removed manually.
-    SP
-  
-  
-    You have to name the schedule.
-  
-  
-    You have not selected any units.
-  
-  
-    lication failed to set accountinformation (such as username and password) on the current schedule.
-  
-  
-    An unhandeld error has occurred in the application.
-  
-  
-    Do you want to remove selected schedule?
-  
-  
-    Do you want to remove the selected unit from the list?
-  
-  
-    No devices exists. Add them first by clicking "Configure unit(s)".
-  
-  
-    The scheduled task
-    SP
-
-  
-  
-    Off
-  
-  
-    On
-  
-  
-    Telldus Scheduler
-    SP
-  
-
\ No newline at end of file
diff --git a/scheduler/DeviceScheduler/Languages/WinFormStrings.resx b/scheduler/DeviceScheduler/Languages/WinFormStrings.resx
deleted file mode 100644
index b867a2c6..00000000
--- a/scheduler/DeviceScheduler/Languages/WinFormStrings.resx
+++ /dev/null
@@ -1,159 +0,0 @@
-
-
-  
-  
-    
-    
-      
-        
-          
-            
-              
-                
-              
-              
-              
-              
-              
-            
-          
-          
-            
-              
-              
-            
-          
-          
-            
-              
-                
-                
-              
-              
-              
-              
-              
-            
-          
-          
-            
-              
-                
-              
-              
-            
-          
-        
-      
-    
-  
-  
-    text/microsoft-resx
-  
-  
-    2.0
-  
-  
-    System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    kunde inte hittas i systemet och har förmodligen tagits bort manuellt.
-  
-  
-    Du måste ge schemaläggningen ett namn.
-  
-  
-    Du har inte valt några enheter.
-  
-  
-    Programmet misslyckades med att sätta kontouppgifter (användarnamn och lösenord) på schemaläggningen.
-  
-  
-    Ett ohanterat fel har uppstått i programmet.
-  
-  
-    Vill du ta bort markerad schemaläggning?
-  
-  
-    Vill du ta bort markerad enhet?
-  
-  
-    Inga enheter finns. Lägg först till enheter genom att klicka på "Konfigurera enheter".
-    SP
-  
-  
-    Den schemalagda uppgiften
-    SP
-  
-  
-    Av
-  
-  
-    PÃ¥
-  
-  
-    Telldus Schemaläggare
-    SP
-  
-
\ No newline at end of file
diff --git a/scheduler/DeviceScheduler/Languages/WinFormStrings.sv.resx b/scheduler/DeviceScheduler/Languages/WinFormStrings.sv.resx
deleted file mode 100644
index b867a2c6..00000000
--- a/scheduler/DeviceScheduler/Languages/WinFormStrings.sv.resx
+++ /dev/null
@@ -1,159 +0,0 @@
-
-
-  
-  
-    
-    
-      
-        
-          
-            
-              
-                
-              
-              
-              
-              
-              
-            
-          
-          
-            
-              
-              
-            
-          
-          
-            
-              
-                
-                
-              
-              
-              
-              
-              
-            
-          
-          
-            
-              
-                
-              
-              
-            
-          
-        
-      
-    
-  
-  
-    text/microsoft-resx
-  
-  
-    2.0
-  
-  
-    System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    kunde inte hittas i systemet och har förmodligen tagits bort manuellt.
-  
-  
-    Du måste ge schemaläggningen ett namn.
-  
-  
-    Du har inte valt några enheter.
-  
-  
-    Programmet misslyckades med att sätta kontouppgifter (användarnamn och lösenord) på schemaläggningen.
-  
-  
-    Ett ohanterat fel har uppstått i programmet.
-  
-  
-    Vill du ta bort markerad schemaläggning?
-  
-  
-    Vill du ta bort markerad enhet?
-  
-  
-    Inga enheter finns. Lägg först till enheter genom att klicka på "Konfigurera enheter".
-    SP
-  
-  
-    Den schemalagda uppgiften
-    SP
-  
-  
-    Av
-  
-  
-    PÃ¥
-  
-  
-    Telldus Schemaläggare
-    SP
-  
-
\ No newline at end of file
diff --git a/scheduler/DeviceScheduler/Program.cs b/scheduler/DeviceScheduler/Program.cs
deleted file mode 100644
index 5efeb96c..00000000
--- a/scheduler/DeviceScheduler/Program.cs
+++ /dev/null
@@ -1,39 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Windows.Forms;
-
-namespace DeviceScheduler
-{
-    static class Program
-    {
-        /// 
-        /// The main entry point for the application.
-        /// 
-        [STAThread]
-        static void Main()
-        {
-            Application.EnableVisualStyles();
-            Application.SetCompatibleTextRenderingDefault(false);
-            Application.Run(new frmMain());
-        }
-        private static DeviceHandler.Handler m_Handler = new DeviceHandler.Handler();
-
-        public static DeviceHandler.Handler DeviceHandler
-        {
-            get 
-            {
-                if (m_Handler == null)
-                {
-                    m_Handler = new DeviceHandler.Handler();
-                    
-                }
-                
-                return m_Handler;
-            }
-            set
-            {
-                m_Handler = value;
-            }
-        }
-    }
-}
\ No newline at end of file
diff --git a/scheduler/DeviceScheduler/Properties/AssemblyInfo.cs b/scheduler/DeviceScheduler/Properties/AssemblyInfo.cs
deleted file mode 100644
index 8e7997fa..00000000
--- a/scheduler/DeviceScheduler/Properties/AssemblyInfo.cs
+++ /dev/null
@@ -1,33 +0,0 @@
-using System.Reflection;
-using System.Runtime.CompilerServices;
-using System.Runtime.InteropServices;
-
-// General Information about an assembly is controlled through the following 
-// set of attributes. Change these attribute values to modify the information
-// associated with an assembly.
-[assembly: AssemblyTitle("DeviceScheduler")]
-[assembly: AssemblyDescription("Program for scheduling Telldus devices.")]
-[assembly: AssemblyConfiguration("")]
-[assembly: AssemblyCompany("Telldus Technologies")]
-[assembly: AssemblyProduct("DeviceScheduler")]
-[assembly: AssemblyCopyright("Copyright © Telldus Technologies 2010")]
-[assembly: AssemblyTrademark("")]
-[assembly: AssemblyCulture("")]
-
-// Setting ComVisible to false makes the types in this assembly not visible 
-// to COM components.  If you need to access a type in this assembly from 
-// COM, set the ComVisible attribute to true on that type.
-[assembly: ComVisible(false)]
-
-// The following GUID is for the ID of the typelib if this project is exposed to COM
-[assembly: Guid("604d814a-5ace-4cf6-9212-f84cd90058f5")]
-
-// Version information for an assembly consists of the following four values:
-//
-//      Major Version
-//      Minor Version 
-//      Build Number
-//      Revision
-//
-[assembly: AssemblyVersion("2010.10.0.0")]
-[assembly: AssemblyFileVersion("2010.10.0.0")]
diff --git a/scheduler/DeviceScheduler/Properties/Resources.resx b/scheduler/DeviceScheduler/Properties/Resources.resx
deleted file mode 100644
index ffecec85..00000000
--- a/scheduler/DeviceScheduler/Properties/Resources.resx
+++ /dev/null
@@ -1,117 +0,0 @@
-
-
-  
-  
-    
-      
-        
-          
-            
-              
-                
-              
-              
-              
-              
-            
-          
-          
-            
-              
-              
-            
-          
-          
-            
-              
-                
-                
-              
-              
-              
-              
-            
-          
-          
-            
-              
-                
-              
-              
-            
-          
-        
-      
-    
-  
-  
-    text/microsoft-resx
-  
-  
-    2.0
-  
-  
-    System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-
\ No newline at end of file
diff --git a/scheduler/DeviceScheduler/Properties/Settings.settings b/scheduler/DeviceScheduler/Properties/Settings.settings
deleted file mode 100644
index abf36c5d..00000000
--- a/scheduler/DeviceScheduler/Properties/Settings.settings
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-  
-    
-  
-  
-
diff --git a/scheduler/DeviceScheduler/Tasks.cs b/scheduler/DeviceScheduler/Tasks.cs
deleted file mode 100644
index ae545fc5..00000000
--- a/scheduler/DeviceScheduler/Tasks.cs
+++ /dev/null
@@ -1,10 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Text;
-
-namespace DeviceScheduler
-{
-    class Tasks
-    {
-    }
-}
diff --git a/scheduler/DeviceScheduler/frmAbout.Designer.cs b/scheduler/DeviceScheduler/frmAbout.Designer.cs
deleted file mode 100644
index 5f6862ce..00000000
--- a/scheduler/DeviceScheduler/frmAbout.Designer.cs
+++ /dev/null
@@ -1,184 +0,0 @@
-namespace DeviceScheduler
-{
-    partial class frmAbout
-    {
-        /// 
-        /// Required designer variable.
-        /// 
-        private System.ComponentModel.IContainer components = null;
-
-        /// 
-        /// Clean up any resources being used.
-        /// 
-        protected override void Dispose(bool disposing)
-        {
-            if (disposing && (components != null))
-            {
-                components.Dispose();
-            }
-            base.Dispose(disposing);
-        }
-
-        #region Windows Form Designer generated code
-
-        /// 
-        /// Required method for Designer support - do not modify
-        /// the contents of this method with the code editor.
-        /// 
-        private void InitializeComponent()
-        {
-            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(frmAbout));
-            this.cmdClose = new System.Windows.Forms.Button();
-            this.lnkInternet = new System.Windows.Forms.LinkLabel();
-            this.label2 = new System.Windows.Forms.Label();
-            this.label3 = new System.Windows.Forms.Label();
-            this.label4 = new System.Windows.Forms.Label();
-            this.label5 = new System.Windows.Forms.Label();
-            this.lblVersion = new System.Windows.Forms.Label();
-            this.label6 = new System.Windows.Forms.Label();
-            this.linkLabel1 = new System.Windows.Forms.LinkLabel();
-            this.label7 = new System.Windows.Forms.Label();
-            this.SuspendLayout();
-            // 
-            // cmdClose
-            // 
-            this.cmdClose.AccessibleDescription = null;
-            this.cmdClose.AccessibleName = null;
-            resources.ApplyResources(this.cmdClose, "cmdClose");
-            this.cmdClose.BackgroundImage = null;
-            this.cmdClose.Font = null;
-            this.cmdClose.Name = "cmdClose";
-            this.cmdClose.UseVisualStyleBackColor = true;
-            this.cmdClose.Click += new System.EventHandler(this.cmdClose_Click);
-            // 
-            // lnkInternet
-            // 
-            this.lnkInternet.AccessibleDescription = null;
-            this.lnkInternet.AccessibleName = null;
-            resources.ApplyResources(this.lnkInternet, "lnkInternet");
-            this.lnkInternet.BackColor = System.Drawing.Color.Transparent;
-            this.lnkInternet.Font = null;
-            this.lnkInternet.Name = "lnkInternet";
-            this.lnkInternet.TabStop = true;
-            this.lnkInternet.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkLabel1_LinkClicked);
-            // 
-            // label2
-            // 
-            this.label2.AccessibleDescription = null;
-            this.label2.AccessibleName = null;
-            resources.ApplyResources(this.label2, "label2");
-            this.label2.BackColor = System.Drawing.Color.Transparent;
-            this.label2.Font = null;
-            this.label2.Name = "label2";
-            // 
-            // label3
-            // 
-            this.label3.AccessibleDescription = null;
-            this.label3.AccessibleName = null;
-            resources.ApplyResources(this.label3, "label3");
-            this.label3.BackColor = System.Drawing.Color.Transparent;
-            this.label3.Font = null;
-            this.label3.Name = "label3";
-            // 
-            // label4
-            // 
-            this.label4.AccessibleDescription = null;
-            this.label4.AccessibleName = null;
-            resources.ApplyResources(this.label4, "label4");
-            this.label4.BackColor = System.Drawing.Color.Transparent;
-            this.label4.Font = null;
-            this.label4.Name = "label4";
-            // 
-            // label5
-            // 
-            this.label5.AccessibleDescription = null;
-            this.label5.AccessibleName = null;
-            resources.ApplyResources(this.label5, "label5");
-            this.label5.BackColor = System.Drawing.Color.Transparent;
-            this.label5.Font = null;
-            this.label5.Name = "label5";
-            // 
-            // lblVersion
-            // 
-            this.lblVersion.AccessibleDescription = null;
-            this.lblVersion.AccessibleName = null;
-            resources.ApplyResources(this.lblVersion, "lblVersion");
-            this.lblVersion.BackColor = System.Drawing.Color.Transparent;
-            this.lblVersion.Font = null;
-            this.lblVersion.Name = "lblVersion";
-            // 
-            // label6
-            // 
-            this.label6.AccessibleDescription = null;
-            this.label6.AccessibleName = null;
-            resources.ApplyResources(this.label6, "label6");
-            this.label6.BackColor = System.Drawing.Color.Transparent;
-            this.label6.Font = null;
-            this.label6.Name = "label6";
-            // 
-            // linkLabel1
-            // 
-            this.linkLabel1.AccessibleDescription = null;
-            this.linkLabel1.AccessibleName = null;
-            resources.ApplyResources(this.linkLabel1, "linkLabel1");
-            this.linkLabel1.BackColor = System.Drawing.Color.Transparent;
-            this.linkLabel1.Font = null;
-            this.linkLabel1.Name = "linkLabel1";
-            this.linkLabel1.TabStop = true;
-            this.linkLabel1.Tag = "http://www.vistaico.com/link_to_us.htm";
-            this.linkLabel1.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkLabel1_LinkClicked_1);
-            // 
-            // label7
-            // 
-            this.label7.AccessibleDescription = null;
-            this.label7.AccessibleName = null;
-            resources.ApplyResources(this.label7, "label7");
-            this.label7.BackColor = System.Drawing.Color.Transparent;
-            this.label7.Font = null;
-            this.label7.Name = "label7";
-            // 
-            // frmAbout
-            // 
-            this.AccessibleDescription = null;
-            this.AccessibleName = null;
-            resources.ApplyResources(this, "$this");
-            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
-            this.Controls.Add(this.label7);
-            this.Controls.Add(this.linkLabel1);
-            this.Controls.Add(this.label6);
-            this.Controls.Add(this.lblVersion);
-            this.Controls.Add(this.label5);
-            this.Controls.Add(this.label4);
-            this.Controls.Add(this.label3);
-            this.Controls.Add(this.label2);
-            this.Controls.Add(this.lnkInternet);
-            this.Controls.Add(this.cmdClose);
-            this.Font = null;
-            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
-            this.Icon = null;
-            this.MaximizeBox = false;
-            this.MinimizeBox = false;
-            this.Name = "frmAbout";
-            this.ShowIcon = false;
-            this.ShowInTaskbar = false;
-            this.Load += new System.EventHandler(this.frmAbout_Load);
-            this.ResumeLayout(false);
-            this.PerformLayout();
-
-        }
-
-        #endregion
-
-        private System.Windows.Forms.Button cmdClose;
-        private System.Windows.Forms.LinkLabel lnkInternet;
-        private System.Windows.Forms.Label label2;
-        private System.Windows.Forms.Label label3;
-        private System.Windows.Forms.Label label4;
-        private System.Windows.Forms.Label label5;
-        private System.Windows.Forms.Label lblVersion;
-        private System.Windows.Forms.Label label6;
-        private System.Windows.Forms.LinkLabel linkLabel1;
-        private System.Windows.Forms.Label label7;
-
-    }
-}
diff --git a/scheduler/DeviceScheduler/frmAbout.cs b/scheduler/DeviceScheduler/frmAbout.cs
deleted file mode 100644
index 266e58ce..00000000
--- a/scheduler/DeviceScheduler/frmAbout.cs
+++ /dev/null
@@ -1,142 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.ComponentModel;
-using System.Drawing;
-using System.Windows.Forms;
-using System.Reflection;
-
-namespace DeviceScheduler
-{
-    partial class frmAbout : Form
-    {
-        public frmAbout()
-        {
-            Localization.ChangeLanguage();
-            InitializeComponent();
-
-            //  Initialize the AboutBox to display the product information from the assembly information.
-            //  Change assembly information settings for your application through either:
-            //  - Project->Properties->Application->Assembly Information
-            //  - AssemblyInfo.cs
-                      
-            this.lblVersion.Text = AssemblyVersion;
-  
-
-        }
-
-        #region Assembly Attribute Accessors
-
-        public string AssemblyTitle
-        {
-            get
-            {
-                // Get all Title attributes on this assembly
-                object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyTitleAttribute), false);
-                // If there is at least one Title attribute
-                if (attributes.Length > 0)
-                {
-                    // Select the first one
-                    AssemblyTitleAttribute titleAttribute = (AssemblyTitleAttribute)attributes[0];
-                    // If it is not an empty string, return it
-                    if (titleAttribute.Title != "")
-                        return titleAttribute.Title;
-                }
-                // If there was no Title attribute, or if the Title attribute was the empty string, return the .exe name
-                return System.IO.Path.GetFileNameWithoutExtension(Assembly.GetExecutingAssembly().CodeBase);
-            }
-        }
-
-        public string AssemblyVersion
-        {
-            get
-            {
-                return Assembly.GetExecutingAssembly().GetName().Version.ToString();
-            }
-        }
-
-        public string AssemblyDescription
-        {
-            get
-            {
-                // Get all Description attributes on this assembly
-                object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyDescriptionAttribute), false);
-                // If there aren't any Description attributes, return an empty string
-                if (attributes.Length == 0)
-                    return "";
-                // If there is a Description attribute, return its value
-                return ((AssemblyDescriptionAttribute)attributes[0]).Description;
-            }
-        }
-
-        public string AssemblyProduct
-        {
-            get
-            {
-                // Get all Product attributes on this assembly
-                object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyProductAttribute), false);
-                // If there aren't any Product attributes, return an empty string
-                if (attributes.Length == 0)
-                    return "";
-                // If there is a Product attribute, return its value
-                return ((AssemblyProductAttribute)attributes[0]).Product;
-            }
-        }
-
-        public string AssemblyCopyright
-        {
-            get
-            {
-                // Get all Copyright attributes on this assembly
-                object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyCopyrightAttribute), false);
-                // If there aren't any Copyright attributes, return an empty string
-                if (attributes.Length == 0)
-                    return "";
-                // If there is a Copyright attribute, return its value
-                return ((AssemblyCopyrightAttribute)attributes[0]).Copyright;
-            }
-        }
-
-        public string AssemblyCompany
-        {
-            get
-            {
-                // Get all Company attributes on this assembly
-                object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyCompanyAttribute), false);
-                // If there aren't any Company attributes, return an empty string
-                if (attributes.Length == 0)
-                    return "";
-                // If there is a Company attribute, return its value
-                return ((AssemblyCompanyAttribute)attributes[0]).Company;
-            }
-        }
-        #endregion
-
-        private void cmdClose_Click(object sender, EventArgs e)
-        {
-            this.Close();
-        }
-
-        private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
-        {
-            System.Diagnostics.Process proc = new System.Diagnostics.Process();
-
-            proc.StartInfo.FileName = lnkInternet.Text;
-            proc.StartInfo.UseShellExecute = true;
-            proc.Start();
-        }
-
-        private void linkLabel1_LinkClicked_1(object sender, LinkLabelLinkClickedEventArgs e)
-        {
-            System.Diagnostics.Process proc = new System.Diagnostics.Process();
-
-            proc.StartInfo.FileName = linkLabel1.Tag.ToString();
-            proc.StartInfo.UseShellExecute = true;
-            proc.Start();
-        }
-
-        private void frmAbout_Load(object sender, EventArgs e)
-        {
-
-        }
-    }
-}
diff --git a/scheduler/DeviceScheduler/frmAbout.en.resx b/scheduler/DeviceScheduler/frmAbout.en.resx
deleted file mode 100644
index 016f572d..00000000
--- a/scheduler/DeviceScheduler/frmAbout.en.resx
+++ /dev/null
@@ -1,942 +0,0 @@
-
-
-  
-  
-    
-    
-      
-        
-          
-            
-              
-                
-              
-              
-              
-              
-              
-            
-          
-          
-            
-              
-              
-            
-          
-          
-            
-              
-                
-                
-              
-              
-              
-              
-              
-            
-          
-          
-            
-              
-                
-              
-              
-            
-          
-        
-      
-    
-  
-  
-    text/microsoft-resx
-  
-  
-    2.0
-  
-  
-    System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    Close
-  
-  
-  
-    294, 187
-  
-  
-    230, 26
-  
-  
-    This software is developed by Mattias Dahlgren
-for Telldus Technologies.
-  
-  
-    197, 26
-  
-  
-    © Copyright Telldus Technologies 2008.
-All rights reserved.
-  
-  
-    237, 187
-  
-  
-    49, 13
-  
-  
-    Website:
-  
-  
-    214, 13
-  
-  
-    This software is using icons from VistaIcons:
-  
-  
-    260, 26
-  
-  
-    In accordance with the Creative Commons Attribution 
-3.0 license
-  
-  
-    
-        iVBORw0KGgoAAAANSUhEUgAAAfQAAAEsCAIAAAC62dafAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
-        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAAewQAA
-        HsEBw2lUUwAAtDBJREFUeF7tvYefJMmV31fH4/k78A7AHXAADgfggAWw3s4aYL33drzb8b7duJ4e7733
-        fg1wwDmKohFJSZRIiUaU6ClRXnf8T/TN+s68icmsrq7uru5pE/HZT29NVWZk5MvMb7z8xYsXv7Bjx45a
-        LtkC2QLZAtkCE8wCwD2XbIFsgWyBbIEJZoHazlyyBbIFsgWyBSacBTLcJ9wlzSeULZAtkC2wc2eGe74L
-        sgWyBbIFJqAFartyyRbIFsgWyBaYcBbIcJ9wlzSfULZAtkC2wK5dGe75LsgWyBbIFpiAFqjtziVbIFsg
-        WyBbYMJZIMN9wl3SfEITyAJ31p+cQIacjKeS4T4Zr3o+57Fggf7AvXfv3gMHDhw7duzMmTMXL166evXa
-        5SvXLl26eurUuePHzx44cPzgwTMHD109dPjK9h1nNmw8trH3OP/1bjrR0Xnwnfc2vPv+rf/efnf96o79
-        m/pOsMGGjce3bT996NCVg4cuHTh48tChk8dPnDl37tKlS1euXLl28eJFDnf06NH9+/fv2bPH2JFWupax
-        YMnchoYWqHEhc8kWyBZo0QKQ18L2pSeqYQ2lbdjx4MGDJ06cPHv2HOC+du36tWufXbx47fz562fOfnrg
-        wLlNfUfXrT/W2Xl0/se733pn0/MvbXjuxb4fP9s75akNd9/f8/17ur91V9e37+r61l0937qr+9t39dz2
-        3/d7vtPov3Qb9qrv2PWd73f98L6ehx9b99TTvRzi+Zc2vvlW77z5uzn0uvVHN285duTIpXPnPj137sql
-        yzTy00uXLp85c/bkSXqFQ5yp3G9C1RbtmTcbOQtkuI+cbXPNE80C1659snTZzu6eg13dB5Yu33nx4hUm
-        rIeHm5Ju3759eMFnz569jNd97dOLF2H39Z27Tnd2HZo7b/ejj3d/5/vdtdqKWm1xrbbs5n/La7VVtb+2
-        pvYra2pfWPM7v9/5tW91f+M7xX/f/KPuP/xe97fr4P6jH7TnP7uBb32v55vfvXGUr327m4PWfqvegBr/
-        razVaJLNW8p/X/lm530PdX3w0dY1HYe2bjtx6hR90tWrVz+5cOHiqVOngD4WaAL9iXY3jPnzyXAf85co
-        N3DMWODKlU9qtQW1X+8o/qstRDXZvHnzli1b4DsqCoyD4/jghw5dXNNx4K23N//hdzvrfFxS5yMfVtd+
-        o+MLX+kseP3dwu9uF6lHoR56AjqYP/ij7i9/o6v2W5z+6voZ8R/cX/Ht73e+/8HWru7DR45chPhXrlw/
-        d+7ckSNHAvdVN3/MXNUJ25BavGbmD9kC2QJNLAADrl79FJZJ0tpfW71zFw7rhd17Ti9ZtveRx9fWXV04
-        Du9W1r7Q8Xt/0FUQvGVfOxSVP/xu9+9/q4vdwehv/G5n7a/jRK9K/sPf16EuvOlh/Gd/Q21WDqzrf391
-        Dd3P736jaMBX/7ALmtMJ3WhbPy8NnCNnWkD/18PfX1r7jVWvvrEJ3B87duny5U8uXLxE/5e+3KRMzTfe
-        SFggw30krJrrnGgWgETILKdPX4GGwv17P+yB4HXIrvqVL3XgjA/oiYtIcPm7f9D1G7+HUy9PwauMFrVL
-        v/lHHc+9uOmNt/oYGp338dbOzv29m4729u7fuHFPb+/urVv3btu2b8eO/Tt3Hti+fc/Wrdu3bt2xZev2
-        zZu3bdjQ299/fX1bt7DZlmLjnTv37dy5nxqoZ+u2fb29u3p792yg8k2H1284tHrN3llzNr/z3vo33970
-        4it99zzQddNDp23Ro9zsEr7Q8eWvd331m13IO55dvEMwKvCVb4p7T3D5j5/d0N1z5NSpy/j1DN6iXIU7
-        n0E/Eg9MhvtIWDXXOREsAHFwNq9cQWT4fMuWU8+90Pvlb3S2IoB85wc3IP6lr3fVfimcWZ36Zfc91PP2
-        u33z5m/ZsPHQpr59EBbabt68dd26DV1d3atWrVq4cOGcOXNmzpw5derU99577+3RLe++++6HH344bdo0
-        GkAzPv54wfLlKzo7u3p61m3YsGnbtp27dx+kzX19+zb1HV62fNf7H/S+8trmL36NXkqV5ua7S231b/9+
-        J75/OP5o+rwWyPrf/caahYv3HD128fLlaydPnlK90a8P0E+Ee+iOnkOG+x01fz742LMAcMGvvH79s4MH
-        L7z7/tabGshqpJKG45mgHF2CX3/5izjyDkIWMvR9D3W//+GWzs69mzfjJu/DcV67dt3Klavmz58/ffr0
-        999//616SdH9Tr2AVwtkp7Al5YN6AbuWj+oF+lMAcVqovHkpbc8/rcc64xB88KA2wGKTovArfcDcuXOX
-        LVvW1dW1ceOmHTsIpDm4ZevB9esPzpi15cWXN9V+FZrzH9Av/P1f+VJBfF5ffvXLvLsUoP/uD7s6Og6d
-        O8fw7AViQB2gzpQf/pNR4+Uol2yBbAGeJcYACUzcuvXUvQ8SygKgVyE99xeg8t0f9uCZBsqffWHjokU7
-        Nm8+CMf7+rasWdOxYMECiAmsA98puwPcklpGA+UZM2aAS8qsWbNmz56N7ww6582bR5fwcb1QLQXvftHN
-        sjgpS1or6S5RD3VSrN9jcVAOTaEZFNpDq2we7bQLadI3sDFVYYqNG3t37dq7e/ehLVuPLlq84+XXemu/
-        QC9oHM7K2i/jzqNQFWMA02duP3Hi8sWLl6F8ID4wl+/SQVkgw31Q5sobT0ALnDhxAj991+5z378HfRmm
-        r8avLMkvIB4FmdjE+P5LX++cO2/r5s0716/fuHTpMniHr11yw8MB1+kOgstuwS21hTXMBc5Lly5djhSy
-        YsVK/PxVq1bXyxoY2dHRWS/4yJTu7u6em2Xt7WVd/yXdMHbnA7VZrYegcDgO6tFpBo2hSTSMQgtpJ62l
-        zfYH0ROkfUDaAcTrAj0EO9KM7dt37t9/dPuOo0uX7UGOT8YeCA9dCuVPn75MdxuxlbxRZcoP6vHLcB+U
-        ufLGE8oCTCM6d/76m++gvRR+eonpAj2cylde7339zU2EnN+Ilqkt27Ch7+WXX37llVdef/31N998U0UF
-        7UJnHJxBNyGO8xsEB4uIGLJbastr8ArywPL6etmwYcNGPN7e3k310lcvRF5aiL/c2qhsa6003Jc6KXEI
-        j+jRaQaNodAq2kYjaap9g/2BPUH0AZxg0F/0YwF6skB/vAHwge6NHTnugQOH9+07vqZjX531yDizCTzt
-        7Dp88eJVguiRa9RqMuJbfAhrzDbOJVtgslng2vVP9u4792tfLoK1iV1J/XTiXmq/iFBQqASvvtG7YePB
-        3bsPQDTc7W3bdvN9AvfNkh2HHd8cjQJUgTA5HhCHXBJcXxsyBrjltVQFuJB5e704N6qUA6A6HbSNEdoN
-        55pG+oFojKuM2khaaydhl2BPYDfACdoB+EIA+unG9P2D+yWXP6Qn3gawEhg/duz09h0nXnltU60254f3
-        dROqxMxetRr4HoCbbLdu6+eb4d66rfKWE8EC169/unXbGQf3mJUjqXHSQXx9OHTpA4/0dPcc2Lv3EN4z
-        xEEcV13BMd++HbjfjHOvLevt3fLaa69Bdvx0fFKohGQBymEZRNMN1/sOiINC2d1wamuTQJEWnbW2b1Yd
-        1iv1KNErgF37gOgAAv3BfaGvCkRvp7Mv8VOpJxQqvmfjffv2nzx1nsQM777fe+zYeVIg6MUH4ifCfTkC
-        55DhPgJGzVWOSQuQCWD3nrN1l3y1w6T8LaIV6zEbb73dxzxToIHcDayNDDFkRaUFxXzXrn23w30ragy/
-        oiPDJmiFgw/KQzYJH7x5nF+LRB59o7bYMDdLu4HoAER/yn1sEs6+nn4Qv+Tjq+87/GCXyY6nT589deri
-        hQuXsAbVciCPPvrGGftHrDEqnUu2wMS2AL7ehYuf/vZXi0lDYp1ovLqfvuz9Dzfv3XsCZxpvEXwb/2fo
-        oUBHN4fduPDICIcOHUvh3te3HbedbfgJ9IAqlIpSjEcr6sHEMH4T2IURogMw7ZqyjzqPxNfHT1UdBX0H
-        k6E/jjw9KHuRf40d9d899MQwYxvPIsO9jcbMVY1FC1y//snc+YWcYjqX2i+gpy8lCeLevadw+/C4nS4U
-        8d18Vj0X6EjneI4ICJDl1Ckc/1uyzJYtO3Dt2ZjwD6ADnkIraEi6sWidUWlTQ2uUiB+4R3IJQZ93IFif
-        DuQ64Mw3dAN0pWys857hXr2SGe6jcnfng9wJC+DcXb36eTHF/7c6vs70yEJ+Wblu/ZFjx06i+cJuCE5M
-        i5N3DG7BSSd4Ay8etZcxQKVzUYJfef785dvhvlO40wEAHVgTXmQVZ3fCAGPrmAPqGKm80x/rjeHxcmS4
-        N7/ANR6AXLIFJp4FiF4/dPgiLGZKJPLLj57eeOToeR4G3HCC85zf76QhoxX5UicdBQA3HGUAn9HxzwjC
-        u3z5egr3rVt3ochTDz0B7iQqAfwiaK+VgsHTJ5NdDh8+HDuWfu3v6pT2Kj3q/e3FgdJjedDSEQesqlRJ
-        w+1bPym2JKT9MqMiV67y58KFC+SOJ6mkMo4KvvJ9OmYbw6q67RPvHh7mGWW4D9OAefexaAFE9q3bTtZq
-        i2AxOQBIQgsXkFbAN465My0NW0yZHk46LqF6rlHVMV53W1bI2rIq3E+fvrqm49i6dafWrjvZ5L/lKw4R
-        tBM1A6ZLlz5dteaoO65cdeTKlVu/9kcu2Hf4yNXO7uPutWLlYQSotM6GvGPFpe6eo2vXnao08vjGjYcP
-        HLhw/vwnTOkCr+lApeyOK03HuXPn2e6ekzcPfQgoVw99/frPV666cVIrVh25du3z6jb1GWSf96w98ugT
-        63/ty0agrviDP+oiZmn23F2bt5xgIsLVq9flezV0JxVkxuKNeEfblOF+R82fDz4CFjh+/DhQqNVmfTRt
-        G8lmgQLUJtwCZZwIdIBuKDr/DD891XBLunnqkw4I9y1bjxfzoVjsovl/tfks9GEsjYc7dOh8sXCHe9UW
-        njhxIf21Id/JUrlk2YEi/8GNvRaQbdH3DGXoEpG1NN5xvc9r1MIix5n5v5b+5u+t7t10/PLlolOsEpm+
-        85XXNhYb3zj0XKaDVQ995iya2MI4qbNnr5VOip5mxSpOoThxphd863usYVKsLcXoCBPK/sZXTZy5cN7H
-        Rf7IsFUpNqbhaY7AbTX+qqy18gqZt8kWGEcWOHz4Uu23VqG2Ix0wIocajnrOwKm5U2A60XV8g/YC09kg
-        pVIVo6lUUoI7oTHE1SjLIOPUQ7x5XVh9K+3t93rQ+l1NKf0PnJ0+fY6GRYDNkSMXGA+4OT1qxdFjZ42q
-        RBeCa7QKtJQuAXBfveYIaYdjUtXpM+fYyzrhe8O9gPtvf3XFH37vVm5eMEojTeZFEjRrYwaAU3NPnrxk
-        TIvDCRIOuL/3wRYSuN889OITJ095aIwZhz537id0FTe3WX7y5MX0pMi4uWr1Ic76ux7xuzeOeDMB8krS
-        BTMfmJWhVqw6hCkoBiPZb6WsHUc352g2NcN9NK2djzXiFvj0s5+SzfHcufO4nJAR5hJCx9xI+OsMI/4p
-        Vfm1FGvRnBf82hzu9ck7t+COE3rPA2sff2r9Y0+U/0N5OHToKO1B36eDgVmHD+O534L7/v3H+BUdCRo6
-        TivOUvPV4X44hfuhQ0eiTpoSEEz3qsKdZVSf+NGGl17tu/fBHjN5xdwusrTTDx08eJYBTKiNSe386nDf
-        nMKdcBUOjW1BcBz67Dk891twP3z4dHpSdWMuFv30Lt++q3Pb9uNHjpw+ePDooUMndu8+umbNvh/eS8Tq
-        gkWL95unAWtw1eg8qtYY8RtrHB4gw30cXrTc5H4sgDPImp48+dAQxEBwBBnTnsQwqZzSFa1qF01MO1i4
-        Q3BSnxtMyXuDvYuFzoaAHNR/viRuh7eHEtwJ43bKK82mwQ2ddzT3EtyZgYXixOGok2CShhBM4Y7//p3v
-        d9D/OSMUkYokCDt2HP7CV4pU7KS9dJ4XMg6ZAOgRqVPHGeGrBHd25NCcZhyabqAEd5aVjZPi0hw8yHB3
-        0Z/Rl3zlmx28FWAQBkJMN2Z2TJgOyXfsOOYrl5MJ+nuVyY9FyQI1R71zyRaYGBbg/g64g0WzXIUakOrR
-        qSPcyrlTMwmB02gZZRl4BK9xwOuyzKmQZdiS5ObOcWVKlNGWYssQHWIxg4YluG/fsY9we3BJN4AvDM44
-        KYNPolQ9d1b8oH6GE4AgHQZw9xzTva5cuRKyDNL2d+5aA9ltpJO2qIFkZc++sIG5u7rVJGZ48seF5EJP
-        Cd/x3+lES3AnyULp0DT47O2yzK7dB7GAJ0VtHZ0Ha79ZaEq/+Xudc+btotmGpTpxzBAmi0mPaSesx84N
-        rdHKFZxs22S4T7YrPsHPN+AOanmFN8dhBESHpK6PMyhbDAHuKBlMYQWdMMtFLUzwa0J2yA6tcJyrsgya
-        Of2B3QYbtAj33k2bATRHQX2iY4PCrcCdxtBIeinY6lxcyo6dTPtaGQsHkqNx375DuPaG82O3EtzpQDk0
-        O3JGHrqAezGgekuWYV3AOCl6rM6ugywXDtzR+r9/bzdJMJ0VDNmdaoB9IuGMIyVMO/A9ptrVDepSTpKN
-        M9wnyYWeLKcJgiEa0kGkNIkZ6qlQOwRzDB7uK7ZvR4ku1qiDXOR8JKGhcZX41CaJBNxqHUeO3Ka5Iyyn
-        Q7Wtwr23Dz7i6gJ3XOPW4U5ONPxl3yRMIg/HO7v2E8Ryczh01caNB8zNi++MJd99/zbNnRxpHDrtV6pw
-        37Fzf5wU71L1WQg3FqRlOPehx9Zt236IJV6xFZZRRjOxsKklHQB3rDjDvZUbuIZyl0u2wISxgNNz4DvP
-        f0xJT/30IZ8pNVdkmd0QDW8XFCoXpLIMmnU90yQxJ6X/VsyYdSOPisEwqP9Hj94WLRNwV/AR0zQgbTza
-        SElzJ/ukhNV9BoK+ncRefCYgvSTL8A4Ruc/AKIczu8uJE/Q3N/Ib/+qXO/DmoT8eNNtQ83tluK8vHZoG
-        lzR35niFikX9ly6x2vhiVii0/ygyLdezctZ+bRVrzPZtPnb23GVGbs2HbEpkxlFSsg/5Uk6SHTPcJ8mF
-        nkSnqVMTg0vh4wzTBIOFu6ORKBul/5gx+/ECFuQrEqDjhxqC0hzu5slqEe567sK9tBc1MP+zqrmH022s
-        i0Hl588X83sl7+//YfezL6xzzQ16DiSvMtzX3vDco1/pD+7IU2pNDGsfPkyXthC3PYJHiwVp74pOkRkD
-        q3bvPnP8OJndijHwCLIsmWKYV3ai7p7hPlGv7KQ+r9JLa1tsMVi447n/TrHIKt4oM4PS/5ZNnb5ZwQEf
-        GYwO6LmPNNxRupFcUEIixob+5vLlawF31hf80TM9kN2gfjZ77/2+NBSS3PUteu4p3OnYzpy5zGhtfd2l
-        Vb/ztU6CL9OFU+qxmMtZr+Po0WMRi2mPlfk+4F1dY8w9l2yBbIEBLcCzxAT6NFqG8VJlmYhpSWWZL3+j
-        c/7H2/v6DmzqO9C3+dCWLYe3bju6bduxrVuP79lzFESyF3yXp6VJTAjLKhgKPkCQFxEakDaSeMQ1t8e5
-        b9q0OQjLm0F94utte1FDw2gZxnvxyhkG4E2CMQFfeq5dYwrSDc/9t7/aOXXaVrPxEGpJ5VW4O5aL5x6H
-        Lk1iUnMPFQv3n06L06d7I7Yd+3w0bctf/x0krGLJQyJ5pDx9JHzftesUzn4EuUv2AS/ZJN8gw32S3wD5
-        9Fu1wGDhDqSIlWQ1j7feestAQxNPujo2HDRw2/CPsQN3fHb94oMHLwHZGwOqv8RK2buNqCGOhTa/896m
-        3701Q3UJq1ZV4X7mLJGj5WiZdIiC7gfEowXRJRhBxIwEpPUtWw59667OWI78a9/ufvypYt5Z9IU47xnu
-        A964Ge4DmihvkC1QWGAIcMe1h+wRaAjWQZuB23jKhKYQBIKfi2PeLrhXCZtCsLnnTmPw3IX7tWvX7r6/
-        SJkQuQ127DxAFyXccaIXL93/y1+6lfmAl4bqofcU617dSMZAV8eocGn8mWPBd/QWKkzTutEFMqL6je90
-        kpPAWU5f+EoH/QevO8Zi8nqRnfcBH8saY+65ZAtkCwxoAZ4l8heWZBmIBqydlVNPSFuexCTZUTMMNQHo
-        sW4cMEVycbJ+aUCVjAPBQRxbdBtYRgPSRpJPcU3HbekHJCwHApTIHRIw3YvPzOAtDajSKuIgcZyFO1FG
-        Z86c2biRDGg3uKzwzSRf4K4sU8xm2kpqtgD38p0795cOTfNmz935ha903uwelpKAPVQszBWD3rQT/91J
-        UrQc+5jibdmK3SZXEO6oRgwM4OOzpYFAJYMMeAUn2wYZ7v1eccKwTt8spK+jXKqXerLpovDjZLtdJvP5
-        DgHuhHgwg8kQclOvOF0WR9WlVh1NhadHj96Yiw/LICmhkCncG2ruVbgTxBiEVfiuurdVuINRWqjmzi7k
-        Il6+gqViV5l+QMl769ZDriXrvCpO4dx5hltvBEpC8Bkzt0Ne49w99KefFjOYXNSQdI+//MXV/GQYvn0h
-        Sx+ePHXt6tVrzktAm6JrQfDBOC5r9eIrGw2kYZbT9+7ucs0s/sYyexnuzZ/HDPfCPqdYP+3sWahN5g1e
-        SD/55JOf/OQnP71Z/vhm8Yuf/exnfvHzn//8T/7kT9jy008/ZS/oz/M2mfE3sc99sHAnY+3S5awYd3Dn
-        ziP79p0k7Bv3/NixS8ePXz569NLlK58a4e58nBTuX/x654IFaBUHd+0+um/fKeY3nThx5dSp66dPXz95
-        6vqVK58VmdwPH8baqedONph16w/u2HmY7AAHD56mwpMnr7rX8RPXPvvspyrpaShkPca8q3fT/p31vfr6
-        jkybsQMi/7Xf7kjIvmra9C1IMcCdcVd6KWdIkZqNDsAUY6R1rP3imtVr9u3YsRNAHzt2nLOb8uT63/9W
-        pI1kTat9TkCNDuBIEdr/8W8VuYVPcFJQnmeQJ+gkC2BfvLxq9YHa37gp+/w6ifh3mr+BloB+OkXshh0m
-        9i03zLOrMeY+CQteOSyGyKAZQFP+9E//9M///M//4i/+4m/+zb/5X9TL3/pbf+u/vFn+9t/+2/GZ7yls
-        wJZs/2d/9mdQXu5DfEBPQAJO/SS06sQ+ZZ6069dvBZDgtzKlBuLEtEy0gp07T4dYAR9/4/cIhWRtv+p/
-        H+/afcHAbeF+7Ngtz50dv/g1Zj813HHJ0mXFzH6V8TTlb+Fi/yIJ2RvuNe/cuWIdD/bi1bOU8rc+x6pY
-        gJAPBCPqa/Mf8Sqc46zZ2xj1hcsUpHBXi3Wa6IkTpIa/kdaxOPpvFIvTfuGr/C1WHifRo/UwLsr3zDvF
-        8Y9XBBzzo/VTLnILF80mG+XSr3+78+EpG77xHc59aXQwZi4jTX0M5wp3/H2624l9yw3z7CYX3NFSrl+/
-        justmoPgsPvv/t2/+/f+3t/7r24WPjcspQ3Y6+/8nb8j+qkQ0FM5jv9nn33Ggc6fPz/My5N3HzsWAO68
-        0aWaewnu9diPW3BP47VLn4Ha3n0XkCCcoVrS3Jvt+OsdHZ37nK4JXtMZqk0Pt/zU6cvm2MHtKME9JltB
-        8699q6verxTxiF/++uq9e4+RzpIODLLjNZt+wNEFe5edu85AXmQZuwSmIAHryEhTF+sJ8F9Gbnl89rR7
-        4MWElfVqtflAHNXFNjB8yhCug6h+Q83Uv2VLkXEMuNO7uFwtRlNzHzu3xxhsyaSAO6oLUiPkBcHgOC18
-        g/cN5Uvfp/8MygfZ48Pf//t/P8U9oJfy+PIgHi+JlwP+jsELn5s0WAvUPXd05Fn1tYr4bw7rUpi70WmZ
-        wL2v71ix9tCNDdys4X/zt249xeAhTig7Mpy4/wCBJfNb2HHxosXbEcfZEVjPX7CnvqxSkwP509zDh8/g
-        gDNiyVnUavNu34W48mW1XyDNS9fTz/VOm7F1U9+RgwdZLHAdGjcnqB7CaaK28yVcdqlYXiCg/KlT56dN
-        36brXf/rEYt//vrvrl6/4SDjqOwO2dM8l+xYXyv1k1Wr9xOWc3N3anB3PhS1fTiV6J3DCP2m1aQNBP7H
-        CDPnMtiLOKm2ryFyTdSC9oLv/Pnnn0NbhBTIC6bB8T/4B/+Av/rpYJ0N4C/KjM57qaRAZ68BC9tTA748
-        fQZCDSI+bQDx6om5jF8LwAVcBN7KmJfPBBo0FVJs4UuaYtfoFIRjBiTPnj1Pql3WYWWEc/36jSgSZH3B
-        2962rVj0CWGa6TubNxdCNkOLxvZduIBI+El9x8NsQ9Ld2JFEvumO+OzsCOMg9alTZ9jxxIlTLKEBQxmm
-        re/VS9hMejgSljEIiaLiaOe5cyxmgvrPghj0RlsY4qWbWbVqNadDtVTuGrPpAuKcY6SEjCAcPHf6Myqk
-        8voCTMQ1Ht29my+PHjzIRK19fM/wKSYC66acZDiUZhtwSffAXxe53rcfoYn6TrEQyIEDJ44cLZbs4Kzx
-        0+1gKDTJzDaG9Oi2j9/baRRaPmHhjqSOAo63Dr7xplOsA2g4LuL5FZWcldcpfJm65ANy3A2oJy1+ST30
-        JXQq8h05iP4Dyo/CFc2HGCELgBKAAlaAC4iBOy7H6uIYASzYB+jBPVNyABNQM427c5coMI5iqDuB20aG
-        uAA0oMQrZ0c2629HcIk8Yow8CgnHIrwEalNbHC6mSqWHI9gR1xu28q7AgfjA0WkGbRO+sZctjEaamtg1
-        oSS7A31YA+EbOhPQyQb0CtRGG+JM7SH8pyknjet36iz1YEzUc2qmk+Os2YYaIo179DFmS3bpkoiD1G0f
-        oWs9MaqdaHDHWyfoBaQyQIrvjMMOsgPTMNfPeNYQmZ8YRMWtRrfhVmP7FOglag/qn/Kd+uG7bwZonTQs
-        8310Hpsmb98NG1DdvroZ2wCUwBneLnCkuFQejDPnSQDLJblBalpcx5VivnLzuRvqTsH/hXTsSIfRcK90
-        R5dGYhdwSQ+h091kr2gqfQmYhpKgli9jr2gYzaYBJkhQzFE7CrKHuYhX8XyL/OydnXQe1kZPQw9k8nrX
-        ouKkqMcZW8rlFD7QpXEWrmCOQaIx1mDue1eJsjMz+7FBkNGM0bmpxt1RatBwwhTQafQLmFZe17NO/XEZ
-        7a+47Yx/4llzo9QzJV2ueuKDYnppY/133h7Q3yE7XYgx8hPG4GPtRBzKpvA2ZuGbevk0BrfjEWXEu7Tx
-        9eufcEapP5ieILfH558T9vr5lSvXYAtAB0kuxwrduH8gnaG0Z8+eg57Ga0MucrhDND6DPwqQouDsFznN
-        Dx02DNccxZCuPhUWzWcX27h9ugt7UYAsczDQcIhHZC+wqzbCIazcsmlTH1viJtNO9uIvCHYBa+f9x178
-        yr60k9hC1A5EHhrv8lW0ny31tVMlBMtg1c8//+mnn3527dp1rOo7hKdJz2cxPzBnx18PXQ8NusFlHgeU
-        Li4NtZEthuPSNNpJn2eha6E2W14P9bmCeMUl4NC8agv3uKBj7W684+2ZIHDHL+ZZZRgTTxxkg1TAmmJd
-        nz3gywZ0AJCdR5F9HRri4US9GQ7Nq/tSIe1BIOImVnZHL7rjV32iNuCRKYT0MVrIf4t+4QvLa7/F0BzD
-        m/zzHVKxO6MnXudPnWKB5rn1gTtGMtlm9vfuXsM1cr5+UANb1YOsfvbsCxtZrLlWm16rzaTaS5c+xQV2
-        le1wabfvYN7mzN5Np2QZv/LCxhjs8y8U84NcFkrHuR4ucuilVzcQTfjlr68kzfrNBPTE23x49OhlWMnG
-        Bsa4PaVIfruDDYg1ZFx3BvsuWbqXfWkD20Rx4ytXrrPNXXev4cSpx+WoaKrLM7kYodl9T58+s2790fqo
-        JtVydstWrz5IF+WqhAbGpDIIneL2HYwA0wwMOA3TYUZmJHEIm23hM8e6+z42m3H5ynVXrLUqifzTn/5Z
-        ccRf5jJ9fPPCTSXSnY7TtPJG+NCMy5evvvfB1rr9ORwtnEd0PJcmvaBUOFFv7KGd10SAe+gwaCDoLQI6
-        jWMpkV1BBuCilmA17j/Izi3OI60W38bCoXlLwHnneQDruGncghBkaFcr79XcAmfPfnL8xKcnTn7Wu+n0
-        b32lg/mNW7edOXrs2v4Dl3H65FR4oKfPENe47I23tx09iid+jZyPJ05ec5CwxCBG5eudxMrDhy99+ulP
-        rl79dOu2U7gTsXpfxFzXQwOXbt5yzimXlPPnr/LNa29sBENA6sb4YR1z3AzvvLe1Hnq4kmWJlN0PHiRA
-        cMHxE5+wr3kTbTbb44XMmr2T7LjsdeXKpzSju6cg8i/8jdXnz19wY4PZXXPq889/xsaPPs6yGyfjV/NE
-        qpjzgX/y+Lz+Rh+NnDNv99WrnxHhtWz5fqq998EuoB9Rj0Fk3oeefm4d27/yet+VKz/55JPP2Wvb9lMb
-        Np7kISqGjB0jZcWp/ftp8+NPraUTonP1G3N+2Xf+7Gd/QQsfeGQ9F4hLcOjwFbKV0bBguufOxgsWEhe0
-        bN9+7P9T3rhOnLxKuBFb2ldFhfkBSS1Q4w4bv4VbhxlDYFodxlHTf/gP/2FpLBRY82VaYC5uPrcXjwHF
-        QAj6Br4vbTnYf8ax7CEcvFX/4S2Bd0kOyt/xa/Mx23Jua2yrLI4zW48RXIGzjlaAG6jCoLoNwbnidbgv
-        xAMFRvyEn8g2xp67BCjsqHuXf1wPzltx8eKn7EsNbqwnrtTAEWXfrgLuS7ZuOw9n+am+5EUB9zfe3AhG
-        /cbtqRyqvvv+tt/7g64vfb2D+s+cOcuhyeyCG3vixPUAZUSnfPopsF781T/sRBeifjamDbPmMKd02fbt
-        xYpFJjOI3utnP/tTGjPlyQ1YJg7Nr4JVc1EuXcYOix9+bD35NTQFzXvtjc3se+jw+ZI1CtnqRHFGTz+7
-        kVhGX1CwAwaBwr6X0Dadfc6ROp/8MT3BYroi+7bUXHW4L8IInCP7cpnQgvTZXcZEQ3E1732QSlYQjMSX
-        /KTlOVbY34tF88bs/Tn6DRvHcIfsEFmy47Crw8jTKFWsC2vHVBl0ZegVjR4xh6FXXf7WaR4OfrUvSVtC
-        tSXnHRDgvI/+xZ7YR5RWPOSQhfnrAAUcgBJG6ijmdXFAT2ScPl1kAZs3f8+FC9fPnr18+vSlEydOu66p
-        3NQf/OzzPwFz3/peB10yWAE91KPazmdXQI2eoA73FbPn7kW0odqLF6/3bS4SbAF3WiK2AJzbC/df/mLH
-        jh3Hfu3LHaTiQrAm3wBwP3bsqp0N9dNge6Ndu4t177q6DhtXAwdpxvHjyD5Ln3uhGJVV/Y/G/OxniB4F
-        3DkRfqLf8lduv/DvUJzWdBwq5hntLXx/tuG8bjZj6ccLigM5mmoHxtvn2+8ijyw7fbroYPiVRqqi2Il6
-        FGCt9RiEEO68EPATzUht+8d//Oe08Mkf9547zyVgXvclouY5L6+US5RwUET5D6dy0JWz5+4+eYrNzmEB
-        rpQDHvDdw2W4lx7wcQx37huGT+EyAnro6Wl4YnNM61Ozr+HtuvwtlmC3Q7VpaHw1Lj7CIumHeM/gcSrc
-        xtOnJzZqR//sAu7w69KlG3CHSoRqUFwZI43WqMN9xS99Ea8ZGXdqrfYm2VEYxDOoA3yIVPwHAPTh1IIg
-        cMdxTodDRVX0FnXPHUF8za98yTqtdsXXv9MN3MG0Y4N8qK+rdwPuVH7mDDIOvcL8Qrc4cBK4o/84dmra
-        SBhH5es38tMy1vowvMSxVm4lanjkcVat28H2Th+15QF3Dse5G11Tnw1bOLleILg5c3YxBenY8YvGRzqG
-        ebxYQHXJ1OmE6m/UbhiknjH46o+e2cRPFy4UsOYnctG/8tr6ufO2TZ22CTFf2kbXGHC/cOGK3QadAdS2
-        hXW4L2WGal3rx1Yf/MKvr8Cwnkj0KLT2Jz/54zff5mUCcQyVf8EvfXHVgYOnaVXaE2e4TwS48xjj9aBi
-        43qnPnuqlbeI6SFsFoI+TKdjoAGmH/BD9BYp5dmMNwNeEYjbMBqS5wTKjz4BJ/AR9UZBBuC4epWxxMJz
-        Z/6OcDfo0NmVOpV1uC9ZvHTv8eOMuzCh5iAb4+MHywTQp5/+nM0eenQtfQZkpx7YB4AgC9gNSVqtow73
-        FYsW7yf91aHDzPNkRhKy+Ko33iT4ZB3xfOyrpJPAfdHp02epCsx1de/v7SUj4+KDBy/QEnuaulZTePr1
-        MUwSmhdCEwjmV9pz8hQUXvrEjwpXl2+cQer2IctwOENuDBJPnVzeIJcsLeTsAwcucFLEt1jtocMca+ns
-        2btMw+s0JfoYnrsXX+nlJwRRjsXGR46cXLf+CAvDYiUOGnDXegH3c+cuUS3Npiq7K1zy+oDq4mee72XQ
-        GlvRs9G9cbiIegwRybcNpo+dOHl+1ep9v1kk7Vm1YeNBanMpKw+XZZn0Aa9FVtvx8oHWg0UEGVRsiKka
-        U2X0f92+klYePjtkN9kAejq6kAXVnm+cCpvC3TmrvGQQ8+6wKo8BlB8vNh8v7cSw8v2zzwB3AXccVfOn
-        O1cofX8/fYZtFmzbfhrwGZAe4dj1+MVClrmpubPC54qzZy/JPulvcEsI3HYtrAkK4zZvPUudRG1TIRJ3
-        XXPfALDsY3BdhTt3ArIMojNwB+V79rLlkj/6fqG/HzhwjjBzmo0PS7NF4dWrhTj+4KPrOC710Bi0kM6u
-        QlTpWXuE+qmEv74ZsP3Pf16g8/GnNuAC6487cZ9D3wbB059w3NffLPoqaqivhbS1PnK7jMXt7EW0npLO
-        jp2c47IZs1Dnt9oD4Yl/7VvQdjkRohzCtxlpy6uqsgxwN0SSLoEDSe26577onfe28SXmMqTddyxeC6yE
-        S8DzjiaGEehg2BKbTJuxnbQzv/alBa5Da6oZKhRt4+V2Hel2jjO4+/TqthOCAkalbcrftlC92lukCrtK
-        i3lpeHugm6Go3TshNvz3UGzShAQmgjfAeaQv8GSr3zukPgpawJ2wEQEEFGCcCBDEdbgvnTtvN04h6WNZ
-        OpQ4PSV1u4GQL3buwo1d/O27Oo8dO4NrSQ14F4xDOmaozy5WhPumzUWHAcqZkgOWhTuUNAFAI7ifE/r3
-        PLC2nkORPumMs5yAdVAVh+axJ4g8Wb6mg0SSzB46WM9IQ/TnQmLeOaJDC3Q8Nl7P/b6H1h0/TrbhE0eP
-        MdhYzMQOI9hmOkKSwFBt76aiTl5idhVnQbVLGZ60WngaahKx7fUgyBVd3cwyPUpHdfr0eYaFMREGwdPH
-        hrr53OQluMe7RQL3JU89vfHYMcKRj+zdxxkdJuwzBDT7VypZtnwPKiwjyRibs3hkyobaL65eu+6gLzch
-        N9lpTbZ7vr/zHWdw50pzJqrtBreU4D40svcnzpRiIiO8UjUm0kCa3h2+x7TY0GcU9N2enkDZXbjX1YOr
-        +UZsuwV4vMm6b7QMqNLJRcqoL1VawOKGf1fAfcVXvgmVIunVrN279/Cmn8Jdz3H/gfPfvostzWmFIz//
-        0qXPnZIacRqQpY7FJZv6Crinnvvr/XjuOK11z/0c6MdVP3SoUHU4CnBnciadAfVALl1mClN4GAE2a2P9
-        v5XPPt97/sIVhRo9d+CeeO5Lv3UXqRkLUtdPczrat68vhvf4osPcrw8+pCVkcPTsVr72Rh+rG0S14bnX
-        J5ayItVnU6dvv7l9ke2LlL/z5uOR7zAbWnQwPKpIRuG5l+D+07rmThrIm4alhdNoVwx7eL14xZm/oJCt
-        bv63/Je+uGb7jpM0D6MpuKnje3HbfkeN0wprLio0LgqXjRsRb1dNBge5FLk4QmRPsxeYVCAEGVx1HHYa
-        4yIeOu8hzui/W+wM2IbGY23hjgQ/Liw/vhrJo8hSK909R9ZvKFLBlBSJePg/+eTnPWuPbuw9tn7DkXXr
-        D+EGMvfTVCcmUVG+oPAB/5TVXBYt2nHvA8unTe87caKYGmpcuVMu9RkvXPy0o+vI8ROXARzyAoVf1qwh
-        Hc1RXgjU3BEchC8voCT+7eg8hNCIawyaOXpX9wEcc1JoqVGwvbKM7wfcMxxoz96TL77c/eOn19BmxH3n
-        hTojVM39pl/8866uI72bjm/YeJQT5D9agsJhxGSI1FbLJd62/cRLVPtMB1khmcgV1YZQbrUUPnC6u3ad
-        eO2NdY9MWbVi5R6GMOiEOAVO2XPEgJwjU0l27DjFOTKZNjR3XqEE8R//7E9vtPDmJVi1GnseduzX4QEN
-        yzzYM2evLVq8++77lr397oaDB09xmSA7PShH5LN1Fi9kBOfnUrfAeIK7vgbvlU5GDcG9FFoe7nbrg6VV
-        D70EdL3vKOZwV20PuMt3nXfFmdR/F+5OVQ24cyL5Pmy7BYxEgsjQAUHWufWm5FUN0xEDBMae8yu6vNlU
-        4KOv+SlZwJmCLxCBXMAuomVctkJQUjP3p3WCJzYDZ4ZL0gyOwjcmJHBqhV4zn8G30S8mCWAvugHbw/bC
-        Wi+b9gNNo2WozX5LaNqqGDK1WwKOKNdgGveWc1RgQf+h2fLdau29cLdtZKnasF70dlTLWWNSaotMAxzC
-        /iw0HPs8/tKZ0Wbq8eh62baQD3DZ3GGQWk88NHdPXKnNKUvmdbAv5Iy8ZBjZGeYZ7unTNG7gzgX2HU24
-        g1QAaghjWkop19PISPuA6uzThruXaF4lewylqrlDdlfmo9dhMMCcZcF3PX2cepNEKstw4zKtqe1oyxUK
-        dzkIN2EBxayNIjjgDlkADb8CCHgaebIiFFK3MfBHbQbqRXIYAJeO5kkrQANknY9jfgIA7TegLYYTfRPl
-        NjBE3YVVqZC/euKmJAsU2nlYP5vZHwSLjTI0EMXTjGazscOtlEgEFs22j6EZfGMnVKrWqMR0xNLt+TK2
-        d6jZUCJToYWyb9docjF+crC61E9QDzvaNyjslA5ahXs9TXEx/GtAkS9DXtz8CGiBGirHuCjcIsKdIBPU
-        DOBuxkfjUhy3VDDRrfZDxLCXMoJVHfOoIeV49bPVeggaoOzuMnvCveq8GyLJxmzJNsKdm5u737D3cWH/
-        cdRITIqFg4MmWjH6BUbEk882Os78ahYwitHrzovhGgELawu48BOsjOQnusDhM8prk3nxkwII/zQbgd+E
-        4JNWawfgxH235CgU4xrrgZsFszwv7hw2g2jgkgbbi8SsH8mebhyzkzzB8NxLzbZa4BvVOovKyUTRBmuW
-        7+n2rv2t9VLUhumcc2tWSAfPPB0qt5+I2WHVFqYnTpOcyxrnEibNT1P6nI4buHMjpp47PDVBWAAd19il
-        TSMw0VX00tjzdLZRqrEEslv8ELwuwR12I7zQ8cBxVwjReXd5Jr4nLwdKq+/L3NMokmPtdmTwynSJ9FIY
-        mfcSV5TljCj8kxPkV8QlthyzxMeq4RebYeJGyoE6Imm2iJc7kMhsAc7R57Mz/gWQWwaIuWrm24psLYaF
-        pC8E1MmX5ngp1Ot6Fpf0m6hZZvmrCWE4LuzjM0exY9DJTfskd6F+QEkzos3hXMfGvsFQrdmTPEd2cagg
-        uoEwF0fn3K3WE4xsDXYYmkJr+PZpvxXJEiJzQygkcY4RPKpcE5eAf/JT2sIYzEhb6BG1f9oXhom8WGP2
-        nhz9ho0PuHPZuO2ce4KNUDNAj2nCdKIVSRzehD6uVS2bVMBjhlEV3/402BIdSXjuxLBT4HvqvLuaNoW2
-        0SSXZNLr4aZEYvIWH/0Lnx6RlyF4jbnsF10oPNYKjy5KE7lQeKwSzl70WGMN9FpVHcMxQKVb2RSQUrvw
-        pZArYhHHKdntDFR76o7zkb7NB3o37evdtH9T3/7NWw7u2Vv4+PI9PajHVVyOlpR0YUEZjWQztzQuRWk+
-        sJX2NDab58JHwxGpOLu0A7M2uw1KRHD215JqtRhv585j23cc3VH/y8ysfftujBkYGlBEULZQcxik1GuW
-        LkHEIEWPEv1rei7VE7mzz9FYO3rNRYjGeOEaB9y5zGmysIZwh7DhRBu+UlLAQ1oZFNPlWpSQZehR6E4g
-        O4gMuBvz7tsDDaCbYQM0Gcf69OnU6OkM4KO5xSmjeS1oj+sLRgiQhgo5qzSHwNm5TuAqsZ7zpfG8l4xm
-        +5scyydNGiJUILHs2l2A6eDBk8fQLW4Ks+GHSudgdPS4cYiocMfOo3c/sO77966N/956d6sUDs03VX6j
-        GeFQWxU1p42MX1MHudqMdC/7EkvqJVTbnG4ZjYxmRJ1pN5ZWu3PX8XseWPeDe9f6HyfuKdt13RzsPbF7
-        z9H9B7DDjcbgne/bj+pCt6qZb5TqcaPvbHIJwlbpuaTe+hi58cZOM8YH3NUZ7ai5nKgZMBSXWdVFRxKA
-        hucu3EsKuNhqV9Fz54gxoCqaS8oMrVK6oTFmhVST5dWSz5GAPuSjGCoQuIFRfX+7h7bcPdRDq2ImrWMS
-        DDj/Ny0XAk/ZxflcqUdvuGdbGjnMSiAeE3Peenfbo09ufPDRDT+8v8DTfQ+tf/Cx9c++0LdsBaLHbUQu
-        vUI1PDqIwXu996H1f/SDHv+76561L722iWvKLaqEMqA+UKp5QI+v2pL+dml9y5Swpc6gWjlwb3jKOOyK
-        pVu2HvnRs5vueXA95n3znW18R5jmU8/03nvjm63EE6Wdn32bpfnpp2fU+lkP886ZGLuPJ7j7yswtEmOq
-        RpQ3hHvKWZ13negS4kM2GdQHXXK7E+EO010ACP7qj/O9+gYMRZBByDarjKIhSiVdFF+6vXOg2As/msK+
-        FKNuSiMHhgPB/VhGagg3Iq11uMKJAi3zvN8NqaREeRrPC9YQ2tauXbZuO/biq1sAOm4mU2yCxX743t2F
-        +/nqG30wWQkYIjfkXbU9kA6ERYXfv2fti69sMAltOmyb8qtdJ3Wn6ml+yowUPP/SZuygTXitWbh45xM/
-        3oiF45vlK4pcAoM19Z0634lx3BrEGfvFyIdQZjA9XjBANFWvJTx3UasCnsYmpnAfFMqrGwt3wQ2RaQnH
-        cl03Pij3pyOQLrMHQSA7AcIMB/EZ95btfb1g+yj802GDtDhDynFa0xuE0+1iT5xyK9eRZmA0Q0hxvaH1
-        f9u+Qm348mnMEl0UrwitNKy92zDN5+Ept+BSIrv/RGd478NeroUzNrki4njAlhSkeziFe8/zLxXZtSLJ
-        F7dri1UNeKwxskHzUyZiKDUIuddffbP3vgfXhdnvfmDtB1OLeMrBmnqMnP44bcb4gDsPXjoWpDKDp+xy
-        qf350WyQojZGCIPyQW1raL1AWMlecttTz11YA+jw2Q0JIMqNcwF5MYapJhPKRnQbMT1KNT9K9FhsWQI9
-        YKVJuMwNb0eMRrNxscW6pX1sv1FTID6m5rbY8bTrETp1+twzL2xGLWnI9PjyngeZMV9MGop8tgi+rUC5
-        SrpnX+xkQimR8sRxc4nxT1F4Wukn2nXKI11P81MmuOXFV/t+cN863ocw+30Pr1u6bN1zL677wX3FO9P3
-        7+m596G1S5cXGfAxtUHuPMITyT4jbf+h1T8+4M6tgM/riHwEROq868xK26pIUhLB1WeUaJoXN6uWiLP0
-        WOJbt71YhvmmLKPrzdHhLLxwch2eC7HJeO48+XZO1ADZXSQkcie4lohqe4zZeiB24Sj0Fpw7fz0cTj1G
-        4HToHpTpDflnF/z0uC1oCZtRc0lbaTvcrZCjeBY2BruNmgu/ZNk+QBMQhzg/vL/nB/f13Pdw9wOPdt/z
-        YPe9D/Z8/94ePsydt5gpjmZepOtt4nGn7+lV0j3zfMesWbNI9UVVBAVyiw4BXh6iyWNc0gpiy/i+v31b
-        xGhaf1oV3w94yn2b930wdeuTT2947qX1M2d3Y9UFC1a+8Vb3lKd6nn1h7bQZHUuWLKXzoyt1wm2L/SjN
-        6K9VA/KulR1b2abUhtSYrVyvAds5chvUeP7HfsGIAXeVu3DeHZNM4V7SSSKCRVkjTc/bH8FbITtV6Vmr
-        tsNciu8KikL80+y+3MqxGpkz/ZxnC6DhNY0HyqF9g8V/9I/+UfDRQUszBoNvDsoR7UtQdeA1xKSf4AOH
-        s6ujP1C0seDa0yq2obVU1dxV59DtLSI+xgkM8x/p8vzLm1Of/b6H1r7zXues2YtmzpwzY8asadPnTp26
-        4MWXVz/7wprZs+csXLiQeZXme+EF0cfVFp48xWLZLCLK0n3EQd4aACyT7t6eZ55bM2PGDJz3NR3d69Zv
-        27O3gFfpyW941rxksOgEItKJkwT2lOHOLqR75Nddu/3vxN59RQspCEi0irYdvtGP3NYrcBLEDLMj21T7
-        i7QlnCNbUg//HT1GUOaN0ywRh0PfpkQlp8zcV+ejUpjw1NOzcdHiNfPmL6+nxiGdwApAzyfsbD/qm2vY
-        J0zNmrIc3eOSdpMjxn9x1tGqOAXaP6gdqaGVU25ieV45OCJto5GplWzSgBd0pG/+tP7xAXdabCxtOO/E
-        nHCLAzhIarouPfeSCK43HXx3nJNtIpQ7WN/iB3b0KKGZhDct3/WsYS7uuRNkuPVxDF21x+UdnHZh/ySU
-        aZXxmnLZZaFCPOGD7ry+PA3gREC8BzL6UD3BKUgp5XXh2XhAkb29WI/a6KhsvJTneo3o/Q2qHn2iN3Xb
-        n/xxNxCfPn36tGnTQDAu9uyizJk9Zx4F7jAj3/zswp2nd3XHwVde34pqT4gILwEPPLJhylMbX39r64aN
-        h7hqxFNWSTd16rwXXu588FGGE9ey4vOrb2zp23LYsJmgfHriW7cdf+u97VOeIs3vekYgH3x0/XMvbSbC
-        xCDNUId27znJBhGD+PiPeglE2bjp0EuvbaFVtI2WPPlM74JFe8jo65SJ3r6jL7++5QGig+otf/XNrZu3
-        FD1A2hL6jL4tx95+b8dDUzZaj6f52JMbiXGkfpsRLxMN4Y49SV1ZT222vWftnjfe3kIY0v0PF2oML0b3
-        P9Tz8OM9L72K9tVBzhgzfJnMnWc53mywA8149MleIm1YT+qNd7b19h1evnIfg7ERdkkcDlFIpVMY7I50
-        z32bj7793vYWT7lqebJXYGesTVNp3opVxfLfcbG2bD3WygUN12FEnwIrHzdwN84k5TuPIicAy1wHVWRD
-        yapDrU9tkKIjkyI+ishusTQkO92MrjS85pEwWZKrGLsYJr6hywc7A9v1gBzEg8js67zQUpi8SgtMDDgq
-        1+jFczp0XRwUO3CTxVwY3CLuIWUrzpcOgF3S3qKhFDNCcLdaX0EsNGnk7ux9+08BqYA7mu9jT3ZB9alT
-        p86cOVOa40K6goeZTFwbSOLs3HUCvR7SVSV7nudpMwjyO8KsJWTlW9Ey9/Y8+EjXvQ91Iy7Hl4DpwUfW
-        LV66i/UrnI2ZOPIXPl64l0YSyZO+YVD//Y+snzpjGyu8Oh2JewOqpjGIdBvTZ22nZsCddmA0+K13ydly
-        +O33toKetGZ+evTxDbSEqVm25NTps+99uIMaIpolNRctv/ehdR8v3GnLbUbDlxXh3tHZ9ebbvU1qY2zj
-        o2nd5F3GbTcVsGMSmGTx0v1F15KEM2F22k9XGifIN0Cfubq+shvTv3jpvkHtSBD1O+9va/2UuVgly9P7
-        vvx6H4PwqHyYCwsvWlJkkKZJhPvPX7CnxQuqsz9y9/9tnjtkGRcllBn5HuIMjYfdEX0o3FNlRlc6NJNq
-        3GGEHhqA2LCk3UBI7frscBl60gwJaxi7A6cmIQHu3NMUcmKYXQSVJibEKz56vamEvoHaZD3glvXpMiAx
-        9GqUvV45HGdfjg4UzFoTYaNUrtQeIY+SfURR3rByDuq4Ai2h2SN01yGH4N6m0Lz7ge6nn1/z0dQFc+fN
-        B+vICAx7clEsrpan4L5y9QHcuv5GYu99cO3yFVuKFIYbdrECRhLnTqh7d8NoywceWUem8UjMUldvzy9a
-        uh9Xvb/BXhz/N9/ZxJIgZrbZufO2yJwf3r/27vsbdDxFAOL96370LExsMIwMj2hJZ+eNnGLw+vW3t1XJ
-        niKeiJfOrhuLYtMMQvvLLyvPr+FlCCUKe778em/z2uD7wkU9JhTDGsWE3VNn3v1gB3VW7cY3nGZcBWp+
-        9AlS1mwxLQ9zCcD0EHZ87c3NrZ9yvZu/zfIYhKVUbo3GP7Bu/oLiZmABgHkf72j9gvI8yt8Ruv/Tamuj
-        cIx2HcIUHFHMFgLR1CIcWoyAQpzWUMP51aJEoyxuoKG+raUUj+g/46fYwMBHasNl5tA8sYU3dDNjlN56
-        5JYS6CYtMS0UNyin4AT3cOi82F71krCopA6+ZX2kVbATshvjpILv2ATLOE8KxLNvVee5U3wH+g7nwndX
-        HGx7wYAfTtuJ93ebU3wPA6ogvmvhQpacLsIfnWpAiV52+45jeIhNnv8HHgHuXcWaoh2b8G3T+quE8lcG
-        cl97k0U+t5ptGGT0bT72yBMbY3ugADIAegplBgmWr7ixyNy2bYdTqoLp/o5VxKXcWw7nj0bSkudfYt3X
-        oiU8R6s79msi/HpIet/DRRvS3WnPcy+u79t8Y7nBbduPNIH7oiVb7qkHPiLI3Kzttsb84F6GVUn1uI5n
-        Qflr6fL9CEf99XDpOdKqZ14gR2aHkaYfL9zxwKO3Xdz+LkS6I4/h0uU7hnPKGESf/eaVXTtz9nqatHzF
-        poen3OqiBrygvqyPDt/HE9xBoUmgTLGU+u8Yy7DxoLajmml4CfgzyCQGPwV9WpzaWvqyFImo0i3TAbS5
-        NSIYBqybY5b7CZRT8NN5otBhnM5ndj1eRKA2bY4mUa3aTrwHcAing8fMch381LU3PpITt7NhAyo3oxNH
-        pHl49wg7eu6hzNxBuBtIY7gkbR4JuJNm4JEp66s+LE87MTPPvbSho5O0hUX6B/Ox0DGfPHX6tbe2lfQc
-        kAdn73+kiKthx8ee7F6wYBG+/7LlxPaV4c77AcrMD+/vBmQpbh54pIeVUM0mf/hIoYZHx0NH8uNn1y9d
-        1j17zhoU6lTnefo50jcWfm7vJkLIy8f6IZE/DxKn38OHEh85R/B6/8NriQgq/Xrfwz3Llhct4Ybctfsg
-        Lx8Q+a13Ny1bvn7Z8tVz56149InulO/Uv3DRjQTx5NIpKVHPJJ47iY1v1ta7dNnaJUtXzpmzrFTb3Q/0
-        LFjQaeJ1EuA/8sSGlJX46bT2gYeLuKZSF8U/n3uhiDRFSeOlC5IOYUe0/k2bdgz+lMu9CMqbYVf3PtQz
-        ddpqbgWmONAvehUGvKCuKOJg8ig47zUQM46KWVlS8T2UuMClHrolAgcVxKOIUXEf0DfEMC2xvUEpOtcA
-        l+5XpgNQHhUeQlAe3roJY22n8kgkdbKRuuFOX3JKqlKSeeENhmEbFXwRD7Ij/5Q8UgzlV8Uci83jV5vH
-        T8g44bmncA/l5L9rRwHWdCFmR2BounmVhgOxCw3TsG0snDJGXrZiz0OPoSk38GT5kqdxzjzSu9/Ie47F
-        GA17eMptjiTbvPte55w5i2bNmjNz5txp0z+ePn3h3LlzkeyXLEVhvw249zzQ/ebbiz78cDrDqo890XUb
-        Ih/snjFzNdoFTiujjrjtgWMOMXNWNxUyEvDci53pXqB58ZJiacC167ans2EL+aU41gqaNHPmgilPdcGa
-        2/uS7nffX80KfXPnFni9KxkGoIuaNr3It17PqL6PSaRr1+1GLKRtLk795jurQXDSvJ4Pp65x+429eyqe
-        e4cBQvVT275g4Y7unl1oXC4eixb/5tuV2j5a7dj1ytW77n7gFjeB9cNTembPWT579rxp0xc+9FjX9+6+
-        rauLSNN58wtVKh1saHHHItp127Zo5BBOuS589Ux5qvOjqQsJu5o1a/7cuR/Pmr3iocdSi62dMaubiNh+
-        LmgHFxRc8GzqvKdPbhsfgahqnMEdloXzHpQ3p4cesVZTuaYYLBgECemjvwENJZGb0WbFdHRzHTlWyVUx
-        faBMN2c3N6urEAB3e2azE9dHWm6k9DOOxYBF3gwifDPNjWOymtKsVzV9B2ljyNQUsmk6wDhQ2lo241gB
-        90gBhuqdau7DZzu1UQnVIu7TSIxDNwnBm9Qc+jvKUntva+FOOisk40efaMx33voB6+tv9SKSKW1/NH1X
-        quTcff9auEZEDfyiMBI7Z04RW6P/uHxFMeSYIvXhKZ3vv//RBx98wLDthx8tgr+3EHl/z9vvrsTdZ9j2
-        9bf6lC/8DxGfUQBqJnbnvQ9WpmClt5g+Y0Wx+mvHphLcYd9HH9GLTKVhU6ctphtIW/LIlK5p02fRYOqc
-        Om3JbS15oGgJHHetcB4fFzPp7mYhqlWLFq94/4NOHNJbysN93W+8tRpSIz70rL2tjykUj+dvwd2k863X
-        9t4Hfan8xbV47/01tBkRn5N6/c3bTMF4xjPPr1bff/Od27QjLNbijnau3JmtN7J0ypjlvoe63/9g3kcf
-        fcRIsoPzL73aFW57KxeU0Xvjsgx5yHAvP/vYhSvEdbKESpMmPk3z3hkmmOobEjDyz6UesZlX4XIAFJTj
-        gHtb8GZtqmtuFF11w2AcJmIvgW6SvOhp6FocEjDk0UWaIgbGPIvO93HifikJmiHz6vvpS0PaKg0SLwqi
-        n8ZwLFM8xlolVed9mHBX4TEYhrMD7qbb5rhNagb9ykQ0DOO0ke/23xgfC2zs3fbu++uYuMTLflXevefB
-        tdNnwvfdvF8980JfOo5KROOcOfMlO/AFK0byuYxRR2dfCndI9/RzayA7j32dqktS4MKm517ooIbVqzun
-        PHXb+OH9D/fMmLl4+vSPmf/07vtrUrAW2PpgBU59qSOJYxn8Uz3Wj59d/eGHH0KferRng5bgU4MYl0Mi
-        aGvZ8m3PvrDhgUeJUTHd4y1D1anaMX/+fPoYTvm2dDoVuHPvESWwbMX2Vmp77sXbXpIeeKQbVBqoirVn
-        zlpeMiBwNzLnmRduGy5ucUdfL+iBBtXI0ilz/zw0pYvuG/PSTsjOMoiPPXXbEAgXdPqMZhfUnpJhOSO5
-        RxzuOrbjq0BPR8OqiI/kkYFaaSu1A9yyO/xfw0u49nYVgXLcc1fGcXEA3ByeCvreNMrCagV6SS3RVY9J
-        pKaFCQU8zQFgGEmaULc6NxWhRpUGcnFEGq+7FC2knSHx8xM9QcCdYErDEAPuyjIpf//7wRcddgr184rA
-        iwJmt/Pj7YRf+6uSn5TdgTtmae/tp5W4HBihEAFWdiGwgPiSGs67P4L4mg4WG9qZajJIGU893TVz5ixZ
-        wwPp0nH04pwXZ7dh4+4K6db4zAOghYvA9C0GiUj0nGXLVz3y+C23nbcHGgBM/c/Y8NTff/2tldS2eAne
-        9G1hl4jdTY9VwB3uQ7RFizuqLeGMiAHt7d20es3OJ5/eiOPZX3RQveVr2J53ldVreivNKDx3pibVJ+Xu
-        7Oze++TTva3UxrSmx568zQ6IS9OnF247VqITXbIE1atkwMJzx7RD2xFTDLaRDU/5R8/QhRcdJ2Rng87O
-        niFcUO4l7iIeXmOgQ2No7yNgbbWRqHQU6gSmkNexyoh8COKng64RGh/sFt8Wd6GG4Lgod4EbLgNABxA8
-        2EbOxcrCqZMefrrjJMa3NPTWI9NAOlPUAUZjBE2iSwcAK+F7qDRwUyFeicbgnIiKcSkcW2sxTsbEammk
-        fPBdZWaYcKcSJ9DSaTFswM2KMW0G7e8P7nFQ96Vwam28ZxwdwUqYiPZw+Xi2Fy9Z+cprnSURAwd52ozu
-        Vas3MPUmHc9kBA+aMN0JePE0mnzG8XCu+9Zth6qhI7jScBD5ZcXK9VUO4kaTe4bh2f7iQ0rf2yUULw0L
-        V6ekq+sha5oea3XTX9GaZgPQqdM3NAGxjVEPoZ+ge1vZ6KRuwr1n5uwtRIk0T+YTtTFT9cHHbtmBM3r2
-        hQ6FDtTq+vKttwUj1U95deEsz1/MG1V6mVrc0R5oUI3s55TX8HLGXcEbFaE/PWu3lsa6m1zc6ON5/+N2
-        4l4yzC/DvfGDj3eGjeBaFKNT9F7TIrstsY17BcdxzKUSvnm456ournHstFKd9PDTY36awyPGsRhT73p7
-        4BUlPead6udKdn3nKtmdpuTaUsA9DauP+MsYNS0NANByeiD+8j3NEO6RQjKWC0/bEKgdrOPOjtDZGVU0
-        krZhH/oYVUV+agj3tDtxTNX0xW2Ee4x+YyWnHXBxXQX7rXe60hiSH97X/dKrnfjUj97uU095svAldXIJ
-        8DCQMdKh1COgbwkLAhc8hYJRhXsh0c5fRvhNi3CnzpdfXQmIP16wsgr3W8dqwMGBWzJ3HnWW5k8Vrw5E
-        o/M3WiiOoSrMrapDau5wc8nS8giELyL91TZv3rLSGf342QLuYe116wlrSZJu1s3LsXDrh7bjEBrZzykX
-        tuX1AkAXkuym3Q8kyUGbX9m4oHT/UEXZPR0dbO/9f8NzT2NIxuNnkMoDjA+ucmJEean4vQWCW/Rw5biL
-        EeubY3qXPwYHDILx1386v9RYda5NZJZ32BafWqanSYbTdAJpft10an7qs4fyrtue5os3a1jAvT5L/saq
-        zSnfnRBrbibkoDTVjAle5LsTmhwIbSKeDIh7KjQvJm2jn6PvdCgCT5z6B9ydDcJ5N8lau4o3t/47TxGv
-        OAAa4yxbvqEEiJdfW71gwcKnn0eduOUV3lsElsDq+fQH7MXunJ2PImXP3lMluJOmJkJHenq2ldiEg1nX
-        SRY98vgtdKLJcMT7H+564BH+6y7/9yhjd4sKuH9chvtAxxqwJbOefaE77eGIm3zxlXULFnbOmctbQklz
-        L+AOHIF7Om9Ld5uTWrhw0XMvrWP8OdDWvLa6urL4oUdv6+QentI1fcassPamvn2lFyNPmR0fHPyOQ2hk
-        /6dczNsy40I9Iu7QlCdvxT61ckF9twMm8IrnV3ewXfd8tZ7ayFU9mjX7MPMEGp5obKLgtojvEsTluBCn
-        EEUQxW9SuLOx9KcSauaZj+mmkBRlhsfeRGBm4lUMieWNqpNCDQdM1ZiSzx4phSMfpFHwUCbgbgAPbzCK
-        706L5Y2EJrEX5DVbJDULd4tJKDl6KDOtgLi6DZ0EjaRJnL5xCHYtHK7FPoMG2OXQznbdMLv3nF63gZHt
-        IhohbFV34Q9Om7ElnWdIMMn7HyzhkXvj7dt0XgZgf/QsY4kLGEENhRTJzdts777TFbhLuuL1vxS8GBxE
-        +f3xc7eghub+6ONdH3w4/cMPpzKUSMAl8TiM4s6eTYzjbGCH6F/E51RkGUg34LGatGTGzDkPPnYrmAct
-        5cmn15KRAbaiN1RHMsFZkfNreWO4f7xg8cOJxtJKbUjnU8rjkN3o7QHN1R17WL/pdvlFuC+c8mRPOr/p
-        /ocH3LG4LkNoZH+nbBfOVcbJ4z2VJUqinS1eUN4FeUbwDjPcW33efRPnSUYwAS6SXWccfAepSx9SlPO5
-        CnT2heli3eQwKdb14nFXI6o90hFDYcBqft2GWE/JbkatWMU0zeeezrON+U2GReKQOoXK6ExuFxrDuTtL
-        BdybcicdUw3nvdTltAjiKtxBM42nJ8NV54hmzuG49Byt9xaONPDX95Lhlw+m7mLi5f0PbyD518LF+7rX
-        HmL2/OqOA0xbv//2+e7QAakcB3nmrFUPT7nNnUSxYdbSex/0rFi5efWa3VNn7Hzvw53MPqHDIKVUf3Av
-        lNjbI9OFu1B4693bdA/GeN99byFhNga3gHIIC+PmzfuYD4boLF3a1Y/LvLC/Y4n+/n7ljeS+xD3H35zy
-        VPecOXOLcMz3VxALX5JlmsMdjSXVmohYp7a5c+c1qY3zeuW1tan+w1V4+93lnHp9sHH72+9tSYPZ6wa8
-        8ToyhB3rMYuDbmST/kzbGvEybcbONLl0Kxe0nmetGBLjEVZwH/4N318NNafzjOviuUF2IKuSbiJG4S6d
-        Q2yR15HDywgT3tljzpFBhFw5euZ01NR/Gl0eQTXGYjpTKdaqLzIb1RNFAQLkGggLVfWRFWSqZK/67OYV
-        MIOCk1f12dM5TRH8Y5NMLMwpYwfaY0B9Cnc1GcMiS7K7LP7Hgy/GvVCnUhJ/Vdsb1hTE91f/GSE3vAQM
-        /z5kOsGzL25xEmN9Lb0i32F9kv26dOIMv9bnExYDp5Bo0aKlOLDp1Ec2+O4PiwgWJnzyHxsTCL97T5Hu
-        As2dTqI0sud4IIFu5D28/3bJ+KaCgYaB/JImpSnyy7/4ymrC1efMWTp9Zufb7/U89+La515au2LFGl4a
-        8BDrce63DfZaW/NjNfmVCKB0WJKzIKb+vQ+WEQLPrNc0/NxoGY/Vnyzz8cdLSlJJ89rs5BYsJKX+bXag
-        v3nz7TX4xMyYTW1bv0w3JKAh7zjYRjY/ZW3Ls4ZrtanvyINJljos1vyC0is4V5knlwdZsg//nu+vhgkC
-        d7MwGvrtlNEIdNHdNhejeV2MiC+xWyKXkr34Gp4mCShlpwGgSO1sY4Si0ZCOsqa5wBTlgTVeuVSNwMeI
-        jcH/DZE9TXwm2X0v0WdPJ1VFPL6eO2cN3E05aQgmMlFoREH2hnAP/33whP/H7GuPpY7fXw0ldz4Qr0Ho
-        4YZ/ox89ej5N+dvfMBcv0Q8+ykv9fCPwisUlFt6mHVd3RElniik3z+YtB4YG946OztffIvqwPJhZH4E0
-        GrLoYAg5X7W6cEG4b/vrKoYB95nPvNDFZMvEQy/mXtIGOrP0rFuBO/3V87dr7gwkNKlNORs7PPtiOY2P
-        RqAfLVk+0feHvOPgGtk63JknThrOQV1Q6MSzaajMiJKdR2ncwx3eueS8bjWMc6oRLnmafLEUih4Qj2ik
-        IHiKb3Bsoi5KZBU283ss55Su1cf3bGkar8gNFC9fHsIE7lAerOuwNxw+LSUhCO24SIRyc7psGq0P0M1Z
-        xquJLxNG7DimGgMAN9Pu3ua5R6oZ+T4EuLe+S/A91YLMCUxxRu5wypatJ0tZw6qYLmI5Huj58KPlkN2Q
-        cNxkYDp9JjNImZbSOKYFsX7u/CIp/5CByyv5+vV9Tz1Dst9+83/VXem18z8uQp7Q/Zj33/A9YMhwL055
-        1hJm7VcTkMHl1HPHDk/8mLeEYoWp/gdUFy5a3P3IlHUt1sZsX6NLV63exEtMFeWcfj0lZGlct5Blbu7Y
-        N9gd6yH/g2hk81MOz93s/wcPnvjRs72tX1CTYo6C217AvZRNZRz9E3/ZZPlON1VISVPNpIskBGFN1FUi
-        uBkf03U8ZDdYxO0FviCY4iJ2adiJrAy5w59irilgxbVXSo5UNmYuc4U8DupRUp/d9DJsY3oZup/IIKbO
-        nk7FCs9duBdpQDZu9O3ETMiu5BeTVJ0Xms5TjVGBiJyR1P9kBEraByjIhJvvwDI96DDvwAMHz73wyhZE
-        GAQZvOBQWuBFHV5Fvq1X3+hCiQHrTiJ37VNTRa5avY2ZKWzm9nYMMdvo/Q97mOvIvKd7bstwgm7Qafhz
-        Icus30nW7+hR2NdfXYSvGPHevHPGLNBWaD4cIvKoGG5hYsUPpm6gs2Hj3t49DWtrfqwmv3LKCPrTZnSS
-        pYtjefT6cbsfebznsSdunTXfP/gok7nm0HIWyGt4yvXI9K6583oBbiu1zZiJAlbYgT6SFfd+/CzrhNww
-        At0DzeDcHywytaX5F4uoUL3pIe/Y0dnZeiObnzK2ZXyOW8UUAkCGjHAzZ29u5YKap8EgyJQJw7zn+9t9
-        XMIdu0QSGNO/mGgNDobTF9kWI8dvulKHKzEFwU2SnuI7laeDhmk4Y8P1LkoBMI6UwnoIDrYAfZqWMjoY
-        oydLa4ywpcF8IbI3JHvA3bSUwB1OGalJDS5TxdGrcJfvDUdWA8EjgPd/EpULdwch+Ox8KPqhYd7o3ACE
-        tWzsPfTmO5tffGX94z8ilXn3w1OQjzsJaX//w5Wst8daTK7HBOYQZGJhT9PSkeNw9ty1L79W7PLQlG7+
-        48Orr6+ZPmPpxx8XWSFXrmLYcP2Dj7J8UkEi6n/9zVXOZeWx7+3d9fiPNrImUbHB7b9yIJOS82bZ09NL
-        1jCSkzz9XBdCLS187sVuDjp9ZteiRWtWrixyjdVHjPqtrfmx+vuVE8eTXbVq1cqVpJpZ99QzhTz19HOd
-        b72zatasjz+augpFPuIyn36OtWHngLNVq9ZVTxkD8pNLcKxdt+Xd9zf86Jm1rdSG9Azm4OOWLTvmzt/4
-        8ms9rJbF8PXzL3V88NGqDz5akwbt3H0/w61LgLs9lgYc1I72CoNtZMNT9ioTeSHcfTvnA65Vz9pNrVxQ
-        dsQ/y3Bv8JirPhviZrfpC06sxWGu9irHww0v+eAR9y3BI7tW6pKX3PNwfp1/VIqH0Rt11LQ6cMp7AP2K
-        Sr1wj77HVMMm743AmHT4tOqzA6MS3LmDA+6YRdmdbsxlWkOT8RR8C0n195LzPhL+exXuIdY7O3f4cOf2
-        4HnjKeIlZsWKVbyUz51LiOGNwvOJyA7W6w5psWQzDjLvOg6WYGQeVMxo4kCCVohQdE92JJSlvtxHN0Py
-        jONs2NhHxhjm8RAfQoUx44m+dd9+FhTd3tFJjsAbvzJh3aSARjfxmkXzSNtClklayIGovBAQFi1yrSh+
-        uvE+sa9I27J587a0tubHav5rEYJTX7GEgvy9ZAmRKuQ4nFsP1yFQZyGNqVts7qz6UoTmGquPW+1ihhwD
-        vXHKtNOV8+iucMbJQbZkaRH30qQ2d6mrpiTPKOaXcQnIncswK8eiFc88f1uqy3vu7/7gw4+dKMuORfjD
-        vkOD2tFewVG3FhvZ5JTryRt6DVR33gMPKS/TVD7gBWUDR2JHCe6xkMXY/yDyNKh5wAFBrLxh+lyXwDaL
-        i2vUmfA2qF3yvkFzYD2yawUEG36IYcmgfOkDh4jwx5T1EdVubAmCSeSON4+8yeidi+8EnEj2G2Q3Z04U
-        xSh44TQuPXdcG77kBjKxMDbBGmEHT0q5Pzz6aHPI7iPhtkedMZQaHaGyDH+NDhpy8Y0HuyFM8TyDAyjp
-        Gs1yE0bAWVxXvDmeUpcs50F1jhJ/TUoD8XHQ0OLZmEc9dkQvZi+X06J+tqEq1+2DmLCDfsIQVTbwaU9/
-        dW1oc+6zQeFOsvrHmjUggxqKZPEkMFhR5IPke66ml5LrG+xo/Vj9tYRT4J3A1WM4BAficB49Vh+Ms+ZL
-        jGB8rfcYN1h6UjbS+SUaZMDaOGsWOHjx1c1P/HjjzNnbFi3eQs6GxYs7Z87qeP2trlKKCKQhchPQudIk
-        LE/gcX3H3tZ35BTsVp3u12Ijm5yy89p4PI224K8ra+JPNL+g7BgR7uw45Ju8xR1rLW53ZzfjicUWqDHC
-        nb9mbnEpJeVysy3GoqPSvOE8+8hiWGK31FYxN+rcoU68fnoLS7qOtm8DDSWd6EtsQ5rIRadelnE4aqD9
-        KdxdIopTjsCYJmSPkYbQ3LmPAQFEYHetRP20PFIgKBbZ7DTbe8xpirDIkeZ7KDPxioNZ6KSHc7N5q/iy
-        DN2AEU9pkRj9ZoE+xsLyE0bjmUxDF4w3Bb7wFBzwNLKxE9z4C6xhWT2RZDGq4XQ5N3B5FqPcvHBswCHA
-        aOlXExAVeYnrywI7DJ4exSRl9TmQxXKjDqEDpoa1NT9Ww19NlWP8rg2ItNUc2lkdaXtiWhw3FdtXTzlt
-        JMbBDuzum0HD2urxbIfqcw7Q/Qux3nhTPqTx78ZBPv8ik/6LiCYn/W/dtn9oO9rVUTjxVhrpTMCGp8x1
-        0ft2IC343soFNR8kt5kK7YiW8QR3jSiw1F501SFXTPRXZEhhGqgykUt42SG2xASiyOUSq2eog3MggZuu
-        0xSOtr8qBCmdR08TPE3fG2LSf1CeX4GsorzOexzO5AqOoFZ99vhJzz0GVHn8nE6FxRxWTWNmfG+IYiNL
-        douYmZHju3Hu4bnHa41paoZcVHWc95AuShXJhZzT4BqNbKCsF8PdMYjNEwhSY/av+ekwMg+8OxqQquWp
-        nF/BBz+5ooChsdVfXa1FN4XNFIJKRzFg1/wWURuIH+yxmrSEe8mU1GYYtaMyzaoTPkw46nmZVUnZquEp
-        m5vB02mlNo6+fMWNdf6apGRhiLVY8Gjqx6bbdLYwK30PGA2V7ojilE4zdgG1VhrZ/JQD0N5vMQ1lwAvq
-        DRCxeUO+z1vZcUzD3fXwOA3Nx99YSA+MplgH0CUfOfDkLJtUOVHbNfMiHQP1VBdCimAVX9XV99O88HxW
-        8Y+kzAazG4oTbxWKRaW86tHUEG1sIZwFbSncncQkpEpqTKQwc5Kqce6GQuKIGchP4zWazrt+uieeljQL
-        cfSLGnB04J72u9iqlRu3yTbB99LkADP4G2Gl+xyzSMKNSp/VdDRbmseOqoJpfKq/qu3IboU1R/vj17Qj
-        SUdWdLGjxCQ4W9hfbc2P1eRX79uY1x3zJ5zq4eIHtjydkdf8lKPHaqW219/a3mS5WgN4WOCQ9UZMz6lu
-        jvvy6ptbhrAjj4a+tjNX0ikjQzvldPqLgArEe9tUL2jYfHTITqtqAnQMllgnT74HMcFlackLsKikkPqb
-        gEmsG0AdMgggw81nVNPMLVAvcnJ51U24qNwRvbcPsze37eGD3zhxieLcKHbkGy4t11K2uvqSi+pxRBWS
-        UoIXfVjlGlpI8wLxodLop1siMyXHUuHFo4wZqvC9nqz+CI8Zj1zJeQ8dybFlSzXhTGrM/6HdxT4jdd7t
-        3nirwD7DvxtFv8+bgp7okZUxeSR6iNIR091Lc7utMB7mUs3pc1s9bsOnOiTH6oHSN/fmtQ3515KJSm0I
-        i8VZD3hSqcH7q43ub9Waw48+sZGIVdLRRK7gmznuC4nm6ee6Z81mQbuZkB23nYENNBleKpat2DeEHXkX
-        4bkO96uVRrZyyultE/dSKxd0+Hd4KzWMRbhHGImLoBoJEzpMJNHVW0+xHsiISTFVpoNXCioKzjXXw8EQ
-        0GymAT7zJYdjGyd2DrbIZS4wcPdVGvjq08nZOBFc1JSqqVzDSeFi0/2kchA70luUyB7xkXQtvEcjyPAM
-        AHczEJjOjNuUM9J5d8qVo83+DdYH3xs67+3Fu2QX7uG2+zqFWVq5cVvZppU3gCb1tLL7ELZp2JE0qUdn
-        YowXT6r1RnJPnjx1bvWafa+92ffcS+sffKxYOGVKEQ3Z9da7a2bOWkx0UoSrMpRqnAwPaT1N/5lVa/YO
-        akeeGiXy1ls44Jb93TlD3rGVW3pQ24w5uBsaaIygzrsSR7i9Bn6oEZuwJdQDPuj8WpRfAKjaC4VKqA3y
-        4nGrdYg/vmSb/jieKhiOr6aI5FfDTvorHJcj4jjwHgDo+cARuQNceA/RRl8+Qs5TrYY6Y7iV7bWMcnAs
-        /OSAWyq7GwSiMqNQQAPoG5ylFYiPubV+ULSJyEhtm4ozbeR76rbH+LYBPPSOg7qD88bjzgLc/A56w1yU
-        FtLxMHmAKFBCMRk4JeQ0DVdlHNVARtwXVy8y9HCwO+Jaid1xZ64hN7gmQMdIkeMRIJgOnMaiQry5O2Qa
-        3BE6ijAxLmdACG4gO+qqc45gzuEU+Aglnd2TFlfJiCmj7ttigZtsLzoN2qkWSM1tbRu4U43Qt+tid/aK
-        1xHBqlfL9yYRC75TiTJuyKNUGMqMSYmFu6EgHsixX0Utzr1Ugu9h4SZw/x+HUbhYvmOFGMUbmN2w8wDG
-        yN2YmzFCFtDH557kHmasiHuVaU1GlBKoirxO7GmEqxK6g8/Ozezzwp3PUzyEHRVIR+iMxma1YwjuESgS
-        FAuH3QFJPDt1mNRbhxQwooR1Ng6sU5sSuYvhcRmcjh8FdPKNC9q1yPEWNzPoviHrASutUlRRGXehDxx5
-        tq8inhOn2wi4ezM5zOtIL1WB8oh255Ew4sL64buikIin/c7RdU5AlMhEHwt6xEhGjKyG/z40vLt7eO66
-        7Uag2q3StrH5qORWtdEC3Ic6784qCDnRLNyGq5pdh1/1xgwfVNEewo6TjexcrDEBd7kWEYcizEn58NHl
-        JuBd1WFXhylNDkqxzn1QF+kKxQ1upkw3C2MrQIeDUVIaxpetVBKgL2k4fA927XhwSXTkzTmTdmZO0Ocb
-        lz2K0ebIxODbgM67S3aozFDSGA8PEVGknoIWC9ZHFskY0mijC19y2x1H1W33TYLL1EaI5KrGpgV03sV0
-        GrHqgsYukBDjVbomut7D2XFsmmLkWlVT3b6DRenZcHLFh3TsVC8bITh12AEEbmPqsLMBmznJCFxSD7eC
-        I6XcQFTiQsyUCH9UhS+V0FUiX1js2MqHkqrT8BBSXoCmdcJ0KEyDuZUD8Xrx0auJeE4z5TsPiUKkDwlP
-        hfNiVGbiCTFALd4SHMNIO62Yn+X8Xgd7U77H2MZwnPfw3EN0crqs14ViWs1cJrwFgBr3Oc8p4HYSf0Qb
-        R8ZswwEUylMIDnbHCW/Mhid4h+EeZBfukj2NDdd7VWHnXT6wki4tDYNCJWdfLrxvbdw3DhJa1HMbAt2X
-        gxJtW6H5gNukmk/6BhAus3JTFIBr44251MVmG3VwRRL8aE7ZUQTvcgqPgQOtrhfqciV48QZoGmqNRMMH
-        niK2N+2M4wTptNvw350XlobQ9Oe/t67PpJqMoZ/htquM0RjOa3I+ipPwrOMF1LjViMv0c4x/ullqnyHv
-        OKmMfIfhrs9uCbI74hdSjEST7HAklWJw+gCQUgkQ5MrBOACHPBfeuoHtDZke81oHZPTwN6AZnBG9SBXx
-        jhU7U9TC6XAKnAguOfexadnZPd5gdHsNCffBcJ4LLg/iDGq7S+6Z6gStxrgg1yeB8mzJXhgco1XF95Ce
-        olV2LWl+giF48VWyq7ZjmRgj4TQjVmpSPYeT+WQH1CX6M86Qd5wk1q4pcN+REutgOJOoNM2Hxz6kGLGu
-        FGO2Rbmgbg6MTEjifGv+aV51sV6FaWjKbjb6BY6HoxouvBEsOssW/mnIJuA2RQzbgH5deGdpsZkB+7y9
-        xpRIR1YRZ+C7WUTw33HbnZZlOCZ18mzovDcMnlEBV5/hoDHEajx+KVRJcDd34RsKMgY1RZ9Hv35HbsV8
-        0GyBiWeBOwZ3hw0tDqWmEziD7OGwAw5f5CW77i1QgE3O7gGCXB6xGCJMSnbn348+ypsc0VHEkipSQjyn
-        YLwj+NbXBrjpIATKBqbTeXeYAXw7p4kxVfQZs1zhswt30zwhzlChfYYjDRG/H/HvwXc1KyUaVfgS4o2l
-        aR4In8a2x3xU+zkvU0wum3iPWT6jbIHRt8CdgTuQGhTZoUasKw1cYvDNyApzvDj2SFGoSbFuPPsdxHrz
-        o/uGUUJ8ZCmw2eDblAa625xdyYVn98iWJcRx2BHf4TsSjet6G/kO3KE/fSFvOYrvijP66WlJZzk5V0sX
-        PkV8OtepeS6amI+q1B6CDGcq2bklRv8ByEfMFpioFqhFstlR+2A0d2ReVJwx5NGJmg6f+pr/T//pP+Vv
-        kN0EimxpWIUzP7k2ka235AgbUBjLKo3+B5hreiaaSoPheH9tUKBIo86dDxXt5wPyC1AG4tpQF15zUdhd
-        590MsRR8dviOPmNgmWQ30YIJcFBynLxqdjND8ktF3PuTcZyB+BDiA/GRkaa0qqotjPw5BrZ7vo5y0wBO
-        iks5avdhPlC2wMS2wB2Au3lxLSU1pjnZzX4uvukSYBx44rO41GGPorc++jRPj0gbaKGh5b6s4J8O2CS1
-        mpTyCvHuyAk6tIALrwrPT0DWiV18dgasMZGmb4Xvhs0E3FO+h/+uPqP/3gTxqvAiPoSaSLMs5avF5fTS
-        TANVsnNGE/thy2eXLTCaFhhtuOunV8nOow65mvjs/KooDIDoEoz8cy8okzrsChoDMnQUNtCPVis3BMig
-        l1YOHZN6FL7Tvgqk0luowjvdlI0jUJLKcfDNNoPsbnJw05HzTSlvsP67OZUIITAsJzIoUG1Kef13+1f+
-        ppQPrUZf3qERpw1HMYlbGtWOQWi8fbzzU0bz1s/HyhaY2BaolVLLjug/jdq2GP4YKXBTsiPF/LN/9s/4
-        60oO0EGf3YA5rofJUnQbHVmNovLecHm80f8SidxwdVXyGJ9ssSWctRpUFCwQZ8eXJv6PUdaYEIDF8IJj
-        WBW3Hb4TP+PCQ6XUwZGg2PiZSD4T+AbxFkEv4qNJKeWjbaXs+XG+ocY4LyHUGI7LexgnMqK3X648W2BS
-        WWBU4e7sJIoRMuq8AgseqbPDdEtKdrUCyS4u5YWzUi0h2beIzlHYzNwA+NFBTBDvhNvWC8YJl1nHmf7M
-        3fngIZRosIBRNGY8Rr825h24uzKcKk1DviPl21Wk85t04fXQU7gH37W8cfFeo4jWN2bJv5RI/MAGbMbG
-        mMKEl1xNE0JNqgcvn2y2wEhbYPTgni5Epzjj5B2jPkB5jKA2IbuTekRbKlyMKYc9wA3yTHjkRCRPuXWs
-        p1saURPFkWcLtwgqPFD2/UAJ3ogU+I7O7iJNrgnZkO/miHfNncg7H7l9AtzhuVfhHvNaQ7FRuE9jb2J3
-        tsFnj/TLKmxmXMglWyBboF0WqJnRZRQKD7Nqux94vFOyEwStGkNxeg54glwGacAXdXYo6St/SnaDRlIp
-        YOx8pm0mwIOzEHA47VSlCVyq3Xum9iIcxUlJ9peOXmK34DthkcZEuoJow6WdwoUPFd5AyfDiowGKM+G8
-        p3kL0iFZe4LoDxx4MP2ZE69cIkfFP5dsgWyBdllgtOEO1pXaVVEAExoCZCfeUbKbmZ0v+UlGsCVnm5Kd
-        L8OH5fPYQfkotMT5WVHw0z0o32Mi3hIcYsXTd2zTKU4u5aH/bjYxpzU15DsuvJmbTLJqzk5DfWK6U2ju
-        yjIxq0CJJn3JsAOIaUqpFGOyM44VS5e067bO9WQLZAuMNtzTpGA4ntAHP914dsjuNFQl4xi7YxdzkYfP
-        HuwAYaPA07F2iNSFx0pg3RbyWmCCPSV++075DlJd4R64u1yZy2rj1PfnwgfizcyH/Xn5UFxyRacoZrfH
-        wfdDmowsZidxEQ1j9z3GTAlOpjXRjZXnki2QLdAuC9Qib9fIfQi1XUGGB740iArW//k//+f8jXku4Z8C
-        CxOnQCiIb5Ipi+LD5CxYw0xkFgdpjTVEuQKXwfeG/jthkS7OF3Oa+nPh9axduN2c2tQPiKnfy2op3Y7p
-        92yJ7y/TzW7m2vCuLmLmHF8ORu4OzDVnC0xCC4w43H3sw7KGUetx46SH1A7cldpx2w18hFl0A6CEh59v
-        zCeTyZ52ZuZasGhSfzWmyOB6Q+Bdz4SroP+O887IqqoIvnNJnxH0fE+JlVrNBS/lDW4xKavx6SanLH2I
-        pNtsT3vM1k09HJRqqdwVdhyQSG+SSfgc5lPOFmi7BUYc7o78+uga+xjzlRRkdNvN+KjUDtlBkoOooEQ8
-        wfdUaJ6cDnv1rJ2aG0X/ncIbknynN9WAMb4q34mPRJZxPBMnGs42QXyJ8uwi6DlEqaRf8tkVGALowXR8
-        djNTRvLhDPe2P9u5wklugVok8BqJDxgXvgTZjX00qj0lu2676XyNp4bj9AToAOyiahwShLvnEhZQoomi
-        zk7BbQed8p1fjX/nL24yWHfaqtNc2YwPkDf12fXcS4VtwpfHAS8VOom0+Kv6j/XQf0T+YccGjMlRr8sl
-        WyBboI0WGFm48/QG3GMyKt6lETIMooJ1Cp912wG3bjtM56Wex16yxwwaIZVLyQJqVlW+00Gqv6d8pwfF
-        tvKd5AQOVoPa1IXXi2/I9/gykK3AEqXhGwBfurgrPQqfDWw3/Ea1vY33dK4qWyBbAAuMINx5Yk3yh+du
-        rHSMo6ZuO4h3HFVBBkIRPMcDzzu78y35JmTljPUmFmjId64C4OYSmCXYPOz0o3xpWmDEdxemcbJrqPBm
-        GQtkV0FfArr54o2zjMTxbIMKBNY3b968adMm/jqWa0g+FxpZyQicXLIFsgXaa4FaJHtp+wdD3/TLzOhr
-        8LWTUZXa/8W/+Bfhtgtx5BccOh5+NHfnMYVDqnCcSxMLmLzFef9hLuxPT8l9YwZNly3EsCaPdEIT23Cl
-        GBR1vmggPmBtFviGRb3eItYpVOvMWFf7Y7VuyM4H3hXoQjgW19d4JyW4XLIFsgXaa4GRgjsowRnUcy+N
-        o4YgA9lx2w2ScTKquWLYkSAZBwBTqSFjvRULgO9YlgQ3311Ut70QmNo4JdiqDg6IXZ6Qq8YlIwzGgdYU
-        8WyjXO6iH5FgMmqIcVpoDsopfGBOrKtB8dkC3KncaVZOYaO0957OtWULZAtggZGCO0wX7rx0p247PqMR
-        MpA93HboY7A2Thx8QR9QlwdSwl1/M5dWLIAxS3x3L6MVvRbGofL+xGf9btDM9YqsL5EboOTFi/jIMQmp
-        TRbP3CgIjmOOe95XL8Kd7/nVzGXOnyJQB8+djoQ2qBFxSyAZ5acxWyBboL0WGCm443oLd9UAqG1S33Qc
-        Ndx2c7UDcbaEQQDImEjJrlLcCtfyNlpAvkfRenjxpnAxq49pOLkcOPXBdxxqM/nwge+5iDGbNMJplFxK
-        iC/xHcQDd3AP+ukJ3BiVBrLzl6pogwKdhWvd3ts615YtkC1Qc8p4ewsCrnA3Di/U9qrbjiYDepxuqtuO
-        JiCe1I4jZ2TD9X2af8m+VDWEHSfALpx4pI3UT1f7Mv87njLDG2zjqqdAX74TAGPOXq4FiOfxcH6pq28j
-        3RhRY9CklBf0IBsvXsTjsBMVo9vO91aremNOG/7J+xxwd+09S3vvwFxbtkC2wIjA3STd5vkzSKbktiPI
-        mP2Rp9r5qKrtdAn0BLpyCscKxEMr1Ek3M7R9J8BeDkdbwk2G3WAas7g+n+I7XjzetHyH4xrfvJsKJiIe
-        VcfcNeYPSCeaCm4o7/QosE7BbecbUI62o7xjl+BRuDop3DlWfhqzBbIF2miBWpoBql2fYbSeOw0tue1E
-        yPxP9YLyDlZU210bGojQJRjwHpKCoR1DKxANkNFzDG33CbCXWd0tfPaMwDps9Y0KE9HFIr6DWsPVIS8/
-        sX2smhSIp6uOzF9OLsWXT+egUoPhlSAeR56/EB+mm7HAOEv5zmf6crqWWEeb5rXr9sv1ZAtkC2CB9sMd
-        aQUXz/RSEdvOo8tj7Kwl3PaYuIRTqSYDQRzQgz6SxXwywyEs7EAyptB5DKeecb2vs8As0VM63O1YiJcG
-        vsNu4Q6jcdsdlQX6Jlg2DzsdMJuxO9fX1DGYV3fe7DHi2zhIinDnV7dB1aFyvsSd522AJgl3LMzf/EBm
-        C2QLtNEC7Yc7T745pKAA3pmJZyO2HbLjtkN53HZYY8ZaCIKPzy6KIeG2G0oxnGLUBzU7fjg5i1nDLJoU
-        oLu4NsjG/oozFBxqw9VhsSvkCXeX2jAtO1eK/tu5xwatGodj0kcQj2IjwRlEleN8yU8uF653T+EQJWWG
-        Q7Txzs5VZQtMcgu0H+6RIBAvD08cQJhJJtx2IyD5ximprhHqFHm4A4BCJh4+i8GQzjv1D7+rGH577lQN
-        wffo5Oh0was5IbgQNMzI95iLxOWLaWUm0HddDi4Te/GrmX5dP96kvjHuirdueKUzpHDYXUiEzgPWOxLL
-        l9SWym60bZI/jfn0swXaaIFarKHTlg889maCxaGLBJA8wE5J1W1Hk+Gf0ASUGJthBKSicGgIvqoPs8Aj
-        GmPhBIdZ2/jdHWNG3oJQuun5uEyYSHEGuKfiDFExJl6OFfJi0SXhzu7yXS8eFY7auPrOcQXiDrGCcqrC
-        eVe6Ce5HzExq1bbchLmSbIFsASzQZrjzqAt3nvbQZCALw6eq7aHJGAFpxlqVXB5yw9spOvvDL/iekXCc
-        Dxxr+HWO0xoMdbfYcfI31DOHJRzixqfWf+c6pmTndtGtUJkpkT113vXQhTtF590BWMNy8NyBPrcKx03t
-        ma7Yl5/PbIFsgeFYoM1wV+MGCjz5rn9d1WRwD3meHUo1DpKeQOyGNNwWt11q0HMYvWOJQbxxyujhNDvN
-        XmA92N/IGXriiJzBW49cMeo2MjcEmYZkjyFW5RcXWkJ2V3nnn6Z6jzFV+M433APptYb1w7mb877ZAtkC
-        YYGai9a3q4B1PXcOACOMUofm4bbjvIcmY34rDk2XoCMZrqXje0MuKQFpAK8FJj6kKL4PueZxvaPvRiKe
-        z56LOfd9zfJi8ZrFRZTvkNp7ownZEWQcWfXqx7AqHrpzU+E446hoNUbUyH1+QqLhPqFJYVUa0K5bMdeT
-        LTDJLdBOuPOguswmD3lVkzG8HeUdfKjJmPERzxr30OAZ4T58+NpVOILKZ+pUFLZ4uMlZMEgkadACfMP1
-        4ipwybgimIsLRKcbuR7NDtSfzp4GzBgZmcLdmEj4Tj8Byl2bKWR3iM914V0qvRaT/IHMp58t0C4LtBPu
-        5vxybZ2SJqPaHnOXjJMBJXj3sAPE83i3y203FAeySzH5Dq2M67AQxjM54c5Zp5bRCHS0pZFVnHd6QZ13
-        cNw62SPmPQIiDXg364CL85Vkd6ShuBb0K6pAuWQLZAsM0wI1nqV2FaCp54704UKpEScD1v/lv/yXwl3U
-        Ok0GyAIRn23lAncZZhHuVqj/LsJc0NXC0Yd5lHG6u3y38NmzMMWbq2dgPS4THXAssURv3URnN/g1ndBk
-        xmCjHk0ZhghDbXwJ3OMntHhCaOzaw5jcG+26IXM92QKT2QLthLur+Zg3POYuGScj3PHf+SdMUY5XcIca
-        qvA62soCwyzyC7Kb0NzgP77kcLwoWNCa+WmYBxqnu9v52e15CqBc5503Ks3ClcJELreEkKLRIuoxVWOC
-        7Goy8DrW3cbxN61YqsykeWZgvdOSw5IcfTI/kPncswXaZYF2wh3fTbgjvrvoUgRBqskY4c7TC0GgiYI7
-        z7bEF+5iZTiFGpSSQ8QPvvMlCkOsic7R9VInW7E3tWArT9+FTNXTNAsGNJ0AxfBWBy1KOnv47JLdeHbX
-        +hDuZvo1ZsZhVZ13QyQR9ON1zYxD7bq5cz3ZApPZAjXY2q4C2ZVlnHfqvBhGUHXbKY6murIacMe7Byh8
-        EO6WdnE2xGWlfMV3vuSDE3AsXPt2HXF81cOFiJgiW46VzMrpnCY2YFIx9hHuCOXCPcheUmO49OYY0HMH
-        4srukWdG2R1XPeivCs9V4HBhPQ7arhsy15MtMJkt0Da4o3jwYPOEO/OlKrgDd1PKKLgb5w4veKrhiGQH
-        N2wz/GKdobyHOOPrP4dOE/nzAjH8I47HGlK42344i2Vcx1znnb/hvNNtN1Rj7NTDbZfdDpxGkpmQ3fne
-        PsAN8Ny5B+jvOVbYcDI/kPncswXaZYG2wR25Q7jj/clu3fAQ3J2bCl6BqYnaOQdoEusxsb3eYltKyvcI
-        7rb/4CimKosCXNpy0PFVSTjv9Li2HDvovIfyzpfgPpz3SBMG6FM1JsiOz27Rc3dMVdndMVW4j3BnlgLT
-        BVMnN0MKd4Zk2nV/53qyBSatBWrmhBp+AdPCnTf3ENxBA4OoajLC3dFUIIJrj7PPW3+s2gH32YB/tqVI
-        KzXcNLhbcQaupTkIGSTg+7Ycd3xVEjGIYXmEMvo8372EPpcMrRwuU3wzS0dQUzVGwT3yvLtsEx2DGSKV
-        ZfgVPccZT0bE85ljpZee22P4N2SuIVtgklugbXAnlEK4E1CRZh0IuPOBB9jpS+gkTjSnGxDulraTMeW7
-        Y7aGiBgLT9cSU3Ud1217A8Z4hXZ+9nY21QlfXCP6YN+9sCH8Fe442mnUY39kj0U8kHTM8QvZTf8L/akt
-        Xb2Pf3LDpMbnuJP8scynny0wfAu0De4QQbjj+jUcTUWfcdQOcOCa8TzjIaqHSHZHX9tegu8R/xd850M6
-        ZQactf3oY7/CiEEM3zkWR2SsW6HMmPdw3l2gownZgbt8T513EC/cjannKGDdKW/oeOnV5/Pw7+xcQ7bA
-        JLdADdS2pfDECneQHaOpCu7/c70IdzABQ0E8cDcSEXboPCrQj0SBsKkLHyGAkIuWpJIc4u9INGAs14lx
-        jFTBRLaTvpkeGuDyXhWvU1xc0Gy4S0O4h9qefkj5TlgkKg13iPkMKPIdt4BbghsgrERL2nJP5kqyBSaz
-        BdoGd55S4c5DCyKNXOZxRW0PuPONOX5BKuDAfWODgHvAxcS/hsm3C4sp3wGWOQmUI5woG4Wjt+ug46We
-        CEO0wdgK2QSvx25YwQT7CHeUlvDZq+Ookt2lOSiR5pcdcfzdl56DFyYqxA9wtjBPYAp3DjeZn8l87tkC
-        bbFA2+Du+BiPLsOkaahMwJ0n1jhIFXkQz7OtEK8y4GoeOvXUANxNIsaXwywBWb3UNMRbvtPTpG9wfDPM
-        I46v3e35lGVsOeSlk+Yacb0UTPgVNMt3F7yO4dOSzy7Znc5mqhmjHnHb+cuXdOpq+twqTijjn/S1XiaX
-        2G3LzZ0ryRaYzBao8Yy1pQTc4YLLtkWoTHjuYAKMAm7hzmCmcNdzNDkBZMeVjmlHUU+7cOm7QgwkCnf+
-        0p64D/gsZSZPibEBTxmzm9ANUxhHhEGIXxTuKOkxX0nERxHrZgaNtVWD74zH8hOdut0GN56Lbuu5p9Zu
-        yz2ZK8kWmMwWaBvcTeTNg40L7LIPVbjzpVGSsNtYZuMjA+5whGeevsEl91RO+NXsBcMv4kPlQRc+YkU4
-        XHof0MGw5RCOSM0xJ8vJsZwO/Zl/ObtY/rv0wdh/iztG1jPfJIbQmNZ3SeHuXqYiUENzOIRrJ9zxwUtM
-        T7117gSwHgn0+Yy3jnfvYh3m+vcq05Gjz8B3PXevjkefzM9kPvdsgbZYoG1w5wHmCQfuRjo6EMezqtvu
-        gCpf0mjzebk4p3kiLXxmg4C7E46sp3VItbJlie+KQjSAhsGyKPxzwNoM9WFLeixoBa/luGMGkcQ4El5G
-        LvX+Prhl7GhV1GlPIPdd3aK9ZsEm8p3L5Fn7asXlCGWGX52XRHFNVKPaG5KdYVL1dEba4Ts3huoNn6mW
-        E+E0naXsui6YMbV2W27uXEm2wGS2QC3F2XA+h+cuvoM+Vbibr5HNOJw5CVR7TRspHMNp9Zl3GlQbC3WK
-        +HhvMFwEIuOfRuEsSgdlF76U5jaVD8HuyJAzQh+cagvfPbojE1qb0xmOfTBIjExYDwbBeXcR8xjZ5irj
-        tlNQZoS7+oyTTnXYoTlMR0mPRbQBPQ67w7Bs4JJ+1EnLMbXrunAKKdyHcyvmfbMFsgWwQNvgbrpXHuCA
-        uz6gcAcW/FPpI+AOOMwmZpEpElZmyZThMKvJvsH3CKSR7xCThkXx/QP0GMMTPHU+1B0v4j56Gp36hqAf
-        sI+0t/OqaTfozPWCvxzCWCbuGOHO4GrqsKuwA244jlhPr4Cw7gQx03Dyk+kK+IAcZ2Iyrq+L6JbgzqHz
-        w5ktkC0wTAuMKtzNPaDLxgce7IB7CeLqAyOE9bRaER9815GnYcCdWA74xex5TGxnE0CPfLlj5IN9TAp6
-        Gsw32pCzo/Fae8DeTtXbzThx3GoVIQNbVWbkOxpLjJ0SCBtkp0tARsd6RpfywZBH6A/fXQaLphoC67wH
-        1+tI2zbM2zrvni2QLVBLVYjhfA5ZBptWg9zV3PXcUVrYgM3wgvXoDU0JAWc0PwgURQkRTyMhGrlQtm/f
-        vqNeCNCOAYCbiRLG7v/tb2iwiQQc/MQ7ptPiTJvbNoQRN6MeZy0IXwc8qU24OzpqohgV9nDYXfTDpwtV
-        3SVZFN+NavedDGurzNCV0nmkcEfoH87dmPfNFsgWaBvcIxQSfLcOd6F/B+EeqhGgMZcZjidiAm6pZLfg
-        oo5dnFdahtvO5di3b9/OnTsRx/GUVbocwGjC9xLc2RKnW87SW6hQYRzhTlxjSYoJh11nHGS7L6DXece7
-        R7SJ4VOuO7eKm2W4ZxhlC7TXAm2DO8+5mjt+WStwN+AdfER082g67OmxwIq5bmiSAZqu3oIgk/Id33Ps
-        8x3jw1yYDtnhu0APX151Ho+eU25obV9i0g4Aa+B9A1+zAHGxqFC4U9Kx0xLZjXoy+pMaXOCQ7U1soAjD
-        gQx+rcK9vXd5ri1bYBJaoJYOHg7nM05ZxLmncP9f6kWIK8vwYOMGOlmJn8JbdMtRK8AFTimmm0qMDy7+
-        h6cJ1HBRyUIOKC27d+9WnRiDhcbT95CZi3aSwgU3OTJfVjskzxTEcyJcl9TgDn2r3vg918hEb3wwXJXr
-        SMQ6A6oUBJmQYrAYWwJur2wEEdlx8iuvREo3mJGqvCtog4GefJP2N8O5FfO+2QLZAligbXCPxGH4vP3B
-        3Th3nmf9NZ7qOwJ31QBzGzhPyuJggJNr4JRriezZsyf4DuuNOxw7JRSYXbt2IYJH9yPTFd8tMSksPVmM
-        wPfQPBBfgjsbc0HNCaHsDt8ZXxHuRL80dNjTGViO5WJPuhycdxBPI3kJ+Ff/6l9xUN4hjCjlmwz3jKRs
-        gTZaoG1wxynTc8fhLckygsM3ejw7uWMMRsAdpvC0j3QxbsQgSxnnDKYmfMc5Dbjzgfk7sVcky70jH0KB
-        YflpXpvSXkcdJoLiRW2ccumsHXrlr5cgnHevBf8E33Z4ht8Ad3Av3BlcdexUkZ0LypaROsL+kr1cL5cb
-        w5VAqAqU/+t//a+5+jjsTtTKcG/jU52ryhYoPHcVz+GXWImJp1e4G22duoSm6JIy8gJ8RIzEiJJdb50C
-        bmJKakyONRVBJCSAR3jEJj+BXHjE+MVRcFfd+I4U2o+pWfiC9tDTQMzoWoSpWHeiEyWmWcWJlxrv7mo1
-        bBMRNXE5sIA9MRsIdzYmIJKCvk8fwzX1PSxmJ9h/OD2NOmkM2xgzQ1fBxvSy/+bf/Bv4HtMa+CYViIZ/
-        Q+YasgUmuQXaBnce2lisoyrL8NxCDR54gO4EFt/0ebxTV5F/tr0AoxTrAxJZRx5+0UIHA6Ebg6sp3znZ
-        Aetp+wagEz1k7969KEWY2tjzePPQR06xHnPB+NIOtXmfJOKplu314r0WGEGXnArNeaDsLt8xjmRPHXbO
-        3ZkKZtrhinOt8fGNRKI2fvq3//bfBtzZN4U7t8Qkfyzz6WcLDN8CbYM7j24ssye+nUFT8tyNuzCRC96c
-        cLcETdrFdw6tjK7T6gTUAYtQlnRABxI5lwfBPfgOXjmRFisc8IgDboB3DEY5OtH3yF9APGW6wnqkJZDp
-        ojYGFeJlpfmxOCN24dRCOeFaUD9k5/sYU4XvvL4Id2AdM7y0s8kkVOf5S520hDpN4C7c+R6447yzsapR
-        hvvwH+ZcQ7ZAaoG2wR0ACXdEavVf4R5xF3x28qeMcLaqwutIwF2HcVBYD/A15DteJwEzwXc4C7NGlO80
-        HpGa1Uc5KAK3q7xWXfUU64JSV72qwwzYizhr1GQGXCZq4OpwHb2gTjUyuomhUeFOCw03KpE9ZodBbTuG
-        gDuVC3c9d9vMUVI/ID+l2QLZAsO0QE3aDr/Qjsjl3dBzh+A852rZfIAFeO467D7VfMCVG35RXqd+yRu5
-        awb1QQ7CMurhdJylSb+VijMAdziHaNIePGUVGAo+suONMSQQCoxYF44R0JnKL0Hz1s9d2loU8bEnHzg6
-        F44PJiegYxbujOWq+SjF6LBHj+4kNSrBgAg4yFm8A3E6bPPv/t2/03O35ewYdwK/Dv+GzDVkC0xyC7QN
-        7tgRHrn+Dp952tVnS885TzIqBz+xgZRvI9ypSvCFOCDU4A6epocbVBGpKd9Lg6tMFBpy/9GwJRCQPoMu
-        BIfdaVMp1kOBkebNmT6oM003jj4j9fTZAEDTAMfJ2Ua4c8VLUoxX3PHYiJJiX1d3MiUkNfz7f//vgbsC
-        HafJrRJ3Av3BJH8s8+lnCwzfAjUzx7alEOoO2SlOQQzNPX3OIS+/8hNPNR4cm/GEuwEv6byqD7lQp1h3
-        KK9UCNpDVCFqEDoDTXWAVgq1KVYYAo//zuAqVUUhCKThEVupPLahfhUYqiUExf7PQ2OoiCl0ZNgScesx
-        nOAugzpuw41V8CkcPd1A5V24cyASG1CwZzjsDrF4KX0D47M5NfXcEdxNCclmwp1DcC5skMbC8mVbbshc
-        SbbAZLZAO+EOnvTc8c703ONp1ynDO8NH440eZPg+zoMdcGeboZEdlBjfUoJRCia8xZTIfEY0h/ig2fDt
-        5kWJxpBtRhfYN2pDOeEGGjJVqRCLUQkdDykcsEkwPeJ2DIOxhLodcv+QD93fKRsWWYW7A6f22RSwLt8x
-        TryiBdm9lMJdWcZJvyCesxDuXDiHW/mrQGehAZP5mcznni3QFgu0E+6AUrgz9ihqU1kmoiFxfo2lkZUi
-        wDIEuAOF1GGPTDV+CH5BQDziEt/jn4SNoynBHTqJUg1RCTUE34EUATOxOx539BDV3Rt+Q8OAHQoMlZgw
-        wHeO1FVXhEmZrrStEJSiucWDtriZIUYyN92FbxDiA+5YTLjTzpBi9Nm5jkjqKdwdUMVudI2cFNdauHPW
-        VMsZhZLDTyalySVbIFtgOBZoJ9wRE4Q7+kx/cHdcDgfQt3WeeaMmhLtcaL0AmnDYm5DLFwU6lf7gnn6P
-        6sIgIefCLmmdVKJ87xQnzjHdC/WZn9hmQIBy1gwA6PubMMDmpeOlkTagpL0E0wc8ynA2UIOqwt2YSF/I
-        KKT5Fe5YI5ViJHsKd8PnhbsJ/bniwJ297C+xQHTwfBjODZ33zRbIFtACNSd/t6sId3w6ntjw3OO5xTsD
-        DWahwqlXWpXpxrYHF6RDk8KWitFwIVKPNfwg5tTNmdLZCt9jG5BNXDm9kUEgUZUh8KQFTsUZ3gw4L06w
-        v/ZgZOyDAkPIvP1fdBgqMM4vbSimB6ybn2xbfrUDo/AhrZBGCndDV3k/45QpXEQVdi8f1LbwmWtKyzkj
-        49x5t/O9jY3/w3/4D8KdXzlKTG7Qc88lWyBbYJgWaDPcHVMF7gazO/hWip3AJcQv5nkGEwq7Ou++0Q9E
-        9eJ3tjTSUeYOWIQ7u2AsBBBayPobqa4yIPHJoMucTEZi6ZmiNj5Tj7COgsLDkEPaJLaHayTI5ShsD+Ac
-        GwhvnYaJdf5GIKPai0wf8ATbu0F/cLcz5q9w5zSFO7z2ZSslu3CH1OpvzlDl3PlA/WwM3KnEXo2bJODO
-        52He03n3bIFsASzQZriDP+HOY5xOUg3nHQxBMYRXHWH1B3ndItwhglKM1IvUNP19EHwgRgXAGToUuh8i
-        84hlRPhmMHNAvscGcByfHb+VGvDrU7LHZ+R7DsoR2QAFJhIG0OaSsC7ZU6aHthPIHvAc27sBtg3PPa2Z
-        lnPKAXczl1FQWkpkB9wBd/aiO6cDMEu+Lzd2A1TuKALXNODu+0Eu2QLZAsO0QM3Z6u0qPPDAHWLCvmo0
-        JIjnMeZhdq6jc1bRN3jOnYyu5x7v9dUP7O60mshvFdkLmnxgY18UVJNNqlUyHDhGagdVhw4dgsUtFsDd
-        sOC/E4qDU09t8N1xWkMVQ1vnS5keTro0D562cmojsQ2NVB0KjnsU2mZckJPO4LVwx3RcKYBeKlxKhTje
-        z4Q7bzCYnXrcUrizQUhz3ACR8qxd92SuJ1tgclqgzXDn4ddzZzJnNRqSZ9inXbA6fRG7K9cOCHdZoNQz
-        WKgF3xV5jUJxto4XPmU9qhFjntAZRjehPFpNf3DnewZmYZkxLaXoxpTpMWYg0wd7XiOxfRO463cLd2R0
-        4Q61S1j/j//xP/IN19S+HCPj3ZscmM98ya+g30H1kuA+OZ/DfNbZAm23QJvhTvvwf4E7zju4LEVAC3ce
-        aV05nUFQ63t6DMo19NzZy8QmQ8aZfE9RG2OYKetTz5FT4CWDtxB6LAZjzcgYpTncifrXVQ9tPZ1tpPai
-        nz7kMxqhHYU7b0gxdhqeewp3OnLhjgQXcAfrkl24c3bKLC6THXGQ/up7DNvEiDqf236L5wqzBSanBWqR
-        SKRdHxixBO7Mx8FvVRkHDWmgGw+wU5kkNY83KFGZsVTf8alECqQpv4f2WU4JeqpNPWtzcjm2GbgvefcE
-        83FqRNEgr6PUo7r0VxD0xXpEphvImAJ9aKcw0nvRTkcCaG16LFqewh1kM8hMwSWX6WkB3yCbXWJ6Kpu5
-        UBTfsyV/7fw4RCQUwmLtug9zPdkCk9wC7Yc7moZwZ3AVVgr3dIoK/+QZ5qXemYoQhGtgWHRDuKdkTzuJ
-        oX1OaZV6vinuSypKQ9zTZmjVH9mZ1uTcHIFectKjDUM7hZHey8EJFbD0WPwz1dybw905SmkcJJ09Fx2b
-        cK2BO0aw749cBQruuWQLZAu0xQLthztvQGgyFPhuKHcaDakyI9B51B1iNW9UOO88/PGa76BryfdvL90a
-        4l4F3EjEqmgu7sE3E3ka8h0lp8T0MQ701KTOCTBCMf2eMwLoobk3h7txkGyMlVwg29FU7KnsRuUcSE0m
-        EtG05Z7OlWQLZAtggVqaX7Bdn/HZgTtjqr7Fl+AeQEeZkR26ig6yWYQ7QCzFybVrHY8B60knXsnlhmIO
-        zYPjR48eDcQzBosgo+LkjlY14BHHzgZcDhUqTiFtFd/Tc8dsUi4uM2wpKOn/6+0Fx9xQGfBtHlDectiM
-        z+loqv2Er2vwnZrbdQfmerIFsgVGBO5QW7ijUDummsoyOu8qMzAdfLABGreR0Rbnpt8psjfkbBPcw0FG
-        C/HiQRhtji3HDq8H1RKDNSmlPonvncPlCXL5hDvsLsE9QmWohF3AOpZxbXR2VI73zcZpyXruxi/lki2Q
-        LdAWC4wI3Hn7VpZxJYeq7M4TzpcqMzzVsF51Ppx3v9FzjNf2O/6hOfRLKLzjrR1yAyQ7pWR80MwlC7jT
-        hQt3XPgU7rjtCu702ezCr0RAKrg7N5Vfub6+0kUULNZryw2dK8kWyBbQArXIJdveD4gVeO7AnWcbH03R
-        PIUj3+C2u9KeYRU8+XKB55+BO/byyR/jJRg6xtvZYvO4HBHhU9rFCKIIS4fXwp3b6H+7WaB8wJ0rGII7
-        zrtev29mxqRyS8QhOGh778BcW7bAJLfASMGdoDc9d5SZVHYPvuu7gX6QwRPOc24cBc67SQLMOZPLKFtA
-        Ncy8PaVD47bzHoa77UVkaEG4456X4M51LE1fohfnSeNLU00YPhSdt5pMLtkC2QJttMBIwR0QQHYKqcRc
-        vqca8cLjbRIxZzCBe6kB2dkFjvBlqPD5QxstAMGxPD1r1cgGqhrHUjoiahscj1FW0ioIdy6ucFeciQj3
-        0GQiwl1XnRqMoE+HUtt4T+eqsgWyBbBAzRRRI1Hw2YU7+A64p8qMwTAmNDfOXYmDL51EE2FzTbLN5J8G
-        awHMy7RS5mGR/oyZtyRawP5RiRGKFEBcqtlMnyGvMaxCDRQuWcBdTaYUBInmbgyl19cUOvbc8n0kbr9c
-        Z7bAJLfACMIdFgh39PeGykwMq6KwRwZwX9sjV6Ljb7m0ywLYkzml5B8GytCZq4MDTqYEbO4hAL1wL1ke
-        FjsFKeAu2SmpJpNmHeANzJQy/EWXV6ynR6fPDrddR36SP4T59LMFRsICIwh3mkvAO/ggRtBnuzSsCiZi
-        WJWnPeUXEJHvTm7KpV0W4KIQlY/bzrIhXBqwTtfLZcKzNhTVlACU0hG5EGwD+n334oNkZ9i85LYrqccC
-        HWoy6jlccd12IyAtJnvIJVsgW6C9FqiZ3HWEClMThTuRFQ2VGTEBNfDy0syC+ImRETfmNFWTyuZvBmsB
-        TM2SrcgypIjAZ4fsqGcMjSKdRfi5k4pLNXM56KFjQil3IVkzKez7n/7Tf5Lv6dwlBl2cu6QmQ2/tlC4n
-        PYSaD/FH6N7L1WYLTHILjCzcwQEEAe78BQdOVS1Fi5t+wAUfUqDEPMkqaAZLtLx9WABwh+eOaKbnTqEb
-        dkqwmdS4RiWjGSrDxVI3xxkX7uyYDqWG2254O3O7jJMxHNakaek4+SR//PLpZwuMnAVGFu60mydcuJsG
-        0qmqJb7z5CO70xOkaQVBgFNpGMRDIqjmHczfDM0CAJ30xSjvjKbCd3tfLgG1GX7u+HapcmDNteDyCXdc
-        cuFuHKRBMgroJnDHbYfsbAb9ldfM1cPVD7dd9SaXbIFsgZGwQE1pe+QKzznsICQDpoTwmsIdUoTzzmOf
-        znWEMsZcg4bSBPf8zyFbgJ6StMwsLkgUI8o7ojk3FrXxvYnSqtbmujCayrtUaOVc08uXLwN3cK8g46xU
-        eU1P4HLYzl0yBYWDLo7TGiczcnddrjlbIFtgxOGOiXHecQ/hO+/ykUSs6ryjzNITpMzi+RfuTlsfMs7y
-        jlULAGVelbg6dK7+ygfhjnNd2t6UYTHtiA0gOwXfP9x2dndpDoNkIDuFK44cZ95jBRnJzl9T5+eSLZAt
-        MEIWGA2487QLd5x3xuUivXvDbAQliMeESQCBe5gxPXIW4LoI99L7E0ekG4DRCu563MKdN4AQZJxybL4B
-        sM5AK847apurLdIxKMgId9PO5JItkC0wchaoGZQy0gXnHbITcseTb5bwkufuGz2eOziIuGm9woi8Zq/0
-        p/y5jRZQcLdUqzXnV6SCwR9Hz6HwfSrIxKJLRODAd2R3egV2NLWvZKfQPYz0/ZbrzxbIFhgluENtPHfg
-        TmCGznuV73zDqzpEgP4pX4CCSxpRGLVrI9FyVWGBmDhKL1syC9+Y/U23nUI/Ldyd2qogE+OoxlbitrMX
-        XolDJjEliivIVc4PXrZAtsBIW2CU4M5pMLZm4J34bhg2AwVc26HEF74X7g39yszo4VvAVQYp1e4TQCO2
-        sIFk58IhtUN2/uqGp4IM4TFoNfAd2Z0eHY7TMcf0V7anCx/pezrXny2QLYAFapG8e6Q/AAg9dx5+eFGF
-        Ow4gFIDgvOzTGKbGROHd30E5/cf0p/x5+BYA6C4ryEWp1mYQZIQwcu2YAAXZ4TgvVeaQ4Ev0NPpvfHau
-        r247YTN8T4eRTkOLuWkjfb/l+rMFJrkFRg/uGBqtVrhDgYYTmgA3fIEI+H14ef97UgCEcKcAo/Sn/HmY
-        FgDQwr1kc6rlp9BkjE/n2gl3ems6Y9gdETI47E555d3LSU+u+BHzoUwJB98n+VOXTz9bYBQsMKpw52nX
-        s+Mv8ktDZcaAPAJsYEqJWdBHuJtjdphEy7trAd6KJDsDIVWbmOzC+HQzM5OmX7gb3QivuZR024ygOtlV
-        t529uNx2GMIdfYb+gO8z30fhwc6HyBYYVbhjbl7ehTssMN9IdXU6wx9NBZzihsgZsC7fG5Io83oIFsCz
-        Fu6wu7Q7BucqcC3YRredK0guSeDORWQXeY2MhkSD5kbRbTd00qhKyW6kPO4822e4Z+5kC4yCBWoxS2jU
-        PuDZCXeg0DBsxjmr+H2KM/9HUnAzjcWm4EumP+XPQ7AA+MbUFtT2Ug3cf+A4jXVBk8Fzh+98D6+5RvTW
-        xLnCesiu4MZkNCcucR3BupeMzdhF6AfcR+2WywfKFpiEFrgDcOfxFu64e8ivzcUZ4uJxJ1PoxCx5kAE4
-        hkC0vEtYwKzLFChcMgtmx/gxlIrZcdXJVQDcKVw4yQ7NYbqTGLigCjJGyOizmzhItz3DfRIiJp/ynbLA
-        HYA7p4rPzvu7+WCd716a02TkDIxgS17kS9xxwYfIgpJhPTQLQF7Jjv1LPSgVgnKg7BuSk49wyYU7Fw6y
-        809ereinnXvMB5MNROwj9bM7V7AEd/Z1TPVO3fT5uNkCk8ECNZfdGeXCgw3WYQQSDYxo6LwbQB3Tmv7P
-        pCAgmD/WXFSAKf01f27FAuAbpptjHXGmuosrpsZie6jneOhkkYTvwFqy00ODdeDOT/wTaqc+O2TH98eX
-        TzWZlOyjfNflw2ULTCoL3Bm4Y2JcPOEO5fHjGiYkiDXYePfHDUwBRLRMzLsBT6CqFaLlbcICeOKSnZek
-        qlliVmq47WjorLsC3F22iVHTIDsRMlwgXrBMUWB4DGRnG+Cu564mY17TcNsn1ZOWTzZbYJQtcMfgznny
-        zAt30IAy21CcAS6456ABTJQIDt8jHUrm+6D6LUwn2U3YW92XSwOF04QwXCnhzsVKfXZYz09coCrZgTtC
-        jc47mrtw523AOAG2H+V7PR8uW2BSWaAWa2bekQ9gQljw/DdMKAbccS1pG7jBN/y/bi/oCYbxUXA2gVRp
-        g/zPqgWwEialK6XgYlc3gOlcjlDbdcNjRS2uV/jskh1q88ykPjtAp0h2PHfhHkGQgfU7csvlg2YLTBIL
-        3GG484aO5w7c8fIQaiROaXAVvhv5DinYvgSjmIMD31UYMtCbW8AEL5SG5uL1yLWTAtbAnQsk3M0bo87O
-        X4Q1fPaU7LyBSfa0wHeUHNPHcwWF+yR5wPJpZgvcKQvcYbjzkPPM4wz6Cu+rfZXvjObhTsIFKIMX2YTv
-        2X9vTnbedbQwhXHp6sZcAkBsQhjVc3gNyoE7hZAYmM6HhmTnJtZVjyLiQ3an/85wv1OPej7uZLNALRK2
-        3JEPmBtP0GmNUqCh+O7c91iNjw9VvsdknMz3/vhOWFG8FUH56mbo71wFp6RGQhhz8ZuxOT6Ez27GR+eg
-        BtPRYSzpNygzwl23/Y7cb/mg2QKTxwJ3GO4wnbnsjNThkuO5q882jHwPvjMoh6fPP6v6e/AdtxR5Iesz
-        qQWU2oU7PWVD4+Czo4xjxkgIA+hlugWfPdXZg+wMkFbJzjBJIJ4PKjNcvpBlJs9jls80W2D0LXAn4c6j
-        DizME8n7vq/wDr41TEtgehO0dQBEZ1AdDMTxTPmOo5r5rgUgO92hZAfxDXs++lQTQLKlbjsb81IVcJfs
-        OPLYH9c7yO6K2CW4g3JKie8Oq2bnffSf83zESWiBWqRqGeUPPOGqMUIBWBN3oeduYAwie2lkNdJXxZoe
-        aAv/9+0FHTmC/PDfwX1pg8n5TzzxMCZkrxoBS5psQEGGYWoKg6X0u/S+MB1Zxnh2pBWek8gbwz9BthyP
-        wj/5MoqId56qMTOuvWeCz1yyBbIFRsICdwbuPNs4gCDA4TX+whFkGdghBWJ6ZJXvrv5j8LuZxUqowmEP
-        vvMBVE1OoHvWuO0p2TFO1Rpsg9lDkJHsvCG5YJ6pYyA71obLhkjq2vPuFQQPV93LZzIZC5+D+/yT/oBe
-        JMN9JJ7nXGe2QFjgDsAdf8012PigSgCCGWQT1vA96GDWqv74zjkYaYNWU+W71aaTMCch4qE2xgkD8lrT
-        0AggGxxjTzaW7FiP3le4m+6Rrpc+OJZVYkupLcRLiK/CPVz7kvOeH8VsgWyBEbJALSZ5jtoHXv/BgShB
-        NoE4+IBGsoMAmIJWIx2cHRNKMcSJwi767+rvfP//VIrVRmwlTmt1mwn8DRx39WoLdm54stgQNQw7sw1Y
-        R5+hcIGIhyFzJ3B3OISONlbewPLhlTf5wOXj6lD4wGa69l5WlRllmVG78fKBsgUmlQVGG+7OZ3HUDtw4
-        8Z0PYAi7MzQHR2AKfyNJbPA9deHVfB1f5TUfvuOkV+FFzcF3PgAvkDeBgR6nps8+INnZBpc8ldohO4IJ
-        4x/CHefdNVQNocGAmDEkFzCdlhT0QXauDnxPvXtX4AvZfVI9b/lkswVGzQKjCncXzwPWkN2UJgZyuNgb
-        7OaBZxucdxRetjTbFGhozvdY2QOrVcHN+CE1B+Lh3TBdeBgHE8dyD8EJmrbB0t/5YnPIDmfN567bjq1Q
-        urgE8B240xNDdjpOyY6jnebvDYKHh66THhfOTGHw3e9DxomA9+y8j9qjng802SxQi9wsI/oBs/I847aD
-        b3ATZA+4gxVlFp13HEbCM0zm7jKeTfQZExzypq8uXMUu3rqBfVEcZR0soNmdRYguXLhw5coV4gJh4mBr
-        GIXtsS2WjELf1vCgphlwfVQMqBrDB/pURz5MGhMTmiA7n0v5e700ElyIS3mvmmnCLPI9SsBdWWZE771c
-        ebbA5LTACMI97SdhruSFj2YPj/hr/Ep4BDucg4qfiLcIWYjQIHU4AApSNOF7qPYGUzb0VfkyZvE4kDso
-        F56NL168eP78edaGJjkicKf7gaGjwOsWD2EfFljHnti5P7JjKFDr0qmSnQJzGfAQ7iaNMTLSn9JEArHU
-        deCbD/I9SvpTie9sU5LdJ+fjl886W2DkLDCycHcUGI/P+Gj8axfGU2rnQ5DdoT/gzsZghe2BO4v+XL58
-        GdaEe9hQnxFA+uZs4DoSDbEL/lQeonDc/ghYwiJtOH369KVLl2iVQd/GkLRI3pHeTCkmCnbu74iYHbJj
-        ZENfYhCVbhV8C3ds6BCrco0J3EtwL7E7/qkXX/215NdHtHt23kfu8c41T2YL1GJKZ1s+YErqiWU0wAei
-        KgREbOUzpIi5kUrtDHiqBpj6kW1ADBsLdzQQnWVX+ZEX5iBMI2f8LIbSEBoGBv/fRoVDp4ONRonA/YYb
-        x5e04cyZM3Q2LliBcGQwSfO9RuFX3oFShx0LYNj+jstPKdkxPq9NFC4T34NvLlaMePs6JfEjf69ZBHS9
-        Syu482ZGCaz7T7aJ73XtvZTOU+W4yjJtuf1yJdkC2QJhgXbC3U4y1BieW/BqKkf+htSu217y2XHq9fF5
-        34cyhGqgewB3Ms8gcOMvM8QnNZz35PzVEuLVjvnL6bGZITewryHp6FdKu8Oy/jamBqoC7rQEsYiOx5QJ
-        8H0U8N3fIfDNOYvUYYfy2La/7YE4jAbN+uxBdq6ak0iNZQqthg9mY24C93QtSlkvyqPEl16+8Ou9jtwh
-        Ge6ZR9kCI2GBNsM9JTt+GU8vKDFjCTQx9hHnnQ+ARn8TNxyIsDFPPloBRFZwN4E4JIXvyNwgnu+Fu/4g
-        5qjyXWalEg04A+INeadKU0J8f3ykzbxDMJpqpjMTmuOH3hG4i3VOtjR22qQxnCaMpu8skR37RxIYPhgY
-        g1kwNWRvAnfpHEvbSPnUl/cyRUmd+uikhXvm+0g827nOSW6BWjpTfziftaPOOz44Dy2PPc+zs1eEO0AP
-        nV2yc0R+4vkHOjiPoAQtOxb9Ae4UF2VG6abgLKfI4FhVfYZqHR7kiEbpADX6GPqV/69RqcoaZqB01k+6
-        B631NQK+0yS0I7qHhnWO3Jdi3XDMKMpKTQ7KtcAIIDViY5w+BtmNUOQa8cFBEUzHNzrs+uzpmkpsycVy
-        KdTSmhsNQV917dNl9rj63jM0bDi3X943WyBboGSBtsGdekNt54mV7CBAZzxipXWrnROvww58Ha9DyBbi
-        0BzX2NUhcJApUl7QQ/+U7+Z/byjBK9HE3Fd6Do7YHwGBYymIUKcY2KW9Ap0T/RZdBec7cgTvrxOihSnT
-        +Ywx6ZyatITzgtToLeZyYHuxTuF6Rfg5l8lAJiwJyoPsJbhH8q+GcLdH940t9eIb8j2yuofbnh/ObIFs
-        gTZaoG1wL7ntPM/4ibh4kMV8AzzMsBW+0Ho+AAI28FewrrbOX3R24S7WTVnFBpZY4I0uId73leCrfIfs
-        BllGBD3YAk9wrT8ahl+cyh068kZwlnz5UeA7dK666q1gnbbRZgcezNCLKYLsXIJIDMAHR0SwZCrFpJ67
-        yTuFu2nZQzQvLXDTH9xT7qvnmDssw72Nz3OuKlsgLFBLZ+cP57OeO8UIGXM9gmCwDhHABFAw+k3uq8Uj
-        swB0hA7JrtuOhx6xhmxgXIqz4Z0Qb55Cdk89RLSghhK80SCq8NDE9GSQpTmmcYerbrJeM1WZW3HkyI50
-        TgPMukMXVSoDijA0jBowjivThsiuw07BVkajm13d2afYsyTFhCBjEKQLbmBAZRk6V8Nd0iLoG3K81Ae4
-        F23ztuH+Gc7tl/fNFsgWKFlgNOAOEaCDay05xRFSGOwI0KOgyeiwm4ZQoBMkQ2FjPcqYPAni8egZYgUx
-        oQD058JDLmMuY56UIIMsQLAJo/kVHUYdqVpkoqPEw2Q9B6IG0+w0BLrHojHNG+y50FRNrRqWSjFUAlJj
-        thEUpg9jm5LDLtabwz0894B7f2QPJ90AKkskHgi1PT+c2QLZAm20QDvhrvOu587TC1lCmRHoEARSg2zX
-        9wHl+OmWwLrxhVA7Vs1Ol/gxFtuJNtRDH0DBkUyjMnBLqyq8w7mqNEgQbAPgqA1+0eYBiYmbD1j78+WD
-        +4F7HWQcfPaywO74bLyQIUO0p+qbp98M6kUBfx9r6LBzjobwhxRDtV4UQxK5UvxkWs3mcE81GT138wfo
-        vEvqoHbIMr5XxaBryccX7ulQahtv61xVtkC2QK2aLX1o32jKGFY1YEYFxrwi6jOBeAgeq/zggwfTdfBT
-        ESCyUIVGbAIy3wZEPDhLJZqGLryjoxGFKeKdVc8R9eL/soUipgeEcnNkN/81XghabBKtpvsBl8pfzvPS
-        YaeDsXBZ0/lEXqyIdEzl9dRhV5CJy2E+yIiWwc6SvaHznmK9mrE6ldq9eYZ24+W9sgWyBRpaoG1wN/Oi
-        Wr6Dq8F3A5xLiIcmkX0Qdz6YHkkH0+RT6aQYZ8E4VAt0qAc3X10+HWVll4aBNLrwTqFSiGczdlSogUc4
-        vy0QvtgEASS0FCNzhlwMQKRVTkFqsQFuRhtoNgbkFDjrmILkqwOFmrkWMZkIItPPmaRhQLgH2dP1lQLu
-        qeeeOu+pvK6HXioR2+4Nk8me8ZQt0HYLtBPuDfnuM68srhqQUt5ZkYJDD9157b7yx3t9Gk/NZz1QqmJ7
-        9g0XHvcfQKfzJKmqIeLVOsKLp+XQh42pjS4HeIHpQRHWjcE9HrRTcCN5ThA2nGghbvY0x3WHcCyxzsmK
-        dRoPMdVhAusciM4sjUpkGy5H6DD9qTEuVp667VW4c0SvUWmktET2EtxjmlsIMtltb/tTnSvMFsACtWoE
-        4TC/EfGWiHznkYaeAfqU9TEfXVIYgFFaoCdNbKAPaEAOuxhKnyIeoQbol2a9G0tTCnCEgwI3tHgORLVU
-        qDTBZ34dGnlHdC86JydnuQ4tzQ7RKYR+zs7TicI/SzHsJTWmxHTVmFjVNpZPMT9MzFAtKTOpSpNeRy9i
-        OmUpxfow77q8e7ZAtkDJAiMC9+g2U6GmBPpgfSl2In342SVqiFDLtB444mwpVRowBLxwveE7PqkAivFD
-        fdsmiMfhNVUWxzKkRO0CxhlVMqK8bqVywE1LHCSgB4LaDbFOUznNFOsY2QnAJR2mOdwl+5Dh3pzsqRqT
-        H8tsgWyBtlug/XCniek7UWnMOp1iUM38UAp2jpcAK0yrCnFfnQGQqdKAY4V4EQ8EzUHo+4EuZzWcxowF
-        evHpiCstBKbsYqg+hapoRuu6fCvIbr4Nug0mpZdSfaIltIdTxgL0QyHCGIpD+zkXlauAu1k203DSKuIb
-        Bj5WyR6jqakm0zAMxhes0NYVYaLEha5OTWj7LZ4rzBaYnBaolZSK9v4Tm1Jhf5YV2XYGrVs/eg53VPwR
-        8cr6ID7CaRxuBfcp310qCAKyY3q+TkONgMUS5anf1GYG6YNaIAuzwCt0/qu2FsR0GsbpgFePxXE5Om2w
-        zREJk7aW7zVCkJ29TGDZn89udoGqwt7QYXdExM4yHUptOFhqMEwwPTr1khTT3vst15YtkC0QFhhZuA9o
-        6IZML+1lD1HtJPxG1pvSAMpETpsS4kEkwNJ5N6TS6EzDvUtaje5wlfIcETaxPUeJSbbwkWgfiE+FfEkz
-        zKrIeOmAwKdXMMeZrwi0jXqctGXaAJrH9xyREwymp22jkezOrwpQkXXHwWE6NrM4tAL3CIxpSPZS8FIE
-        sKdkTwdL+yN72jd79Qe8SfIG2QLZAkOwwB2Ge0ptYT2Ec0hdeJgSQrxhOakXr4Cu5x45s1By2CaGJaMB
-        JUc+8lmmq4vE4WK6lgH4pUBPcen4JL+iF4FdSsSAOrPf7sH4E4HOqTkxyolI6TQop87SgPCmhTunZuJG
-        XzIIEiX/WhO1vRQVY1OpQbPEJIN0kY0ge39D31Wyl0JiolMfwuXOu2QLZAu0YoExAfdWGtp8G2GRqjSG
-        05jfJhDvlFS1CL50GNaEt65WYQIcYwrjiDC0ClbVeUDvbCY2jheImKPrXM2YFOrQbikNekzUBOW+QJi+
-        xpU0qsd1/hRbUq2nENjln4438Nd8vPzEmTIZuGFIe0OspyGPvt94iFLjI39Aw1HTVFsvhbFnb334d3uu
-        IVugFQvUGmZNGadfhnQTUZh68eI1KO9EWYcQAbro58tYjchwFL5PdfkYvYww9vRDOhgr8Smu7FrKvU49
-        fONPbhYct5JYY7Z0ILZUfkkdaucTxSmEu+0kVU6fn4wdKiXvTcMcPffUVS91GyH4RLIBmV6KbkxzsjcM
-        c/SOHKd3V252tsD4ssCEgjumD50nvHiVkxhujSlUeutSHporRCieCHcz2DhFCIZG3KHad0wobcj60pdK
-        Os3Z3bAegxpBqkk0qwhOnWsjghzw5HyxBm4yHZvhoZ5mOuO0xHQVmP6wXpVi0qD1AbEeb0Lj6/HIrc0W
-        GL8WmGhw90qkUn548Wk6hNJEWSkv02Wourl8jzQJuMAUpw459xVmCXr1k1ZA32Qb6E9tNBg0mxEhPO5I
-        uht8h8KchVErMYPXz/7TTgj/Gk/fId8YKRXrSlLB9AGxnqZybB4JUxonzw77+AVEbvn4tUBtyOlQxv6O
-        JUe+lLRSRV65xvHVVHwPDxfcV/luWnkKCQ/EvbOKqCcIqHSu6pIWvkz9XOjMXqY9MMuxA62GpUeoom8Y
-        fgmjaTMEN6tiRBmm07scNqDL4S99gAHyvp3QzjQXW6raK79E7ocQYWLgtBTaWNVeUimw9FSM/RsmtzBb
-        YCJZYCLDPRW7hU6q1ThFNjLVpJR33ddQ4WOCD4jUeU/hbtphElvGilGElkcxEjFWlYrvXViKXdw9XZNE
-        vpdS2IN79mUZE36iE6JLAOWcjgq+ZxqDulIe6DvYSzdGJ9Ef05VxIjVbJIGIpAKpvF5aWCNmKlTDnCS7
-        DZtID0w+l2yB8WKBCQ73AF9JrjGrgbOfqpSHd2m4ZAr6iLcB9ADXZaFahLurBloC7vI9hXt47k4r5SjG
-        TVLIeg/6wbSKkHJQ5IXnnaDEdweB2RhVxzMKP70J06tYbzizNKae9eetj5dnILczW2BCWqBm2MZkKHH9
-        AvRGT0aO4moIo7kn1W3S0PgQcGJI1qlMsRZgZKvXow+/XpSr5yjsBMojmiWdMupLQ0TNm/UeBYmmujAT
-        c1lNO2xq3zQo08w8qkD0T5FuM11e3GHSqvxSXdc0svJGLGN/qstkuJfyOWYLjH0LTCK4x8WoUl65pkR5
-        RZvIl6tAH059dSaUMk4aUqlwH5P7Sx/8tTrOmdbjZ0d6fVeA75BauLu2H/nfzTMcic/gr6eDOONnZ2xF
-        ZoIS0E0OE3lgQnupZoCpBjKmLs/Yv91zC7MFJo8FJiPcI/y8KtpEerIq6CMrfbqeUerXV117BzBD1SlR
-        O2aBGrViGKIl9HE+GIMfA6pmQ4POnEXkL3MJ1nDeU7g7N8oMl6mHLtDT3F6Z6ZPnsc9nOhksUHMezWQu
-        DT1650OVWK9AH8mK9X9Lrr0Ds5aQuZt/cOMIUY9w9chk6UxagmSUaFBy+InmIcuYs8xl9qrOu4MKeO40
-        ErhHpsbm6QFKMen9+eaT+Z7J554tMPYtkOF+4xqlPXmq28Ss15J0Ax+D9Snu02WPIgTFufuqOvE5jTtU
-        MAnZpPRB6R8vXr6bBI2jI7LDdNOToc/gyJeUd+BuuCROOu5/GsgY+ZOrES/V+JbUOGP/ns4tzBbIFsAC
-        Ge7l26Ah5SPWMPJQCsdIK5+y3gmxlHDt03Uz0s8x+ai0mJG9hcWqYs0p9RnEd/oGnXewnjrvrg0LoB0r
-        dpSYgueeaujVWJcS00vvrflpyRbIFhhfFqiVptjkf6YWSK9lSb0pxVbq/1ZxH1lwm39IdZKY4hQBiO5L
-        T4ALr/+OOBPOO4J7OO8o7yYBjrBIarZ7QMp32aYYFPUFpTnE8/2QLZAtME4tkOHe6oUL0FeHYmK2VKrh
-        hF4v8dP1AtPlqErySKQ7Tz9E6AsOOA67uXxx3lXekdpLyrtLwppbhh7CoWAntWagt3q983bZAuPcAhnu
-        g7uADd/LqkpONcWNek76N4SRhllw0xpidFdSg2k0FrPNgHuahPLuWn148anyTs2uB6tqT4mmlk5kcFbI
-        W2cLZAuMeQvU8PJyGY4FSpe4oZIDUptMgWsxKosahLV8Z4DURcDpJKrOe8S88yuSjpI9ygzHKjU4zt3M
-        w7lkC2QLTAwLZLi38zo27MtLuPefQLbhS0DzrsIJqEjnyCyKM/jvsD6cd8T3qvPu9qYn87gexQb0x/p2
-        2iXXlS2QLTDqFshwH0GTD/a9zaY02cteAWeccBrnJeG8Q21EecNmUGb467CqYTN0Bjr7bMYYrDmKq+JM
-        etARtEiuOlsgW2C0LFAz81Quo28BL/GAxy3JJlAY/x2axwoeREaG825MZMl5tzNQyUF/j3yN6dtDVZMZ
-        sGF5g2yBbIGxbIEM97F8dW61LZx6nXcccJT0cN4R03HPmcFkzHvJeXdjwmyAO4inY4jFNCLpfKrPtNjr
-        jA/D5VZmC0xWC2S4j48rn8IdEENnlHSGSUlLYE4xs80gyBg2U8pGQJgNG5vcxnmqRmeaaaCE+HhXGB+m
-        ya3MFsgWaGSBWqztmT+MZQuYtN1R0FDSVWYYUyXmnfFVnXfnNKXOe8g4bKOGY04CcwKnfFd5D7FoLBsk
-        ty1bIFuguQUy3MfBHRJkh7ymFojZScgsTmiiEBIDx80DbCrgSCXG9qjtjKkytZWYd7YU8brwme/j4CbI
-        TcwWGKQFMtwHabBR39z3rXDbYzkOuIzn7jApZGcRD4Jn+JKNwbrDqpEHGO1FjR7PHSUH/d2VtUt8p3LF
-        9+y8j/p1zgfMFmizBWrEzOUyli3ABU/h7lqpyCkmjYHXwBp/HLhTQDaAZpJqyXnnS7iPz25oPF0Cn01b
-        BvRjOVbjZyS7N9pYtkxuW7ZAtkATC2S4j93bI/rxgLtJbNRkcLqhs3DHH2cRDxbwc7xU511lBtBzhiDb
-        rO7Oa0WpZ0d6ghBn+JU+Q889w33s3hO5ZdkCLVsgw71lU92hDVPPXbgDYuDuKoBpHjEXZcUlB9Oo7Trv
-        hs2gtBDtLtwdfRXu1EA9jqw2hHt23u/QZc+HzRYYrgVqPPm5jGULcIWD7zGaaqJ2/G5Qbh4xnHdWaALu
-        CC8473jfYD2cd/6Zwh3PnV7BYVXqcSk+uo1w2/H9484ay8bJbcsWyBbozwIZ7mP33gi8BtxN5GtGAddX
-        0nkH1rjkLuKBPmM2MfZiQJXCGbIju9ATILgj0Ku5N9dkMtzH7p2RW5Yt0IIFMtxbMNId2qQEd7xpcw8o
-        uwffccDN+GgeYBbhA998yTbGvTjpCZSjxqjJOJpqqIyCjPOY2N7gnFBj7tCp58NmC2QLDNcCNQbcchmb
-        FuDa2jA+hDhjqHuk/3UJ7HQdPhFPjjAkdbx7F/owcRjQ5yd99lSNiXHUiJCJ22psWia3KlsgW2BAC2S4
-        D2iiO7xBcFby6r/LdzxuF0oF4rjhgXgTQIJyAmlQYEz2S5AMf9XZ2d65S66bqoOfyX6Hr3Q+fLZAWy2Q
-        4d5Wc7a7svTFTOc91d9dAETE66HrxSO54LYbSGM+GT5Uh0/7C3z0oO0+lVxftkC2wKhaoOaYWy5j3AJx
-        U0jeVKUx20xo8QF6F92OpbcjU5iLYkcwu8p+leZj3CC5edkC2QLNLZDhPs7uECV4+Z5GSUZOMRfiMKgm
-        LTLdUVNFmMB66qqPM3Pk5mYLZAv0Y4EM93F2a1Rd+KC8io3TWSMXTSyxlKaL0VWvyi/jzBa5udkC2QL9
-        W6DGVJdcxpEFGl7KVMlrEj8Vm6WVjKNzz03NFsgWaN0CGe6t22qMbjkE32WMnkluVrZAtkD7LJDh3j5b
-        5pqyBbIFsgXGjAUy3MfMpcgNyRbIFsgWaJ8FamSFzSVbIFsgWyBbYIJZIMN9gl3QfDrZAtkC2QKFBTLc
-        832QLZAtkC0wAS1Qc0mHXLIFsgWyBbIFJpIFMtwn0tXM55ItkC2QLXDDAhnu+VbIFsgWyBaYgBao/WUu
-        2QLZAtkC2QITzgIZ7hPukuYTyhbIFsgW+Mu/zHDPd0G2QLZAtsAEtEDtr3LJFsgWyBbIFphwFshwn3CX
-        NJ9QtkC2QLbAX/1Vhnu+C7IFsgWyBSagBWr/OZdsgWyBbIFsgQlngQz3CXdJ8wllC2QLZAv85//8/wNu
-        r1zYpv3VXAAAAABJRU5ErkJggg==
-
-  
-  
-    About
-  
-
\ No newline at end of file
diff --git a/scheduler/DeviceScheduler/frmAbout.resx b/scheduler/DeviceScheduler/frmAbout.resx
deleted file mode 100644
index f79061e7..00000000
--- a/scheduler/DeviceScheduler/frmAbout.resx
+++ /dev/null
@@ -1,1195 +0,0 @@
-
-
-  
-  
-    
-    
-      
-        
-          
-            
-              
-                
-              
-              
-              
-              
-              
-            
-          
-          
-            
-              
-              
-            
-          
-          
-            
-              
-                
-                
-              
-              
-              
-              
-              
-            
-          
-          
-            
-              
-                
-              
-              
-            
-          
-        
-      
-    
-  
-  
-    text/microsoft-resx
-  
-  
-    2.0
-  
-  
-    System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    3
-  
-  
-  
-    259, 13
-  
-  
-    Denna programvara använder ikoner ifrån VistaIcons:
-  
-  
-    49, 13
-  
-  
-    435, 264
-  
-  
-    System.Windows.Forms.Form, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    System.Windows.Forms.LinkLabel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    9
-  
-  
-    222, 13
-  
-  
-    51, 13
-  
-  
-    lnkInternet
-  
-  
-    Enligt licens Creative Commons Attribution 3.0
-  
-  
-    75, 23
-  
-  
-    label7
-  
-  
-    System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    label2
-  
-  
-  
-    CenterParent
-  
-  
-    522, 299
-  
-  
-    label5
-  
-  
-    $this
-  
-  
-  
-    11
-  
-  
-    9, 9, 9, 9
-  
-  
-    $this
-  
-  
-    System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    237, 207
-  
-  
-    Om...
-  
-  
-    8
-  
-  
-    System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    System.Windows.Forms.Button, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    True
-  
-  
-    3
-  
-  
-    System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    8
-  
-  
-    5
-  
-  
-    linkLabel1
-  
-  
-    True
-  
-  
-    System.Windows.Forms.LinkLabel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    7
-  
-  
-    234, 26
-  
-  
-    lblVersion
-  
-  
-    237, 235
-  
-  
-    7
-  
-  
-    Detta program är utvecklat av Mattias Dahlgren 
-för Telldus Technologies.
-  
-  
-    9
-  
-  
-    System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    $this
-  
-  
-    True
-  
-  
-    200, 26
-  
-  
-    $this
-  
-  
-    True
-  
-  
-    © Copyright Telldus Technologies 2007. 
-Alla rättigheter förbehålles.
-  
-  
-    True
-  
-  
-    frmAbout
-  
-  
-    5
-  
-  
-    label3
-  
-  
-    http://www.telldus.se
-  
-  
-    System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    $this
-  
-  
-    4
-  
-  
-    label4
-  
-  
-    
-        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
-        r1zYpv3VXAAAAABJRU5ErkJggg==
-
-  
-  
-    45, 13
-  
-  
-    $this
-  
-  
-    237, 154
-  
-  
-    1
-  
-  
-    Hemsida:
-  
-  
-    $this
-  
-  
-    Stäng
-  
-  
-    10
-  
-  
-    6
-  
-  
-    www.vistaico.com
-  
-  
-    $this
-  
-  
-    4
-  
-  
-    label6
-  
-  
-    True
-  
-  
-    294, 185
-  
-  
-    $this
-  
-  
-    Version:
-  
-  
-    237, 220
-  
-  
-    237, 120
-  
-  
-    2
-  
-  
-    109, 13
-  
-  
-    2007.1.0
-  
-  
-    93, 13
-  
-  
-    6
-  
-  
-    294, 101
-  
-  
-    True
-  
-  
-    6, 13
-  
-  
-    True
-  
-  
-    237, 101
-  
-  
-    True
-  
-  
-    $this
-  
-  
-    System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    0
-  
-  
-    0
-  
-  
-    cmdClose
-  
-  
-    237, 185
-  
-  
-    True
-  
-  
-    English
-  
-
\ No newline at end of file
diff --git a/scheduler/DeviceScheduler/frmAbout.sv.resx b/scheduler/DeviceScheduler/frmAbout.sv.resx
deleted file mode 100644
index cc814e94..00000000
--- a/scheduler/DeviceScheduler/frmAbout.sv.resx
+++ /dev/null
@@ -1,897 +0,0 @@
-
-
-  
-  
-    
-    
-      
-        
-          
-            
-              
-                
-              
-              
-              
-              
-              
-            
-          
-          
-            
-              
-              
-            
-          
-          
-            
-              
-                
-                
-              
-              
-              
-              
-              
-            
-          
-          
-            
-              
-                
-              
-              
-            
-          
-        
-      
-    
-  
-  
-    text/microsoft-resx
-  
-  
-    2.0
-  
-  
-    System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-  
-    
-        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
-        r1zYpv3VXAAAAABJRU5ErkJggg==
-
-  
-
\ No newline at end of file
diff --git a/scheduler/DeviceScheduler/frmAskSecurityPolicy.Designer.cs b/scheduler/DeviceScheduler/frmAskSecurityPolicy.Designer.cs
deleted file mode 100644
index 4da78be2..00000000
--- a/scheduler/DeviceScheduler/frmAskSecurityPolicy.Designer.cs
+++ /dev/null
@@ -1,172 +0,0 @@
-namespace DeviceScheduler
-{
-    partial class frmAskSecurityPolicy
-    {
-        /// 
-        /// Required designer variable.
-        /// 
-        private System.ComponentModel.IContainer components = null;
-
-        /// 
-        /// Clean up any resources being used.
-        /// 
-        /// true if managed resources should be disposed; otherwise, false.
-        protected override void Dispose(bool disposing)
-        {
-            if (disposing && (components != null))
-            {
-                components.Dispose();
-            }
-            base.Dispose(disposing);
-        }
-
-        #region Windows Form Designer generated code
-
-        /// 
-        /// Required method for Designer support - do not modify
-        /// the contents of this method with the code editor.
-        /// 
-        private void InitializeComponent()
-        {
-            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(frmAskSecurityPolicy));
-            this.label1 = new System.Windows.Forms.Label();
-            this.linkLabel1 = new System.Windows.Forms.LinkLabel();
-            this.cmdYes = new System.Windows.Forms.Button();
-            this.pictureBox1 = new System.Windows.Forms.PictureBox();
-            this.panel1 = new System.Windows.Forms.Panel();
-            this.label3 = new System.Windows.Forms.Label();
-            this.label2 = new System.Windows.Forms.Label();
-            this.label4 = new System.Windows.Forms.Label();
-            this.chkHide = new System.Windows.Forms.CheckBox();
-            ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit();
-            this.panel1.SuspendLayout();
-            this.SuspendLayout();
-            // 
-            // label1
-            // 
-            this.label1.AccessibleDescription = null;
-            this.label1.AccessibleName = null;
-            resources.ApplyResources(this.label1, "label1");
-            this.label1.Name = "label1";
-            // 
-            // linkLabel1
-            // 
-            this.linkLabel1.AccessibleDescription = null;
-            this.linkLabel1.AccessibleName = null;
-            resources.ApplyResources(this.linkLabel1, "linkLabel1");
-            this.linkLabel1.Font = null;
-            this.linkLabel1.Name = "linkLabel1";
-            this.linkLabel1.TabStop = true;
-            this.linkLabel1.Tag = "http://support.microsoft.com/kb/310715/sv";
-            this.linkLabel1.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkLabel1_LinkClicked);
-            // 
-            // cmdYes
-            // 
-            this.cmdYes.AccessibleDescription = null;
-            this.cmdYes.AccessibleName = null;
-            resources.ApplyResources(this.cmdYes, "cmdYes");
-            this.cmdYes.BackgroundImage = null;
-            this.cmdYes.Font = null;
-            this.cmdYes.Name = "cmdYes";
-            this.cmdYes.UseVisualStyleBackColor = true;
-            this.cmdYes.Click += new System.EventHandler(this.cmdYes_Click);
-            // 
-            // pictureBox1
-            // 
-            this.pictureBox1.AccessibleDescription = null;
-            this.pictureBox1.AccessibleName = null;
-            resources.ApplyResources(this.pictureBox1, "pictureBox1");
-            this.pictureBox1.BackgroundImage = null;
-            this.pictureBox1.Font = null;
-            this.pictureBox1.ImageLocation = null;
-            this.pictureBox1.Name = "pictureBox1";
-            this.pictureBox1.TabStop = false;
-            // 
-            // panel1
-            // 
-            this.panel1.AccessibleDescription = null;
-            this.panel1.AccessibleName = null;
-            resources.ApplyResources(this.panel1, "panel1");
-            this.panel1.BackColor = System.Drawing.Color.White;
-            this.panel1.BackgroundImage = null;
-            this.panel1.Controls.Add(this.label3);
-            this.panel1.Controls.Add(this.pictureBox1);
-            this.panel1.Controls.Add(this.label1);
-            this.panel1.Font = null;
-            this.panel1.Name = "panel1";
-            // 
-            // label3
-            // 
-            this.label3.AccessibleDescription = null;
-            this.label3.AccessibleName = null;
-            resources.ApplyResources(this.label3, "label3");
-            this.label3.Font = null;
-            this.label3.Name = "label3";
-            // 
-            // label2
-            // 
-            this.label2.AccessibleDescription = null;
-            this.label2.AccessibleName = null;
-            resources.ApplyResources(this.label2, "label2");
-            this.label2.Font = null;
-            this.label2.Name = "label2";
-            // 
-            // label4
-            // 
-            this.label4.AccessibleDescription = null;
-            this.label4.AccessibleName = null;
-            resources.ApplyResources(this.label4, "label4");
-            this.label4.Font = null;
-            this.label4.Name = "label4";
-            // 
-            // chkHide
-            // 
-            this.chkHide.AccessibleDescription = null;
-            this.chkHide.AccessibleName = null;
-            resources.ApplyResources(this.chkHide, "chkHide");
-            this.chkHide.BackgroundImage = null;
-            this.chkHide.Font = null;
-            this.chkHide.Name = "chkHide";
-            this.chkHide.UseVisualStyleBackColor = true;
-            // 
-            // frmAskSecurityPolicy
-            // 
-            this.AccessibleDescription = null;
-            this.AccessibleName = null;
-            resources.ApplyResources(this, "$this");
-            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
-            this.BackgroundImage = null;
-            this.Controls.Add(this.chkHide);
-            this.Controls.Add(this.label4);
-            this.Controls.Add(this.label2);
-            this.Controls.Add(this.panel1);
-            this.Controls.Add(this.cmdYes);
-            this.Controls.Add(this.linkLabel1);
-            this.Font = null;
-            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
-            this.Icon = null;
-            this.MaximizeBox = false;
-            this.MinimizeBox = false;
-            this.Name = "frmAskSecurityPolicy";
-            this.Load += new System.EventHandler(this.frmAskSecurityPolicy_Load);
-            ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit();
-            this.panel1.ResumeLayout(false);
-            this.panel1.PerformLayout();
-            this.ResumeLayout(false);
-            this.PerformLayout();
-
-        }
-
-        #endregion
-
-        private System.Windows.Forms.Label label1;
-        private System.Windows.Forms.LinkLabel linkLabel1;
-        private System.Windows.Forms.Button cmdYes;
-        private System.Windows.Forms.PictureBox pictureBox1;
-        private System.Windows.Forms.Panel panel1;
-        private System.Windows.Forms.Label label3;
-        private System.Windows.Forms.Label label2;
-        private System.Windows.Forms.Label label4;
-        private System.Windows.Forms.CheckBox chkHide;
-    }
-}
\ No newline at end of file
diff --git a/scheduler/DeviceScheduler/frmAskSecurityPolicy.cs b/scheduler/DeviceScheduler/frmAskSecurityPolicy.cs
deleted file mode 100644
index babe4fb2..00000000
--- a/scheduler/DeviceScheduler/frmAskSecurityPolicy.cs
+++ /dev/null
@@ -1,54 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.ComponentModel;
-using System.Data;
-using System.Drawing;
-using System.Text;
-using System.Windows.Forms;
-
-namespace DeviceScheduler
-{
-    public partial class frmAskSecurityPolicy : Form
-    {
-        public frmAskSecurityPolicy()
-        {
-            Localization.ChangeLanguage();
-            InitializeComponent();
-        }
-
-        private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
-        {
-            System.Diagnostics.ProcessStartInfo info = new System.Diagnostics.ProcessStartInfo();
-
-            info.FileName = linkLabel1.Tag.ToString();
-            info.UseShellExecute = true;
-
-            System.Diagnostics.Process.Start(info);
-        }
-
-        private void cmdYes_Click(object sender, EventArgs e)
-        {
-            SaveCheckbox();
-            this.DialogResult = DialogResult.Yes;
-            this.Hide();
-        }
-
-        private void SaveCheckbox()
-        {
-            Microsoft.Win32.RegistryKey key = Microsoft.Win32.Registry.CurrentUser.CreateSubKey(@"Software\Telldus\Scheduler\Settings");
-            key.SetValue("AskSecurityPolicy", !chkHide.Checked);
-            key.Close();
-        }
-
-        private void cmdNo_Click(object sender, EventArgs e)
-        {
-            this.DialogResult = DialogResult.No;
-            this.Hide();
-        }
-
-        private void frmAskSecurityPolicy_Load(object sender, EventArgs e)
-        {
-
-        }
-    }
-}
\ No newline at end of file
diff --git a/scheduler/DeviceScheduler/frmAskSecurityPolicy.en.resx b/scheduler/DeviceScheduler/frmAskSecurityPolicy.en.resx
deleted file mode 100644
index 686ed9fe..00000000
--- a/scheduler/DeviceScheduler/frmAskSecurityPolicy.en.resx
+++ /dev/null
@@ -1,222 +0,0 @@
-
-
-  
-  
-    
-    
-      
-        
-          
-            
-              
-                
-              
-              
-              
-              
-              
-            
-          
-          
-            
-              
-              
-            
-          
-          
-            
-              
-                
-                
-              
-              
-              
-              
-              
-            
-          
-          
-            
-              
-                
-              
-              
-            
-          
-        
-      
-    
-  
-  
-    text/microsoft-resx
-  
-  
-    2.0
-  
-  
-    System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-  
-    248, 13
-  
-  
-    Important information regarding scheduling
-  
-  
-    Scheduled tasks can not be performed with a blank password.
-  
-  
-    
-        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
-        gf8DCdMeTzy5zwoAAAAASUVORK5CYII=
-
-  
-  
-    177, 13
-  
-  
-    Carefully read the information below.
-  
-  
-    The application has detected that the security policy for Windows Accounts with blank password is activated. If your account does not have a password, then you are recommended to turn of the security policy due to the fact that scheduling can not be performed with a Windows account that lacks password.
-  
-  
-    306, 13
-  
-  
-    For more information about this, see Microsofts knowledgebase:
-  
-  
-    175, 17
-  
-  
-    Don't show this message again.
-  
-  
-    Important information about Telldus Scheduler
-  
-
\ No newline at end of file
diff --git a/scheduler/DeviceScheduler/frmAskSecurityPolicy.resx b/scheduler/DeviceScheduler/frmAskSecurityPolicy.resx
deleted file mode 100644
index df0d4295..00000000
--- a/scheduler/DeviceScheduler/frmAskSecurityPolicy.resx
+++ /dev/null
@@ -1,446 +0,0 @@
-
-
-  
-  
-    
-    
-      
-        
-          
-            
-              
-                
-              
-              
-              
-              
-              
-            
-          
-          
-            
-              
-              
-            
-          
-          
-            
-              
-                
-                
-              
-              
-              
-              
-              
-            
-          
-          
-            
-              
-                
-              
-              
-            
-          
-        
-      
-    
-  
-  
-    text/microsoft-resx
-  
-  
-    2.0
-  
-  
-    System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-  
-    301, 13
-  
-  
-    System.Windows.Forms.PictureBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    179, 242
-  
-  
-    panel1
-  
-  
-    System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    panel1
-  
-  
-    panel1
-  
-  
-    316, 13
-  
-  
-  
-    8
-  
-  
-    
-        iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
-        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAADllJREFUaEPtWQlw
-        VGW2Fp0HTI3jNgOOMw4PQQQZRKUAHy5RCDwXomFxBtEkLKOOOuorS6pwfFSJC6UoIAxIYMIiQmBI2ELC
-        lpCYfd/3pdPdSaeTdGfvpJfb995z3ncu6ZSUzNTMPBSsmlSd+u/t+9/7n++c7yz/n2uu+fffpS1QVFR0
-        d15e3mKMIY2NjTf+oOxUXl5+W3Nzc6Kqqma/329yOBy72tvbf/yDAQEA7+u67iUiTQTXbqfT+cYPAgAo
-        M72/v98GpUkEfyyjoii2jo6OsVc1iMrKypHgeyyUhs4XA5Afenp6dkOuvWpBwPoR4L1r0OqsqSprmspy
-        P/hbP7ww76oEUFBQMKatra00QBvF3UfuTgsNdJjZN9AToBMNDAxkd3V1XX9VgcjJyRmWm5u7SYO5BYCm
-        +tnbaSa9t4H0njr2OOtIVSSmjXjwd3Z2/s9VBeDs2bOP9fb2OgAAlNHY3dXCalcN691VkArWOsu439Eg
-        yhsyGNB3XBUgzp07d0NhYeFZKEXI+eTt7yFveznrXaWkdxZDClnrKCCvPZc8vU4BSBC9u7t7F6h05QM6
-        Njb2j0ibHp/Pxz6vh1z2CtKcBaw58zDmkO7MYs2RQVpbKvWYs1j1KwJApBcF7soG9FdffTWpqqqq1u12
-        s8fj4d62Rlbs2ay3Z0LSIamQZEgS621n2dd0mntslQEqEYCnIyv99IpQ6csvv7wuOjo6CtzXXC4X9XY5
-        2WVOJ601BXKetbZEWP0s5BSu4/HbCdJajnFX1VHyurolKwmdfKjQVyagN27cGGI2mzvBYwKfqaM+m/3N
-        50i1nSWfq411BalTgaJKN657yW1PIs12kBXzfmqrOC0UMuIB1DODSuO+Vy9ERUWNio+PT0eDxlicWxsr
-        eaAhnrXmOFaa4gw6ffNP0mdX03lWbXtYa4rinrLt3G2rMTLWYEDvRGr9/gJ6x44df2ppafG1trZyS7OV
-        HGWghzmWNeth8lkOk8SEJH0j8eNPRqclgVT7DgDYRmrDZmrO3M4+z4DhCWSvLhjj+wno3bt3319WVtaI
-        qssAwdaSRPbWRbPeeIB1y1fsNe9jVNtvecBhPsJq2xbWbZtYa/yEXYV/YktONKP1EKG+vr4kePOG75RK
-        SJkj4uLiDkF5gvXJWlvKnUV7SGvYS5ppN2uWKPKa/0IuV99FHpDqbKlYS2rTs6zVzSG16H5SMqZweeR4
-        eKaMEQcSC24AeOU7BYC0uRQblT4B0GJrJmvWPlaqd5JWvwMAIkGh7eS1bKOenq6LAIiFq/PDSG2ZzZo5
-        iLSqWaQWzGBX4lTK27U4AECoV41vj/9OQBw/fvx2bBELJHCF+6aCs+wq3sJqzZ9h1S2sNazH+Dr3VzzD
-        9harQaFAV+r1erm6MBzF7SnW7Y+DbsGsVQSxP28Wm6MnsyknVtoLEUIwb0Vqve6ygkC7cC2yzsdwsSrW
-        b2qoItvXn5JauYHV8jXkL3wetIB1q+dSf83j8I7JSJHSWkhGklRbUxJOWu9i1jsXkN4SAto9zmrZbPJm
-        PcT5X8yi/t5O2fQwwHZe9oBOSEh4xGq12mEZbmtrpbrzO8iduxo8XshK+iPkz59NasXjoMfTNGAJJXNj
-        lQQyocgRlJdgp9ryCNIHXmByLSW947ekNy9grfYpUovnsvPUA1R2Yq0BQOIBAZ0MY12eg4D09PTr0awl
-        iBVR9rkuN57tR+ezL+khVlJBg9xgWPJJUCgU9Pgtu1uXcE11AYMKLIClTiBuuL56GZNvBZNnOet94aw7
-        nkPMLGK1OoSVgnlcHjWNnZZyg0oAoeC9y7OHTktL+wMqrUeqrc1cx7mbppPnzEOkpDxK/uxg9hc/SVpt
-        KKrs70CPMPJ0RFB5WRaDBgQlRLipqYlMdcuJ/C8xKS8SeVZir7AMLcZS0hoXs1oRQq60OZS3eymU90pG
-        koA24xsT/l+xkJ2dPQHWq4ZLGdannC//yB1HZ5Iv+VHQJxjcf5LVKihv/R3pjjBYdiVa5pVUXp4h1heP
-        SVACgIXMphU4n3iFSX2FSHmZaOD3aLmXoT9aylr9IvKXzCdzzANsyo41AIjA61H4xr8W0KWlpdehYEWC
-        yzq4zKbCRK6KnArqBLGSNhvUkSB8mjXTs6y3vsB6z3Im90vsdb3IVZUZEriGCIC6ukq2mEEf7VVmERVA
-        vC+z7lrJuhPZyboEVAplb94TnBf5GLt6OgJUkpT9xL/khfz8/KfQZXYZwdjdyTl/nkf9CbNYSQkiJXMO
-        +YueILXmGbQGCMiOF0h3AYD39+TrX0mVlWkI9jZC4FNDQwOXlORSkyUCHngZHoD1/S8R+V5kGgCVuiNY
-        sz+HrLSQ1LL57DzzCJUce48k9Q4GdBaodNM/BQLWvwWLZ8gH8CGqOLWRW/bfQ77E/0LgPkz+3Mew2H9j
-        0RAsvoj0riVE/cgwnnBSXC9Q8vloTk5OJpGvv/4a1/Fkt2KOEoEYABBfBLE3HADCEAtLsV94ljTLM6RW
-        PclK/hwqj7qPWhuKAwVORRyt+qcAFBcXr4byqmSErpYGLt40ib2n7mMlaTr70x9gteBh1irnsG5GUWqb
-        z9QdivS4kHlgEWuuRVxf8TznpC3j7NQwjOFckreU+xyhzJ7FF8QNwVzqh/QuAI2eZr0ZmawWGa04iF3J
-        Mzn3L4tZmkLZ6aGW2FE87/qHQCBl3gfeNl9IZ17Kj1pCvbF3se/MZFKS72F/5v0oWjNIq5lFujUIAGYT
-        dQYT98yFMvNIxFz7EbKQlTqcrdTZ0cI2Syx5HJjTN4+pD3Mg3Itrmd89Fyl1Dum2R0mvf4i1spnkz5lG
-        lgMTuCbtgGQjCWiJpwPwxI/+LgicaY6ora2NEeoIAHNODJm230a+k2NZOTOO/MkTWM2eRFrJb5A67yXd
-        Mg25fzpR+wxi50ymjpmkOWZSdWmkUX0HNztsqs+kzvppxB0X5ogY106MjhlMrdNJb5oGAPexVj6F1Ny7
-        yYu18rZMpS5Hi9Geg8puxNXTfxcADqeex2S3KN+PTJD/2SR2x4xmJe4XrJy+jf3JvwKAX7NWPJb16nGs
-        m+5ksk5gaobYLojWNIEr8jdKHTAykEhFaSI7ysYNzQnMHRrxjt54J+u141grHctq7hj2p97OzphbufDw
-        KkYyMTZJGIsA4uZLgsCx4C9tNltVIAc3pu/l9qjryXfkBlKO38jKqZvIn3Qzqxm3kJb/M9JKf0565SjW
-        a0aTXgupG80QUGs0VYD7ycnnKTU11Qji1DPrqLtg1NAcmReYj3cvfKMKz8tGsVb4c1KzfkZqys3sO30T
-        FW8YTR3tdlFe+iodNFrzLQBQfhhkIyYMFZHWghju3vUf5IsZTsqx4azEDyf/uRGspowgLROSO5L0gpGs
-        FY0kEb0Y18UXrrvTf8xFMb+mzAPjKSt6LNfG3UjevG/MwbzAfGOUbxRC8nCdNYLU1BHkTxzBSsIIMm27
-        hVptVpZOQEAgrXcgoCdfBAJHg4/A1d3iJkmbRvr0uNmRso6c0Q+Q89BUdh6eSs7Yqew4NpUcJ6ZS+0lD
-        uO3kPSTSGjeF7XFTyH7iN2Q7PpmtRyeTOfZuyCS2xE4i65GJIri+iywxIhO48fCdZPrreIaQ6dB4ajw0
-        ni2HJpD14F3UHD2Rm/bdQ3WJm0l2ftKWCAgcxUiVPwIqXQhoNGsjq6urU2UbGDjfGSwiRgob7NO/Ncoz
-        mSfvyEelWkvllQZO9gugI1ssFpZChsTAOHpnVHZGimbEGmNvwVlZWZySksJJSUmGnD9/ntF7MQxqzMOZ
-        E9fX1xvfGQTBOJ4XOinorxYbAHDCcAesr0EJcY8oJFwbqoSBjPTNMRAngyCMVDcIwsg8xkkFtpzoowhH
-        LwKCampqUKErGUWSQFcSEDgQpszMTAFBACBiFECAIDxDBS8hgKBBEGS320kMBBBS4RMMAAsWLPglbryi
-        gMilPPG3vDDY+g55QrKFWEgyzyAIo5UeBMEAwRUVFQKCAYLRrggIzsjIEMWHPCHXYIbxDCAYDDE8ge6A
-        AUIaSz5w4EDC559/PuyaoKCgn7z33ns2uJTkw6gFYimSl8RqGGnQ9cZzeSa/gxaGZcS6JpOJ8J8ZUZTg
-        bhFxu3EtyuOZMUfmy7viAaEPhIQusjbAGF4BdWQddLTlxlqyvgCX9wJelPffeOONrYYHZsyY8aOwsLCc
-        d955h959910GGFq3bh19+umnvGHDBvrkk09o9erV/Prrr9OqVav4/fffp/Xr1xNO5mjLli28fft2Ag0J
-        R41iFTp8+DAdPXqUT5w4QSdPniRsRVlGEZxoME42aNOmTYT1GOvRhx9+yHL/xRdfEI5s+ODBg3TkyBFj
-        7uA7dOzYMY6JiSEcZdLOnTtZ1li+fPlqA8C99947LCQkZDeUEoVZlIqMjORdu3bx3r17Gcrxxx9/zGvW
-        rGFZbOvWrcazffv2yWKiEMtip0+fNoIQud8ITnG/UESsGhC5F7rgdINhGBYjwQDGPRRkASv0kbgIvCsj
-        9iVGcMv3YRhj3pIlS54bSqW33nrrjPnz52e+9tprTW+//XY7LNMLT3g/+OADbe3atfpbb71Fr776Kr35
-        5pviJcJv9NFHHxGA0WeffUabN2+mbdu2EYAb3tizZw8BIO3fv/8igaJiZcPD8k2sRTCM8S35DoxHOPUz
-        3pe5eF/HqOLeC8v3wHhtWLNp5cqVaVOmTBk7BGDMmDHDJk6ceNuDDz748Ny5c5fDI5tCQ0NPI8BLFi5c
-        WHslBToUQZd4GHh9cHBw2KxZsx6cPHnyL75VjaH4tRERET9dtmzZeIzBGJdD3oa8C/nfKySy9lvQJwLj
-        YxjuQLz+BLoOu2Q/hEnDMGk4xhswjkag3L5ixYoxGP/zSoisDV1+BV1GiXHDw8OHQy6t/D+0Wfj3pMtv
-        gf8DCdMeTzy5zwoAAAAASUVORK5CYII=
-
-  
-  
-    chkHide
-  
-  
-    label2
-  
-  
-  
-    CenterParent
-  
-  
-    435, 277
-  
-  
-    1
-  
-  
-    9, 156
-  
-  
-    OK
-  
-  
-    True
-  
-  
-    3
-  
-  
-    $this
-  
-  
-    Visa inte detta meddelande i fortsättningen.
-  
-  
-    System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    Viktig information Telldus Schemaläggare
-  
-  
-    För mer info kring begränsningen se Microsofts kunskapsdatabas:
-  
-  
-    6, 13
-  
-  
-    2
-  
-  
-    229, 17
-  
-  
-    2
-  
-  
-    System.Windows.Forms.Button, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    260, 13
-  
-  
-    linkLabel1
-  
-  
-    AutoSize
-  
-  
-    System.Windows.Forms.LinkLabel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    12, 92
-  
-  
-    0
-  
-  
-    10
-  
-  
-    397, 59
-  
-  
-    True
-  
-  
-    Programmet har upptäckt att säkerhetsprincipen för Windows konton med blanka lösenord är aktiverad. Om du inte har något lösenord på ditt Windows konto rekommenderas du att stänga av säkerhetsprincipen då schemläggning inte kan utföras med Windows konto som saknar lösenord.
-  
-  
-    1
-  
-  
-    panel1
-  
-  
-    48, 48
-  
-  
-    pictureBox1
-  
-  
-    216, 13
-  
-  
-    Läs noga igenom nedanstående information.
-  
-  
-    frmAskSecurityPolicy
-  
-  
-    9
-  
-  
-    label3
-  
-  
-    $this
-  
-  
-    3
-  
-  
-    label1
-  
-  
-    12, 18
-  
-  
-    label4
-  
-  
-    cmdYes
-  
-  
-    -3, -3
-  
-  
-    5
-  
-  
-    6
-  
-  
-    7
-  
-  
-    System.Windows.Forms.Panel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    $this
-  
-  
-    2
-  
-  
-    9
-  
-  
-    Schemalagda aktiviteter kan inte utföras med ett tomt lösenord
-  
-  
-    True
-  
-  
-    True
-  
-  
-    System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    4
-  
-  
-    9, 169
-  
-  
-    31, 41
-  
-  
-    1
-  
-  
-    378, 15
-  
-  
-    $this
-  
-  
-    System.Windows.Forms.Form, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    75, 23
-  
-  
-    0
-  
-  
-    Microsoft Sans Serif, 8.25pt, style=Bold
-  
-  
-    True
-  
-  
-    475, 73
-  
-  
-    $this
-  
-  
-    System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    Viktig information angående schemaläggning
-  
-  
-    System.Windows.Forms.CheckBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    13, 200
-  
-  
-    $this
-  
-  
-    True
-  
-  
-    English
-  
-
\ No newline at end of file
diff --git a/scheduler/DeviceScheduler/frmAskSecurityPolicy.sv.resx b/scheduler/DeviceScheduler/frmAskSecurityPolicy.sv.resx
deleted file mode 100644
index 11662d8f..00000000
--- a/scheduler/DeviceScheduler/frmAskSecurityPolicy.sv.resx
+++ /dev/null
@@ -1,189 +0,0 @@
-
-
-  
-  
-    
-    
-      
-        
-          
-            
-              
-                
-              
-              
-              
-              
-              
-            
-          
-          
-            
-              
-              
-            
-          
-          
-            
-              
-                
-                
-              
-              
-              
-              
-              
-            
-          
-          
-            
-              
-                
-              
-              
-            
-          
-        
-      
-    
-  
-  
-    text/microsoft-resx
-  
-  
-    2.0
-  
-  
-    System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-  
-    
-        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
-        gf8DCdMeTzy5zwoAAAAASUVORK5CYII=
-
-  
-
\ No newline at end of file
diff --git a/scheduler/DeviceScheduler/frmAskUsername.Designer.cs b/scheduler/DeviceScheduler/frmAskUsername.Designer.cs
deleted file mode 100644
index 17290092..00000000
--- a/scheduler/DeviceScheduler/frmAskUsername.Designer.cs
+++ /dev/null
@@ -1,176 +0,0 @@
-namespace DeviceScheduler
-{
-    partial class frmAskUsername
-    {
-        /// 
-        /// Required designer variable.
-        /// 
-        private System.ComponentModel.IContainer components = null;
-
-        /// 
-        /// Clean up any resources being used.
-        /// 
-        /// true if managed resources should be disposed; otherwise, false.
-        protected override void Dispose(bool disposing)
-        {
-            if (disposing && (components != null))
-            {
-                components.Dispose();
-            }
-            base.Dispose(disposing);
-        }
-
-        #region Windows Form Designer generated code
-
-        /// 
-        /// Required method for Designer support - do not modify
-        /// the contents of this method with the code editor.
-        /// 
-        private void InitializeComponent()
-        {
-            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(frmAskUsername));
-            this.pictureBox2 = new System.Windows.Forms.PictureBox();
-            this.label16 = new System.Windows.Forms.Label();
-            this.label15 = new System.Windows.Forms.Label();
-            this.txtPassword = new System.Windows.Forms.TextBox();
-            this.txtUsername = new System.Windows.Forms.TextBox();
-            this.label14 = new System.Windows.Forms.Label();
-            this.groupBox1 = new System.Windows.Forms.GroupBox();
-            this.cmdOK = new System.Windows.Forms.Button();
-            this.cmdCancel = new System.Windows.Forms.Button();
-            ((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).BeginInit();
-            this.groupBox1.SuspendLayout();
-            this.SuspendLayout();
-            // 
-            // pictureBox2
-            // 
-            this.pictureBox2.AccessibleDescription = null;
-            this.pictureBox2.AccessibleName = null;
-            resources.ApplyResources(this.pictureBox2, "pictureBox2");
-            this.pictureBox2.BackgroundImage = null;
-            this.pictureBox2.Font = null;
-            this.pictureBox2.ImageLocation = null;
-            this.pictureBox2.Name = "pictureBox2";
-            this.pictureBox2.TabStop = false;
-            // 
-            // label16
-            // 
-            this.label16.AccessibleDescription = null;
-            this.label16.AccessibleName = null;
-            resources.ApplyResources(this.label16, "label16");
-            this.label16.Font = null;
-            this.label16.Name = "label16";
-            // 
-            // label15
-            // 
-            this.label15.AccessibleDescription = null;
-            this.label15.AccessibleName = null;
-            resources.ApplyResources(this.label15, "label15");
-            this.label15.Font = null;
-            this.label15.Name = "label15";
-            // 
-            // txtPassword
-            // 
-            this.txtPassword.AccessibleDescription = null;
-            this.txtPassword.AccessibleName = null;
-            resources.ApplyResources(this.txtPassword, "txtPassword");
-            this.txtPassword.BackgroundImage = null;
-            this.txtPassword.Font = null;
-            this.txtPassword.Name = "txtPassword";
-            // 
-            // txtUsername
-            // 
-            this.txtUsername.AccessibleDescription = null;
-            this.txtUsername.AccessibleName = null;
-            resources.ApplyResources(this.txtUsername, "txtUsername");
-            this.txtUsername.BackgroundImage = null;
-            this.txtUsername.Font = null;
-            this.txtUsername.Name = "txtUsername";
-            this.txtUsername.TextChanged += new System.EventHandler(this.txtUsername_TextChanged);
-            // 
-            // label14
-            // 
-            this.label14.AccessibleDescription = null;
-            this.label14.AccessibleName = null;
-            resources.ApplyResources(this.label14, "label14");
-            this.label14.Font = null;
-            this.label14.Name = "label14";
-            // 
-            // groupBox1
-            // 
-            this.groupBox1.AccessibleDescription = null;
-            this.groupBox1.AccessibleName = null;
-            resources.ApplyResources(this.groupBox1, "groupBox1");
-            this.groupBox1.BackgroundImage = null;
-            this.groupBox1.Controls.Add(this.label14);
-            this.groupBox1.Controls.Add(this.label16);
-            this.groupBox1.Controls.Add(this.pictureBox2);
-            this.groupBox1.Controls.Add(this.label15);
-            this.groupBox1.Controls.Add(this.txtPassword);
-            this.groupBox1.Controls.Add(this.txtUsername);
-            this.groupBox1.Font = null;
-            this.groupBox1.Name = "groupBox1";
-            this.groupBox1.TabStop = false;
-            // 
-            // cmdOK
-            // 
-            this.cmdOK.AccessibleDescription = null;
-            this.cmdOK.AccessibleName = null;
-            resources.ApplyResources(this.cmdOK, "cmdOK");
-            this.cmdOK.BackgroundImage = null;
-            this.cmdOK.Font = null;
-            this.cmdOK.Name = "cmdOK";
-            this.cmdOK.UseVisualStyleBackColor = true;
-            this.cmdOK.Click += new System.EventHandler(this.cmdOK_Click);
-            // 
-            // cmdCancel
-            // 
-            this.cmdCancel.AccessibleDescription = null;
-            this.cmdCancel.AccessibleName = null;
-            resources.ApplyResources(this.cmdCancel, "cmdCancel");
-            this.cmdCancel.BackgroundImage = null;
-            this.cmdCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
-            this.cmdCancel.Font = null;
-            this.cmdCancel.Name = "cmdCancel";
-            this.cmdCancel.UseVisualStyleBackColor = true;
-            this.cmdCancel.Click += new System.EventHandler(this.cmdCancel_Click);
-            // 
-            // frmAskUsername
-            // 
-            this.AcceptButton = this.cmdOK;
-            this.AccessibleDescription = null;
-            this.AccessibleName = null;
-            resources.ApplyResources(this, "$this");
-            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
-            this.BackgroundImage = null;
-            this.CancelButton = this.cmdCancel;
-            this.Controls.Add(this.cmdCancel);
-            this.Controls.Add(this.cmdOK);
-            this.Controls.Add(this.groupBox1);
-            this.Font = null;
-            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
-            this.Icon = null;
-            this.MaximizeBox = false;
-            this.MinimizeBox = false;
-            this.Name = "frmAskUsername";
-            this.Load += new System.EventHandler(this.frmAskUsername_Load);
-            ((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).EndInit();
-            this.groupBox1.ResumeLayout(false);
-            this.groupBox1.PerformLayout();
-            this.ResumeLayout(false);
-
-        }
-
-        #endregion
-
-        private System.Windows.Forms.PictureBox pictureBox2;
-        private System.Windows.Forms.Label label16;
-        private System.Windows.Forms.Label label15;
-        private System.Windows.Forms.TextBox txtPassword;
-        private System.Windows.Forms.TextBox txtUsername;
-        private System.Windows.Forms.Label label14;
-        private System.Windows.Forms.GroupBox groupBox1;
-        private System.Windows.Forms.Button cmdOK;
-        private System.Windows.Forms.Button cmdCancel;
-    }
-}
\ No newline at end of file
diff --git a/scheduler/DeviceScheduler/frmAskUsername.cs b/scheduler/DeviceScheduler/frmAskUsername.cs
deleted file mode 100644
index f0924c65..00000000
--- a/scheduler/DeviceScheduler/frmAskUsername.cs
+++ /dev/null
@@ -1,50 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.ComponentModel;
-using System.Data;
-using System.Drawing;
-using System.Text;
-using System.Windows.Forms;
-
-namespace DeviceScheduler
-{
-    public partial class frmAskUsername : Form
-    {
-        public frmAskUsername()
-        {
-            Localization.ChangeLanguage();
-            InitializeComponent();
-        }
-
-        private void frmAskUsername_Load(object sender, EventArgs e)
-        {
-            txtUsername.Text = Environment.MachineName + @"\" + Environment.UserName;
-        }
-
-        public string Username
-        {
-            get { return txtUsername.Text; }
-        }
-        public string Password
-        {
-            get { return txtPassword.Text; }
-        }
-
-        private void cmdOK_Click(object sender, EventArgs e)
-        {
-            this.DialogResult = DialogResult.OK;
-            this.Hide();
-        }
-
-        private void cmdCancel_Click(object sender, EventArgs e)
-        {
-            this.DialogResult = DialogResult.Cancel;
-            this.Hide();
-        }
-
-        private void txtUsername_TextChanged(object sender, EventArgs e)
-        {
-            cmdOK.Enabled=(txtUsername.Text.Length>0);
-        }
-    }
-}
\ No newline at end of file
diff --git a/scheduler/DeviceScheduler/frmAskUsername.en.resx b/scheduler/DeviceScheduler/frmAskUsername.en.resx
deleted file mode 100644
index 7d2b33fc..00000000
--- a/scheduler/DeviceScheduler/frmAskUsername.en.resx
+++ /dev/null
@@ -1,230 +0,0 @@
-
-
-  
-  
-    
-    
-      
-        
-          
-            
-              
-                
-              
-              
-              
-              
-              
-            
-          
-          
-            
-              
-              
-            
-          
-          
-            
-              
-                
-                
-              
-              
-              
-              
-              
-            
-          
-          
-            
-              
-                
-              
-              
-            
-          
-        
-      
-    
-  
-  
-    text/microsoft-resx
-  
-  
-    2.0
-  
-  
-    System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-  
-    
-        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
-
-  
-  
-    56, 13
-  
-  
-    Password:
-  
-  
-    32, 13
-  
-  
-    User:
-  
-  
-    To be able to perform the scheduled task you need to specify the username and password that you enter when logging into Windows. This information is needed in order to get persmission to run. The application is storing the information in secure (encrypted) fashion. 
-  
-  
-    User details
-  
-  
-    Cancel
-  
-  
-    User account
-  
-
\ No newline at end of file
diff --git a/scheduler/DeviceScheduler/frmAskUsername.resx b/scheduler/DeviceScheduler/frmAskUsername.resx
deleted file mode 100644
index ec4c0534..00000000
--- a/scheduler/DeviceScheduler/frmAskUsername.resx
+++ /dev/null
@@ -1,451 +0,0 @@
-
-
-  
-  
-    
-    
-      
-        
-          
-            
-              
-                
-              
-              
-              
-              
-              
-            
-          
-          
-            
-              
-              
-            
-          
-          
-            
-              
-                
-                
-              
-              
-              
-              
-              
-            
-          
-          
-            
-              
-                
-              
-              
-            
-          
-        
-      
-    
-  
-  
-    text/microsoft-resx
-  
-  
-    2.0
-  
-  
-    System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-  
-    6
-  
-  
-    System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    groupBox1
-  
-  
-  
-    149, 132
-  
-  
-    2
-  
-  
-    403, 194
-  
-  
-    75, 23
-  
-  
-    4
-  
-  
-    13
-  
-  
-    System.Windows.Forms.Button, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    $this
-  
-  
-    5
-  
-  
-    74, 106
-  
-  
-    
-        iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
-        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAEl9JREFUaEPtWQdw
-        lUeSXjCYZGPARJMNwmBMFlEgIaGcUEA5BySh9BSfMspITyignHMWSiAJEYUQApGMgQXjAKyNMfbereOW
-        F++d6b7u/9579bQWnNiqq6ur2lf1vZ6Zf3qmu6e7Z/75//CHf/3+ZYH/PxZoaj82obmtc3Zze+emtmNd
-        pp3dvaLjvacyTpw+d/TE6bNXu0+e/qa149iPhaXly/5PtCqva5xaUduwvKq+WaOm6ahTfWvnwaaOrrLm
-        zq7TzR1d95vbj3/f0Nr5vKapFcpq6jG/tBJyCksxM68IMnIKQJKViymZOZCclu77v6JASWXNzKKyyo3F
-        lTUmJVV1/hX1zelVTa0tlQ0tVyobjj6tamr7W+3RDiBgbUsbVDe2QE1DM9Y1HYVaQgUJTfxQUFIG+UUl
-        WFRSCk0tLVhWXg6ZWVmQk5uLhzMyIS4pJeOVFLgwcHHM0NVrUzu7epbXN7Wo1zY2O9U3t8Y0HG0vbWzt
-        OFXX3HafhPmlsr4Zy+uasbiqHgsrarCwvBpLKqqxsq4RaxpbSFBCYzNW1dRiaXkFCViC5RWV2NHZid09
-        PXj+/Hk8fvw4FhQUYH5+PpbQc25ramoS6gxJWhrGJqW0v5ICHZ3HwgcvD/3KQuSVlMPh7HxITMvE2ENp
-        EJssgbiUw5ggyYDUjGzMLSqB0ooqqG1oJOsdxbb2DiCh4NSpUywM9PX1AQuWnZ0NjLq6OhwcHITLly/D
-        pUuXsL29HXJycvgZFhUVwblz57C6ulroy22pqRKIjE24+UoKJCYdyok4GA8+weEYFBYFYVEHISYuAWPj
-        EyEhMQmSkw9hWloasKX6+/vhwoULMDAwwEAplZfPnDkDeXl5mJGRAQwSTuDhfsTH1hbaCUj9BMVLS0vl
-        bakSCQRHRP85NCJ6/KiV8PL2DfIWBWFAaBhZIHVEkALCUpOFX4oTJ05gVlaWMIZEIsGKigpkKzMf06qq
-        KqGdn7PFe8i1WGHZvCkpKSgKDf8tSBzx9qgVcHZ13+d+wAd8AoIxMTERpBhWTk5OhtraWiSLsdVkUKwL
-        ZXYRFkY2DlkXT548KfQnKriNbHxeiU6Kj/T09GFz+gWJQRQs3jBqBRycnLc4u3uCp18gHjx4EKQYVo6N
-        jYXKykrs6uqC7u5uGfAfy42NjZCQkCDn5YCV8XAAHzlyRD4+rQS0UBZi4yjOKQoJA7+AYNNRK2Br7zjf
-        3snlN09RMIrDwjA8PPx3iIyMZF/lIHwp2EWioqIE/oiICMyl1CjjaW1tFVxFNj4JjryqJPyw+QJCxOjt
-        Hxg0agUsbewmWNna/+zhF4SBQUEQ9N9AKRXKISEhwGmOg1ABinWhXFhYCNRX4A0ODobMzEx5n/r6eoyL
-        i5OPTysFbBSxWDxszoCgEPDyFeWMWgHuaG5p88DNW4S+fv7g6+vLQCkVyiKRCGj5hZSnAMW6UKYABn9/
-        f4HXz88POPhl/cvLyzEsLEw+fnR0NPAK8diKc/qLAsDDx7/rlRQwMbfsc9rvjd6+/ujh4fE7HDhwQMge
-        nONfBnYLT09PgZ9pUlKSvD+vIAkrH5tdicf08vIaNp8XzeXhI/rjKylgZGJWZevsjl6+/uDs7MxAKRXK
-        bm5unCnYp9lqMijWkTcotqqLi4vASxQo+OV9KNuwoPLx2cXIpZD7DZuT6gdEQX99JQX0jfYmWNg5opdf
-        ANra2v4ODg4OGBMTg4cPH34h2F04XmT8dnZ2QiDLeNgAjo6O8ufsauT/Qt3KygrNzc1RX18f1dXV0ZPk
-        sHNynTVqJXT0Dd33WlijT0AI7Nu3j4FSKpRpAuDJFPYJYUUU9w0OSnI1Oa+FhQUHsrwPu4ypqSno6urC
-        7t270cTEBIyMjHDFihWwePFiWLBgARKYgqObJ1ra2m8ZtQKaOnraesam6B8awYMKA0upUOaJ2X8pRYIC
-        FOtIqRacnJyAraipqQlqampgY2ODrq6uQCsIenp6uGjRIpg3bx688847uHnzZlBWVkYqy9v4GcPCxh4J
-        lqNWQENLZ+UeXQMMCItGAwMDJCsNA7dxsEnTKwYGBiK7ALdRfCC7GFkcN2zYgCQAzp07lwVDVVVVNoSA
-        Xbt2CW1z5swRnm/atAnXrFkj1P8RBsYmrIB41Ars3qM1RU1TB3yDw2l51YEHJwAJBOvWrUOCYFleCUND
-        Q8ENdHR0UFtbGxhcZqsrKSnBrFmzkAAkJOzYsUPehyzOgvJzmD17tjAmuY/QVwp5ebfGHrS0cywctQLc
-        UVVD6y+u3iLYvkNFmGDmzJnAePvtt4WJt2zZguS77L8yKNbZ2oIvc38CjzGMZ+3atcKY/IwofvDBB7Bk
-        yRKhrxTysrLyZnRw3X/ylRRQ26N908H9AGpoauH06dOHga3K7rF9+/YXYuvWrYKLyHhZSEWe9957D2fM
-        mCE8Z7py5UqcP3/+sHm4ffXq1WhJWSlUHPYLxd0gbXKZlH6X/o/KaGjpdto67wdDEzN46623kMBUKLOF
-        yGK4ceNGkIHdTLHMLsFWl/GSMMN42NqyMadNm4bLly8XVlrWxrHD+wEnCT57MeV9hYChoaF/pWeGL1VC
-        S9cgx8rBBaztneDNN99EAlOhTFYT/JWXXQGKdbYosNAyXhIS2Oqy/mxtHm/RgjmgsWMF2uzdDOrbV+Cc
-        2QIPTJ06VYgXe3t74P2Csxft5pya0dvbm8s/WlpavngldAyMQngzczvgi2+88cYwsFWXLl3KOfuFePfd
-        d9macj4ucxvzUHDjO/PmorPZJqxONcbWHHM8VmCJPaU22JZnie6Wm3HG9LcE14oLcsfOkiRsL0rE6EAP
-        IbtZW9sIxw1KIsUvXAXajS332diDSBwJkydPRgJToUwKCRsNB6kM7BKKZd6AuJ+Ml626cOFCeR9D9fcx
-        N1IbiuL0oCLZEGskxlCfYYJNWWbQlmcBh4I1cQrNd7b8IHzVX4mPz5fD/a4jcCI/BLPFtmBtZQHW1tY/
-        GRsbTxhRCToPbTe3toOw2CTBDSZOnAhSCMpwruZNRwGKdWT/nzRpEvMIvFOmTOFUKt+ofGw2Y+wBFUgL
-        VoeeQm+8fUwCH5/OxYdDDfD1rU7IjPEkBSZBb4EYhhqS8XZbGpwpDofeHD+si7UFRzNt4GMHpfBdIypg
-        Ym4xf5+1LfiLo3ApLf3rr78uBwvFy8uZ5UXgwJwwYcKIPJxaAx02o9hlK+aEG+Pnp3Lxy4Ey/Pc7bfjL
-        t9fx2Xe38N7FRtQzMMSGFC/sKw7Fs0XB2J3ljU0JDlgQZIS2Bip8vEEtLS2vERXYZ2UzycLa7mfvoDDY
-        uEkZx48fD1KwUEKQKWSm32Uqdh9Zf6akjMBDEILUx2oDBtgrQ1mcNXzcnYkP+4rg6UdH8ccng/Ds+1vw
-        06M+dHZ1g2hPU2g95IJNiQ5QE20FxSHGGO+6B3T2qLELsQLuIypAb2Zj6AD10IdeqlV3a+Brr70GUuC4
-        cePYPRTj4ndxwm4j6890+vQZsGHjRjQ2MQW6+YBQNw1sTHWHc6WhcLs9FT/pzYZ7Z4rwixvN8MODU/DD
-        Jz1oaKALNkbqUBlhjiWheyFfpA/pnhroZrITyPeBTqy/7d27d/kLA9nG3rHfJzAUDfaa4tixY+UggYa5
-        lMy9yNK8UsLZZoeKClrZ2KI4IgrzCouRrxUr6NaupLIWC8qqMDHCA6sT3LC/PBxvNCXgnQ4JfnIyB/9E
-        rvRkqAYfD1aC8qYNH23dooyxLnsw1nEXRtpsx2TX3bhHdRuamZmhqZlJwUv3Agdn1xqfwBCwcXDGMWPG
-        gBRCmRViKy9evAR2qe0GugzAsKgYyKfbPLp65CtGqG5o5ntQvmqEqvomKK9pYAWggC5y049k/1oc5/5D
-        f1kYDNXGsBK0EhK835MFn5/Og5ttqd9NmjhRm/aNh9pblGIzfXQgw1sXRBYquHOnMpjb6x13FVm8/MKL
-        7oiS+J3AOyAEp9OmpERndTX1PWht5whBYZGYmpkNwm0yIZtulvmGubiiBsqq6+UK8BVlWVXt35JT0+65
-        e3q1aGnrxNOGZksxoqK/4/3Y0/kBMFARjufLwqG/IhKvNibCQG0cVCZ5XFywdI6Buolyo4WH6uMkx22Q
-        6LAViNKpdxd4xBk8iyp0DHzpCrjt9/D0pRXwp2M1p9NwQkRcMsYkSSA+NQOT04+A5EieggIVkFdcBpLM
-        bIyKSwTm1dXTr6cUup4mWk3YSNhG4NSn7mOh1nIixxf6SsVISsCpwhA8VSyGj1oP0d2o62O/dJP/dIzQ
-        BAvfXXjYQxUyGPtV0SVAHXxTTCCzRQTVffGHO64dGTOiImQxXb/AEPSjVBoYcRBDYxJQqgAmpGZAoiT9
-        J3FkzFW6Ryqjvn92cvdE3r332TrIsX7jpioaXIWwm6BJ0Bk/fpyhieGO7K7i0J/6SkKxN9ePViACL9fG
-        4rXGRDxbG/FbTLk1BueZoWeyHjqEa2CW3x7MJySJNNEjXh+jS+yx4EQgdn2UDb23iv1HVMDQyHiGl4/v
-        bRIeQqPivqN35EEzC6u8HTt3edKxQIU2tIXEOJ+wVFNb9wsbRxewc3YDVoSuQiAwNBwoFd6imNGlPvoE
-        g5UrFnr2tCd+em0gG88dOwSXamKAlTiR7QtdlOevdyc/S811uh1RYYGhRWYgyjYG7zRDbD5WB11nj0JQ
-        hhUG55hDapM7VPWHY/vNZDh5p+jH9itHZgxTgrLJ2FmzZ48jvEFHhBWUx2dTh5mEeYTFBCXCBzK3MDAy
-        /iY4PBIPJibj4Sy6Li+rQPq+gJ1d3c8NjYwyWfhNG5QC735Y8tOTR4341aMm/PRuFV7vzcRL1dHYVxLC
-        SuDdK3n44FYBFrV6Y0ixCQblG9NKmGLrmR6sOVWJATnGGF5qgaktrlh8JhBrBiOx9Woa5nUHWikqMJYq
-        fMaYSmDB2dKcb98n8EXrVsJORbfY7+n1b43NR6Gr5wT09V/Ay1euwtXrN+DK1et4tu/8f9jaWpfdHMr/
-        4fFDOio8boOnTzqR6RefN8Cdi7V4s7cIrvRW4ZnubPjsZg7cu5GPB8usIDDfEMRF+7Chuw0kDaFUN0Jx
-        sSkcrLaGlBYXTO/YDyUnIyCxzjlFpgAHxOuE6VJLs5WVCTsIaoQ9BG2C3C3Yuk7OLo+u3bgBDPpAgqfP
-        noOO41388QML6TNS39lyePhxBT5+1AhPvz4G337bg0wfP2qCLz9vxaePLsPTh1fwVHch3LuWDnevHcG2
-        3njwy9aF4IK9WN5aRdQc/HP0UJRnAMGFxhBWaooR5eaQ3uILPhKjVJkCr1HhDanwm6RCa0kF1mNhR4D+
-        ciUlCX0Aec5fasoqqvBIbj5S6sSo2HiMTYjDWx+W42d3i/GLB3X49Vft+M3TLvz6SQfV66m9BJ98fg6/
-        JQUunKnEW5cPCbh2pQRF2Qbok6mNKWUxeCBTC70ZWdrok6WDolxDjK1wwuRaz+fb9VeayxQYRwUOCE57
-        6oSRhOaA5HYdAivH/XbSW1WAvYPjA1FQMISER0CwOAwioqL/XlKa8f1H1wvg7s1s/OxeKfzpQR18STHA
-        9LOPS+EetX96qxq+fTCEQ/3VcH0gjoHXh3IhOM30e5d49Z8PJJk8c0/W/NUjRfvvHsk6v7rH6/5o6a96
-        Td1iTb6yppKaxr4NQirlP97dOFjXETjtsbAygdltWGANgiphO4FXaQ1hBWEJnZMWrVq1ykxdQyNFRUXF
-        eetW5SX5RQl5Vwcl8OFQCt6+kQn3bufD/TuFyPQO1bn9+mAyfPPZAF4bKIPLfVEM7D8r+XXZsnd03p79
-        1rLps95cOXPutFULls5dpbRm0ZIV6xZOf3/r4hF3Yl4B9v+VbFUC+zwLzP7P+XyzVDl+/i5hAYEDnXne
-        JEymDDaB3mnH0879mqWV4dikQwH1g+fj8XJ/DF69GI/XLyXjjaFDAuU6tw+ei8CHt9vw5qU8HDgtJleK
-        fG6ovzlrw4Zlk9iyr/LjDDSZwOlylVTYtUQ5A3EmWkSYS+DvVpylphAmEtgaHD/MP2xnlKQHxV04fxj6
-        BcHEMHA2HC6SwEy53n86BM+fDII/XinCaxck0Nbo9RdNjdXiTRuXskFe+SdzIw5kdiUWdo60PI0ot7PA
-        nKl4tVho5hl5O6cH2bmhk3PzQ+KqKkPu93aF/u3siaDnfSeD8FxvIJzu9n/e0+H7rL7K7Zu0RKc+OyvV
-        8G1blJZo7F7FhvinfywMC8d7AS+hTOAXWnk0M7m4aI9X3fX+vG1blq/dsU1p1+pV83euX7dw/fq1C9/d
-        vnXZNH2d9TznP/37L6jWkUpQmhlGAAAAAElFTkSuQmCC
-
-  
-  
-    181, 20
-  
-  
-    label16
-  
-  
-    487, 224
-  
-  
-    0
-  
-  
-    $this
-  
-  
-    groupBox1
-  
-  
-    149, 106
-  
-  
-    System.Windows.Forms.Button, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    0
-  
-  
-    Användarkonto
-  
-  
-    cmdOK
-  
-  
-    75, 23
-  
-  
-    6, 13
-  
-  
-    System.Windows.Forms.PictureBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    3
-  
-  
-    pictureBox2
-  
-  
-    Användare:
-  
-  
-    txtUsername
-  
-  
-    label14
-  
-  
-    groupBox1
-  
-  
-    14
-  
-  
-    62, 13
-  
-  
-    10
-  
-  
-    Avbryt
-  
-  
-    1
-  
-  
-    cmdCancel
-  
-  
-    True
-  
-  
-    True
-  
-  
-    $this
-  
-  
-    label15
-  
-  
-    frmAskUsername
-  
-  
-    18, 31
-  
-  
-    12, 12
-  
-  
-    txtPassword
-  
-  
-    74, 135
-  
-  
-    7
-  
-  
-    48, 48
-  
-  
-    För att kunna utföra schemaläggningen behöver du ange det användarnamn och lösenord som du loggar in med i Windows. Dessa uppgifter behövs för att schemaläggningen skall få tillåtelse att kunna köras. Programmet sparar informationen på ett säkert (krypterat) sätt.
-  
-  
-    System.Windows.Forms.TextBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    System.Windows.Forms.TextBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    321, 194
-  
-  
-    System.Windows.Forms.Form, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    OK
-  
-  
-    System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    72, 31
-  
-  
-    12
-  
-  
-    groupBox1
-  
-  
-    11
-  
-  
-    Användaruppgifter
-  
-  
-    System.Windows.Forms.GroupBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-  
-    AutoSize
-  
-  
-    181, 20
-  
-  
-    374, 52
-  
-  
-    54, 13
-  
-  
-    8
-  
-  
-    System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    466, 176
-  
-  
-    9
-  
-  
-    groupBox1
-  
-  
-    *
-  
-  
-    groupBox1
-  
-  
-    CenterParent
-  
-  
-    groupBox1
-  
-  
-    2
-  
-  
-    Lösenord:
-  
-  
-    1
-  
-  
-    True
-  
-  
-    English
-  
-
\ No newline at end of file
diff --git a/scheduler/DeviceScheduler/frmAskUsername.sv.resx b/scheduler/DeviceScheduler/frmAskUsername.sv.resx
deleted file mode 100644
index bfda575b..00000000
--- a/scheduler/DeviceScheduler/frmAskUsername.sv.resx
+++ /dev/null
@@ -1,206 +0,0 @@
-
-
-  
-  
-    
-    
-      
-        
-          
-            
-              
-                
-              
-              
-              
-              
-              
-            
-          
-          
-            
-              
-              
-            
-          
-          
-            
-              
-                
-                
-              
-              
-              
-              
-              
-            
-          
-          
-            
-              
-                
-              
-              
-            
-          
-        
-      
-    
-  
-  
-    text/microsoft-resx
-  
-  
-    2.0
-  
-  
-    System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-  
-    
-        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
-
-  
-
\ No newline at end of file
diff --git a/scheduler/DeviceScheduler/frmMain.Designer.cs b/scheduler/DeviceScheduler/frmMain.Designer.cs
deleted file mode 100644
index 8d847b25..00000000
--- a/scheduler/DeviceScheduler/frmMain.Designer.cs
+++ /dev/null
@@ -1,679 +0,0 @@
-namespace DeviceScheduler
-{
-    partial class frmMain
-    {
-        /// 
-        /// Required designer variable.
-        /// 
-        private System.ComponentModel.IContainer components = null;
-
-        /// 
-        /// Clean up any resources being used.
-        /// 
-        /// true if managed resources should be disposed; otherwise, false.
-        protected override void Dispose(bool disposing)
-        {
-            if (disposing && (components != null))
-            {
-                components.Dispose();
-            }
-            base.Dispose(disposing);
-        }
-
-        #region Windows Form Designer generated code
-
-        /// 
-        /// Required method for Designer support - do not modify
-        /// the contents of this method with the code editor.
-        /// 
-        private void InitializeComponent()
-        {
-            this.components = new System.ComponentModel.Container();
-            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(frmMain));
-            this.statusStrip1 = new System.Windows.Forms.StatusStrip();
-            this.menuStrip1 = new System.Windows.Forms.MenuStrip();
-            this.fileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
-            this.newToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
-            this.mnuNew = new System.Windows.Forms.ToolStripMenuItem();
-            this.toolStripMenuItem1 = new System.Windows.Forms.ToolStripSeparator();
-            this.mnuExit = new System.Windows.Forms.ToolStripMenuItem();
-            this.editToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
-            this.mnuRemove = new System.Windows.Forms.ToolStripMenuItem();
-            this.toolsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
-            this.toolManageDevices = new System.Windows.Forms.ToolStripMenuItem();
-            this.helpToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
-            this.mnuWebsite = new System.Windows.Forms.ToolStripMenuItem();
-            this.toolStripMenuItem2 = new System.Windows.Forms.ToolStripSeparator();
-            this.mnuAbout = new System.Windows.Forms.ToolStripMenuItem();
-            this.toolStrip1 = new System.Windows.Forms.ToolStrip();
-            this.toolNew = new System.Windows.Forms.ToolStripButton();
-            this.toolEdit = new System.Windows.Forms.ToolStripButton();
-            this.toolStripSeparator = new System.Windows.Forms.ToolStripSeparator();
-            this.toolRemove = new System.Windows.Forms.ToolStripButton();
-            this.notifyIcon1 = new System.Windows.Forms.NotifyIcon(this.components);
-            this.lvwCommon = new System.Windows.Forms.ListView();
-            this.columnHeader1 = new System.Windows.Forms.ColumnHeader();
-            this.columnHeader2 = new System.Windows.Forms.ColumnHeader();
-            this.columnHeader3 = new System.Windows.Forms.ColumnHeader();
-            this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components);
-            this.cmdTurnOn = new System.Windows.Forms.ToolStripMenuItem();
-            this.cmdTurnOff = new System.Windows.Forms.ToolStripMenuItem();
-            this.imageList1 = new System.Windows.Forms.ImageList(this.components);
-            this.tabControl1 = new System.Windows.Forms.TabControl();
-            this.tabPage3 = new System.Windows.Forms.TabPage();
-            this.pictureBox3 = new System.Windows.Forms.PictureBox();
-            this.label5 = new System.Windows.Forms.Label();
-            this.linkLabel2 = new System.Windows.Forms.LinkLabel();
-            this.label6 = new System.Windows.Forms.Label();
-            this.pictureBox2 = new System.Windows.Forms.PictureBox();
-            this.label4 = new System.Windows.Forms.Label();
-            this.label3 = new System.Windows.Forms.Label();
-            this.linkLabel1 = new System.Windows.Forms.LinkLabel();
-            this.label2 = new System.Windows.Forms.Label();
-            this.pictureBox1 = new System.Windows.Forms.PictureBox();
-            this.label1 = new System.Windows.Forms.Label();
-            this.tabPage1 = new System.Windows.Forms.TabPage();
-            this.tabPage2 = new System.Windows.Forms.TabPage();
-            this.lvwTasks = new System.Windows.Forms.ListView();
-            this.columnHeader4 = new System.Windows.Forms.ColumnHeader();
-            this.columnHeader5 = new System.Windows.Forms.ColumnHeader();
-            this.columnHeader6 = new System.Windows.Forms.ColumnHeader();
-            this.columnHeader7 = new System.Windows.Forms.ColumnHeader();
-            this.contextMenuStrip2 = new System.Windows.Forms.ContextMenuStrip(this.components);
-            this.mnuRunTask = new System.Windows.Forms.ToolStripMenuItem();
-            this.menuStrip1.SuspendLayout();
-            this.toolStrip1.SuspendLayout();
-            this.contextMenuStrip1.SuspendLayout();
-            this.tabControl1.SuspendLayout();
-            this.tabPage3.SuspendLayout();
-            ((System.ComponentModel.ISupportInitialize)(this.pictureBox3)).BeginInit();
-            ((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).BeginInit();
-            ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit();
-            this.tabPage1.SuspendLayout();
-            this.tabPage2.SuspendLayout();
-            this.contextMenuStrip2.SuspendLayout();
-            this.SuspendLayout();
-            // 
-            // statusStrip1
-            // 
-            this.statusStrip1.AccessibleDescription = null;
-            this.statusStrip1.AccessibleName = null;
-            resources.ApplyResources(this.statusStrip1, "statusStrip1");
-            this.statusStrip1.BackgroundImage = null;
-            this.statusStrip1.Font = null;
-            this.statusStrip1.Name = "statusStrip1";
-            // 
-            // menuStrip1
-            // 
-            this.menuStrip1.AccessibleDescription = null;
-            this.menuStrip1.AccessibleName = null;
-            resources.ApplyResources(this.menuStrip1, "menuStrip1");
-            this.menuStrip1.BackgroundImage = null;
-            this.menuStrip1.Font = null;
-            this.menuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
-            this.fileToolStripMenuItem,
-            this.editToolStripMenuItem,
-            this.toolsToolStripMenuItem,
-            this.helpToolStripMenuItem});
-            this.menuStrip1.Name = "menuStrip1";
-            // 
-            // fileToolStripMenuItem
-            // 
-            this.fileToolStripMenuItem.AccessibleDescription = null;
-            this.fileToolStripMenuItem.AccessibleName = null;
-            resources.ApplyResources(this.fileToolStripMenuItem, "fileToolStripMenuItem");
-            this.fileToolStripMenuItem.BackgroundImage = null;
-            this.fileToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
-            this.newToolStripMenuItem,
-            this.toolStripMenuItem1,
-            this.mnuExit});
-            this.fileToolStripMenuItem.Name = "fileToolStripMenuItem";
-            this.fileToolStripMenuItem.ShortcutKeyDisplayString = null;
-            // 
-            // newToolStripMenuItem
-            // 
-            this.newToolStripMenuItem.AccessibleDescription = null;
-            this.newToolStripMenuItem.AccessibleName = null;
-            resources.ApplyResources(this.newToolStripMenuItem, "newToolStripMenuItem");
-            this.newToolStripMenuItem.BackgroundImage = null;
-            this.newToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
-            this.mnuNew});
-            this.newToolStripMenuItem.Name = "newToolStripMenuItem";
-            this.newToolStripMenuItem.ShortcutKeyDisplayString = null;
-            // 
-            // mnuNew
-            // 
-            this.mnuNew.AccessibleDescription = null;
-            this.mnuNew.AccessibleName = null;
-            resources.ApplyResources(this.mnuNew, "mnuNew");
-            this.mnuNew.BackgroundImage = null;
-            this.mnuNew.Name = "mnuNew";
-            this.mnuNew.ShortcutKeyDisplayString = null;
-            this.mnuNew.Click += new System.EventHandler(this.mnuNew_Click);
-            // 
-            // toolStripMenuItem1
-            // 
-            this.toolStripMenuItem1.AccessibleDescription = null;
-            this.toolStripMenuItem1.AccessibleName = null;
-            resources.ApplyResources(this.toolStripMenuItem1, "toolStripMenuItem1");
-            this.toolStripMenuItem1.Name = "toolStripMenuItem1";
-            // 
-            // mnuExit
-            // 
-            this.mnuExit.AccessibleDescription = null;
-            this.mnuExit.AccessibleName = null;
-            resources.ApplyResources(this.mnuExit, "mnuExit");
-            this.mnuExit.BackgroundImage = null;
-            this.mnuExit.Name = "mnuExit";
-            this.mnuExit.ShortcutKeyDisplayString = null;
-            this.mnuExit.Click += new System.EventHandler(this.mnuExit_Click);
-            // 
-            // editToolStripMenuItem
-            // 
-            this.editToolStripMenuItem.AccessibleDescription = null;
-            this.editToolStripMenuItem.AccessibleName = null;
-            resources.ApplyResources(this.editToolStripMenuItem, "editToolStripMenuItem");
-            this.editToolStripMenuItem.BackgroundImage = null;
-            this.editToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
-            this.mnuRemove});
-            this.editToolStripMenuItem.Name = "editToolStripMenuItem";
-            this.editToolStripMenuItem.ShortcutKeyDisplayString = null;
-            // 
-            // mnuRemove
-            // 
-            this.mnuRemove.AccessibleDescription = null;
-            this.mnuRemove.AccessibleName = null;
-            resources.ApplyResources(this.mnuRemove, "mnuRemove");
-            this.mnuRemove.BackgroundImage = null;
-            this.mnuRemove.Name = "mnuRemove";
-            this.mnuRemove.ShortcutKeyDisplayString = null;
-            this.mnuRemove.Click += new System.EventHandler(this.mnuRemove_Click);
-            // 
-            // toolsToolStripMenuItem
-            // 
-            this.toolsToolStripMenuItem.AccessibleDescription = null;
-            this.toolsToolStripMenuItem.AccessibleName = null;
-            resources.ApplyResources(this.toolsToolStripMenuItem, "toolsToolStripMenuItem");
-            this.toolsToolStripMenuItem.BackgroundImage = null;
-            this.toolsToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
-            this.toolManageDevices});
-            this.toolsToolStripMenuItem.Name = "toolsToolStripMenuItem";
-            this.toolsToolStripMenuItem.ShortcutKeyDisplayString = null;
-            // 
-            // toolManageDevices
-            // 
-            this.toolManageDevices.AccessibleDescription = null;
-            this.toolManageDevices.AccessibleName = null;
-            resources.ApplyResources(this.toolManageDevices, "toolManageDevices");
-            this.toolManageDevices.BackgroundImage = null;
-            this.toolManageDevices.Name = "toolManageDevices";
-            this.toolManageDevices.ShortcutKeyDisplayString = null;
-            this.toolManageDevices.Click += new System.EventHandler(this.toolManageDevices_Click);
-            // 
-            // helpToolStripMenuItem
-            // 
-            this.helpToolStripMenuItem.AccessibleDescription = null;
-            this.helpToolStripMenuItem.AccessibleName = null;
-            resources.ApplyResources(this.helpToolStripMenuItem, "helpToolStripMenuItem");
-            this.helpToolStripMenuItem.BackgroundImage = null;
-            this.helpToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
-            this.mnuWebsite,
-            this.toolStripMenuItem2,
-            this.mnuAbout});
-            this.helpToolStripMenuItem.Name = "helpToolStripMenuItem";
-            this.helpToolStripMenuItem.ShortcutKeyDisplayString = null;
-            // 
-            // mnuWebsite
-            // 
-            this.mnuWebsite.AccessibleDescription = null;
-            this.mnuWebsite.AccessibleName = null;
-            resources.ApplyResources(this.mnuWebsite, "mnuWebsite");
-            this.mnuWebsite.BackgroundImage = null;
-            this.mnuWebsite.Name = "mnuWebsite";
-            this.mnuWebsite.ShortcutKeyDisplayString = null;
-            this.mnuWebsite.Click += new System.EventHandler(this.mnuWebsite_Click);
-            // 
-            // toolStripMenuItem2
-            // 
-            this.toolStripMenuItem2.AccessibleDescription = null;
-            this.toolStripMenuItem2.AccessibleName = null;
-            resources.ApplyResources(this.toolStripMenuItem2, "toolStripMenuItem2");
-            this.toolStripMenuItem2.Name = "toolStripMenuItem2";
-            // 
-            // mnuAbout
-            // 
-            this.mnuAbout.AccessibleDescription = null;
-            this.mnuAbout.AccessibleName = null;
-            resources.ApplyResources(this.mnuAbout, "mnuAbout");
-            this.mnuAbout.BackgroundImage = null;
-            this.mnuAbout.Name = "mnuAbout";
-            this.mnuAbout.ShortcutKeyDisplayString = null;
-            this.mnuAbout.Click += new System.EventHandler(this.mnuAbout_Click);
-            // 
-            // toolStrip1
-            // 
-            this.toolStrip1.AccessibleDescription = null;
-            this.toolStrip1.AccessibleName = null;
-            resources.ApplyResources(this.toolStrip1, "toolStrip1");
-            this.toolStrip1.BackgroundImage = null;
-            this.toolStrip1.Font = null;
-            this.toolStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
-            this.toolNew,
-            this.toolEdit,
-            this.toolStripSeparator,
-            this.toolRemove});
-            this.toolStrip1.Name = "toolStrip1";
-            // 
-            // toolNew
-            // 
-            this.toolNew.AccessibleDescription = null;
-            this.toolNew.AccessibleName = null;
-            resources.ApplyResources(this.toolNew, "toolNew");
-            this.toolNew.BackgroundImage = null;
-            this.toolNew.Name = "toolNew";
-            this.toolNew.Click += new System.EventHandler(this.toolNew_Click);
-            // 
-            // toolEdit
-            // 
-            this.toolEdit.AccessibleDescription = null;
-            this.toolEdit.AccessibleName = null;
-            resources.ApplyResources(this.toolEdit, "toolEdit");
-            this.toolEdit.BackgroundImage = null;
-            this.toolEdit.Name = "toolEdit";
-            this.toolEdit.Click += new System.EventHandler(this.toolEdit_Click);
-            // 
-            // toolStripSeparator
-            // 
-            this.toolStripSeparator.AccessibleDescription = null;
-            this.toolStripSeparator.AccessibleName = null;
-            resources.ApplyResources(this.toolStripSeparator, "toolStripSeparator");
-            this.toolStripSeparator.Name = "toolStripSeparator";
-            // 
-            // toolRemove
-            // 
-            this.toolRemove.AccessibleDescription = null;
-            this.toolRemove.AccessibleName = null;
-            resources.ApplyResources(this.toolRemove, "toolRemove");
-            this.toolRemove.BackgroundImage = null;
-            this.toolRemove.Name = "toolRemove";
-            this.toolRemove.Click += new System.EventHandler(this.toolRemove_Click);
-            // 
-            // notifyIcon1
-            // 
-            resources.ApplyResources(this.notifyIcon1, "notifyIcon1");
-            this.notifyIcon1.Icon = null;
-            // 
-            // lvwCommon
-            // 
-            this.lvwCommon.AccessibleDescription = null;
-            this.lvwCommon.AccessibleName = null;
-            resources.ApplyResources(this.lvwCommon, "lvwCommon");
-            this.lvwCommon.BackgroundImage = null;
-            this.lvwCommon.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
-            this.columnHeader1,
-            this.columnHeader2,
-            this.columnHeader3});
-            this.lvwCommon.ContextMenuStrip = this.contextMenuStrip1;
-            this.lvwCommon.Font = null;
-            this.lvwCommon.FullRowSelect = true;
-            this.lvwCommon.Name = "lvwCommon";
-            this.lvwCommon.SmallImageList = this.imageList1;
-            this.lvwCommon.UseCompatibleStateImageBehavior = false;
-            this.lvwCommon.View = System.Windows.Forms.View.Details;
-            // 
-            // columnHeader1
-            // 
-            resources.ApplyResources(this.columnHeader1, "columnHeader1");
-            // 
-            // columnHeader2
-            // 
-            resources.ApplyResources(this.columnHeader2, "columnHeader2");
-            // 
-            // columnHeader3
-            // 
-            resources.ApplyResources(this.columnHeader3, "columnHeader3");
-            // 
-            // contextMenuStrip1
-            // 
-            this.contextMenuStrip1.AccessibleDescription = null;
-            this.contextMenuStrip1.AccessibleName = null;
-            resources.ApplyResources(this.contextMenuStrip1, "contextMenuStrip1");
-            this.contextMenuStrip1.BackgroundImage = null;
-            this.contextMenuStrip1.Font = null;
-            this.contextMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
-            this.cmdTurnOn,
-            this.cmdTurnOff});
-            this.contextMenuStrip1.Name = "contextMenuStrip1";
-            // 
-            // cmdTurnOn
-            // 
-            this.cmdTurnOn.AccessibleDescription = null;
-            this.cmdTurnOn.AccessibleName = null;
-            resources.ApplyResources(this.cmdTurnOn, "cmdTurnOn");
-            this.cmdTurnOn.BackgroundImage = null;
-            this.cmdTurnOn.Name = "cmdTurnOn";
-            this.cmdTurnOn.ShortcutKeyDisplayString = null;
-            this.cmdTurnOn.Click += new System.EventHandler(this.cmdTurnOn_Click);
-            // 
-            // cmdTurnOff
-            // 
-            this.cmdTurnOff.AccessibleDescription = null;
-            this.cmdTurnOff.AccessibleName = null;
-            resources.ApplyResources(this.cmdTurnOff, "cmdTurnOff");
-            this.cmdTurnOff.BackgroundImage = null;
-            this.cmdTurnOff.Name = "cmdTurnOff";
-            this.cmdTurnOff.ShortcutKeyDisplayString = null;
-            this.cmdTurnOff.Click += new System.EventHandler(this.cmdTurnOff_Click);
-            // 
-            // imageList1
-            // 
-            this.imageList1.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imageList1.ImageStream")));
-            this.imageList1.TransparentColor = System.Drawing.Color.Transparent;
-            this.imageList1.Images.SetKeyName(0, "");
-            this.imageList1.Images.SetKeyName(1, "");
-            this.imageList1.Images.SetKeyName(2, "IDI_ICON1.png");
-            this.imageList1.Images.SetKeyName(3, "Alarm-005.png");
-            // 
-            // tabControl1
-            // 
-            this.tabControl1.AccessibleDescription = null;
-            this.tabControl1.AccessibleName = null;
-            resources.ApplyResources(this.tabControl1, "tabControl1");
-            this.tabControl1.BackgroundImage = null;
-            this.tabControl1.Controls.Add(this.tabPage3);
-            this.tabControl1.Controls.Add(this.tabPage1);
-            this.tabControl1.Controls.Add(this.tabPage2);
-            this.tabControl1.Font = null;
-            this.tabControl1.Name = "tabControl1";
-            this.tabControl1.SelectedIndex = 0;
-            this.tabControl1.SelectedIndexChanged += new System.EventHandler(this.tabControl1_SelectedIndexChanged);
-            // 
-            // tabPage3
-            // 
-            this.tabPage3.AccessibleDescription = null;
-            this.tabPage3.AccessibleName = null;
-            resources.ApplyResources(this.tabPage3, "tabPage3");
-            this.tabPage3.BackgroundImage = null;
-            this.tabPage3.Controls.Add(this.pictureBox3);
-            this.tabPage3.Controls.Add(this.label5);
-            this.tabPage3.Controls.Add(this.linkLabel2);
-            this.tabPage3.Controls.Add(this.label6);
-            this.tabPage3.Controls.Add(this.pictureBox2);
-            this.tabPage3.Controls.Add(this.label4);
-            this.tabPage3.Controls.Add(this.label3);
-            this.tabPage3.Controls.Add(this.linkLabel1);
-            this.tabPage3.Controls.Add(this.label2);
-            this.tabPage3.Controls.Add(this.pictureBox1);
-            this.tabPage3.Controls.Add(this.label1);
-            this.tabPage3.Font = null;
-            this.tabPage3.Name = "tabPage3";
-            this.tabPage3.UseVisualStyleBackColor = true;
-            // 
-            // pictureBox3
-            // 
-            this.pictureBox3.AccessibleDescription = null;
-            this.pictureBox3.AccessibleName = null;
-            resources.ApplyResources(this.pictureBox3, "pictureBox3");
-            this.pictureBox3.BackgroundImage = null;
-            this.pictureBox3.Font = null;
-            this.pictureBox3.ImageLocation = null;
-            this.pictureBox3.Name = "pictureBox3";
-            this.pictureBox3.TabStop = false;
-            // 
-            // label5
-            // 
-            this.label5.AccessibleDescription = null;
-            this.label5.AccessibleName = null;
-            resources.ApplyResources(this.label5, "label5");
-            this.label5.Font = null;
-            this.label5.Name = "label5";
-            // 
-            // linkLabel2
-            // 
-            this.linkLabel2.AccessibleDescription = null;
-            this.linkLabel2.AccessibleName = null;
-            resources.ApplyResources(this.linkLabel2, "linkLabel2");
-            this.linkLabel2.Font = null;
-            this.linkLabel2.Name = "linkLabel2";
-            this.linkLabel2.TabStop = true;
-            this.linkLabel2.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkLabel2_LinkClicked);
-            // 
-            // label6
-            // 
-            this.label6.AccessibleDescription = null;
-            this.label6.AccessibleName = null;
-            resources.ApplyResources(this.label6, "label6");
-            this.label6.Name = "label6";
-            // 
-            // pictureBox2
-            // 
-            this.pictureBox2.AccessibleDescription = null;
-            this.pictureBox2.AccessibleName = null;
-            resources.ApplyResources(this.pictureBox2, "pictureBox2");
-            this.pictureBox2.BackgroundImage = null;
-            this.pictureBox2.Font = null;
-            this.pictureBox2.ImageLocation = null;
-            this.pictureBox2.Name = "pictureBox2";
-            this.pictureBox2.TabStop = false;
-            // 
-            // label4
-            // 
-            this.label4.AccessibleDescription = null;
-            this.label4.AccessibleName = null;
-            resources.ApplyResources(this.label4, "label4");
-            this.label4.Font = null;
-            this.label4.Name = "label4";
-            // 
-            // label3
-            // 
-            this.label3.AccessibleDescription = null;
-            this.label3.AccessibleName = null;
-            resources.ApplyResources(this.label3, "label3");
-            this.label3.Font = null;
-            this.label3.Name = "label3";
-            // 
-            // linkLabel1
-            // 
-            this.linkLabel1.AccessibleDescription = null;
-            this.linkLabel1.AccessibleName = null;
-            resources.ApplyResources(this.linkLabel1, "linkLabel1");
-            this.linkLabel1.Font = null;
-            this.linkLabel1.Name = "linkLabel1";
-            this.linkLabel1.TabStop = true;
-            this.linkLabel1.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkLabel1_LinkClicked);
-            // 
-            // label2
-            // 
-            this.label2.AccessibleDescription = null;
-            this.label2.AccessibleName = null;
-            resources.ApplyResources(this.label2, "label2");
-            this.label2.Name = "label2";
-            // 
-            // pictureBox1
-            // 
-            this.pictureBox1.AccessibleDescription = null;
-            this.pictureBox1.AccessibleName = null;
-            resources.ApplyResources(this.pictureBox1, "pictureBox1");
-            this.pictureBox1.BackgroundImage = null;
-            this.pictureBox1.Font = null;
-            this.pictureBox1.ImageLocation = null;
-            this.pictureBox1.Name = "pictureBox1";
-            this.pictureBox1.TabStop = false;
-            // 
-            // label1
-            // 
-            this.label1.AccessibleDescription = null;
-            this.label1.AccessibleName = null;
-            resources.ApplyResources(this.label1, "label1");
-            this.label1.Name = "label1";
-            // 
-            // tabPage1
-            // 
-            this.tabPage1.AccessibleDescription = null;
-            this.tabPage1.AccessibleName = null;
-            resources.ApplyResources(this.tabPage1, "tabPage1");
-            this.tabPage1.BackgroundImage = null;
-            this.tabPage1.Controls.Add(this.lvwCommon);
-            this.tabPage1.Font = null;
-            this.tabPage1.Name = "tabPage1";
-            this.tabPage1.UseVisualStyleBackColor = true;
-            // 
-            // tabPage2
-            // 
-            this.tabPage2.AccessibleDescription = null;
-            this.tabPage2.AccessibleName = null;
-            resources.ApplyResources(this.tabPage2, "tabPage2");
-            this.tabPage2.BackgroundImage = null;
-            this.tabPage2.Controls.Add(this.lvwTasks);
-            this.tabPage2.Font = null;
-            this.tabPage2.Name = "tabPage2";
-            this.tabPage2.UseVisualStyleBackColor = true;
-            // 
-            // lvwTasks
-            // 
-            this.lvwTasks.AccessibleDescription = null;
-            this.lvwTasks.AccessibleName = null;
-            resources.ApplyResources(this.lvwTasks, "lvwTasks");
-            this.lvwTasks.BackgroundImage = null;
-            this.lvwTasks.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
-            this.columnHeader4,
-            this.columnHeader5,
-            this.columnHeader6,
-            this.columnHeader7});
-            this.lvwTasks.ContextMenuStrip = this.contextMenuStrip2;
-            this.lvwTasks.Font = null;
-            this.lvwTasks.FullRowSelect = true;
-            this.lvwTasks.MultiSelect = false;
-            this.lvwTasks.Name = "lvwTasks";
-            this.lvwTasks.SmallImageList = this.imageList1;
-            this.lvwTasks.UseCompatibleStateImageBehavior = false;
-            this.lvwTasks.View = System.Windows.Forms.View.Details;
-            // 
-            // columnHeader4
-            // 
-            resources.ApplyResources(this.columnHeader4, "columnHeader4");
-            // 
-            // columnHeader5
-            // 
-            resources.ApplyResources(this.columnHeader5, "columnHeader5");
-            // 
-            // columnHeader6
-            // 
-            resources.ApplyResources(this.columnHeader6, "columnHeader6");
-            // 
-            // columnHeader7
-            // 
-            resources.ApplyResources(this.columnHeader7, "columnHeader7");
-            // 
-            // contextMenuStrip2
-            // 
-            this.contextMenuStrip2.AccessibleDescription = null;
-            this.contextMenuStrip2.AccessibleName = null;
-            resources.ApplyResources(this.contextMenuStrip2, "contextMenuStrip2");
-            this.contextMenuStrip2.BackgroundImage = null;
-            this.contextMenuStrip2.Font = null;
-            this.contextMenuStrip2.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
-            this.mnuRunTask});
-            this.contextMenuStrip2.Name = "contextMenuStrip2";
-            // 
-            // mnuRunTask
-            // 
-            this.mnuRunTask.AccessibleDescription = null;
-            this.mnuRunTask.AccessibleName = null;
-            resources.ApplyResources(this.mnuRunTask, "mnuRunTask");
-            this.mnuRunTask.BackgroundImage = null;
-            this.mnuRunTask.Name = "mnuRunTask";
-            this.mnuRunTask.ShortcutKeyDisplayString = null;
-            this.mnuRunTask.Click += new System.EventHandler(this.mnuRunTask_Click);
-            // 
-            // frmMain
-            // 
-            this.AccessibleDescription = null;
-            this.AccessibleName = null;
-            resources.ApplyResources(this, "$this");
-            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
-            this.BackgroundImage = null;
-            this.Controls.Add(this.tabControl1);
-            this.Controls.Add(this.toolStrip1);
-            this.Controls.Add(this.statusStrip1);
-            this.Controls.Add(this.menuStrip1);
-            this.Font = null;
-            this.MainMenuStrip = this.menuStrip1;
-            this.Name = "frmMain";
-            this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.frmMain_FormClosing);
-            this.Load += new System.EventHandler(this.frmMain_Load);
-            this.menuStrip1.ResumeLayout(false);
-            this.menuStrip1.PerformLayout();
-            this.toolStrip1.ResumeLayout(false);
-            this.toolStrip1.PerformLayout();
-            this.contextMenuStrip1.ResumeLayout(false);
-            this.tabControl1.ResumeLayout(false);
-            this.tabPage3.ResumeLayout(false);
-            this.tabPage3.PerformLayout();
-            ((System.ComponentModel.ISupportInitialize)(this.pictureBox3)).EndInit();
-            ((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).EndInit();
-            ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit();
-            this.tabPage1.ResumeLayout(false);
-            this.tabPage2.ResumeLayout(false);
-            this.contextMenuStrip2.ResumeLayout(false);
-            this.ResumeLayout(false);
-            this.PerformLayout();
-
-        }
-
-        #endregion
-
-        private System.Windows.Forms.StatusStrip statusStrip1;
-        private System.Windows.Forms.MenuStrip menuStrip1;
-        private System.Windows.Forms.ToolStrip toolStrip1;
-        private System.Windows.Forms.ToolStripButton toolNew;
-        private System.Windows.Forms.ToolStripButton toolRemove;
-        private System.Windows.Forms.ToolStripButton toolEdit;
-        private System.Windows.Forms.ToolStripSeparator toolStripSeparator;
-        private System.Windows.Forms.ToolStripMenuItem fileToolStripMenuItem;
-        private System.Windows.Forms.ToolStripMenuItem editToolStripMenuItem;
-        private System.Windows.Forms.ToolStripMenuItem toolsToolStripMenuItem;
-        private System.Windows.Forms.ToolStripMenuItem helpToolStripMenuItem;
-        private System.Windows.Forms.NotifyIcon notifyIcon1;
-        private System.Windows.Forms.ListView lvwCommon;
-        private System.Windows.Forms.ColumnHeader columnHeader1;
-        private System.Windows.Forms.ColumnHeader columnHeader2;
-        private System.Windows.Forms.ColumnHeader columnHeader3;
-        private System.Windows.Forms.ImageList imageList1;
-        private System.Windows.Forms.ToolStripMenuItem newToolStripMenuItem;
-        private System.Windows.Forms.ToolStripSeparator toolStripMenuItem1;
-        private System.Windows.Forms.ToolStripMenuItem mnuExit;
-        private System.Windows.Forms.ToolStripMenuItem mnuNew;
-        private System.Windows.Forms.ToolStripMenuItem mnuAbout;
-        private System.Windows.Forms.TabControl tabControl1;
-        private System.Windows.Forms.TabPage tabPage1;
-        private System.Windows.Forms.TabPage tabPage2;
-        private System.Windows.Forms.ContextMenuStrip contextMenuStrip1;
-        private System.Windows.Forms.ToolStripMenuItem cmdTurnOn;
-        private System.Windows.Forms.ToolStripMenuItem cmdTurnOff;
-        private System.Windows.Forms.ToolStripMenuItem toolManageDevices;
-        private System.Windows.Forms.ListView lvwTasks;
-        private System.Windows.Forms.ColumnHeader columnHeader4;
-        private System.Windows.Forms.ColumnHeader columnHeader5;
-        private System.Windows.Forms.ColumnHeader columnHeader6;
-        private System.Windows.Forms.ColumnHeader columnHeader7;
-        private System.Windows.Forms.ToolStripMenuItem mnuRemove;
-        private System.Windows.Forms.TabPage tabPage3;
-        private System.Windows.Forms.Label label4;
-        private System.Windows.Forms.Label label3;
-        private System.Windows.Forms.LinkLabel linkLabel1;
-        private System.Windows.Forms.Label label2;
-        private System.Windows.Forms.PictureBox pictureBox1;
-        private System.Windows.Forms.Label label1;
-        private System.Windows.Forms.Label label5;
-        private System.Windows.Forms.LinkLabel linkLabel2;
-        private System.Windows.Forms.Label label6;
-        private System.Windows.Forms.PictureBox pictureBox2;
-        private System.Windows.Forms.ContextMenuStrip contextMenuStrip2;
-        private System.Windows.Forms.ToolStripMenuItem mnuRunTask;
-        private System.Windows.Forms.ToolStripMenuItem mnuWebsite;
-        private System.Windows.Forms.ToolStripSeparator toolStripMenuItem2;
-        private System.Windows.Forms.PictureBox pictureBox3;
-    }
-}
-
diff --git a/scheduler/DeviceScheduler/frmMain.cs b/scheduler/DeviceScheduler/frmMain.cs
deleted file mode 100644
index af5aad12..00000000
--- a/scheduler/DeviceScheduler/frmMain.cs
+++ /dev/null
@@ -1,430 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.ComponentModel;
-using System.Data;
-using System.Drawing;
-using System.Text;
-using System.Windows.Forms;
-using Microsoft.Win32;
-using TaskScheduler;
-
-namespace DeviceScheduler
-{
-    public partial class frmMain : Form
-    {
-        public frmMain()
-        {
-            Localization.GetSelectedLanguage();
-            Localization.ChangeLanguage();
-            Localization.Assembly = this.GetType().Assembly;
-            InitializeComponent();
-        }
-        private TaskScheduler.ScheduledTasks m_Tasks = null;
-        private DataStorage m_Data = null;
-
-        private bool ShowSplash()
-        {
-            string[] cmds = Environment.GetCommandLineArgs();
-
-            foreach (string cmd in cmds)
-            {
-                if (cmd.ToLower() == "/nosplash")
-                    return false;
-            }
-
-            return true;
-        }
-
-       
-        private void frmMain_Load(object sender, EventArgs e)
-        {
-            Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
-            
-            frmSplash frm = null;
-            bool splash = ShowSplash();
-
-            if (splash)
-            {
-                frm = new frmSplash();
-                frm.TopMost = true;
-                frm.ShowDialog(this);
-            }
-
-           
-
-            SetupListViewDevices();
-            m_Tasks = new ScheduledTasks();
-
-            LoadData();
-            LoadTasks();
-
-            if (splash)
-            {
-                frm.TopMost = false;
-                frm.Close();
-            }
-
-            if (IsPasswordPrincipalActive())
-            {
-                if (ShowAskSecurityPolicy())
-                {
-                    frmAskSecurityPolicy policy = new frmAskSecurityPolicy();
-                    DialogResult result = policy.ShowDialog(this);
-
-                    policy.Close();
-                }
-            }
-        }
-
-        private bool ShowAskSecurityPolicy()
-        {
-            RegistryKey key = null;
-            bool blnReturn = true;
-            try
-            {
-                key = Registry.CurrentUser.CreateSubKey(@"Software\Telldus\Scheduler\Settings");
-                if (key != null)
-                {
-                    if (key.GetValue("AskSecurityPolicy") != null)
-                    {
-                        blnReturn = Convert.ToBoolean(key.GetValue("AskSecurityPolicy"));
-                    }
-                }
-            }
-            catch
-            {
-                throw;
-            }
-            finally
-            {
-                if (key != null)
-                    key.Close();
-            }
-
-            return blnReturn;
-        }
-       
-
-        //private void DisablePasswordPolicy()
-        //{
-        //    RegistryKey key = Registry.LocalMachine.OpenSubKey(@"SYSTEM\CurrentControlSet\Control\Lsa");
-        //    key.SetValue("LimitBlankPasswordUse", 0);
-        //    key.Close();
-
-        //}
-
-        private bool IsPasswordPrincipalActive()
-        {
-            RegistryKey key = Registry.LocalMachine.OpenSubKey(@"SYSTEM\CurrentControlSet\Control\Lsa");
-            bool result = Convert.ToBoolean(key.GetValue("LimitBlankPasswordUse"));
-            key.Close();
-
-            return result;
-
-        }
-
-        /// 
-        /// Handles unexpected errors. All roads lead here...
-        /// 
-        /// 
-        /// 
-        void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
-        {
-            MessageBox.Show("Ett ohanterat fel har uppstått i programmet."+Environment.NewLine+e.Exception.Message,
-                "", MessageBoxButtons.OK, MessageBoxIcon.Error);
-        }
-
-        private void LoadData()
-        {
-            string path = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
-            //string path = System.IO.Path.GetDirectoryName(Application.ExecutablePath);
-            path = System.IO.Path.Combine(path, "Jobs.dat");
-
-            m_Data = new DataStorage();
-
-            if (System.IO.File.Exists(path))
-            {
-                m_Data.ReadXml(path, XmlReadMode.ReadSchema);
-            }
-        }
-
-        private void SetupListViewDevices()
-        {
-            lvwCommon.Items.Clear();
-
-            Program.DeviceHandler.Load();
-
-            foreach(DeviceHandler.Device dev in Program.DeviceHandler.Devices)
-            {
-                ListViewItem item = lvwCommon.Items.Add(dev.Name,2);
-                item.SubItems.Add(dev.ID.ToString());
-                item.SubItems.Add(dev.Protocol);
-                item.Tag = dev;
-            }
-        }
-
-       
-
-        private void mnuAbout_Click(object sender, EventArgs e)
-        {
-            frmAbout frm = new frmAbout();
-            frm.ShowDialog(this);
-        }
-
-        private void cmdTurnOn_Click(object sender, EventArgs e)
-        {
-
-            if (lvwCommon.SelectedItems.Count == 1)
-            {
-                DeviceHandler.Device item = (DeviceHandler.Device)lvwCommon.SelectedItems[0].Tag;
-                Program.DeviceHandler.TurnOn(item);
-                return;
-            }
-
-            foreach (ListViewItem lvwItem in lvwCommon.SelectedItems)
-            {
-                DeviceHandler.Device item = (DeviceHandler.Device)lvwItem.Tag;
-                Program.DeviceHandler.TurnOnWithDelay(item);
-            }
-        }
-
-        private void cmdTurnOff_Click(object sender, EventArgs e)
-        {
-            if (lvwCommon.SelectedItems.Count == 1)
-            {
-                DeviceHandler.Device item = (DeviceHandler.Device)lvwCommon.SelectedItems[0].Tag;
-                Program.DeviceHandler.TurnOff(item);
-                return;
-            }
-
-            foreach (ListViewItem lvwItem in lvwCommon.SelectedItems)
-            {
-                DeviceHandler.Device item = (DeviceHandler.Device)lvwItem.Tag;
-                Program.DeviceHandler.TurnOffWithDelay(item);
-            }
-        }
-
-        private void ConfigUnits()
-        {
-            RegistryKey key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Telldus");
-			if (key == null)
-			{
-				key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\Telldus");	//64 bit (windows 7)
-			}
-			if (key != null)
-			{
-				string path = key.GetValue("UninstallString").ToString();
-
-				path = System.IO.Path.GetDirectoryName(path);
-
-				Cursor = Cursors.WaitCursor;
-
-				System.Diagnostics.Process proc = new System.Diagnostics.Process();
-				string filename = System.IO.Path.Combine(path, "TelldusCenter.exe");
-				proc.StartInfo.FileName = filename;
-				proc.StartInfo.WorkingDirectory = path;
-				proc.Start();
-
-
-				Cursor = Cursors.Default;
-			}
-			else
-			{
-				MessageBox.Show("Path to TelldusCenter.exe cannot be found in Windows Registry. Please open TelldusCenter manually to configure devices.",
-			   "", MessageBoxButtons.OK, MessageBoxIcon.Error);
-			}
-        }
-
-        private void toolManageDevices_Click(object sender, EventArgs e)
-        {
-            ConfigUnits();
-        }
-
-        private void LoadTasks()
-        {
-            
-            //Clear listview of tasks
-            lvwTasks.Items.Clear();
-
-            foreach (string item in m_Tasks.GetTaskNames())
-            {
-                Task task = m_Tasks.OpenTask(item);
-                if(task != null)
-                {
-                    if (task.Creator.ToLower().Contains("telldus"))
-                    {
-                        DataStorage.JobRow job = m_Data.Job.FindByID(Convert.ToInt32(task.Parameters));
-
-                        if (job != null)
-                        {
-                            ListViewItem lvwItem = lvwTasks.Items.Add(task.Name, 3);
-                            lvwItem.SubItems.Add(Convert.ToDateTime(job.StartTime).ToShortTimeString());
-                            lvwItem.SubItems.Add(task.Triggers[0].BeginDate.ToShortDateString());
-                            lvwItem.SubItems.Add(task.Comment);
-                            lvwItem.Tag = task;
-                        }
-                        else
-                        {
-                            //Den schemalagda uppgiften / kunde inte hittas i systemet och har förmodligen tagits bort manuellt.
-                            MessageBox.Show(Localization.GetString("thescheduledtask") + " " + task.Name + " " + Localization.GetString("couldnotbefoundprobablygone"), Localization.GetString("telldusscheduler"), MessageBoxButtons.OK, MessageBoxIcon.Error);
-                            m_Tasks.DeleteTask(task.Name);
-                        }
-                    }
-                    task.Close();
-                }
-            }
-        }
-        
-        private void toolNew_Click(object sender, EventArgs e)
-        {
-            CreateSchedule();
-        }
-
-        private void CreateSchedule()
-        {
-            frmSchedule frm = new frmSchedule(m_Data, m_Tasks, null, true);
-            DialogResult result = frm.ShowDialog(this);
-
-            if (result == DialogResult.OK)
-            {
-                SaveDataStorage();
-                LoadTasks();
-            }
-            frm.Close();
-        }
-
-        private void mnuExit_Click(object sender, EventArgs e)
-        {
-            SaveDataStorage();
-            Application.Exit();
-        }
-
-        private void toolRemove_Click(object sender, EventArgs e)
-        {
-            RemoveSchedule();
-        }
-
-        private void RemoveSchedule()
-        {
-            if (lvwTasks.SelectedItems.Count == 0) { return; }
-
-            //"Vill du ta bort markerad schemaläggning?"
-            DialogResult result = MessageBox.Show(Localization.GetString("msg2"),
-                Localization.GetString("telldusscheduler"), MessageBoxButtons.YesNo, MessageBoxIcon.Question);
-
-            if (result == DialogResult.Yes)
-            {
-
-                foreach (ListViewItem item in lvwTasks.SelectedItems)
-                {
-                    Task task = m_Tasks.OpenTask(item.SubItems[0].Text);
-                    int id = Convert.ToInt32(task.Parameters);
-                    task.Close();
-
-                    //First remove the task from windows scheduling
-                    bool result2 = m_Tasks.DeleteTask(item.SubItems[0].Text);
-
-                    //Second remove the entry from the Job table in the datastorage.
-                    DataStorage.JobRow job = m_Data.Job.FindByID(id);
-                    
-                    //Third remove all JobActions
-                    DataStorage.JobActionsRow[] actions = m_Data.JobActions.Select("JobID=" + job.ID.ToString()) as DataStorage.JobActionsRow[];
-
-                    foreach (DataStorage.JobActionsRow action in actions)
-                    {
-                        action.Delete();
-                    }
-
-                    //Forth remove the job
-                    if (job != null)
-                        job.Delete();
-
-                    //Fifth remove the entry from the listview.
-                    lvwTasks.Items.Remove(item);
-                }
-
-                m_Data.AcceptChanges();
-            }
-        }
-
-        private void frmMain_FormClosing(object sender, FormClosingEventArgs e)
-        {
-            SaveDataStorage();
-        }
-
-        private void SaveDataStorage()
-        {
-            string path = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
-
-            //string path = System.IO.Path.GetDirectoryName(Application.ExecutablePath);
-            path = System.IO.Path.Combine(path, "Jobs.dat");
-
-            m_Data.WriteXml(path, XmlWriteMode.WriteSchema);
-        }
-
-        private void mnuRunTask_Click(object sender, EventArgs e)
-        {
-            if (lvwTasks.SelectedItems.Count == 0) { return; }
-            Task item = m_Tasks.OpenTask(lvwTasks.SelectedItems[0].Text);
-            
-            item.Run();
-        }
-
-        private void toolEdit_Click(object sender, EventArgs e)
-        {
-            if (lvwTasks.SelectedItems.Count == 0) { return; }
-
-            Task task = m_Tasks.OpenTask(lvwTasks.SelectedItems[0].Text);
-            DataStorage.JobRow job = m_Data.Job.FindByID(Convert.ToInt32(task.Parameters));
-            task.Close();
-
-            frmSchedule frm = new frmSchedule(m_Data, m_Tasks, job, false);
-            DialogResult result = frm.ShowDialog(this);
-
-            if (result == DialogResult.OK)
-            {
-                //Reload all tasks
-                LoadTasks();
-            }
-
-            frm.Close();
-
-        }
-
-        private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
-        {
-            CreateSchedule();
-        }
-
-        private void linkLabel2_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
-        {
-            ConfigUnits();
-        }
-
-        private void mnuWebsite_Click(object sender, EventArgs e)
-        {
-            System.Diagnostics.Process proc = new System.Diagnostics.Process();
-
-            proc.StartInfo.FileName = "http://www.telldus.se";
-            proc.StartInfo.UseShellExecute = true;
-            proc.Start();
-        }
-
-        private void mnuNew_Click(object sender, EventArgs e)
-        {
-            CreateSchedule();
-        }
-
-        private void mnuRemove_Click(object sender, EventArgs e)
-        {
-            RemoveSchedule();
-        }
-
-        private void tabControl1_SelectedIndexChanged(object sender, EventArgs e)
-        {
-            if (tabControl1.SelectedIndex == 1)
-                SetupListViewDevices();
-        }
-        
-    }
-}
\ No newline at end of file
diff --git a/scheduler/DeviceScheduler/frmMain.en.resx b/scheduler/DeviceScheduler/frmMain.en.resx
deleted file mode 100644
index 1c13bc08..00000000
--- a/scheduler/DeviceScheduler/frmMain.en.resx
+++ /dev/null
@@ -1,3264 +0,0 @@
-
-
-  
-  
-    
-    
-      
-        
-          
-            
-              
-                
-              
-              
-              
-              
-              
-            
-          
-          
-            
-              
-              
-            
-          
-          
-            
-              
-                
-                
-              
-              
-              
-              
-              
-            
-          
-          
-            
-              
-                
-              
-              
-            
-          
-        
-      
-    
-  
-  
-    text/microsoft-resx
-  
-  
-    2.0
-  
-  
-    System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-  
-    
-        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
-        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAA01JREFUOE91U2tI
-        k2EUXnQFG1Ysi+5REfTDGEQJSRD+qWEGYkVChe7HlHU3c7RuFrIoK3Jpm0NikhfYJrqt3OalOafbbE3d
-        pruY07lZc1NLnZmYe/r2QUVWBw68533PeTjnfZ5DoSwwsVi8xePx5I+NjbVNTk5+nJqaCoyPj5vtdvtT
-        qVS6d2H+rzg9PX2RRqO5HQyNfPOFvLAOdcL4oRWtrma0u1tg83ZhOOCP2Gy2lyKRKOYvILlcLvZ+HISh
-        TwetS4MWdwPaP2ih62uEoluCyo4ylLcJ8c5pgMPhMJSUlPwGkclkWZ6hfqjtCiisEtR0VsA+1IWfprbV
-        Iq8uE+elp5BdfQJKUw0sFouQ7CIlJWWZy+UKqLprUWkphfjdc4gMj9DmbEIkEiG9sOEq9vOXYF/RYtCf
-        LcaBQhp6nPbvPB5vB4XD4SQN+j0QGB9A2VONrmEj6l2VcH3qxuzsLMLhMNqdGlSaHqPC9AQs2UEkli1F
-        tV4EhUKRRykuLr5k6TeBZzyPVrcKc3NzmJmZwcTEBEZHRzEyMkJ6MBgkY4H+Ko7XrABfewN6vV5CKSoq
-        4pj723H27R5IDWUgKITb7YbX6yULQ6EQfD4feUdQidK3V8BsXoky4x3odLpaygXChkd9YKhicPLNGmTI
-        1+Pi6w1Qd5SD0AIJIjNwUaDZgnz1ZtzUxeGyYRVaXHXREcopCQkJxwih4K7+NM6YqWB3rsZN61o0vBdj
-        YGCAdKWVg1LnJhQ7NuJhz3oChI7w1zAKCgruU2g0GlUikXwZHvOCSYzB6lyH69ZNqDe9gt/vRyAQwJue
-        fDx37sZTxy7cMu5EB6ER4i2SlJSUSFLJYDDuRecbDPbhctNRnNNvB7suETmSI8iTMnCj6SC45r3IUSdA
-        rq8g/0koFDbFxcUtIgGoVOoKNpvdrNVqMT09jcZeOR60XMQ19XHkqJJxp/4cXrzmQd2ogslkglKp9MbH
-        x2/9Q86xsbExaWlp5QKBYN5sNpPtR6mLMtDb2wuVShUtjBAS7qDT6dv+uVQsFouWmZlZyOVyA3w+f76q
-        qipCyDxCbOh8bm7u5+zsbAmRE//fjYw+JCcnL8nIyNiYlZV1iEhOizpxPsxkMrelpqYuX1j8A/bFYLQi
-        FLFKAAAAAElFTkSuQmCC
-
-  
-  
-    131, 22
-  
-  
-    Schedule...
-  
-  
-    98, 22
-  
-  
-    &New
-  
-  
-    95, 6
-  
-  
-    98, 22
-  
-  
-    &Exit
-  
-  
-    37, 20
-  
-  
-    &File
-  
-  
-    
-        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
-        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAA2RJREFUOE91U2tM
-        k2cUrsniXBDR2NQYI2D8IxKrTI1kGi+ri5EAKtYlq1sYoAI2ZH9EG0mMsDA2syhCIDSoBDQS0nKxRS1t
-        qVBqsaWgpdiWYr9evnL52nIZKIEBffz6/dCIepKTvG/e8zznvHmew2Iti9ra2miCIArHx8efT09Pj8zM
-        zIxNTEyYBgYGbkml0p3L6z/cBQLBCqVSeS1AUXOTXg/GzC9B6rvg6dTAq+vEaP8rUMO+kMViqamuro74
-        jEgmk9WOut0gn2vhbVfC0/YYLnkznE0NcDTch/3+XVjuiUEYXsBms3VXVlZ+JGlsbMzxOZ1wPpHDo1Jg
-        NhiAV62AvUYMa9VtEC0S/OdyoudaPp5l/AyzrAl9fX1iZorU1NSVg4ODY4Otj2Cru4tpGhyOpcVFWG//
-        hd5L57AwN4f5+XlQbhca4zl4GMeB4/XAYklJyVaWSCTijbgIvCr9B+YbRdAXXobfRyIUCmFh4X/MvnuH
-        qakpDJMkVOdPon3bd3i8dRV66+5ALpdfYVVUVPzhNhlhFOVBc3wvVHERUKfuATU6AloJ+P1+UBQF48UU
-        OA5EwbxvDXQ7V6Pn7wLodDoJq6ysTOQ26KE8sgNtcauh37MWQzWlDCicgUAAwWAQo5pHoE5vAfnTelj2
-        r4O5tBBarbaFlUfHBD1yy7Y10Hy/HkOSGqZrGOSxv0a/Vg03rY7L5YLP2Al/+i684bFBKGXhL9SxEhMT
-        U2ijQCs8i/bEjTDKpExne48e5IV9CP4ejz5FM0PqHbLDdf4H9At2Y/btWxQXF//JYrPZkRKJZGqS9EDF
-        2w7toc1Q37wO+6+7MPtLDObOxiKQHo/ehjtwCH8EcWoLiC4VfD5fiMfjHWCkTEpKKqKtiiAxhGeCo+je
-        vwG2Y5vgTomG71QMhul0n4iGkc/FC+kD0FaHWCxu53A4KxiCyMjIVUKhUNPR0cHI5njajO6rF9CVzkPX
-        b4fRmXcGyltFULcpYDAY0Nra6uFyuTGf2DkqKiqCz+fXVVVVLZlMpvCIzL9JWn+r1QqFQhEGhmgLGxMS
-        EmK/uFTZ2dnszMzMfwsKCsbKy8uX6uvrQ7TNQ/SGLuXn50/m5uZK6BruVzcy/JCcnPxNRkbGppycnIN0
-        MT+c9PlIVlZWbFpa2rfLwe8BECxb5G8PU2sAAAAASUVORK5CYII=
-
-  
-  
-    117, 22
-  
-  
-    &Remove
-  
-  
-    39, 20
-  
-  
-    &Edit
-  
-  
-    
-        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
-        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAidJREFUOE9jYICC
-        3HnFii3bJ1rD+CTRst58Mnnr0z+vebrrb/7qbHtCmtesWWOyfv16Ebg6XhMmMYtqhfdVO7P+N+8vvRfS
-        4smLbkhnZ6fdtWvXPA8ePLjk1atXb/bt25ezYsUKf7g6pRi2iKApev96T9T9b9iVNwvdgOnTp3fs3r37
-        /927d/+fOHHi2OnTp2+cO3euGEWdaaHA/Py1gf+nnWv6V74+1RNZ8tChQxeqKsv/AzX9f/To0f/nz5//
-        nzdvXjCKAcKWLDweLXK3Og8X/O873nIXJrl27dqkY8eO/Tty5Mifixcv/lywYMGJ+Pj4RKxhpRjAaeTb
-        Zf0uZ0Pxn7yZJaJTpkxJ2rlz529goN2NjIwMERYWFiIUyAxybnLsBuE6C+avWHDk5MmT/4Chvt/JyUmQ
-        oEaYgsysTObVa1ZPP3DgwH+g7XttbGy4iNacn5/PBQzhjR8/fvy/ZcuWncuBoKSkhJmQAYxABVyKiory
-        27ZtO/ny5UuQ5q0WFhYcVlZWFqtXr66QkpICqcEN7O3tzZcuXfrk6tWr/ydPnrxHTk6OG6haFIhl3d3d
-        24yNjb2BbHGsJgBTlPOuXbteAuP6/8yZM09ycXHJABWqQrEIGxsbd29v75G8vDwjrAbs2bNnWWxsrA8w
-        tO/x8/PrAxXxAzHI3yBn8wCxNNArDWfOnDmC1QCQ85KTk2cANZsCFTBhUQQyiM/Q0DCYg4ODjVCAkiQP
-        ADBk5tzXJg/8AAAAAElFTkSuQmCC
-
-  
-  
-    165, 22
-  
-  
-    &Configure units...
-  
-  
-    48, 20
-  
-  
-    &Tools
-  
-  
-    
-        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
-        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAt1JREFUOE+V030s
-        1HEcB/DfeUrDsd1wtNap8xTNnIcjj5vCRIfWZfOUKKeIowcP1ehhkTxlidrE1GweNg8RFksoD5kwI+c0
-        PUhUl4c7ws+7a23MUOv7z2ef7z6f13ff7fOhEJucwOoc+k42w3FuQVGru2V2amV+YKAtJL5ns9p1d0a8
-        QqXAEnHWjW7xYvbQNFIFkzheO4f9pa0r5iXp7cyMMOstEbNrRbTQBlFv7SiJwW8k3k1L43cS9WMkkl4u
-        wfaxAHLcComcTbr7BsSY70IJ6GpprhCSEEgbv86TmPlJYlIah6V5mRQ93fYROrc7oBt/Z0bVOUpnHWJf
-        H3PoXM8bNH8mMTpLQiRtlixJgYU/ecW4BIkjfeC2PYNlWQ7YpfySdQCrJqzgQucw6j6R6PtB4oOYxIT0
-        9d+xQ7SIlKlKXBxpAE+QA5+BZNjWRs3TvE0UVxGtfLfOE41dKBhdxpMJEu0iEnUiIe6LqnB9/C7ihHkI
-        63oFl6o6eLamgVXIB9WTvXcV2J7Afu1QlI8r3QtIHVlGikCIiP4ExLyNx/nhS4gcjENobxqYmR0wzEuG
-        6lk/KDiaGa99gxP9UDe5H/6VX8BrnYFvSwdcazg40nQM3Oe+cH3qDfcmfzg38kG/Gg31dPtFwpiutAbo
-        Z7rKBtRgX9oQXB+9h1v5GCweRMKswA7sYgeYFtvBoNAKzCJrqCU6Q+mMXdXGeTDKfSHjXw31yz3QSx2C
-        UZYAzJRy7E6yAOOWCTRuGoKWoQ95vwOL8hyG5UZAjb+DYGQIiYMFIPyqIBPaCNmTuaCGGkA1WhfUWCa2
-        hTNXKFZOvK1HWjFYnVCNLSO0k0nCMAWEjQsoXrugHGgAFR+2hGLqlE1ouVH/vhN0D3UVVsg9E27ShElQ
-        sNgsIlxsfCp6UoHl20nR804n6B7afwdodjKE9mFNBSNfayo72EvZPIgryzzqRjA4LGKPpwah6Sjzz638
-        n4JfHjGLP3wxItMAAAAASUVORK5CYII=
-
-  
-  
-    164, 22
-  
-  
-    Telldus website...
-  
-  
-    161, 6
-  
-  
-    164, 22
-  
-  
-    &About...
-  
-  
-    44, 20
-  
-  
-    &Help
-  
-  
-    
-        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
-        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAA0xJREFUOE91U2tI
-        03EUnbUeYEllpfSOiqAPySBKaCSRH2wUfTCLPuRIwSnrbeZj9jYKtSKXtgypjXzAdDi3cpuP5rbcZmvq
-        Nt3DnM7NnJtawszE3Om/f0RkdeHw4144h3N/994wyrzg8/mb6HR6akRERDyVSt0KYAEBz8jIiNput79M
-        TEzsns/5lYcpFIrrPv/oN7ffBdNQJ3Qf1VDbW9HuaIPZ1YWBIWfQbDa/EAgE4X+JiMVivuvTILR9Kijt
-        CrQ5mtD+UQlVXzMk3UJUdVRA8O4Z3tu0sFqt2qKiot8iIpEo3TnUD7lFAolJCFFnJSxDXYTznyE31yNb
-        nIKztSeRUZMEqV4Eo9H4jHSRlJS02GazeWXd9agyloP//gmea4vwztaCYDBIorjpMvZyqdhTshC0xwux
-        r3g1LBbL98LCwm2U3NzcQ4MeJ3i6+5D21KBrWIdGexXsI92YmZlBIBBAu02BKv0DVOofglW3H/SKRajR
-        PIdEIsmmlJaWXjD263FPdxZqhwyzs7OYnp7G5OQkxsbGMDo6SsLn85E5T3MZx0RLwVXmQa1WCyklJSU5
-        hv52JL/dhVptBZxOJxwOB1wuF0n0+/1wu91kjbCN8reXkNq6DBW6G1CpVPWUc0QMj7nBkIXjxJtVONMQ
-        jfOv10HeIcD4+DgpUqfl4K5iE27JNyJftRYXtSvQZheHWhBQYmNjj05MTOCm5hROG5aD3bkS+aY1aPrA
-        x8DAAAmpKQfltg0ota5HYU80IUJD4GsABQUFdyiRkZHLhULhl+FxF1KJNlidUbhq2oBG/St4PB54vV68
-        6bmFJ7adeGTdgWu67eggdoRoNRgfH08nR8lgMG6H+hv09eFiy2EwNVvBFtORKUxAdi0DeS37wTHEIFMe
-        iwZNJflPPB6vhaCG/drIpWw2u1WpVGJqagrNvQ2433YeV+THkCk7ghuNTDx9fQ/yZhn0ej2kUqmLRqNt
-        /mOdo6KiwolDERDKcwaDgbQfGl1oAr29vZDJZCA2NlhWVtYRExOz5Z8HlZaWtjolJaWYw+F4uVzuHHGZ
-        werq6iDxzmVlZX1OT08XZmRk7P7fNZL1uLg4anJy8npC7ACLxToeAkE6yGQytyQkJCyZT/4BXq9YqhOK
-        nicAAAAASUVORK5CYII=
-
-  
-  
-    75, 22
-  
-  
-    &Schedule
-  
-  
-    
-        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
-        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAbFJREFUOE9jYCAD
-        rO/vF9gxc6YGGVoZGO5t3qz/7eixZx8OHPj3ZsmSQpIMuXf0qPv9LVs+P+vr//9swoT/j5ublxJtwI+X
-        a4IfX9n4fV9F4/8TXd3/L2RkHFsZEiJKlAH/3q3M+XEl6s+nQ37/dy2f/D/X03Otj7ExF0HN//8zMP59
-        s6j9+/mgf1922fy/0K36b0+jZhNQIyNBzTNnzmT9+2rmwj8XvP5/2GD2/3SPzM/dDRrxBDWCFOzfP4Xn
-        7/PeHb9OOv9/vdTg/6kOxXdbKtUdidJ86fhs8T/Pms/8OGj7/9kczf/HmhXvLi9T1SRK8+OrS1V/P6q4
-        83W72f8Hk1X+H2lUOj4tQ0mMKM2v7m8z/HEv/dWntfr/b/Uq/j/QpLqmN0SGkyjN9fX1LN+eHrz0bpnh
-        /3PN8v/2Nal04whpUOjDMMLsR7cv5F7e2fd/Rav3y2xvsXxRUQYeoKwAEAsDMSixiEMxyDsgMW4gZoKZ
-        wGllqrNcX1O2iZmZ2QsoaA/E5kCsD8RqQCwPxBJQjXxAGpSAWJC9BnISOxCDbAVJsgExM9QGwgmGqEDC
-        owgA7kywHOvKSsIAAAAASUVORK5CYII=
-
-  
-  
-    47, 22
-  
-  
-    &Edit
-  
-  
-    
-        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
-        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAA19JREFUOE91U21M
-        U2cYLYY4F7TT1EgWIx/xj0gU2DASbeyULkMS/AhiMt2oMi2whvhHNpHEKCNmwrIhBAKJWqlGQqqFUthK
-        Wyq0rtDyMUtZewF7b9tbLf3gY4sSGNDj7U2MkemTnLx53+Sc53lznhPFWVXNzc1xfD7/Oy6XK4yOjk4E
-        sIaB1+fzGcfHx+/m5uZaV3Pe3KM0Gs2VoN+/MOtxY8r6F2iTEe4+PTxP+uAbfQqaIsM2m00qk8li/iei
-        VCqbfS4X6D8N8PRo4O7uAqVqg1PRionWeyDu3YbtThNI8wAcDkd/dXX1WxGFQlHkdTrh/F0Ft1aN+VAQ
-        Hp0ahLQJ9sabINvl+IdyYvBKKR6fPQlrhwIjIyNN7BR5eXlrCYKYGu9UwiG7jX8ZcqRWlpdhv3kdwxfP
-        YWlhAYuLi/C7KDxK3oIHSVswNja2XFVVtZ1TVlaW+YIi8bTmBqxVFTBd+wEBL41wOIylpf8w/+oV5ubm
-        8JymoT1/DD07PkbX9nUYlt2CSqX6kVNfX3/BNWSB5VIJ9If3QJsUA92RdPh9LzA9PY1AIAC/3w/L9zmY
-        4H8C614unqSsx+DP5TAajXJObW3tJZfZBM3BXehOWg9T+kZMSmtYUgTBYBChUAg+vRL+3ETQX/Jg278J
-        1pprMBgM7ZwSpmaYkdt3cKH/jIdJuZTtGiG5ib8xatDBxbhDURS8lj4ERKl4lrkZpKYj8gUZJyMjI2dm
-        ZgYGyWn0ZHwKS8dDtjMxaAIt3ovQmWSMqNtYUc8kAer8Poye+hzzL1+isrLyJw6Px9sgl8vnZmk3tJk7
-        YRBsg+7XqyC+ScX81/FYOJ2AoCgZw623MCE5BPJ4IkijFiRJhoVCIZ+1Mjs7u4KxBSFyEo9PCdG/PxaO
-        r7bClRMH7/F4PGfgOhoHy4ndGHh4P0JGY2NjD0ONerOR6yQSib63t5e1beKPNvRfFsMoyoTx2y/QV5IH
-        zW8V0HWrYTab0dnZ6U5LS4t/Z51jY2NjmKDIGOWVoaEheL1e9t8047/dbodarQazseGGhgZLSkpKwnsD
-        JRaLNxcUFPxSXl4+VVdXt8IkM9zS0hJmzpXS0tLZoqIieXFx8e4PpZF9FwgE0fn5+VsZsQOFhYUnImBI
-        B0UiUUJWVtZHq8mvAXJeU9ifZ+GWAAAAAElFTkSuQmCC
-
-  
-  
-    70, 22
-  
-  
-    &Remove
-  
-  
-    Name
-  
-  
-    Protocol
-  
-  
-    
-        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
-        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAAewQAA
-        HsEBw2lUUwAAAWNJREFUOE+N0csvA1EUx/ErsbT1B9jYSfwLrGzYWPkv2LIVSwmJHYloUU00kZDQSFOv
-        SOrRTFtBK1WPmmpNr760nZnOV0uCours7jm/zz3JvS2AqCtDWHFRbdImWtvrR2+nKvgsK4Xpx4xghCmd
-        kj3GKNYFahd9VCWNcUJFxbxHD1M8JecmZsOqfDVfQN6DEaWi1UBRIbeNdHI1iqr8BiyL9DJGBEqYcV4O
-        kaskpjnqIehssCG5RGEL/ZpSkMwG6hSBIVyC4HoDkNjjaRLpIDXL7RiBPtyCecHTXQNQzHIxQnyU2DDn
-        gxx0YRfszzd+perkZpezXkL9HHazKpjrJKv9CXQd/ziPTrwDLAp8jm/p2i9/b52scDnDQgcTgodoc5BP
-        JuRtRFlf8yzYM/K5OXjOFB6Tcmdfca15tfQ/gJRZVU15vccOx6amyeYbymU9FArbbC6fTzFNszl4T+Ry
-        +Z/R984rn0GmMacbOKoAAAAASUVORK5CYII=
-
-  
-  
-    117, 22
-  
-  
-    Turn on
-  
-  
-    
-        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
-        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAAewQAA
-        HsEBw2lUUwAAAUxJREFUOE+VU12rglAQ7EL//1f0oI+9mNSLQg9BQRJRGUZBQdiHGib2ZXObvRy4pRYN
-        HNTjzOye3bM/eKBSgCzLKupXtVotovzt0eA/HkJcr1dZl8sFaZoijmPcbrdXqnw/GVB8Pp+FTAO+K4PV
-        aoX7/Z4zeTI4Ho8iVFkocRiGWCwW2G637w1IZNqMRKMkScA93/cxHA7hed57A0agiCan0wmHw0HEruvC
-        sqzPBrvdDlxRFMmT56a40+mg0WjI/iueasCos9kM6/Uay+VSIvb7fTSbTQwGg89dIIPi6XQqy3EcSd0w
-        DDlaEXL3gC0cj8dS8V6vh1arhdFoVCjO3QPFmkwmmM/nME0TmqZJPcqQy4BEVUBG13VdWvmVAdu32WzQ
-        brdRr9cRBMF3BozIYtq2LRns9/vvDDgDvHm1Wg3dbrd0kEqLqMJxCj/hF5B2pm1BgCdyAAAAAElFTkSu
-        QmCC
-
-  
-  
-    117, 22
-  
-  
-    Turn off
-  
-  
-    118, 48
-  
-  
-    
-        AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w
-        LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
-        ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAADG
-        DgAAAk1TRnQBSQFMAgEBBAEAAQwBAAEEAQABEAEAARABAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAFA
-        AwABIAMAAQEBAAEgBgABIP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8AOQABAQMFAQcDDwQU
-        ARsDDQERAwMBBBQAAwUBBwMUARwDGgElAxoBJAMYASIDFwEgAxYBHgMUARwDEwEaAxIBGAMNAREDAwEE
-        EAAc/wH0AvMh/ycAAQEDBAEGJAADAwEEAw0BEQMgAS8DNwFbA0ABcAMyAVEDHQEpAw0BEQMDAQQMAAMU
-        ARwDPgFrA0oBigNIAYgDRwGDA0UBfQNDAXgDQQFzAz8BbQM7AWUDLwFKAw8BFBAAFP8B+gL5Af8B2gLU
-        Af8BrgKjAf8B0QLKAf8D/Bn/JAADJQE3A1oBvgMIAQsbAAEBAwcBCgMYASIDMwFSAVECTwGlA1gB3QFS
-        AlABowNQAZ4DRQF9AzIBUAMcAScDCwEPAwIBAwQAAWMCXAHqAXMCYgH1AWICWAHpAVwCVwHfAV4CWgHV
-        AVsCWAHLAVsCWQHDAVgCVgG8A1UBtQNTAaoDRgGAAxgBIhAAFP8B8gLvAf8B6wLnAf8BzALAAf8BuAKo
-        Af8B7wLtGf8UAAMLAQ8DLwFKA0IBdQNCAXQDVgG2A1MBqgMRARcDBAEFEAADAwEEAxEBFwMoATwDSAGG
-        A14B5QNgAf8DRwH/Az8B/wNXAd8BUgJQAaQDTwGcA0QBewEsAisBQwMLAQ8EAAGMAmoB+QH/AvQC/wLk
-        Af8B/QLjAf8B+wLgAf8B/ALkAf8B/QLlAf8B+QHZAdgB/wHLAcUB2QH/AX8BawFtAfcDSwGOAxsBJgMA
-        AQEMABT/AfUB8QHwAf8B7wHqAekB/wHRAcQBwQH/AcABsQGuAf8B8AHuAe0Z/wgAAyQBNQMoAT0DQAFw
-        A3sB5gPhAf8D6gH/A+oB/wPhAf8DYwHVAzgBXgMYASEDCQEMDAADDgETAzoBYQFbAlkBwwFzAm8B/gNj
-        Af8DXgH/A1YB/wNDAf8DQgH/Az0B/wNaAdsDUQGhA0MBeAMWAR4EAAGMAmoB+QH/Au4B/wH7AtwB/wH8
-        AdkB1gH/AfgB0wHQAf8B+QHVAc8B/wH7AdUBzQH/AfYBywHFAf8B1AHAAcwB/wGAAWwBbQH3A0sBjgMc
-        AScDAAEBDAAU/wHoAeoB9AH/AdsB4gHvAf8BsQG0AdEB/wGkAaIBvgH/AfAB7wHxGf8IAAMxAU8DjgH0
-        A9IB/gP0Af8D5QH/A/0F/wP8Af8D8QH/A4EB6wMxAU8DEgEYDAABSQJIAYcBbQJSAfcDggH/A2wB/wNg
-        Af8DVwH/A2cB/wNCAf8DQwH/A0EB/wM9Af8DWgHkAUkCSAGIAxoBJAQAAY0CagH5Bv8B+wH/AWUBlwH9
-        Af8B3gHlAfwB/wFVAYgB/QH/ATcBZAH9Af8BVAGAAfoC/wH8AfQB/wGGAm0B9wNNAZYDKAE9Aw4BEwME
-        AQUIABT/AakBzQL/AZUB2QL/ARsBogL/AQABhgL/Ad4B5hr/CAADJQE3A8YB/AP1Af8D/QH/A/0B/wP9
-        Af8D/QH/A/0B/wP7Af8D5QH/A4UB8QMkATYMAAFiAlgB7wOLAf8DgQH/A2oB/wGKAosB/wGkAqUB/wGe
-        Ap8B/wOJAf8DXAH/A0QB/wNAAf8DWQHrAUUCRAF8AxcBIAQAAYgCbQH3Bv8B+wH/AUQBhgH+Af8BxQHY
-        AfwB/wHhAeIB9wH/AQ8BTgL/AcMBygH4Av8B/gH6Af8BnQKSAfsDUwGsA0cBgwE1AjQBVQMbASYDBQEH
-        BAAQ/wL6Av8BhAHPAv8BqgHpAv8BSAHAAv8BAAGlAv8BqAHKGv8IAANYAbQD5QH/A/QB/wP0Af8D8gH/
-        A+gB/wP0Af8D9AH/A+QB/wPgAf8D0AH/A2EBxwwAAWUCUgH0A4cB/wOYAf8BsgK1Af8BgQJvAf8BUwJI
-        Af8BRQJBAf8BWgJdAf8BhwKIAf8DgQH/A18B/wFZAlMB8gMuAUgDDQERBAABewJiAfYE/wFiAZwC/wEZ
-        AYcC/wHJAd0B/QH/AWQBlwH9Af8BvQHOAfkB/wGBAYwBuwH/AYMBhQGHAf8BaAFrAWwB/wNbAdkDUgGo
-        A1ABmgM+AWsDGgElAwMBBBD/AcIB4QL/ATwB1QL/AUcB1AL/ASoBxwL/AQABrQL/ASABnQL/Ae0B8hb/
-        BAADBAEGA7AB+AP0Af8D7QH/A7gB/wOUAf8DqgH/A9IB/wPcAf8D5gH/A+EB/wPUAf8DzgH+AxQBHAgA
-        AXUCZQH4A84B/wHDAsQB/wGPAoEB/wHBApIB/wHXAp4B/wHLAo4B/wFZAkAB/wGEAocB/wF/An4B/gFe
-        AlwBzgNBAXIDDAEQAwIBAwQAAXsCYgH2CP8BbwGmAv8B3QHoAfkB/wHGAdoB+AH/AY8BigGZAf8BtQGm
-        AZkB/wH2AdUBrwL/Ad8BtAH/AfMB0gGsAf8BpwGZAYoB/wNZAckDTwGbATUCNAFVAw0BEgz/AfIB9wL/
-        AWsB2AL/AXQB5QL/AWoB4AL/AU0B1wL/AScBxQL/AQABpAL/AaABxBb/BAADFAEbA9UB/wPtAf8D9AH/
-        A+gB/wO+Af8D4AH/A98B/wPXAf8D3gH/A+AB/wOaAf8DuwH/AyABLwgAAzACTAJLAY8BXgJcAc4BcwJp
-        AfwB6gLZAf8B7wLRAf8BzwKWAf8BYQJUAe4DUAGdAyoBQQMHAQoDAQECDAABfQJiAfYB9AL3Af8BigKL
-        Af8BYgFgAV0B/wGuAagBpwH/Aa8CogH/AcIBsAGjAv8B5gG3Av8B5QG4Av8B5gG5Av8B5QG+Av8B6QHA
-        Af8BqQGaAYoB/wNSAakDRAF5AxYBHgz/AcMB6AL/AY4B7AL/AagB7wL/AZwB6wL/AXUB4gL/AUIB0gL/
-        AQABugL/AQABoAL/AeMB7BL/BAADCAELA8AB/APiAf8D6gH/A9IB/wPrAf8D6wH/A+sB/wPrAf8D6QH/
-        A7wB/wOOAf8DgwH+AxIBGBMAAQEDDQESA0ABcAFYAlYBuQFSAlEBoQEsAisBQwMNARIDAQECFAABWQJX
-        AcIBYQJcAdwBXQJXAe0BXgJaAdUBYQJcAdwBegFxAXIB+gH9AeIBvAL/AekBwQL/AfABxgH/AbABoQGE
-        Av8B5gG6Av8B5wG/Af8B+gHXAbAB/wNbAdkDSAGFAxkBIwz/AaYB6gL/AbkB9QL/Ad8B+gL/AdMB+AL/
-        AbUB8QL/AZEB5wL/AVMB0gL/AQABrgL/AbQB0xL/CAADXQHAA9YB/wPjAf8D4QH/A+QB/wPkAf8D5AH/
-        A+MB/wPIAf8DlQH/A3QB/wNgAdAbAAEBAyUBNwE1AjQBVQE/Aj4BbAMkATUDEQEXAwMBBBQAAwYBCAFW
-        AlUBtAFZAlcBvwNSAakBXAJYAdEBgAF3AXgB/AH/Ae8BywL/AfgB1wH/Ac8BxAGlAf8BSAFLAVMB/wGY
-        AYsBaAL/AekBvAL/AegBuwH/AWcCWQHyA0QBeQMWAR4I/wL+Av8BpwHuAv8B2wH7Av8B+AP/AeUB/AL/
-        AccB9gL/Aa0B7wL/AZIB6AL/ATsBywL/AaoB0xL/CAADJgE4A7cB+APQAf8D2AH/A90B/wPUAf8D1AH/
-        A8kB/wOFAf8DuwH/A+MB/wOSAe8DBgEIEwABAQMQARUDHgErA0MBeANAAXADOgFhAyQBNQMQARYDAwEE
-        GwABAQMAAQEDAAEBAWACWwHWAf8B8gHTAf8B7gHpAdMB/wE6ATkBNAH/AegB3QG8Af8CQQE7Af8B0wG+
-        AZ0C/wHfAbcB/wFeAloB2AE1AjQBVQMNARIM/wG+AfQC/wHeAfsC/wHtAf0C/wHkAfwC/wHRAfcC/wG8
-        AfMC/wGqAe8C/wF0AdwC/wHRAecS/wwAAygBPANpAdQDtQH/A70B/wPHAf8DzgH/A48B/wOvAf8D9AH/
-        A/sB/wPpAf0DCwEPEAADBgEIAxABFQNQAZ4BXAJaAc0BWwJZAcQBQgJBAXMDMwFTAyABLgMIAQskAANE
-        AXsB7QHWAcYB/wGhAZ0BjQH/AukB0wP/Ad0C/wHxAcoC/wHxAcIB/wG/AawBnAH/AU4CTQGVAxsBJgMD
-        AQQM/wHuAf0C/wHNAfsC/wHnAf0C/wHkAfwC/wHaAfoC/wHOAfcC/wG6AfMC/wGjAeAC/wH9Af4S/wwA
-        AwkBDANpAd0DpQH/A6AB/wObAf8DywH/A6UB/gOTAe8D/gH/A+oB/wNQAZsUAAMIAQsDUAGdA0QBegFF
-        AkQBfAFJAkgBhwFRAk8BnAFKAkkBiQMUARsDAwEEJAADBAEGAVoCWAHAAe8B2gHJAv8B+AHYAv8B8wHP
-        Av8B6wHFAf8ByAG2AaYB/wFbAlkBxAMdASoDBgEIBAAQ/wHrAf4C/wHPAfwC/wHbAfwC/wHaAfsC/wHO
-        AfgC/wHMAfIC/wH3AfsW/wwAAw0BEgOhAfED8wH/A/EB/wPfAf8DQgFzAxQBHAMFAQcDMgFRAykBPxwA
-        AxgBIgNUAa4BZAFSAUsB7wFhAlsB4QNKAYoDEgEYAwQBBSwAAwQBBgNEAXsBYAJbAdYBdQJlAfQBXQJZ
-        AdcBRwJGAYADEgEYAwQBBQgAFP8B+gP/Ad8B/QL/Ad4B/AL/AeoB+x7/EAADGQEjA0oBiwNXAbEDSgGN
-        AwUBBxwAAUIBTQE+BwABPgMAASgDAAFAAwABIAMAAQEBAAEBBgABARYAA/+BAAH4AR8BAAEPAgAB/wGf
-        AfABBwEAAQ8CAAH/AY8BwAEBAQABDwIAAfgBBwGAAQEBAAEHAgABwAEDAYABAQEAAQcCAAHAAQMBgAEB
-        AQABAwIAAcABAwGAAQEBAAEBAgABwAEDAYABAQQAAYABAQGAAQEEAAGAAQEBgAEHBAABgAEBAeABHwQA
-        AcABAwHwAR8EAAHAAQEB4AEPAcADAAHgAQEB4AEPAfgDAAHgAQMB4AEPAfgBAQIAAeABBwHwAR8B/AED
-        AgAB8AF/Cw==
-
-  
-  
-    
-        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
-
-  
-  
-    276, 13
-  
-  
-    Starts the application which allows you to configure units.
-  
-  
-    29, 13
-  
-  
-    Start
-  
-  
-    100, 13
-  
-  
-    Configure unit(s)
-  
-  
-    
-        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
-        HdfAfwC8OWB2rvuFqgAAAABJRU5ErkJggg==
-
-  
-  
-    387, 13
-  
-  
-    This application allows you to easily schedule one or more units at the same time.
-  
-  
-    276, 13
-  
-  
-    Choose when and where each unit should be scheduled.
-  
-  
-    107, 13
-  
-  
-    Create new schedule
-  
-  
-    99, 13
-  
-  
-    Schedule unit(s)
-  
-  
-    
-        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
-
-  
-  
-    270, 24
-  
-  
-    Welcome to Telldus Scheduler
-  
-  
-    Welcome
-  
-  
-    Units
-  
-  
-    Schedule
-  
-  
-    Starts
-  
-  
-    Latest run
-  
-  
-    Description
-  
-  
-    
-        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
-        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAAK7wAA
-        Cu8BfXaKSAAAAyRJREFUOE9Vk3tIUwEYxWeiFZHNICkIojAsMBmJJRkhGiKZGUUPSkoriVolzSiopMyw
-        1NCsiZr0QE0LjVDzUc3HFJ1uaWsmPipd6dbcarO0bGqdzl3+sS78uJd7v3Pu9333XBeR05GaWuk19s0m
-        9ZjvFuEpnuM9NWWH0WR5b/lirunrV99vbHxuZPkkgbPOcZ2fr91R8rDFavpsxuDoFLSWSagNP6Hu/wxF
-        rQJXk7Ise/ccjWGpmLj+ZyCIm+q7p38B0E0BRp6HfgMDdkA7AdSagAZ1N26kZtpDQiJOULyIzHKYCG0X
-        FzVZxyl62tGDu0UFoA76aaCb4ld80E7qbECVUoMzp8+ZxGJxJKULiIso8WJhkkE/DA2LegxGuHG+0sZm
-        DNOklzQMfcdl+QO0jgGVvJmfk42AgIA8in2Jm+h6SklH38gPDLL1bxRUaF5jnqsLqnsG0WqewGJPD0Qf
-        l0HJDpq+AiU1LdgWsbWd4p3EU5SbXTbabhiHngv4IECTW6WVCN0YiECJH8oVSvRZuVQaqASDhl4ciT1g
-        oDiBLBXdziy2tQxY8e4noLECaraqpdH28DDcy89FaFYoNt/ajCdvnuPjD6BQ0YVDB6OHKb5CVogunpdr
-        WnXvUfeF83LbTWag7TsX+tYMnXEUQTcCcV+XhYSqk5A+jUdHVz+Oxh3upDjZYRB3JPFKbUUFyvWAggYv
-        uag6A1A/wnFotDbFD9kdyUhUxWKXYhXCC4IQL4/XUZxIlomCg8OXJyfdtLxQqlBOcS2p+gg8o2E/55Zc
-        XwOpcgt2N/hAqg1A+tcoBN1bbaf4ElkuRMF93764mLRrGfbyGgXKev+gmp3UkwF+WkmaL2TqMJx664+r
-        I5HYVCKZYOMF1F1wdOAIA+MZEhIplcWfNd2R30RRWRUKq9vQ2fsJ/pl+kI/EYH/zBoTmBFtYW0ZSSNhM
-        mByBFGLpJSTM3399XtS2rW2HYw8MlT5+ZJOkrZmWpPvaYzNiVKwpnnnzuhnxvzjPHMIPIsRTSJgQEhkR
-        Np1GMkgqOUb8yFxnofO1MI47WUiWkhVkJfEh3mQJme0s+Au+QgUxI1c9OgAAAABJRU5ErkJggg==
-
-  
-  
-    104, 22
-  
-  
-    Run...
-  
-  
-    105, 26
-  
-  
-    Scheduled units
-  
-  
-    
-        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
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AwMDAQoKCgEQEBACFBQUAhUVFQEVFRUCFhYWAhcXFwEWFhYBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAwAAAAYDAwMHCQkJCgYGBgsAAAANAAAAEAAAABAAAAAP
-        FBQUCxISEggeHh4EEhISAgcHBwEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAUAAAAK
-        AAAAEAAAABcAAAAdAAAAIwAAACsAAAAxAAAAMQAAAC0AAAAlAAAAGgAAAA8FBQUJBwcHBgEBAQMAAAAB
-        AAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAQAAAAIAAAAIAAAADgAAABcAAAAiAAAALQAAADgAAABIEhISZGJiYruBgYHc
-        YGBguBYWFl0AAAA1AAAAJQAAABkAAAAPAAAACQAAAAQAAAACAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAABAAAABgAAAAwAAAAZ
-        AAAAJQAAADYAAABHAAAAWwEBAXN6enrhvLy8/8jIyP+urq7/eXl57AsLC1YAAAA7AAAAKgAAABwAAAAR
-        AAAACAAAAAQAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAQAAAAIAAAAHAAAAEQAAACAAAAAyAAAARAAAAF0AAAB6NDQ0sru7u//j4+P/
-        4+Pj/8nJyf+YmJj/Ly8vkwAAAEoAAAA5AAAAKAAAABcAAAAMAAAABQAAAAIAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAgAAAAS
-        AAAAIAAAADQAAABJAAAAaQQEBI+Ojo7w29vb/+zs7P/i4uL/ysrK/5ycnP8sLCyPAAAATgAAAD0AAAAr
-        AAAAGgAAAA4AAAAFAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAABgAAAA4AAAAZAAAAKgAAAEgAAAByQUFBvcPDw//r6+v/
-        6urq/9zc3P/Dw8P/lpaW/x0dHWoAAABEAAAANQAAACYAAAAXAAAADAAAAAQAAAABAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAD
-        AQEBCAAAABIAAAAjAAAASgsLC32amprz4ODg/+/v7//l5eX/1tbW/7u7u/+KiorzAgICPwAAADIAAAAl
-        AAAAGgAAABEAAAAIAAAAAwAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAgENDQ0EAAAACgAAACQAAABTUlJSt8nJyf/u7u7/
-        7e3t/9/f3//Pz8//srKy/35+fs0AAAAkAAAAHgAAABUAAAANAAAABwAAAAQAAAACAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAQAAAAEAAAABAAAAAQAAAAEAAAACAAAAAQAAAAEAAAABAAAAAQAAAAEAAAAC
-        BwcHAhYWFgQICAgPAAAANRISEm6lpaX35OTk//Ly8v/o6Oj/2dnZ/8nJyf+rq6v/dnZ2nQAAAA8AAAAM
-        FBQUCAoKCgUAAAADAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAEAAAACAAAAAwAAAAQAAAAGAAAACAAAAAkAAAAK
-        AAAACgAAAAkAAAAJAAAABwAAAAcAAAAGAAAABgEBAQcGBgYIAAAADgAAACUAAABRYWFhv87Ozv/y8vL/
-        8PDw/+Li4v/U1NT/w8PD/6ioqP9FRUVtWlpaBEBAQAMlJSUDCwsLAQAAAAIAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAwEBAQQAAAAG
-        AAAACAAAAAsAAAAPAAAAEwAAABYAAAAZAAAAGgAAABoAAAAaAAAAGgAAABgAAAAWAAAAFAAAABMAAAAT
-        AAAAFQAAABgAAAAjAAAARBsbG3murq776Ojo//b29v/r6+v/3Nzc/8/Pz/++vr7/qqqq/zs7O0IrKysH
-        KysrBSAgIAMHBwcCAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AQEBAQICAgICAgIEAQEBBwEBAQsAAAAPAAAAEwAAABYAAAAbAAAAHwAAACUAAAApAAAALAAAAC4AAAAw
-        AAAAMAAAADAAAAAuAAAALAAAACkAAAAnAAAAJgAAACYAAAAoAAAALQAAAEIAAABgb29vzdPT0//19fX/
-        8/Pz/+Xl5f/W1tb/y8vL/7y8vP+qqqr+ICAgIgAAABMAAAAPAAAADAAAAAoAAAAHAAAABQAAAAMAAAAC
-        AAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAADAwMBBwcHAwcHBwUCAgIKAAAADgAAABMAAAAYAAAAHwAAACYAAAAq
-        AAAALgAAADIAAAA4AAAAPQAAAEAAAABDAAAARQAAAEYAAABGAAAARgAAAEQAAABBAAAAPgAAAD0AAAA8
-        AAAAPAAAAD8AAABHAAAAXiQkJIuysrL+6urq//j4+P/u7u7/39/f/9HR0f/Hx8f/wsLC/52dneMAAAAk
-        AAAAIAAAABwAAAAZAAAAFgAAABMAAAAPAAAACwAAAAgAAAAGAAAABAAAAAIAAAABAAAAAQAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAEICAgCCQkJBQcHBwkAAAAQ
-        AAAAFwAAAB0AAAAlAAAALAAAADMAAAA5AAAAPwAAAEIAAABHAAAATAAAAFAAAABVAAAAWAAAAFkAAABb
-        AAAAXAAAAF0AAABcAAAAWQAAAFcAAABVAAAAUQAAAFIAAABSAAAAVQAAAF8AAABub29v28vLy//x8fH/
-        8/Pz/+jo6P/Z2dn/zc3N/8XFxf/MzMz/g4ODwAAAADEAAAAuAAAAKgAAACYAAAAjAAAAHwAAABsAAAAX
-        AAAAEgAAAA8AAAALAAAACAAAAAUAAAAEAAAAAgAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAcHBwENDQ0DBwcHBwAAAA4AAAAVAAAAHwAAACgAAAAxAAAAOAAAAEEAAABIAAAATgEBAVQmJiZw
-        PT09l0VFRa9bW1vEZGRk2GxsbOtubm70bGxs+mxsbPpra2v5bGxs92lpaepqamroZGRk1VVVVcE8PDyr
-        NTU1lSAgIHkAAABqAAAAcCIiIpuQkJD/ysrK/+bm5v/o6Oj/39/f/9PT0//Jycn/ysrK/87Ozv9XV1ej
-        AAAAQAAAADwAAAA4AAAANAAAADAAAAAsAAAAJwAAACMAAAAdAAAAGQAAABUAAAARAAAADQAAAAoAAAAH
-        AAAABQAAAAMAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkJCQEQEBAECQkJCAAAABAAAAAaAAAAJgAAADEAAAA8
-        AAAARQAAAE0JCQlYPT09iFdXV7V+fn7gg4OD+35+fv96enr/eXl5/4GBgf+Li4v/lZWV/5ubm/+kpKT/
-        paWl/6Wlpf+lpaX/m5ub/52dnf+RkZH/hYWF/319ff+Dg4P/iIiI/4eHh/FwcHDOampq6ZGRkf+3t7f/
-        y8vL/9HR0f/Ozs7/yMjI/8TExP/X19f/w8PD/zk5OYsAAABNAAAASQAAAEUAAABBAAAAPAAAADgAAAAz
-        AAAALgAAACgAAAAjAAAAHgAAABkAAAAUAAAAEQAAAA4AAAALAAAACAAAAAYAAAADAAAAAgAAAAEAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkJCQERERED
-        CgoKCAAAABEAAAAdAAAAKwAAADgAAABEAAAATxMTE2FKSkqdfHx8zJSUlPqOjo7/jo6O/5ubm/+np6f/
-        uLi4/87Ozv/i4uL/6Ojo/+zs7P/t7e3/7e3t/+zs7P/s7Oz/6+vr/+vr6//s7Oz/7e3t/+3t7f/t7e3/
-        5+fn/9nZ2f/Hx8f/tLS0/6Ghof+ZmZn/np6e/6Ojo/+rq6v/sbGx/7S0tP+0tLT/uLi4/9bW1v+qqqr/
-        IiIidgAAAFkAAABVAAAAUQAAAE0AAABIAAAAQwAAAD4AAAA5AAAAMwAAAC4AAAAoAAAAIgAAABwAAAAX
-        AAAAFAAAABIAAAAPAAAACwAAAAkAAAAGAAAABAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAPDw8BERERBgAAAA8AAAAdAAAALQAAADwAAABLAAAAVzw8PIV1dXXB
-        oaGh+Zubm/+goKD/r6+v/8LCwv/V1dX/4ODg/+fn5//s7Oz/6urq/+bm5v/i4uL/29vb/9TU1P/Pz8//
-        y8vL/8bGxv/ExMT/xcXF/8rKyv/MzMz/0NDQ/9bW1v/e3t7/4+Pj/+jo6P/r6+v/7Ozs/+Hh4f/IyMj/
-        tLS0/6mpqf+rq6v/paWl/5qamv+rq6v/vr6+/4mJifoEBARlAAAAYAAAAF0AAABaAAAAVwAAAFMAAABP
-        AAAASQAAAEUAAAA+AAAAOAAAADIAAAArAAAAIwAAABwAAAAYAAAAFgAAABQAAAARAAAADwAAAAwAAAAJ
-        AAAABQAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAEAAAACAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAQMDAwEKCgoBFBQUAwYGBgwAAAAa
-        AAAAKwAAAD0AAABNAAAAXUlJSZibm5vgqKio/6enp/+2trb/y8vL/9bW1v/c3Nz/5eXl/+rq6v/m5ub/
-        3d3d/9DQ0P/AwMD/rq6u/6Ojo/+qqqr/tbW1/7u7u//Dw8P/yMjI/8zMzP/Ly8v/wcHB/8PDw/+5ubn/
-        sLCw/6enp/+jo6P/s7Oz/8fHx//V1dX/4uLi/+np6f/s7Oz/4ODg/8LCwv+zs7P/srKy/62trf+YmJj/
-        Xl5e3wAAAGQAAABjAAAAYQAAAF4AAABcAAAAWQAAAFYAAABSAAAATQAAAEgAAABCAAAAOwAAADMAAAAq
-        AAAAIgAAABsAAAAaAAAAGAAAABYAAAATAAAAEAAAAA0AAAAKAAAABgAAAAMAAAABAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAACAgIBBgYGAgkJCQMCAgIFAgICBgICAgcCAgIIAgICCQEBAQgAAAAIAAAABQAAAAQAAAAE
-        AAAABAAAAAMBAQEGBQUFBwoKCggAAAATAAAAJAAAADoAAABOAAAAYEZGRpiioqLlr6+v/7Ozs//Dw8P/
-        1NTU/9fX1//f39//6Ojo/+fn5//b29v/yMjI/66urv+np6f/urq6/9DQ0P/q6ur//v7+////////////
-        //////////////////////////////////////////////////////z8/P/i4uL/xsbG/7Gxsf+mpqb/
-        vLy8/9TU1P/k5OT/6+vr/+bm5v/Nzc3/ubm5/7S0tP96enrVAwMDZQAAAGMAAABhAAAAXgAAAF0AAABb
-        AAAAWQAAAFYAAABSAAAATgAAAEkAAABDAAAAOwAAADEAAAAmAAAAHgAAABwAAAAbAAAAGQAAABcAAAAU
-        AAAAEAAAAA4AAAAMAAAACAAAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEAQ0NDQQJCQkIAAAADgAAABMAAAAY
-        AAAAHgAAACQAAAAoAAAAJwAAACAAAAAXAAAAEgAAABAAAAAOAAAADwAAABIAAAAWAAAAIAAAADEAAABJ
-        AAAAXzU1NYyenp7ftbW1/7e3t//IyMj/1tbW/9fX1//f39//6Ojo/+Pj4//Q0ND/s7Oz/6ioqP/FxcX/
-        6Ojo////////////////////////////////////////////////////////////////////////////
-        //////////////////////////////////////r6+v/U1NT/srKy/66urv/Ozs7/4+Pj/+vr6//l5eX/
-        yMjI/7u7u/+pqanhPz8/gwAAAGAAAABeAAAAXQAAAFsAAABZAAAAVwAAAFQAAABRAAAATQAAAEcAAAA/
-        AAAANQAAACkAAAAgAAAAHAAAABwAAAAcAAAAGgAAABYAAAATAAAAEQAAABAAAAAMAAAABgAAAAIAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAELCwsFBAQECgAAABUAAAAgAAAAKgAAADYAAABCAAAAUQAAAFoAAABUAAAASAAAADsAAAAx
-        AAAAKgAAACUAAAAiAAAAJgAAAC8AAAA/AAAAVw4ODnN3d3fCubm5/rq6uv/IyMj/1tbW/9fX1//c3Nz/
-        6Ojo/+Li4v/Kysr/qqqq/7i4uP/i4uL////////////////////////////+/v7/+fn5//Pz8//u7u7/
-        6enp/+jo6P/l5eX/5eXl/+Pj4//l5eX/5ubm/+np6f/t7e3/8vLy//f39//9/f3/////////////////
-        ////////////////6+vr/7m5uf+srKz/z8/P/+Xl5f/s7Oz/29vb/729vf+9vb3+lJSUwhoaGmUAAABc
-        AAAAWgAAAFgAAABXAAAAVQAAAFIAAABOAAAASAAAAD8AAAA1AAAAKQAAAB4AAAAaAAAAGwAAABwAAAAc
-        AAAAGQAAABUAAAATAAAAEwAAABAAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICAgMDAwkAAAAUAAAAIwAAADQAAABD
-        LS0tcDU1NZAMDAyEAAAAiAAAAIUAAAB3AAAAZQAAAFcAAABMAAAARQAAAEEAAABFAAAATwAAAGQ4ODiY
-        rKys7bu7u//ExMT/1dXV/9jY2P/Z2dn/4+Pj/+Tk5P/Nzc3/q6ur/7+/v//w8PD/////////////////
-        //////r6+v/x8fH/5+fn/97e3v/d3d3/3d3d/97e3v/j4+P/5eXl/+fn5//o6Oj/6enp/+jo6P/n5+f/
-        5eXl/+Hh4f/f39//39/f/+Dg4P/m5ub/7u7u//n5+f///////////////////////////+7u7v+3t7f/
-        tra2/9ra2v/q6ur/5ubm/8PDw/+2trb/yMjI8F5eXo0AAABaAAAAWAAAAFYAAABUAAAAUwAAAE8AAABJ
-        AAAAPgAAADMAAAAlAAAAGgAAABgAAAAZAAAAHQAAAB4AAAAcAAAAFwAAABUAAAAVAAAAFAAAAA0AAAAF
-        AAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAACAgIEAAAADAAAABoAAAAsDAwMQ3l5ecKsrKz/rKys/46OjvIoKCi6AAAApQAAAJgAAACJ
-        AAAAeAAAAGwAAABmAAAAYgAAAGYAAABzb29vwL29vf6/v7//0NDQ/9nZ2f/Z2dn/3t7e/+fn5//Y2Nj/
-        srKy/7y8vP/x8fH//////////////////Pz8//Dw8P/j4+P/3d3d/93d3f/i4uL/7Ozs//T09P/6+vr/
-        /v7+//////////////////////////////////////////////////z8/P/39/f/7+/v/+fn5//g4OD/
-        39/f/+Tk5P/w8PD//f39///////////////////////c3Nz/rKys/8zMzP/m5ub/6+vr/8zMzP+ysrL/
-        xMTE/6WlpcMUFBRdAAAAVgAAAFQAAABTAAAAUQAAAEoAAAA+AAAAMQAAACIAAAAWAAAAFAAAABcAAAAa
-        AAAAHgAAAB4AAAAaAAAAFwAAABgAAAAXAAAAEAAAAAYAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAgIEBAQKAAAAFgAAAChWVlaN
-        v7+//9vb2//Z2dn/yMjI/66urv91dXXlJSUlsgAAAJUAAACIAAAAggAAAIAAAACBExMTjpaWluG9vb3/
-        xsbG/9jY2P/a2tr/2tra/+Li4v/i4uL/w8PD/6ysrP/j4+P/////////////////+Pj4/+jo6P/d3d3/
-        3d3d/+Xl5f/x8fH/+Pj4/9zc3P/z8/P/////////////////////////////////////////////////
-        //////////////////////////////////////39/f/z8/P/5+fn/9/f3//g4OD/7u7u//z8/P//////
-        ///////////5+fn/ubm5/76+vv/i4uL/7Ozs/8/Pz/+tra3/uLi4/9fX1+Y9PT13AAAAVAAAAFMAAABR
-        AAAASwAAAD8AAAAuAAAAHgAAABQAAAAUAAAAFgAAABoAAAAdAAAAHgAAABwAAAAaAAAAHAAAABsAAAAS
-        AAAABwAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAgICAhEREQYAAAAOAAAAGomJia7U1NT/8fHx/+/v7//k5OT/1NTU/8DAwP+np6f+
-        cHBw2yEhIZsAAACKAAAAliAgIKmmpqbvvb29/83Nzf/a2tr/29vb/9zc3P/l5eX/2NjY/7CwsP/IyMj/
-        /Pz8////////////+Pj4/+Tk5P/c3Nz/3t7e/+zs7P/6+vr///////v7+/9wcHD/YGBg/3p6ev/r6+v/
-        ////////////////////////////////////////////////////////////////////////////////
-        ////////////////+vr6/+rq6v/f39//4eHh//Ly8v//////////////////////zc3N/7W1tf/e3t7/
-        6+vr/9HR0f+np6f/s7Oz/+Li4vyBgYGWAAAAUwAAAFEAAABMAAAAQQAAAC4AAAAdAAAAFQAAABYAAAAZ
-        AAAAGwAAAB0AAAAdAAAAHAAAAB8AAAAhAAAAHwAAABQAAAAHAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMBHh4eAi8vLwYXFxcL
-        W1tbe8TExP/v7+//9/f3//Hx8f/o6Oj/3Nzc/8zMzP+vr6//g4OD/kNDQ9swMDDDra2t9729vf/R0dH/
-        29vb/9vb2//e3t7/5OTk/83Nzf+urq7/6Ojo/////////////Pz8/+rq6v/b29v/3t7e/+/v7//9/f3/
-        ////////////////z8/P/01NTf9zc3P/hYWF/8PDw///////////////////////////////////////
-        //////////////////////////////////////////////////////////////////////r6+v/n5+f/
-        39/f/+bm5v/7+/v/////////////////3t7e/7Ozs//d3d3/6+vr/8rKyv+hoaH/rq6u/9zc3P+mpqa8
-        CwsLUgAAAEwAAABBAAAALQAAAB4AAAAZAAAAGgAAAB0AAAAgAAAAHwAAAB0AAAAeAAAAIwAAACcAAAAh
-        AAAAEwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHFxcQN/f38MlpaWxtbW1v/09PT/+Pj4//Ly8v/p6en/
-        2dnZ/7e3t/+Ghob/c3Nz/66urv+8vLz/1dXV/9zc3P/c3Nz/39/f/+Pj4//BwcH/tra2//f39///////
-        //////Ly8v/e3t7/29vb/+zs7P/9/f3////////////////////////////p6en/Tk5O/2tra/98fHz/
-        39/f////////////////////////////////////////////////////////////////////////////
-        ///////////////////////////////////////////z8/P/4eHh/+Hh4f/19fX/////////////////
-        4uLi/7S0tP/g4OD/7Ozs/8DAwP+ampr/ra2t/9nZ2f/MzMzXKCgoWgAAAD8AAAAuAAAAIwAAACAAAAAg
-        AAAAIwAAACUAAAAjAAAAHwAAACAAAAApAAAALAAAACMAAAAQAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAACcnJwUoqKi293d3f/29vb/+fn5/+/v7//U1NT/pqam/4qKiv+urq7/urq6/9bW1v/c3Nz/
-        3d3d/+Dg4P/h4eH/urq6/8rKyv/+/v7///////z8/P/m5ub/2tra/+Li4v/4+Pj/////////////////
-        ///////////////////////////Pz8//np6e/9LS0v//////////////////////////////////////
-        ////////////////////////////////////////////////////////////////////////////////
-        ///////////6+vr/5eXl/9/f3//x8fH/////////////////4ODg/7i4uP/k5OT/6urq/6ysrP+SkpL/
-        q6ur/9bW1v/d3d3kMzMzVwAAAC8AAAAoAAAAJgAAACYAAAApAAAAKwAAACcAAAAiAAAAJQAAAC8AAAAv
-        AAAAIAAAAAsAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACsrKwmra2t6+Li4v/19fX/
-        5ubm/76+vv+Xl5f/q6ur/7e3t//X19f/3d3d/93d3f/g4OD/39/f/7a2tv/T09P////////////5+fn/
-        39/f/9ra2v/u7u7//v7+////////////////////////////////////////////////////////////
-        ////////////////////////////////////////////////////////////////////////////////
-        ///////////////////////////////////////////////////////////+/v7/6enp/9/f3//x8fH/
-        ////////////////1NTU/8LCwv/n5+f/5OTk/5iYmP+Li4v/pKSk/9TU1P/l5eXuOTk5WAAAACwAAAAr
-        AAAAKwAAAC8AAAAvAAAAKwAAACYAAAArAAAAMwAAAC4AAAAYAAAABgAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAACQkJA8r6+v+NLS0v/ExMT/oqKi/6Wlpf+xsbH/1tbW/97e3v/e3t7/
-        4ODg/9/f3/+1tbX/2dnZ////////////8fHx/9ra2v/d3d3/9vb2////////////////////////////
-        ////////////////////////////////////////////////////////////////////////////////
-        ////////////////////////////////////////////////////////////////////////////////
-        ///////////////////////////+/v7/6urq/9/f3//x8fH/////////////////w8PD/9DQ0P/r6+v/
-        zs7O/4qKiv+CgoL/n5+f/9HR0f/o6Oj3ZGRkZgAAAC8AAAAwAAAAMgAAADMAAAAtAAAAKwAAADEAAAA1
-        AAAAJwAAAA8AAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACJiYlX
-        kJCQ/pWVlf+goKD/q6ur/9HR0f/f39//39/f/+Hh4f/h4eH/t7e3/97e3v///////////+/v7//Z2dn/
-        4uLi//v7+///////////////////////////////////////////////////////////////////////
-        ////////////////////////////////////////////////////////////////////////////////
-        ///////////////////////////////////////////////////////////////////////////+/v7/
-        6enp/9/f3//09PT////////////6+vr/uLi4/97e3v/s7Oz/qqqq/4KCgv9+fn7/m5ub/83Nzf/n5+f8
-        iIiIegAAADUAAAA2AAAANAAAADAAAAAxAAAANgAAADEAAAAbAAAABwAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABycnJ9kJCQ/6SkpP/Kysr/39/f/+Dg4P/h4eH/
-        4+Pj/7y8vP/V1dX////////////t7e3/2NjY/+Tk5P/9/f3/////////////////////////////////
-        ////////////////////////////////////////////////////////////////////////////////
-        ////////////////////////////////////////////////////////////////////////////////
-        ///////////////////////////////////////////+/v7/5ubm/+Dg4P/7+/v////////////n5+f/
-        v7+//+jo6P/j4+P/h4eH/4CAgP9+fn7/mJiY/8rKyv/o6Oj+nJyckwAAADkAAAA1AAAANAAAADcAAAA2
-        AAAAJgAAAA8AAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAJ6enmefn5//wcHB/+Dg4P/h4eH/4eHh/+Tk5P/Dw8P/zc3N////////////7e3t/9fX1//m5ub/
-        /v7+////////////////////////////////////////////////////////////////////////////
-        ////////////////////////////////////////////////////////////////////////////////
-        ////////////////////////////////////////////////////////////////////////////////
-        ///////////8/Pz/4eHh/+Xl5f/+/v7////////////Hx8f/19fX/+zs7P+3t7f/fHx8/4qKiv9/f3//
-        mJiY/8rKyv/o6Oj/o6OjnwAAADgAAAA5AAAAOgAAADEAAAAcBQUFCQUFBQEAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACrq6slmpqa+K6urv/e3t7/4uLi/+Li4v/k5OT/
-        z8/P/8PDw////////////+/v7//X19f/5eXl//7+/v//////////////////////////////////////
-        ////////////////////////////////////////////////////////////////////////////////
-        ////////////////////////////////////////////////////////////////////////////////
-        ///////////////////////////////////////////////////////////19fX/39/f//Dw8P//////
-        //////b29v+7u7v/5ubm/+bm5v+CgoL/i4uL/5CQkP+CgoL/m5ub/8vLy//p6en/pqampAAAADwAAAA5
-        AAAAKwAAABgAAAAKEhISAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        pqamBpWVlcqgoKD/2dnZ/+Li4v/j4+P/5OTk/9ra2v+2trb/+/v7///////y8vL/19fX/+Li4v/+/v7/
-        ////////////////////////////////////////////////////////////////////////////////
-        ////////////////////////////////////////////////////////////////////////////////
-        ////////////////////////////////////////////////////////////////////////////////
-        ///////////////////////////q6ur/4ODg//z8/P///////////9DQ0P/X19f/7Ozs/6+vr/95eXn/
-        ra2t/5GRkf+EhIT/oaGh/87Ozv/q6ur/p6enqAAAADUAAAAmAAAAGAAAAA4pKSkEAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACZmZlzlZWV/8bGxv/j4+P/5OTk/+Tk5P/i4uL/
-        t7e3/+3t7f/+/v7/+fn5/9jY2P/e3t7//Pz8//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7/
-        /v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7/
-        /v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7/
-        /v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//r6+v/f39//
-        6+vr//7+/v/+/v7/9PT0/7+/v//p6en/2tra/3Nzc/+lpaX/srKy/4+Pj/+JiYn/q6ur/9DQ0P/s7Oz/
-        qKionQAAACYAAAAbAAAAD0VFRQQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        qqqqGpCQkPWqqqr/4eHh/+Tk5P/l5eX/5ubm/8XFxf/Y2Nj//f39//v7+//d3d3/2NjY//j4+P/9/f3/
-        /f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3/
-        /f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3/
-        /f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3/
-        /f39//39/f/9/f3//f39//39/f/9/f3//f39/+zs7P/d3d3/+Pj4//39/f/9/f3/yMjI/93d3f/t7e3/
-        k5OT/4mJif/Pz8//rq6u/46Ojv+SkpL/tra2/9TU1P/w8PD/qamplAAAABwAAAAMY2NjAgAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACMjIymlJSU/9fX1//k5OT/5ubm/+bm5v/Z2dn/
-        v7+///39/f/9/f3/5ubm/9TU1P/w8PD//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3/
-        /f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3/
-        /f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3/
-        /f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3/
-        +vr6/97e3v/q6ur//f39//39/f/n5+f/ycnJ/+vr6/+6urr/bW1t/9XV1f/MzMz/pqam/46Ojv+hoaH/
-        wcHB/9/f3//y8vL/p6endERERAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        nJycNYuLi/+3t7f/4+Pj/+fn5//n5+f/5OTk/7q6uv/v7+//+/v7//Hx8f/T09P/5OTk//v7+//7+/v/
-        +/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/
-        +/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/
-        +/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/
-        +/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/6enp/93d3f/5+fn/+/v7//v7+//AwMD/
-        5ubm/+Dg4P9tbW3/ubm5/+Hh4f/Dw8P/np6e/5OTk/+1tbX/z8/P/+7u7v/y8vL8srKyKwAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACGhoa1lJSU/9vb2//m5ub/6Ojo/+jo6P/R0dH/
-        zc3N//r6+v/6+vr/2tra/9fX1//4+Pj/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/
-        +vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/
-        +vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/
-        +vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/
-        +vr6//r6+v/19fX/3Nzc/+7u7v/6+vr/+vr6/9HR0f/d3d3/7e3t/4ODg/+Wlpb/8PDw/9vb2/+5ubn/
-        l5eX/6SkpP/Jycn/4ODg//Hx8f/09PSzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        mZmZNIeHh/+4uLj/5OTk/+jo6P/o6Oj/4+Pj/7m5uf/19fX/+Pj4/+fn5//R0dH/7e3t//j4+P/4+Pj/
-        +Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/
-        +Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/
-        +Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/
-        +Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/l5eX/6urq//j4+P/g4OD/4+Pj//j4+P/4+Pj/
-        4uLi/9DQ0P/s7Oz/oaGh/3V1df/4+Pj/7Ozs/9LS0v+qqqr/mpqa/7y8vP/Y2Nj/5+fn//Hx8f/r6+te
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACCgoKtkJCQ/9vb2//o6Oj/6enp/+np6f/Pz8//
-        1NTU//j4+P/19fX/0tLS/9zc3P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/
-        +Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/
-        +Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/
-        +Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/
-        mJiY/2JiYv97e3v/xsbG/+np6f/a2tr/9vb2//j4+P/29vb/w8PD/+rq6v++vr7/aGho/+np6f/29vb/
-        5eXl/8PDw/+goKD/q6ur/9bW1v/f39//7u7u//Ly8vPn5+caAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        lZWVHYODg/yysrL/5OTk/+rq6v/q6ur/5OTk/7q6uv/09PT/9vb2/+Li4v/Pz8//8PDw//b29v/29vb/
-        9vb2//b29v/29vb/9vb2//b29v/29vb/9vb2//b29v/29vb/9vb2//b29v/29vb/9vb2//b29v/29vb/
-        9vb2//b29v/29vb/9vb2//b29v/29vb/9vb2//b29v/29vb/9vb2//b29v/29vb/9vb2//b29v/29vb/
-        9vb2//b29v/29vb/9vb2//b29v/29vb/9vb2//b29v/29vb/9vb2//b29v/29vb/9vb2//b29v/29vb/
-        9vb2//b29v/29vb/9vb2//b29v/29vb/9vb2/+Dg4P9QUFD/eXl5/5KSkv+goKD/7+/v/9nZ2f/u7u7/
-        9vb2//b29v/Gxsb/5+fn/9PT0/9oaGj/0dHR//z8/P/y8vL/2NjY/7CwsP+hoaH/ysrK/+Pj4//k5OT/
-        8fHx//Dw8KAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACMjIyEh4eH/9fX1//o6Oj/6+vr/+rq6v/U1NT/
-        z8/P//T09P/y8vL/z8/P/9vb2//09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/
-        9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/
-        9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/
-        9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/
-        6Ojo/1VVVf91dXX/i4uL/7Gxsf/09PT/2NjY/+Xl5f/09PT/9PT0/8/Pz//i4uL/6Ojo/2hoaP+5ubn/
-        /v7+//n5+f/n5+f/w8PD/6Ojo/+6urr/5ubm/+Hh4f/u7u7/8fHx/fLy8ioAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        nZ2dBX9/f+Sfn5//4uLi/+rq6v/s7Oz/6Ojo/76+vv/s7Oz/7e3t/9vb2//Ly8v/7Ozs//Pz8//z8/P/
-        8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/
-        8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/
-        8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/
-        8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/xMTE/5CQkP+vr6//7e3t//Pz8//d3d3/
-        39/f//Pz8//z8/P/1tbW/9zc3P/t7e3/dXV1/6enp////////Pz8//Hx8f/U1NT/ra2t/62trf/g4OD/
-        6urq/+Xl5f/y8vL/8fHxmwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACUlJRAgICA/8PDw//n5+f/7Ozs/+3t7f/e3t7/
-        x8fH/+vr6//n5+f/6urq/8vLy//x8fH/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/
-        8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/
-        8vLy//Ly8v/y8vL/8fHx//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/
-        8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/
-        8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy/+Hh4f/Z2dn/8vLy//Ly8v/c3Nz/1tbW/+3t7f+Dg4P/
-        mJiY///////+/v7/+Pj4/+Hh4f+6urr/p6en/9LS0v/z8/P/4ODg//Dw8P/y8vL58PDwEgAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAHt7e52Hh4f/2tra/+rq6v/t7e3/7Ozs/83Nzf/a2tr/3Nzc//Pz8//19fX/6enp/+Xl5f/w8PD/
-        8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/
-        8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/7+/v/+7u7v/t7e3/6+vr/+np6f/U1NT/wsLC/+jo6P/v7+//
-        7+/v//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/
-        8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/
-        4+Pj/9XV1f/v7+//8PDw/+Hh4f/R0dH/7e3t/4yMjP+Ojo7////////////7+/v/6+vr/8fHx/+np6f/
-        w8PD//X19f/l5eX/6urq//Ly8v/z8/N1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACcnJwCfHx86qKiov/i4uL/7Ozs/+7u7v/o6Oj/
-        vr6+/+vr6//Y2Nj/9/f3//X19f/8/Pz/6enp/+Xl5f/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/
-        7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7e3t/+vr6//r6+v/6Ojo/+Xl5f/i4uL/
-        3t7e/9nZ2f/U1NT/j4+P/0JCQv9BQUH/WFhY/9HR0f/n5+f/6+vr/+zs7P/u7u7/7u7u/+7u7v/u7u7/
-        7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/
-        7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/l5eX/09PT/+rq6v/u7u7/5ubm/8/Pz//t7e3/
-        kpKS/4iIiP////////////39/f/x8fH/0tLS/6ysrP+2trb/7+/v/+7u7v/i4uL/8/Pz//T09NYAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAJKSkjV9fX3/vLy8/+Xl5f/t7e3/7u7u/9/f3//Gxsb/5OTk/+Li4v/19fX/9/f3//z8/P/8/Pz/
-        5ubm/+Xl5f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/7Ozs/+rq6v/o6Oj/
-        5eXl/+Pj4//f39//2tra/9XV1f/R0dH/zMzM/8jIyP+9vb3/m5ub/3d3d/9BQUH/QUFB/0FBQf9BQUH/
-        fHx8/9vb2//d3d3/4eHh/+Xl5f/p6en/7Ozs/+3t7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/
-        7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/
-        7e3t/+Xl5f/S0tL/5+fn/+3t7f/o6Oj/zc3N/+3t7f+Tk5P/hoaG//7+/v///////v7+//b29v/a2tr/
-        srKy/66urv/m5ub/9vb2/93d3f/w8PD/8/Pz/vDw8BsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAh4eHen9/f//V1dX/6urq/+7u7v/u7u7/
-        1NTU/9PT0//X19f/8fHx//T09P/5+fn/+/v7//v7+//7+/v/5+fn/+Li4v/r6+v/6+vr/+vr6//r6+v/
-        6+vr/+vr6//r6+v/6+vr/+rq6v/l5eX/2tra/9PT0//Pz8//ysrK/8bGxv/ExMT/s7Oz/5CQkP9tbW3/
-        TU1N/zExMf8xMTH/NDQ0/0FBQf9BQUH/QUFB/0FBQf9aWlr/0tLS/97e3v/Z2dn/2dnZ/9vb2//h4eH/
-        5ubm/+np6f/q6ur/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/
-        6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/5eXl/9HR0f/l5eX/6+vr/+jo6P/Nzc3/
-        7e3t/5KSkv+Ghob//f39//7+/v/+/v7/+vr6/+Hh4f+6urr/qamp/9zc3P/7+/v/3Nzc/+3t7f/z8/P/
-        8PDwaQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAB6enq4jo6O/93d3f/s7Oz/7+/v/+zs7P/ExMT/4+Pj/9DQ0P/39/f/9PT0//r6+v/7+/v/
-        +/v7//v7+//7+/v/6urq/9/f3//o6Oj/6enp/+np6f/p6en/6enp/+np6f/p6en/5ubm/9fX1//Gxsb/
-        wcHB/6mpqf+Hh4f/ZWVl/0NDQ/8xMTH/MTEx/zExMf8xMTH/MTEx/0RERP9vb2//VVVV/0FBQf9BQUH/
-        QUFB/5SUlP94eHj/d3d3/76+vv/f39//2dnZ/9XV1f/X19f/3Nzc/+Li4v/m5ub/6Ojo/+np6f/p6en/
-        6enp/+np6f/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/
-        6enp/+np6f/j4+P/0dHR/+Pj4//p6en/5ubm/87Ozv/t7e3/jY2N/4uLi//7+/v//Pz8//39/f/7+/v/
-        5+fn/8HBwf+np6f/0dHR//z8/P/g4OD/5ubm//Pz8//19fWeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHt7e/Cjo6P/4eHh/+3t7f/w8PD/
-        6enp/8HBwf/j4+P/1tbW//X19f/19fX/+/v7//v7+//7+/v/+/v7//v7+//7+/v/7+/v/9zc3P/m5ub/
-        6Ojo/+jo6P/o6Oj/6Ojo/+fn5//g4OD/srKy/15eXv87Ozv/MTEx/zExMf8xMTH/MTEx/zExMf89PT3/
-        bGxs/5ycnP/Kysr/3Nzc/7S0tP88PDz/OTk5/2pqav+urq7/6Ojo/+jo6P/Y2Nj/jo6O/2tra/+jo6P/
-        29vb/9ra2v/V1dX/1NTU/9fX1//c3Nz/4ODg/+Xl5f/m5ub/5+fn/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/
-        6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+Li4v/Pz8//4uLi/+jo6P/h4eH/
-        0dHR/+3t7f+EhIT/kpKS//f39//6+vr//Pz8//v7+//q6ur/xsbG/6enp//Jycn/+/v7/+Pj4//f39//
-        8/Pz//T09OYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAACQkJAke3t7/7S0tP/k5OT/7+/v//Hx8f/k5OT/x8fH/9zc3P/d3d3/8/Pz//X19f/6+vr/
-        +vr6//r6+v/6+vr/+vr6//r6+v/6+vr/9PT0/9zc3P/i4uL/5ubm/+bm5v/m5ub/5eXl/+Li4v9hYWH/
-        MTEx/zExMf8xMTH/ODg4/2RkZP+RkZH/w8PD/+Tk5P/m5ub/5OTk/9vb2//AwMD/SUlJ/zExMf9sbGz/
-        4uLi/+bm5v/m5ub/5ubm/+bm5v/m5ub/4+Pj/6mpqf9sbGz/iIiI/87Ozv/c3Nz/19fX/9PT0//S0tL/
-        1dXV/9vb2//g4OD/5OTk/+Xl5f/m5ub/5ubm/+bm5v/m5ub/5ubm/+bm5v/m5ub/5ubm/+bm5v/m5ub/
-        5ubm/+bm5v/m5ub/39/f/87Ozv/h4eH/5ubm/9zc3P/V1dX/7e3t/3d3d/+bm5v/8fHx//b29v/5+fn/
-        +vr6/+3t7f/Kysr/qKio/8LCwv/5+fn/5+fn/9nZ2f/y8vL/8/Pz/e3t7QMAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJOTk1J8fHz/xMTE/+fn5//w8PD/
-        8fHx/97e3v/Nzc3/1NTU/+Xl5f/y8vL/9vb2//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/
-        +Pj4/+Pj4//b29v/4+Pj/+Tk5P/k5OT/wcHB/zQ0NP9aWlr/iYmJ/7m5uf/f39//5OTk/+Tk5P/k5OT/
-        5OTk/+Li4v/Z2dn/xcXF/19fX/8xMTH/UFBQ/9ra2v/k5OT/5OTk/+Tk5P/k5OT/5OTk/+Tk5P/k5OT/
-        5OTk/+Tk5P/CwsL/enp6/3Nzc/+4uLj/39/f/9ra2v/U1NT/z8/P/9HR0f/W1tb/29vb/9/f3//i4uL/
-        5OTk/+Tk5P/k5OT/5OTk/+Tk5P/k5OT/5OTk/+Tk5P/k5OT/5OTk/+Tk5P/b29v/zc3N/+Li4v/k5OT/
-        1dXV/9ra2v/q6ur/ampq/6ampv/p6en/7+/v//X19f/4+Pj/7e3t/83Nzf+oqKj/vb29//f39//q6ur/
-        1dXV//Dw8P/z8/P/8PDwNgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAlJSUeH5+fv/S0tL/6Ojo//Hx8f/x8fH/19fX/8/Pz//Kysr/7u7u//Hx8f/29vb/
-        +Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4/+/v7//a2tr/3t7e/+Li4v/Pz8//
-        2tra/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Li4v/g4OD/19fX/8TExP96enr/MTEx/z09Pf/Jycn/
-        4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/1tbW/5CQkP9paWn/
-        nZ2d/9nZ2f/b29v/1NTU/8/Pz//Nzc3/0NDQ/9XV1f/b29v/39/f/+Hh4f/i4uL/4+Pj/+Pj4//j4+P/
-        4+Pj/+Pj4//j4+P/4+Pj/9fX1//Ly8v/3d3d/+Hh4f/R0dH/4ODg/9fX1/9oaGj/r6+v/9/f3//n5+f/
-        7u7u//Pz8//r6+v/zc3N/6mpqf+6urr/9fX1/+zs7P/S0tL/7u7u//Pz8//v7+9bAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB5eXmchoaG/9bW1v/q6ur/
-        8vLy//Dw8P/R0dH/1NTU/8bGxv/19fX/8PDw//f39//4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/
-        +Pj4//j4+P/4+Pj/+Pj4//j4+P/m5ub/2NjY/9/f3//h4eH/4uLi/+Li4v/i4uL/4uLi/+Li4v/h4eH/
-        39/f/9bW1v/ExMT/k5OT/zIyMv8yMjL/r6+v/+Hh4f/i4uL/4uLi/+Li4v/i4uL/4uLi/+Li4v/i4uL/
-        4uLi/+Li4v/i4uL/4uLi/+Li4v/i4uL/4uLi/9/f3/+rq6v/bW1t/4KCgv/Kysr/3Nzc/9fX1//R0dH/
-        zc3N/8zMzP/Q0ND/19fX/9zc3P/f39//4eHh/+Li4v/i4uL/4uLi/+Li4v/h4eH/z8/P/8rKyv/u7u7/
-        1tbW/83Nzf/l5eX/vLy8/2hoaP+2trb/1NTU/93d3f/l5eX/7Ozs/+bm5v/Ly8v/qamp/7a2tv/z8/P/
-        7e3t/87Ozv/t7e3/8/Pz/+3t7W8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAHp6eriOjo7/2NjY/+vr6//z8/P/8PDw/83Nzf/Y2Nj/xMTE//Pz8//u7u7/
-        9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//09PT/
-        4ODg/9bW1v/d3d3/4ODg/+Dg4P/g4OD/4ODg/97e3v/U1NT/wcHB/6SkpP87Ozv/MTEx/42Njf/g4OD/
-        4ODg/+Dg4P/g4OD/4ODg/+Dg4P/g4OD/4ODg/+Dg4P/g4OD/4ODg/+Dg4P/g4OD/4ODg/+Dg4P/g4OD/
-        4ODg/+Dg4P/g4OD/w8PD/3t7e/9wcHD/sbGx/93d3f/Z2dn/09PT/83Nzf/Kysr/zc3N/9fX1//f39//
-        4ODg/+Dg4P/g4OD/3d3d/9fX1//d3d3/8/Pz//f39/++vr7/ycnJ/+np6f+mpqb/aWlp/7m5uf/Gxsb/
-        0dHR/9vb2//j4+P/4ODg/8bGxv+mpqb/tLS0//Hx8f/t7e3/y8vL/+vr6//z8/P/7OzsewAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAe3t7zpWVlf/Z2dn/
-        7e3t//Pz8//v7+//ysrK/9vb2//FxcX/8fHx/+7u7v/29vb/9vb2//b29v/29vb/9vb2//b29v/29vb/
-        9vb2//b29v/29vb/9vb2//b29v/29vb/9vb2//b29v/29vb/8vLy/+Dg4P/V1dX/29vb/93d3f/c3Nz/
-        09PT/7+/v/+urq7/SkpK/zExMf9ra2v/3t7e/97e3v/e3t7/3t7e/97e3v/e3t7/3t7e/97e3v/e3t7/
-        3t7e/97e3v/e3t7/3t7e/97e3v/e3t7/3t7e/97e3v/e3t7/3t7e/97e3v/e3t7/3t7e/9TU1P+SkpL/
-        Z2dn/5eXl//V1dX/2tra/9XV1f/S0tL/1tbW/93d3f/e3t7/2tra/9bW1v/i4uL/9PT0//Hx8f/09PT/
-        7+/v/7u7u//Nzc3/6+vr/4GBgf9zc3P/ra2t/7i4uP/ExMT/zs7O/9fX1//W1tb/v7+//6Ghof+wsLD/
-        7u7u/+rq6v/Jycn/6+vr//Pz8//r6+t+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAB8fHzfm5ub/9ra2v/t7e3/9PT0/+/v7//Jycn/2dnZ/8PDw//w8PD/
-        7e3t//X19f/19fX/9fX1//X19f/19fX/9fX1//X19f/19fX/9fX1//X19f/19fX/9fX1//X19f/19fX/
-        9fX1//X19f/19fX/9fX1//Pz8//k5OT/1dXV/8rKyv+9vb3/sbGx/2FhYf8xMTH/Tk5O/9XV1f/d3d3/
-        3d3d/93d3f/d3d3/3d3d/93d3f/d3d3/3d3d/93d3f/d3d3/3d3d/93d3f/d3d3/3d3d/93d3f/d3d3/
-        3d3d/93d3f/d3d3/3d3d/93d3f/d3d3/3d3d/93d3f/b29v/rKys/21tbf98fHz/xMTE/9vb2//Z2dn/
-        1dXV/9bW1v/l5eX/9PT0//X19f/z8/P/7+/v//T09P/Z2dn/wMDA/9bW1v/o6Oj/ampq/3x8fP+enp7/
-        qqqq/7W1tf/AwMD/y8vL/8rKyv+2trb/m5ub/62trf/q6ur/5ubm/8XFxf/q6ur/8/Pz/+rq6n8AAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH19femenp7/
-        2tra/+7u7v/09PT/7+/v/8nJyf/Y2Nj/wsLC/+/v7//s7Oz/9PT0//T09P/09PT/9PT0//T09P/09PT/
-        9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//Pz8//x8fH/
-        39/f/8TExP+IiIj/Ly8v/zw8PP/ExMT/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/
-        3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/
-        3Nzc/9zc3P/c3Nz/3Nzc/8LCwv93d3f/gYGB/83Nzf/s7Oz/9PT0//T09P/09PT/9PT0//Hx8f/u7u7/
-        9PT0/8bGxv/Dw8P/4uLi/8DAwP9oaGj/f39//5GRkf+bm5v/pqam/7Kysv+8vLz/vb29/6qqqv+Tk5P/
-        qqqq/+Tk5P/e3t7/wcHB/+np6f/z8/P/9fX1iQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfn5+7KCgoP/a2tr/7u7u//X19f/w8PD/y8vL/9bW1v/AwMD/
-        7u7u/+rq6v/z8/P/5+fn/9/f3//r6+v/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/
-        8/Pz//Pz8//z8/P/8/Pz//Pz8//y8vL/7+/v/+rq6v/m5ub/39/f/8TExP+srKz/vr6+/9fX1//S0tL/
-        1tbW/9nZ2f/a2tr/2tra/9ra2v/a2tr/2tra/9ra2v/a2tr/2tra/9ra2v/a2tr/2tra/9ra2v/a2tr/
-        2tra/9ra2v/a2tr/2tra/9ra2v/a2tr/2tra/9ra2v/Z2dn/1tbW/9LS0v/W1tb/39/f/+rq6v/w8PD/
-        4ODg//Pz8//z8/P/8/Pz//Pz8//z8/P/7u7u/+/v7//z8/P/tLS0/8nJyf/p6en/n5+f/2hoaP+AgID/
-        h4eH/4+Pj/+YmJj/o6Oj/66urv+urq7/nZ2d/4mJif+lpaX/3d3d/9TU1P+8vLz/6enp//Ly8v/o6Oh/
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/f3/s
-        oKCg/9nZ2f/t7e3/9vb2//Hx8f/Nzc3/1dXV/729vf/t7e3/6Ojo/+3t7f/Ly8v/2NjY/97e3v/w8PD/
-        8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//y8vL/8vLy/+7u7v/o6Oj/
-        5OTk/+Li4v/Dw8P/wMDA/9ra2v/z8/P/8/Pz//Hx8f/m5ub/39/f/9jY2P/T09P/0dHR/9PT0//V1dX/
-        1tbW/9fX1//Y2Nj/2dnZ/9nZ2f/Z2dn/2dnZ/9nZ2f/Y2Nj/19fX/9bW1v/U1NT/0tLS/9HR0f/U1NT/
-        2tra/+Dg4P/m5ub/8fHx//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Hx8f/r6+v/
-        8PDw/+Pj4/+3t7f/0dHR/+zs7P9ycnL/b29v/39/f/+AgID/hYWF/4yMjP+VlZX/n5+f/56env+Pj4//
-        f39//6CgoP/U1NT/x8fH/7e3t//p6en/8vLy/+fn534AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAgOaenp7/19fX/+zs7P/29vb/8vLy/9HR0f/Q0ND/
-        uLi4/+zs7P/m5ub/6enp/8nJyf/X19f/3t7e/+zs7P/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8fH/
-        8fHx//Hx8f/x8fH/8fHx//Dw8P/t7e3/5ubm/+Li4v/j4+P/xcXF/7y8vP/Nzc3/8fHx//Hx8f/x8fH/
-        8fHx//Hx8f/x8fH/8fHx//Hx8f/x8fH/7Ozs/+bm5v/h4eH/39/f/97e3v/c3Nz/3d3d/93d3f/d3d3/
-        3Nzc/9/f3//f39//4uLi/+bm5v/t7e3/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8fH/
-        8fHx//Hx8f/x8fH/8fHx//Hx8f/x8fH/7e3t/+rq6v/x8fH/xcXF/76+vv/g4OD/ycnJ/2hoaP94eHj/
-        gICA/39/f/9/f3//hISE/4qKiv+RkZH/j4+P/4CAgP92dnb/nJyc/8jIyP+4uLj/srKy/+jo6P/x8fH/
-        5eXlewAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        gYGB2pubm//U1NT/6+vr//b29v/z8/P/19fX/83Nzf+1tbX/7Ozs/+Tk5P/u7u7/2dnZ/9DQ0P/g4OD/
-        8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/v7+//6+vr/+Tk5P/g4OD/
-        5OTk/8vLy/+4uLj/wcHB/+3t7f/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/
-        8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/
-        8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/p6en/
-        6+vr//Dw8P+urq7/yMjI/+np6f+enp7/aWlp/4ODg/+CgoL/gICA/39/f/9/f3//goKC/4WFhf+AgID/
-        cnJy/21tbf+Wlpb/urq6/6enp/+vr6//6enp//Dw8P/l5eVzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACDg4PJmJiY/9HR0f/p6en/9vb2//T09P/e3t7/
-        ysrK/7m5uf/j4+P/4+Pj/+rq6v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/
-        7u7u/+7u7v/u7u7/7u7u/+rq6v/i4uL/3t7e/+Li4v/T09P/tbW1/7i4uP/m5ub/7u7u/+7u7v/u7u7/
-        7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/
-        7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/
-        7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7Ozs/+fn5//s7Oz/0tLS/7W1tf/X19f/5eXl/29vb/90dHT/
-        iYmJ/4aGhv+Dg4P/gYGB/39/f/9/f3//fX19/3V1df9lZWX/ZmZm/5GRkf+pqan/lpaW/62trf/p6en/
-        7+/v/+Tk5GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAISEhLGTk5P/zc3N/+fn5//19fX/9vb2/+Pj4//Kysr/v7+//9XV1f/i4uL/5+fn/+7u7v/u7u7/
-        7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+3t7f/o6Oj/4ODg/9zc3P/g4OD/
-        29vb/7Gxsf+wsLD/29vb/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/
-        7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/
-        7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/m5ub/
-        5+fn/+7u7v+xsbH/w8PD/+bm5v+zs7P/aGho/4iIiP+NjY3/ioqK/4aGhv+EhIT/goKC/39/f/95eXn/
-        a2tr/1tbW/9iYmL/ioqK/5iYmP+FhYX/sLCw/+vr6//u7u7/5eXlPAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhYWFlI+Pj//Jycn/4+Pj//T09P/4+Pj/
-        6enp/8jIyP/Gxsb/yMjI/+Pj4//j4+P/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/
-        7e3t/+3t7f/s7Oz/6Ojo/9/f3//a2tr/3t7e/+Hh4f+ysrL/rKys/83Nzf/t7e3/7e3t/+3t7f/t7e3/
-        7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/
-        7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/
-        7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/6urq/+Tk5P/q6ur/1tbW/7CwsP/S0tL/6enp/3x8fP91dXX/
-        l5eX/5KSkv+Ojo7/i4uL/4iIiP+EhIT/gYGB/3h4eP9mZmb/VFRU/2JiYv+EhIT/hoaG/3l5ef+3t7f/
-        7Ozs/+3t7f7Z2dkIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAACcnJxwjY2N/8HBwf/f39//8fHx//j4+P/t7e3/zMzM/83Nzf+5ubn/5eXl/97e3v/r6+v/
-        7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+rq6v/h4eH/2dnZ/9zc3P/k5OT/
-        t7e3/6ioqP+9vb3/6+vr/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/
-        7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/
-        7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+vr6//k5OT/
-        5OTk/+zs7P+xsbH/wcHB/+Xl5f+9vb3/aGho/5KSkv+cnJz/mJiY/5SUlP+Pj4//jIyM/4iIiP+Dg4P/
-        d3d3/2JiYv9TU1P/ZmZm/4CAgP94eHj/cnJy/8TExP/r6+v/7u7u7gAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJubm0mOjo7/tra2/9nZ2f/u7u7/
-        +fn5//Hx8f/W1tb/zc3N/6+vr//n5+f/3d3d/+bm5v/r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/
-        6+vr/+vr6//q6ur/6Ojo/9/f3//c3Nz/5OTk/8HBwf+kpKT/r6+v/+fn5//r6+v/6+vr/+vr6//r6+v/
-        6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/
-        6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/
-        6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/5ubm/+Hh4f/o6Oj/0tLS/6+vr//U1NT/5ubm/3h4eP93d3f/
-        p6en/6Ojo/+enp7/mZmZ/5WVlf+RkZH/jY2N/4WFhf91dXX/X19f/1ZWVv9vb2//fX19/2tra/9ycnL/
-        1NTU/+rq6v/v7++6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAm5ubFY+Pj/+srKz/0dHR/+rq6v/4+Pj/9fX1/+Li4v/Kysr/ubm5/9TU1P/c3Nz/
-        4ODg/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+np6f/n5+f/4uLi/+Tk5P/Nzc3/
-        oaGh/6Wlpf/e3t7/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/
-        6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/
-        6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+jo6P/g4OD/
-        4+Pj/+jo6P+oqKj/w8PD/+fn5/+xsbH/aGho/6Kiov+urq7/qqqq/6SkpP+fn5//mpqa/5aWlv+QkJD/
-        hoaG/3Nzc/9cXFz/Xl5e/3l5ef97e3v/ZGRk/4KCgv/e3t7/6enp/9jY2HwAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkJCQ3KSkpP/Kysr/
-        5OTk//X19f/5+fn/6enp/8zMzP/Hx8f/vLy8/+Dg4P/a2tr/6Ojo/+np6f/p6en/6enp/+np6f/p6en/
-        6enp/+np6f/p6en/6enp/+jo6P/n5+f/2NjY/56env+cnJz/0dHR/+np6f/p6en/6enp/+np6f/p6en/
-        6enp/+np6f/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/
-        6enp/+np6f/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/
-        6enp/+np6f/p6en/6enp/+np6f/o6Oj/4eHh/97e3v/o6Oj/v7+//7S0tP/b29v/5OTk/3Nzc/+EhIT/
-        urq6/7W1tf+wsLD/q6ur/6Wlpf+hoaH/nJyc/5WVlf+Hh4f/b29v/1xcXP9paWn/goKC/3d3d/9iYmL/
-        nJyc/+Xl5f/o6Oj/3NzcSAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAACSkpKenJyc/8LCwv/d3d3/8fHx//r6+v/w8PD/1dXV/87Ozv+rq6v/
-        4+Pj/9fX1//g4OD/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P+urq7/
-        mJiY/8DAwP/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/
-        6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/
-        6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+Pj4//d3d3/
-        5OTk/9nZ2f+np6f/zMzM/+rq6v+cnJz/bGxs/7m5uf/BwcH/vLy8/7e3t/+xsbH/rKys/6ampv+hoaH/
-        l5eX/4WFhf9ra2v/YGBg/3l5ef+Hh4f/cnJy/2dnZ/+6urr/6Ojo/+np6fnS0tIDAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKSkpFWampr/
-        t7e3/9TU1P/r6+v/+Pj4//b29v/k5OT/zMzM/7u7u//Hx8f/29vb/9jY2P/n5+f/6Ojo/+jo6P/o6Oj/
-        6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/56env+tra3/5+fn/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/
-        6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/
-        6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/
-        6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/k5OT/29vb/97e3v/m5ub/pqam/7+/v//k5OT/y8vL/2xsbP+fn5//
-        zc3N/8fHx//BwcH/uLi4/6+vr/+np6f/oaGh/5qamv+Ojo7/enp6/2RkZP9qamr/iIiI/4eHh/9tbW3/
-        d3d3/9XV1f/o6Oj/7e3ttwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAq6urDpubm/mtra3/ysrK/+Pj4//19fX/+/v7/+zs7P/R0dH/
-        y8vL/6urq//i4uL/1dXV/97e3v/n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//k5OT/
-        nZ2d/+Li4v/n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/
-        5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/
-        5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5eXl/9ra2v/b29v/
-        5ubm/7e3t/+0tLT/29vb/+Xl5f99fX3/gICA/9PT0//Nzc3/wcHB/7S0tP+mpqb/mZmZ/5CQkP+JiYn/
-        goKC/3V1df9iYmL/WFhY/3BwcP+MjIz/gYGB/2tra/+Xl5f/5OTk/+jo6P/W1tZqAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        nJyctKampv/AwMD/2dnZ/+/v7//6+vr/9PT0/+Pj4//MzMz/tbW1/8nJyf/Z2dn/09PT/+Pj4//m5ub/
-        5ubm/+bm5v/m5ub/5ubm/+bm5v/m5ub/5ubm/9vb2//X19f/5ubm/+bm5v/m5ub/5ubm/+bm5v/m5ub/
-        5ubm/+bm5v/m5ub/5ubm/+bm5v/m5ub/5ubm/+bm5v/m5ub/5ubm/+bm5v/m5ub/5ubm/+bm5v/m5ub/
-        5ubm/+bm5v/m5ub/5ubm/+bm5v/m5ub/5ubm/+bm5v/m5ub/5ubm/+bm5v/m5ub/5ubm/+bm5v/m5ub/
-        5ubm/+bm5v/m5ub/5ubm/+Xl5f/a2tr/2NjY/+Tk5P/Gxsb/qKio/9HR0f/s7Oz/l5eX/3BwcP/Dw8P/
-        ysrK/7e3t/+mpqb/lZWV/4aGhv95eXn/cHBw/2pqav9iYmL/VVVV/0ZGRv9KSkr/aGho/3x8fP9wcHD/
-        bW1t/7y8vP/o6Oj/6urq+sXFxQ4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACrq6tXpKSk/7a2tv/Nzc3/5ubm//f39//7+/v/
-        6+vr/9LS0v/Kysr/qKio/+Dg4P/S0tL/19fX/+Xl5f/l5eX/5eXl/+Xl5f/l5eX/5eXl/+Xl5f/l5eX/
-        5eXl/+Xl5f/l5eX/5eXl/+Xl5f/l5eX/5eXl/+Xl5f/l5eX/5eXl/+Xl5f/l5eX/5eXl/+Xl5f/l5eX/
-        5eXl/+Xl5f/l5eX/5eXl/+Xl5f/l5eX/5eXl/+Xl5f/l5eX/5eXl/+Xl5f/l5eX/5eXl/+Xl5f/l5eX/
-        5eXl/+Xl5f/l5eX/5eXl/+Xl5f/l5eX/5eXl/+Xl5f/l5eX/5eXl/+Xl5f/k5OT/2dnZ/9bW1v/g4OD/
-        0tLS/6Ojo//Jycn/6enp/7W1tf9tbW3/oqKi/76+vv+np6f/kpKS/4CAgP9zc3P/ampq/2FhYf9cXFz/
-        VlZW/0xMTP8/Pz//NTU1/z8/P/9UVFT/Wlpa/1ZWVv9wcHD/zc3N/+fn5//u7u6uAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAALGxsQulpaXkrq6u/8LCwv/a2tr/8PDw//v7+//09PT/5OTk/83Nzf+6urr/uLi4/9zc3P/Q0ND/
-        3Nzc/+Tk5P/k5OT/5OTk/+Tk5P/k5OT/5OTk/+Tk5P/k5OT/5OTk/+Tk5P/k5OT/5OTk/+Tk5P/k5OT/
-        5OTk/+Tk5P/k5OT/5OTk/+Tk5P/k5OT/5OTk/+Tk5P/k5OT/5OTk/+Tk5P/k5OT/5OTk/+Tk5P/k5OT/
-        5OTk/+Tk5P/k5OT/5OTk/+Tk5P/k5OT/5OTk/+Tk5P/k5OT/5OTk/+Tk5P/k5OT/5OTk/+Tk5P/k5OT/
-        5OTk/+Tk5P/k5OT/4+Pj/9nZ2f/U1NT/3t7e/9bW1v+hoaH/w8PD/+Xl5f/Hx8f/bW1t/4SEhP+vr6//
-        lZWV/4CAgP9ycnL/bGxs/2tra/9ubm7/cHBw/3Jycv9ycnL/a2tr/2JiYv9VVVX/UVFR/0lJSf9AQED/
-        Pj4+/3Fxcf+9vb3/3d3d/7+/v0sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKysrH2srKz/uLi4/83Nzf/l5eX/
-        9vb2//v7+//t7e3/2dnZ/8zMzP+oqKj/0tLS/9TU1P/Pz8//3t7e/+Pj4//j4+P/4+Pj/+Pj4//j4+P/
-        4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/
-        4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/
-        4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Li4v/X19f/09PT/9zc3P/Y2Nj/
-        n5+f/76+vv/h4eH/1dXV/3Nzc/9tbW3/np6e/4iIiP93d3f/cXFx/3Nzc/91dXX/dnZ2/3Z2dv93d3f/
-        dnZ2/3V1df9ycnL/cHBw/29vb/9ycnL/cXFx/1xcXP9BQUH/Z2dn/5ycnP/Hx8fjRUVFBwAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAtra2Eq2trfSzs7P/wMDA/9jY2P/u7u7/+/v7//f39//p6en/0dHR/8bGxv+kpKT/
-        3d3d/9DQ0P/Pz8//4ODg/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/
-        4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/
-        4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/
-        4+Pj/+Pj4//h4eH/1NTU/9HR0f/c3Nz/2NjY/6CgoP+9vb3/39/f/9bW1v93d3f/X19f/4yMjP+AgID/
-        dXV1/3V1df92dnb/d3d3/3d3d/95eXn/fX19/4GBgf+FhYX/hoaG/4WFhf+EhIT/hISE/4SEhP+CgoL/
-        fHx8/3d3d/9vb2//f39//1ZWVo0iIiITioqKAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsrKyibS0tP+3t7f/
-        ycnJ/+Hh4f/09PT//Pz8//Ly8v/l5eX/zs7O/7u7u/+qqqr/3t7e/87Ozv/Ozs7/39/f/+Li4v/i4uL/
-        4uLi/+Li4v/i4uL/4uLi/+Li4v/i4uL/4uLi/+Li4v/i4uL/4uLi/+Li4v/i4uL/4uLi/+Li4v/i4uL/
-        4uLi/+Li4v/i4uL/4uLi/+Li4v/i4uL/4uLi/+Li4v/i4uL/4uLi/+Li4v/i4uL/4uLi/+Li4v/i4uL/
-        4uLi/+Li4v/i4uL/4uLi/+Li4v/i4uL/4uLi/+Li4v/i4uL/3t7e/9LS0v/R0dH/3Nzc/9LS0v+dnZ3/
-        vb29/97e3v/W1tb/enp6/1hYWP94eHj/d3d3/3V1df93d3f/d3d3/3h4eP97e3v/g4OD/42Njf+Xl5f/
-        oqKi/6ioqP+qqqr/qKio/6ioqP+pqan/qqqq/6Wlpf+bm5v/kJCQ/4aGhv99fX3+HBwccwAAACFmZmYD
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAC6uroRtbW167a2tv+8vLz/0dHR/+jo6P/39/f//Pz8/+7u7v/f39//
-        zc3N/7Ozs/+vr6//3d3d/8zMzP/Nzc3/3d3d/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/
-        4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/
-        4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/
-        4eHh/9jY2P/Ozs7/0dHR/97e3v/Ly8v/nZ2d/7+/v//f39//19fX/319ff9WVlb/ampq/3Fxcf92dnb/
-        d3d3/3h4eP97e3v/g4OD/5KSkv+ioqL/sbGx/7y8vP/Dw8P/xMTE/8HBwf+/v7//wMDA/8TExP/IyMj/
-        xcXF/729vf+2trb/qKio/5WVlf96enrqFxcXPkVFRQYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC4uLhv
-        ubm5/7i4uP/CwsL/2NjY/+3t7f/6+vr/+vr6/+zs7P/c3Nz/zMzM/66urv+wsLD/3d3d/8zMzP/Ly8v/
-        2tra/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/
-        4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/8DAwP+goKD/t7e3/9nZ2f/h4eH/
-        4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/97e3v/S0tL/zc3N/9TU1P/f39//uLi4/5+fn//FxcX/
-        4+Pj/9bW1v9/f3//WVlZ/2NjY/9tbW3/d3d3/3h4eP95eXn/f39//46Ojv+hoaH/tbW1/8PDw//MzMz/
-        z8/P/87Ozv/Kysr/xsbG/8TExP/Hx8f/zc3N/9DQ0P/Q0ND/zs7O/87Ozv/IyMj/tra2/5+fn/97e3vF
-        Tk5OCQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC6urrAu7u7/7e3t//Gxsb/3d3d//Dw8P/7+/v/
-        +fn5/+vr6//b29v/y8vL/62trf+tra3/3Nzc/83Nzf/Jycn/0tLS/9/f3//g4OD/4ODg/+Dg4P/g4OD/
-        4ODg/+Dg4P/g4OD/4ODg/+Dg4P/g4OD/4ODg/+Dg4P/g4OD/4ODg/+Dg4P/g4OD/4ODg/+Dg4P/g4OD/
-        4ODg/+Dg4P/g4OD/kZGR/6ysrP/FxcX/zc3N/+Dg4P/g4OD/4ODg/+Dg4P/g4OD/4ODg/9/f3//W1tb/
-        zMzM/8zMzP/Y2Nj/2tra/6Wlpf+oqKj/zc3N/+jo6P/Y2Nj/g4OD/19fX/9iYmL/ampq/3h4eP95eXn/
-        e3t7/4WFhf+YmJj/r6+v/8LCwv/Ozs7/0tLS/9LS0v/Q0ND/zc3N/8rKyv/Kysr/z8/P/9fX1//d3d3/
-        3t7e/93d3f/c3Nz/2tra/9PT0//IyMj/ubm5/6Wlpf+QkJBYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAL+/vxy8vLzvu7u7/7m5uf/Kysr/4ODg//Ly8v/7+/v/+Pj4/+vr6//d3d3/y8vL/7Kysv+hoaH/
-        2NjY/9LS0v/Hx8f/y8vL/9nZ2f/f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//
-        39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3/+enp7/o6Oj/7y8vP/Nzc3/
-        39/f/9/f3//f39//39/f/9/f3//X19f/zc3N/8vLy//S0tL/3d3d/8PDw/+ZmZn/tbW1/9fX1//u7u7/
-        09PT/4mJif9paWn/ZWVl/2JiYv92dnb/eHh4/3t7e/+IiIj/n5+f/7m5uf/Ly8v/0tLS/9TU1P/T09P/
-        0dHR/8/Pz//S0tL/19fX/97e3v/k5OT/6urq/+zs7P/s7Oz/6+vr/+vr6//p6en/4eHh/9LS0v/FxcX/
-        u7u7/6enp80AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL6+vli9vb3/ubm5/7u7u//MzMz/
-        4eHh//Ly8v/7+/v/+Pj4/+zs7P/h4eH/zs7O/7m5uf+cnJz/x8fH/9jY2P/Ly8v/xsbG/83Nzf/Z2dn/
-        39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//
-        39/f/9/f3//f39//39/f/9nZ2f+6urr/xsbG/93d3f/f39//39/f/97e3v/V1dX/zMzM/8nJyf/Ozs7/
-        2dnZ/9XV1f+mpqb/oaGh/8TExP/i4uL/8PDw/8vLy/+RkZH/dnZ2/2pqav9aWlr/cHBw/3V1df96enr/
-        iIiI/6Ojo/+9vb3/zc3N/9PT0//S0tL/0tLS/9DQ0P/T09P/2tra/+Hh4f/o6Oj/7u7u//Ly8v/19fX/
-        9vb2//b29v/29vb/9fX1//Ly8v/r6+v/4ODg/9HR0f/FxcX/u7u7/7Kysi8AAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAL6+vnq9vb3/t7e3/7u7u//MzMz/4eHh//Hx8f/6+vr/+vr6/+7u7v/m5ub/
-        0tLS/8LCwv+fn5//q6ur/9jY2P/U1NT/yMjI/8XFxf/Ly8v/1dXV/93d3f/e3t7/3t7e/97e3v/e3t7/
-        3t7e/97e3v/e3t7/3t7e/97e3v/e3t7/3t7e/97e3v/e3t7/3t7e/97e3v/e3t7/3t7e/97e3v/e3t7/
-        3t7e/9jY2P/Q0ND/ycnJ/8jIyP/Nzc3/2NjY/9nZ2f+wsLD/mJiY/7a2tv/V1dX/7Ozs/+7u7v+9vb3/
-        nZ2d/4mJif9zc3P/WFhY/2NjY/93d3f/dnZ2/4KCgv+enp7/urq6/8nJyf/Pz8//z8/P/87Ozv/Ozs7/
-        1tbW/+Dg4P/o6Oj/7+/v//T09P/4+Pj/+vr6//v7+//8/Pz//Pz8//z8/P/7+/v/+fn5//T09P/q6ur/
-        3t7e/87Ozv/FxcX/vb29cwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL29vaK7u7v/
-        t7e3/7u7u//Ly8v/3t7e/+7u7v/5+fn/+/v7//Hx8f/q6ur/2tra/8rKyv+zs7P/l5eX/7W1tf/b29v/
-        1NTU/8nJyf/ExMT/xcXF/8zMzP/U1NT/29vb/97e3v/e3t7/3t7e/97e3v/e3t7/3t7e/97e3v/e3t7/
-        3t7e/97e3v/e3t7/3t7e/97e3v/c3Nz/1tbW/8/Pz//Jycn/x8fH/8jIyP/Q0ND/2dnZ/9fX1/+wsLD/
-        mJiY/6+vr//MzMz/5OTk//Hx8f/f39//s7Oz/6Wlpf+YmJj/gICA/19fX/9RUVH/cnJy/4ODg/9/f3//
-        lpaW/7Ozs//FxcX/ysrK/8vLy//Ly8v/zc3N/9jY2P/k5OT/7e3t//T09P/4+Pj/+/v7//39/f/9/f3/
-        /v7+//7+/v/+/v7//v7+//7+/v/9/f3/+vr6//Ly8v/o6Oj/2tra/8zMzP/ExMSrAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv7+/B7u7u6S5ubn/tbW1/7q6uv/IyMj/2tra/+vr6//29vb/
-        /Pz8//b29v/s7Oz/5eXl/9XV1f/FxcX/rKys/5eXl/+xsbH/1tbW/9fX1//Pz8//x8fH/8TExP/ExMT/
-        xsbG/8vLy//Ozs7/0dHR/9PT0//U1NT/1tbW/9XV1f/T09P/0dHR/9DQ0P/Ly8v/x8fH/8XFxf/FxcX/
-        yMjI/87Ozv/V1dX/3Nzc/8nJyf+oqKj/lpaW/6+vr//Jycn/4eHh//Dw8P/u7u7/y8vL/66urv+oqKj/
-        mpqa/4qKiv9tbW3/T09P/2NjY/9+fn7/kZGR/5SUlP+urq7/wsLC/8nJyf/Kysr/ysrK/87Ozv/b29v/
-        5+fn//Dw8P/39/f/+/v7//39/f/9/f3//v7+//////////////////////////////////7+/v/9/f3/
-        +Pj4/+/v7//j4+P/09PT/8zMzMkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAALq6upK2trb/tLS0/7e3t//Dw8P/1NTU/+Xl5f/y8vL/+fn5//v7+//z8/P/6+vr/+Pj4//U1NT/
-        xMTE/6+vr/+Xl5f/o6Oj/7+/v//a2tr/2dnZ/9PT0//Ozs7/ysrK/8fHx//ExMT/xMTE/8TExP/FxcX/
-        xcXF/8XFxf/FxcX/xsbG/8rKyv/Pz8//09PT/9nZ2f/d3d3/x8fH/66urv+Xl5f/nZ2d/7a2tv/Nzc3/
-        4uLi/+/v7//y8vL/29vb/7u7u/+ysrL/o6Oj/5CQkP+Ojo7/fX19/15eXv9GRkb/dnZ2/4+Pj/+ioqL/
-        srKy/8TExP/Ozs7/z8/P/8/Pz//S0tL/3t7e/+np6f/y8vL/+Pj4//z8/P/9/f3//v7+////////////
-        //////////////////////////////////////7+/v/7+/v/9PT0/+rq6v/c3Nz/09PT1gAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALi4uHGzs7P8sLCw/7S0tP+/v7//
-        zc3N/93d3f/r6+v/9fX1//v7+//6+vr/8vLy/+vr6//l5eX/19fX/8rKyv+6urr/pqam/5OTk/+cnJz/
-        q6ur/76+vv/MzMz/29vb/9zc3P/b29v/2tra/9jY2P/Z2dn/29vb/9zc3P/d3d3/z8/P/76+vv+vr6//
-        oKCg/5OTk/+enp7/sbGx/8bGxv/Y2Nj/6Ojo//Hx8f/z8/P/4uLi/8TExP+3t7f/r6+v/5OTk/+Ghob/
-        ioqK/4WFhf9xcXH/UlJS/1BQUP99fX3/n5+f/7S0tP/Nzc3/09PT/9fX1//X19f/2NjY/+Hh4f/s7Oz/
-        8/Pz//n5+f/8/Pz//f39//7+/v//////////////////////////////////////////////////////
-        /v7+//z8/P/4+Pj/8PDw/+Xl5f/c3NzXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAALi4uDyvr6/irKys/66urv+5ubn/xcXF/9PT0//h4eH/7e3t//X19f/5+fn/
-        +vr6//T09P/t7e3/6enp/+Hh4f/W1tb/zMzM/7+/v/+0tLT/p6en/5ubm/+RkZH/lJSU/5mZmf+Wlpb/
-        np6e/5eXl/+VlZX/lJSU/4+Pj/+ZmZn/paWl/7CwsP++vr7/zMzM/9nZ2f/m5ub/7+/v//Pz8//y8vL/
-        4eHh/8jIyP+6urr/uLi4/5ubm/+AgID/gYGB/4ODg/+Ghob/f39//2pqav9JSUn/X19f/4qKiv+rq6v/
-        xcXF/9zc3P/b29v/2tra/9vb2//h4eH/6+vr//Pz8//4+Pj//Pz8//39/f/+/v7/////////////////
-        ///////////////////////////////////////////+/v7//f39//n5+f/09PT/7e3t/+bm5ssAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALe3txKrq6ud
-        pqam/6Wlpf+vr6//vLy8/8fHx//T09P/39/f/+jo6P/v7+//9PT0//f39//19fX/8PDw/+vr6//o6Oj/
-        5eXl/+Dg4P/Y2Nj/0tLS/9DQ0P/Kysr/xsbG/8TExP/Dw8P/xcXF/8vLy//Nzc3/0dHR/9bW1v/e3t7/
-        5ubm/+zs7P/x8fH/8/Pz//T09P/u7u7/3Nzc/8TExP+6urr/u7u7/6urq/+Ojo7/goKC/39/f/9/f3//
-        gICA/4KCgv98fHz/ZmZm/0VFRf9tbW3/mpqa/7m5uf/T09P/4+Pj/+Pj4//a2tr/3d3d/+jo6P/x8fH/
-        9/f3//v7+//9/f3//v7+////////////////////////////////////////////////////////////
-        //////7+/v/8/Pz/+fn5//T09P/v7+//7e3trAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACvr689oqKi0J2dnf+enp7/q6ur/7m5uf+/v7//
-        xsbG/8/Pz//X19f/3d3d/+Pj4//n5+f/6+vr/+zs7P/r6+v/6+vr/+rq6v/q6ur/6enp/+np6f/p6en/
-        6Ojo/+vr6//t7e3/7+/v//Hx8f/y8vL/8/Pz//T09P/09PT/8vLy/+zs7P/g4OD/zMzM/7q6uv+2trb/
-        ubm5/7i4uP+qqqr/nZ2d/5OTk/+Kior/g4OD/39/f/9/f3//gICA/3t7e/9lZWX/RUVF/3V1df+qqqr/
-        x8fH/9/f3//p6en/6+vr/+Tk5P/m5ub/7u7u//X19f/6+vr//f39//7+/v//////////////////////
-        /////////////////////////////////////////////////v7+//z8/P/4+Pj/8/Pz/+/v7//u7u6A
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAACsrKwCpKSkWJeXl+ORkZH/jY2N/5CQkP+YmJj/oqKi/6ampv+srKz/s7Oz/7q6uv/BwcH/
-        x8fH/83Nzf/S0tL/19fX/9zc3P/g4OD/5OTk/+fn5//q6ur/7Ozs/+7u7v/v7+//7u7u/+3t7f/q6ur/
-        5ubm/9XV1f/Dw8P/tbW1/62trf+xsbH/ubm5/8jIyP/Kysr/wsLC/7a2tv+rq6v/oKCg/5WVlf+MjIz/
-        hYWF/4CAgP9/f3//e3t7/2dnZ/9HR0f/d3d3/7W1tf/Pz8//5eXl/+zs7P/u7u7/8PDw//Dw8P/z8/P/
-        +Pj4//z8/P/+/v7/////////////////////////////////////////////////////////////////
-        //////7+/v/9/f3//Pz8//n5+f/7+/v/7+/v//Dw8EUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoaGhApSUlIGAgID5
-        dnZ2/2VlZf9eXl7/Y2Nj/25ubv96enr/hYWF/4uLi/+RkZH/mJiY/56env+kpKT/qqqq/7CwsP+1tbX/
-        u7u7/8HBwf/FxcX/ycnJ/8fHx/+8vLz/srKy/6enp/+enp7/n5+f/6Wlpf+wsLD/ycnJ/9/f3//p6en/
-        4uLi/9nZ2f/Q0ND/xMTE/7q6uv+urq7/o6Oj/5iYmP+Pj4//h4eH/4GBgf98fHz/bGxs/05OTv93d3f/
-        vb29/9TU1P/l5eX/6+vr/+3t7f/x8fH/9/f3//n5+f/7+/v//f39//7+/v//////////////////////
-        ///////////+/v7/+/v7//n5+f/9/f3//////////////////v7+//z8/P/7+/v//f39//n5+f/x8fHz
-        8vLyBwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGtraydsbGy4W1tb/lBQUP9ISEj/QkJC/0FBQf9BQUH/
-        SEhI/05OTv9TU1P/WVlZ/1xcXP9jY2P/Y2Nj/2hoaP9paWn/aGho/2hoaP9paWn/bW1t/3Z2dv+AgID/
-        j4+P/6mpqf/Ly8v/6Ojo//n5+f/5+fn/9vb2//Hx8f/r6+v/5OTk/9zc3P/S0tL/yMjI/729vf+ysrL/
-        pqam/5ubm/+QkJD/h4eH/319ff9vb2//U1NT/3R0dP/Dw8P/2NjY/+Xl5f/p6en/7Ozs//Ly8v/39/f/
-        /Pz8//7+/v/+/v7//////////////////////////////////f39/+7u7v++vr7/m5ub/+bm5v/+/v7/
-        //////7+/v/9/f3//f39//7+/v/9/f3/8vLy//Hx8aQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABzc3Mk
-        cXFxbldXV69dXV3rWVlZ/1hYWP9WVlb/VVVV/1NTU/9QUFD/TU1N/0hISP9FRUX/QkJC/0BAQP9AQED/
-        QkJC/0lJSf9TU1P/X19f/3BwcP+Dg4P/mJiY/7S0tP/MzMz/2NjY/+Xl5f/u7u7/9vb2//n5+f/5+fn/
-        9/f3//Pz8//t7e3/5+fn/97e3v/V1dX/y8vL/7+/v/+ysrL/paWl/5aWlv+IiIj/eXl5/2lpaf9TU1P/
-        bW1t/8bGxv/c3Nz/6Ojo/+rq6v/t7e3/9fX1//v7+//9/f3//v7+////////////////////////////
-        ///////////09PT/wsLC/5KSkv9YWFj/kpKS//v7+/////////////7+/v/+/v7//f39//j4+P/o6Oj/
-        8fHxOQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAB6enodaGhotGpqav1sbGz/bm5u/3BwcP9ycnL/c3Nz/3R0dP9zc3P/
-        cXFx/29vb/9sbGz/aWlp/2VlZf9gYGD/W1tb/1VVVf9VVVX/Xl5e/25ubv+BgYH/jY2N/5KSkv+ZmZn/
-        oaGh/6urq/+4uLj/yMjI/9jY2P/m5ub/8PDw//b29v/5+fn/9/f3//Pz8//u7u7/5+fn/97e3v/S0tL/
-        xcXF/7W1tf+kpKT/kpKS/35+fv9tbW3/Xl5e/1VVVf9qamr/wcHB/+Dg4P/q6ur/7e3t//Ly8v/4+Pj/
-        /Pz8//7+/v////////////////////////////////////////////n5+f/k5OT/ysrK/35+fv9gYGD/
-        8vLy//////////////////7+/v/9/f3/7e3t/+fn58AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfHx8GHJyct51dXX/
-        d3d3/3t7e/+BgYH/iYmJ/5CQkP+Tk5P/k5OT/5GRkf+Pj4//jIyM/4qKiv+Hh4f/hISE/4GBgf9+fn7/
-        eHh4/3Jycv9ra2v/YmJi/1hYWP9WVlb/Z2dn/319ff+MjIz/kpKS/5qamv+oqKj/uLi4/8rKyv/b29v/
-        6enp//Hx8f/z8/P/8PDw/+rq6v/g4OD/1dXV/8fHx/+4uLj/paWl/5OTk/+BgYH/dHR0/21tbf9ubm7/
-        dXV1/3t7e/+zs7P/4+Pj/+7u7v/x8fH/9fX1//v7+//9/f3//v7+////////////////////////////
-        /////////////////v7+//f39//t7e3/q6ur/2VlZf/p6en///////////////////////n5+f/v7+/9
-        8fHxOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAB2dna1eXl5/3p6ev+BgYH/kZGR/6Ghof+urq7/srKy/7Gxsf+tra3/
-        qamp/6ioqP+pqan/qqqq/6qqqv+rq6v/qamp/6ioqP+lpaX/oaGh/5ycnP+VlZX/iIiI/3d3d/9mZmb/
-        VFRU/1RUVP9qamr/f39//4WFhf+Pj4//nZ2d/7CwsP/CwsL/0NDQ/9fX1//V1dX/z8/P/8TExP+4uLj/
-        rKys/52dnf+SkpL/i4uL/4uLi/+QkJD/mJiY/52dnf+ampr/jo6O/5ubm//m5ub/8PDw//T09P/4+Pj/
-        /Pz8//39/f/+/v7//////////////////////////////////////////////////f39//X19f+1tbX/
-        v7+///7+/v/////////////////+/v7/+Pj4//X19ZgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf39/RHt7e/98fHz/
-        hISE/5mZmf+zs7P/xMTE/8jIyP/Dw8P/u7u7/7W1tf+2trb/u7u7/7+/v//CwsL/xcXF/8bGxv/Gxsb/
-        xcXF/8XFxf/FxcX/xMTE/8TExP+6urr/qKio/5mZmf+Kior/c3Nz/1hYWP9PT0//X19f/2lpaf9wcHD/
-        fX19/4+Pj/+hoaH/q6ur/66urv+qqqr/pqam/6Kiov+ioqL/pqam/66urv+5ubn/wsLC/8XFxf+/v7//
-        r6+v/5iYmP+BgYH/f39//9bW1v/y8vL/9/f3//r6+v/9/f3//f39//7+/v//////////////////////
-        /////////////////////////////////////////////////////////////////v7+//r6+v/29vbO
-        9vb2CwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAB9fX2vfX19/4KCgv+Xl5f/t7e3/87Ozv/T09P/zc3N/8LCwv+6urr/
-        urq6/8LCwv/Kysr/z8/P/9HR0f/T09P/1NTU/9TU1P/U1NT/1NTU/9TU1P/V1dX/1tbW/9DQ0P/FxcX/
-        ubm5/7CwsP+oqKj/lZWV/3R0dP9aWlr/UVFR/1hYWP9hYWH/dHR0/4qKiv+enp7/rKys/7W1tf+/v7//
-        ysrK/9bW1v/i4uL/6Ojo/+fn5//c3Nz/ycnJ/7Kysv+cnJz/jY2N/4+Pj/+lpaX/urq6//Hx8f/5+fn/
-        /Pz8//39/f/9/f3//v7+////////////////////////////////////////////////////////////
-        //////////////////////39/f/39/f/9PT03vb29h4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAh4eHCYCAgPeBgYH/
-        j4+P/6+vr//Ozs7/2tra/9XV1f/Ly8v/v7+//729vf/FxcX/0NDQ/9fX1//a2tr/29vb/9vb2//b29v/
-        29vb/9zc3P/c3Nz/29vb/9vb2//Z2dn/1tbW/9DQ0P/FxcX/u7u7/7u7u/++vr7/sbGx/5CQkP9ubm7/
-        W1tb/3BwcP+NjY3/sLCw/9DQ0P/k5OT/8PDw//f39//6+vr/+Pj4//Hx8f/j4+P/0dHR/7+/v/+wsLD/
-        qKio/7CwsP/FxcX/3Nzc/+np6f7n5+fHzc3N3Pn5+f/9/f3//f39//39/f/+/v7//v7+////////////
-        ///////////////////////////////////////////////////////////5+fn/8vLy/+/v78/19fUY
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAACIiIgygoKC/4eHh/+fn5//xcXF/9zc3P/e3t7/1dXV/8nJyf/AwMD/
-        xcXF/9HR0f/a2tr/39/f/+Dg4P/g4OD/4ODg/+Dg4P/g4OD/39/f/9/f3//f39//39/f/97e3v/d3d3/
-        19fX/87Ozv/CwsL/vb29/8XFxf/Nzc3/w8PD/6Ojo/99fX3/aWlp/5+fn//Jycn/5OTk//Dw8P/v7+//
-        6urq/+Dg4P/U1NT/y8vL/8PDw/+/v7//xsbG/9HR0f/e3t7/6urq/vHx8drm5uaE39/fJQAAAADU1NQZ
-        4ODgwfn5+f/9/f3//f39//7+/v/+/v7//v7+//7+/v//////////////////////////////////////
-        ///////////8/Pz/8vLy/+zs7P3t7e2Q8/PzCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIuLi0OFhYX/
-        j4+P/6+vr//V1dX/5OTk/+Dg4P/V1dX/yMjI/8TExP/Nzc3/2tra/+Li4v/k5OT/5OTk/+Tk5P/k5OT/
-        5OTk/+Tk5P/k5OT/4+Pj/+Pj4//j4+P/4+Pj/+Li4v/f39//1tbW/8jIyP/AwMD/x8fH/9PT0//Z2dn/
-        ysrK/6ioqP+Dg4P/fHx8/7e3t//Jycn/z8/P/9DQ0P/Q0ND/0NDQ/9PT0//Y2Nj/4ODg/+rq6v7w8PDo
-        9PT0p+Dg4GrS0tIXAAAAAAAAAAAAAAAAAAAAAAAAAADj4+ME6+vrkfLy8v35+fn//f39//7+/v/+/v7/
-        /v7+//////////////////////////////////7+/v/6+vr/8fHx/+np6f/n5+e/7u7uNgAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAj4+PNoiIiP+Xl5f/vb29/+Dg4P/o6Oj/4+Pj/9fX1//Kysr/
-        ycnJ/9XV1f/h4eH/5+fn/+np6f/p6en/6Ojo/+jo6P/o6Oj/6Ojo/+fn5//n5+f/5+fn/+fn5//n5+f/
-        5+fn/+Pj4//a2tr/zc3N/8TExP/Kysr/19fX/+Dg4P/e3t7/x8fH/6CgoP+BgYH/t7e35eXl5cru7u6s
-        8vLyq+Li4n/o6Oh76urqc+vr62Xq6uo/4ODgCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAA7u7uOe7u7rHw8PD88PDw//Hx8f/29vb/+vr6//v7+//8/Pz/+vr6//b29v/x8fH/
-        6urq/+bm5vbk5OSh7OzsOgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACYmJgN
-        i4uL+52dnf/Gxsb/5ubm/+zs7P/n5+f/3t7e/9XV1f/X19f/4eHh/+rq6v/v7+//7+/v/+7u7v/t7e3/
-        7Ozs/+zs7P/s7Oz/7Ozs/+vr6//r6+v/6+vr/+vr6//q6ur/5ubm/9zc3P/Pz8//x8fH/87Ozv/b29v/
-        5eXl/+fn5//Z2dn/s7Oz/5CQkP+ampqzu7u7BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAO/v7yPt7e1q
-        3NzcqNzc3Nfg4ODo5ubm/Ofn5+Xm5ubb5eXls+np6Yfs7OxL8PDwCQAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACMjIy4oKCg/8rKyv/r6+v/9fX1//X19f/y8vL/
-        8PDw//Hx8f/09PT/+Pj4//n5+f/5+fn/+Pj4//f39//19fX/9PT0//Ly8v/w8PD/7+/v/+/v7//v7+//
-        7+/v/+3t7f/n5+f/3Nzc/8/Pz//Ly8v/1dXV/+Li4v/q6ur/7Ozs/+Li4v+/v7//mJiY/6SkpOS6uroB
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAKGhoUaenp7/x8fH/+7u7v/7+/v//Pz8//z8/P/8/Pz//Pz8//39/f/+/v7//v7+//39/f/9/f3/
-        /f39//z8/P/7+/v/+/v7//r6+v/5+fn/9vb2//X19f/z8/P/7+/v/+fn5//a2tr/z8/P/9HR0f/d3d3/
-        6enp/+/v7//x8fH/5+fn/8TExP+bm5v/q6ur2wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJiYmKq9vb3/6urq//z8/P/9/f3/
-        /v7+/////////////////////////////////////////////v7+//7+/v/+/v7//f39//39/f/9/f3/
-        /Pz8//r6+v/19fX/6+vr/9vb2//R0dH/2dnZ/+bm5v/w8PD/9PT0//Pz8//o6Oj/w8PD/5ubm//AwMCa
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAvb29E6urq9jY2Nj/9/f3//39/f/9/f3//f39//7+/v//////////////////////
-        //////7+/v////////////////////////////7+/v/+/v7//f39//v7+//19fX/7e3t/+jo6P/p6en/
-        8PDw//X19f/39/f/9fX1/+Pj4/+7u7v/mJiY/ru7uzsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAyMjIGLq6us/h4eH/
-        9/f3//z8/P/8/Pz//Pz8//7+/v/+/v7////////////4+Pj/4+Pj/+np6f/29vb//v7+////////////
-        ///////////+/v7//v7+//z8/P/6+vr/+fn5//n5+f/6+vr/+/v7//r6+v/z8/P/19fX/62trf+lpaW+
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0NDQCczMzJnf39//8vLy//z8/P/6+vr/+vr6//z8/P/+/v7/
-        /////+bm5v+enp7/ioqK/6qqqv/7+/v///////////////////////////////////////7+/v/+/v7/
-        /v7+//7+/v/+/v7/+/v7/+rq6v/FxcX/oaGh/sPDwz8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAANTU1ELU1NTW5+fn//f39//7+/v/+vr6//z8/P/9/f3/7u7u/9XV1f+fn5//kpKS//z8/P//////
-        //////////////////////////////////////////////////////7+/v/4+Pj/2NjY/6+vr//Dw8Or
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANvb2wTPz89e29vb1+zs7P/4+Pj/
-        /f39//39/f/6+vr/8PDw/7e3t//Gxsb//Pz8//39/f/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7/
-        ///////////+/v7/+vr6/+bm5v+6urr/v7+/yNvb2w0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAADi4uIC5OTkR+Dg4Krx8fH5+/v7//n5+f/z8/P/1tbW//Hx8f/4+Pj/
-        +Pj4//n5+f/6+vr/+/v7//z8/P/9/f3//f39//39/f/9/f3/+/v7//Pz8//e3t7/xMTE99LS0ofk5OQH
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAOnp6Q3p6elQ6+vrmObm5tXo6Oj+7u7u//Ly8v/09PT/9fX1//b29v/29vb/9vb2//X19f/y8vL/
-        7u7u/+Xl5f/e3t7+2NjYyuHh4Xbl5eUTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOXl5Qvd3d00
-        3d3dWN/f33ba2tqT2dnZmt3d3bLe3t6y4eHhoOPj45bp6el07u7uR/Pz8xUAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////////////
-        ///////////////////////////////////////////////////////////////////////8Af//////
-        ////////////4AA//////////////////4AAB/////////////////8AAAP////////////////+AAAD
-        /////////////////gAAA/////////////////4AAAP/////////////////AAAD////////////////
-        /wAAA/////////////////+AAAf///////////////gAAAAP//////////////8AAAAAH///////////
-        ///wAAAAAA//////////////gAAAAAAA/////////////AAAAAAAAB///////////+AAAAAAAAAH////
-        //////+AAAAAAAAAAP/////////+AAAAAAAAAAA/////////+AAAAAAAAAAAH/////////AAAAAAAAAA
-        AA///////x0AAAAAAAAAAAAD/////4AAAAAAAAAAAAAAAf////8AAAAAAAAAAAAAAAH////+AAAAAAAA
-        AAAAAAAB/////gAAAAAAAAAAAAAAAP////4AAAAAAAAAAAAAAAD////+AAAAAAAAAAAAAAAA/////gAA
-        AAAAAAAAAAAAAP////4AAAAAAAAAAAAAAAH/////wAAAAAAAAAAAAAAB//////AAAAAAAAAAAAAAAf//
-        ///4AAAAAAAAAAAAAAP//////AAAAAAAAAAAAAAD//////4AAAAAAAAAAAAAB///////AAAAAAAAAAAA
-        AAf//////wAAAAAAAAAAAAAH//////4AAAAAAAAAAAAAB//////8AAAAAAAAAAAAAAf//////AAAAAAA
-        AAAAAAAH//////gAAAAAAAAAAAAAB//////4AAAAAAAAAAAAAA//////8AAAAAAAAAAAAAAP//////AA
-        AAAAAAAAAAAAD//////gAAAAAAAAAAAAAAf/////4AAAAAAAAAAAAAAD/////8AAAAAAAAAAAAAAA///
-        ///AAAAAAAAAAAAAAAH/////gAAAAAAAAAAAAAAB/////4AAAAAAAAAAAAAAAP////+AAAAAAAAAAAAA
-        AAD/////AAAAAAAAAAAAAAAA/////wAAAAAAAAAAAAAAAH////8AAAAAAAAAAAAAAAB/////AAAAAAAA
-        AAAAAAAAf////wAAAAAAAAAAAAAAAH////4AAAAAAAAAAAAAAAA////+AAAAAAAAAAAAAAAAP////gAA
-        AAAAAAAAAAAAAD////4AAAAAAAAAAAAAAAA////+AAAAAAAAAAAAAAAAP////gAAAAAAAAAAAAAAAD//
-        //4AAAAAAAAAAAAAAAA////+AAAAAAAAAAAAAAAAP////gAAAAAAAAAAAAAAAD////4AAAAAAAAAAAAA
-        AAA////+AAAAAAAAAAAAAAAAP////gAAAAAAAAAAAAAAAD////4AAAAAAAAAAAAAAAA////+AAAAAAAA
-        AAAAAAAAP////gAAAAAAAAAAAAAAAD////4AAAAAAAAAAAAAAAB////+AAAAAAAAAAAAAAAAf////gAA
-        AAAAAAAAAAAAAH////8AAAAAAAAAAAAAAAB/////AAAAAAAAAAAAAAAAf////wAAAAAAAAAAAAAAAP//
-        //8AAAAAAAAAAAAAAAD/////gAAAAAAAAAAAAAAA/////4AAAAAAAAAAAAAAAf////+AAAAAAAAAAAAA
-        AAH/////wAAAAAAAAAAAAAAB/////8AAAAAAAAAAAAAAAP/////gAAAAAAAAAAAAAAD/////4AAAAAAA
-        AAAAAAAA//////AAAAAAAAAAAAAAAP/////4AAAAAAAAAAAAAAD/////+AAAAAAAAAAAAAAA//////wA
-        AAAAAAAAAAAAAH/////+AAAAAAAAAAAAAAB//////wAAAAAAAAAAAAAAf/////8AAAAAAAAAAAAAAH//
-        ////wAAAAAAAAAAAAAB//////+AAAAAAAAAAAAAAf//////wAAAAAAAAAAAAAH//////+AAAAAAAAAAA
-        AAB///////4AAAAAAAAAAAAAf///////AAAAAAAAAAAAAH///////8AAAAAAAAAAAAB////////wAAAA
-        AAAAAAAA////////4AAAAAAAAAAAAP///////4AAAAAAAAAAAAH///////8AAAAAAAAAAAAB////////
-        AAAAAAAAAAAAA////////gAAAAAAAAAAAAP///////4AAAAAAAAAAAAH///////8AAAAAAAAAAAAD///
-        /////AAAAAAAABAAAB////////wAAAAAAAD4AAB////////8AAAAAAAP/gAB/////////AAAAAAP//+A
-        B/////////4AAAAAD//////////////+AAAAAB///////////////wAAAAAf//////////////8AAAAA
-        H///////////////gAAAAD///////////////8AAAAA////////////////wAAAAf///////////////
-        +AAAAH////////////////4AAAD/////////////////wAAD//////////////////wAH///////////
-        //////////////////////////////////////////8oAAAAMAAAAGAAAAABACAAAAAAAIAlAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQDAwMMBgYGFQcHBxcODg4MBgYGAwAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAB0AAABFUFBQqJ+fn+caGhpi
-        AAAAHAAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAACYQEBB8
-        zMzM+s/Pz/4xMTGIAAAAKgAAAAkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        BAQEAgMDAx9ycnLA6enp/729vf4cHBxBBAQEDgAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAEAAAACQAAABEAAAAX
-        AAAAGQAAABYAAAASAQEBGBwcHGXa2tr739/f/6+vr/ApKSkQDAwMBAAAAAEAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwEDAwMIAQEBFAAAACMAAAAy
-        BgYGQw0NDVkNDQ1hDAwMXwcHB1EAAABHAAAAU35+fs7v7+/+0tLS/5mZmdMAAAAmAAAAHQAAABMAAAAK
-        AAAABAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGBgYBBQUFDgAAACYNDQ1L
-        Ojo6iV9fX76EhIThoKCg962trfyxsbH+r6+v/aenp/iTk5PobGxs0aOjo/3IyMj+xcXF/3Z2drwAAABK
-        AAAAPgAAADIAAAAkAAAAFgAAAA0AAAAGAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAEAAAABAwMDAQkJCQoBAQEr
-        IyMja3R0dMK0tLT5zc3N/9nZ2f/Q0ND/0dHR/9PT0//V1dX/1dXV/9PT0//Q0ND/0dHR/9PT0//CwsL/
-        r6+v/z8/P6gAAABfAAAAVwAAAE0AAAA/AAAAKgAAABoAAAAUAAAADQAAAAQAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgYGBwEBARsAAAAzAAAAPgAAACgAAAAb
-        AAAAJBAQEFh3d3fCw8PD/NnZ2f7S0tL+09PT/+Xl5f74+Pj+9vb2//Ly8v7w8PD+8fHx//X19f76+vr+
-        +Pj4/+Dg4P7Q0ND+2dnZ/7S0tOtGRkaRAAAAWwAAAFUAAABMAAAANgAAAB0AAAAbAAAAFQAAAA8AAAAC
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAFk1NTYmZmZnj
-        MjIytwAAAH8AAABpMjIykLKysvDW1tb/1tbW/9TU1P/y8vL/8vLy/+vr6//m5ub/9PT0//j4+P/6+vr/
-        +vr6//b29v/x8fH/7Ozs//Dw8P/8/Pz/4uLi/9TU1P/Pz8/+iYmJxBISEl8AAABPAAAAMgAAABcAAAAb
-        AAAAGwAAABcAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        IiIiB5SUlKnw8PD+1tbW/3x8fOVRUVHMx8fH/Nzc3P7R0dH+6Ojo//Ly8v7p6en+9vb2/+Hh4f5tbW3+
-        8PDw//7+/v7+/v7+//////7+/v7+/v7+//////n5+f7s7Oz+9fX1//Pz8/7T09P/ycnJ/q+vr+YwMDBu
-        AAAAMQAAABoAAAAfAAAAHwAAACIAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAKCgoBbMzMzZ5eXl/6Ojo/7Jycn/3t7e/tHR0f7z8/P+6enp//Pz8/7+/v7+
-        //////v7+/7S0tL+/v7+//7+/v7+/v7+//////7+/v7+/v7+//////7+/v7+/v7+8vLy//Dw8P729vb/
-        1tbW/rS0tP63t7f0RkZGZwAAACkAAAArAAAAKQAAACMAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACsrKwmm5ub7MHBwf7g4OD/0tLS/vT09P7m5ub+
-        +/v7//7+/v7+/v7+//////7+/v7+/v7+//////7+/v7+/v7+//////7+/v7+/v7+//////7+/v7+/v7+
-        //////Pz8/7y8vL/7u7u/tjY2P6Pj4//tbW1+GFhYXoAAAAzAAAAMgAAABEAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACoqKgWsrKy6OHh4f/U1NT/
-        8/Pz/+bm5v/9/f3/////////////////////////////////////////////////////////////////
-        ///////////////////////////u7u7/+fn5/97e3v+9vb3/i4uL/7m5ufxqamqJAAAALAkJCQcAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACfn5+n
-        3Nzc/9ra2v7s7Oz/5OTk/vr6+v79/f3+/f39//39/f79/f3+/f39//39/f79/f3+/f39//39/f79/f3+
-        /f39//39/f79/f3+/f39//39/f79/f3+/f39//39/f78/Pz/6urq/vT09P7a2tr/m5ub/pycnP7FxcX9
-        bGxseSwsLAkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAJ6enjy/v7/85eXl/9zc3P7o6Oj/8/Pz/vv7+/77+/v++/v7//v7+/77+/v++/v7//v7+/77+/v+
-        +/v7//v7+/77+/v++/v7//v7+/77+/v++/v7//v7+/77+/v++/v7//v7+/77+/v/7e3t/vb29v7d3d3/
-        pqam/tDQ0P6jo6P/4ODg+q+vrzkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAJeXl7jk5OT/2NjY/+7u7v/j4+P/9/f3//f39//39/f/9/f3//f39//39/f/
-        9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39/+1tbX/
-        yMjI/+np6f/i4uL/t7e3/97e3v+7u7v/ysrK/+vr69Hi4uIGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAl5eXJ7e3t/vq6ur+2tra/97e3v7w8PD/9PT0/vT09P709PT+
-        9PT0//T09P709PT+9PT0//T09P709PT+9PT0//T09P709PT+9PT0//T09P709PT+9PT0//T09P709PT+
-        9PT0//T09P6mpqb/yMjI/uTk5P7n5+f/yMjI/s7Ozv7j4+P/urq6/unp6f7w8PBkAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjo6Oftra2v7f39/+4eHh/+/v7/7t7e3/
-        8PDw/vDw8P7w8PD+8PDw//Dw8P7v7+/+7u7u/+vr6/7m5ub+sLCw/8vLy/7u7u7+8PDw//Dw8P7w8PD+
-        8PDw//Dw8P7w8PD+8PDw//Dw8P7w8PD/8PDw/uDg4P7q6ur/z8/P/sHBwf729vb/ubm5/ujo6P7x8fHQ
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlZWVyOrq6v/Z2dn/
-        6Ojo//n5+f/y8vL/6enp/+vr6//r6+v/6enp/9nZ2f/Hx8f/oqKi/3t7e/9aWlr/QkJC/2BgYP/MzMz/
-        4ODg/+bm5v/r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/93d3f/p6en/z8/P/76+vv/8/Pz/
-        w8PD/+Li4v/r6+v+7+/vIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACTk5MI
-        pqam+u7u7v7W1tb+6urq//n5+f76+vr/8/Pz/uXl5f7n5+f+0NDQ/1BQUP5RUVH+e3t7/6mpqf6hoaH+
-        YmJi/83Nzf7Kysr+tLS0/7u7u/7Y2Nj+3Nzc/+Pj4/7m5ub+5+fn/+fn5/7n5+f/5+fn/tra2v7j4+P/
-        ysrK/r+/v/76+vr/zc3N/tra2v7l5eX/7+/vWgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAACSkpIvuLi4/+/v7/7Ozs7+8fHx//j4+P74+Pj/+Pj4/vX19f7m5ub+zc3N/8zMzP7h4eH+
-        4eHh/7+/v/5VVVX+0tLS/+Li4v7i4uL+4uLi/9XV1f60tLT+sbGx/9DQ0P7U1NT+2tra/+Hh4f7i4uL/
-        4uLi/tTU1P7b29v/vb29/r6+vv7t7e3/z8/P/tTU1P7h4eH/7+/vgQAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAACRkZFLw8PD/+7u7v/MzMz/8fHx//b29v/29vb/9vb2//b29v/29vb/
-        7+/v/+Li4v/b29v/w8PD/1lZWf+5ubn/3t7e/97e3v/e3t7/3t7e/97e3v/e3t7/3d3d/7e3t/+vr6//
-        wsLC/9XV1f/d3d3/5OTk/+7u7v/Ozs7/pqam/6+vr//R0dH/wsLC/87Ozv/d3d3/7e3tjgAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACUlJRXyMjI/+/v7/7Kysr+7u7u/+vr6/7y8vL/
-        8/Pz/vPz8/7z8/P+9PT0//Pz8/7n5+f+q6ur/6SkpP7Z2dn+2tra/9vb2/7b29v+29vb/9vb2/7b29v+
-        29vb/9ra2v7a2tr+xsbG/9DQ0P7x8fH/8/Pz/uvr6/7Ozs7/iIiI/pGRkf6srKz/paWl/sDAwP7U1NT/
-        7OzskAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACVlZVVxsbG//Hx8f7Gxsb+
-        6urq/9bW1v7s7Oz/8fHx/vHx8f7x8fH+8PDw/+jo6P7V1dX+0tLS//Hx8f7v7+/+6urq/+Xl5f7j4+P+
-        4+Pj/+Pj4/7j4+P+5ubm/+vr6/7w8PD+8fHx//Hx8f7x8fH/7e3t/tjY2P7Ozs7/dnZ2/oCAgP6Kior/
-        gICA/qqqqv7Gxsb/6OjojAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACVlZVD
-        vr6+//Pz8//Kysr/39/f/+3t7f/u7u7/7e3t/+3t7f/t7e3/5OTk/9jY2P/CwsL/7Ozs/+3t7f/t7e3/
-        7u7u/+3t7f/t7e3/7u7u/+3t7f/t7e3/7u7u/+3t7f/t7e3/7u7u/+3t7f/t7e3/6Ojo/8fHx/+oqKj/
-        iYmJ/4WFhf9+fn7/ZGRk/42Njf+8vLz/5ubmdgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAACbm5sisbGx//Ly8v7W1tb+0dHR/+jo6P7r6+v/6+vr/uvr6/7m5ub+2tra/7e3t/7k5OT+
-        6+vr/+vr6/7r6+v+6+vr/+vr6/7r6+v+6+vr/+vr6/7r6+v+6+vr/+vr6/7r6+v+6+vr/+vr6/7n5+f/
-        1tbW/szMzP6Kior/nJyc/pCQkP6AgID/Xl5e/nV1df7Dw8P/39/fTQAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAACfn58BpKSk7Orq6v7k5OT+ycnJ/+Dg4P7o6Oj/6Ojo/ujo6P7n5+f+
-        tLS0/9jY2P7o6Oj+6Ojo/+jo6P7o6Oj+6Ojo/+jo6P7o6Oj+6Ojo/+jo6P7o6Oj+6Ojo/+jo6P7o6Oj+
-        6Ojo/+fn5/7h4eH/w8PD/qenp/6vr6//rKys/p+fn/6AgID/bGxs/nNzc/7Z2dn+29vbFgAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAApKSkptfX1//z8/P/xsbG/9bW1v/l5eX/
-        5+fn/+fn5//l5eX/x8fH/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/
-        5+fn/+fn5//n5+f/5ubm/97e3v/ExMT/x8fH/6SkpP+8vLz/nZ2d/4eHh/9lZWX/fHx8/4qKiv/j4+PJ
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAq6urTL6+vv7x8fH+
-        39/f/8PDw/7Z2dn/5OTk/uTk5P7k5OT+5OTk/+Tk5P7k5OT+5OTk/+Tk5P7k5OT+5OTk/+Tk5P7k5OT+
-        5OTk/+Tk5P7k5OT+5OTk/+Tk5P7k5OT+29vb/8nJyf7Ly8v/j4+P/p2dnf56enr/bGxs/mFhYf5NTU3/
-        UVFR/peXl/7AwMBuAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        sbGxBLOzs9XY2Nj/9PT0/8zMzP/Jycn/2dnZ/+Li4v/i4uL/4uLi/+Li4v/i4uL/4uLi/+Li4v/i4uL/
-        4uLi/+Li4v/i4uL/4uLi/+Li4v/i4uL/4uLi/+Hh4f/X19f/yMjI/8fHx/+FhYX/f39//3Z2dv98fHz/
-        ioqK/46Ojv+NjY3/goKC/3x8fPhNTU0nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAALm5uVC+vr796enp/+/v7/7ExMT/ycnJ/tXV1f7g4OD+4ODg/+Dg4P7g4OD+
-        4ODg/+Dg4P7g4OD+4ODg/97e3v7BwcH+3t7e/+Dg4P7g4OD+29vb/9TU1P7BwcH+ysrK/4ODg/5tbW3/
-        e3t7/paWlv67u7v/ycnJ/sXFxf7Nzc3/y8vL/rW1tf5qamqCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC9vb2gxMTE/+3t7f7t7e3/xcXF/sHBwf7Q0ND+
-        2dnZ/9/f3/7f39/+39/f/9/f3/7f39/+39/f/9vb2/67u7v+29vb/9ra2v7S0tL+ysrK/7y8vP7V1dX+
-        kZGR/2ZmZv58fHz/qamp/s3Nzf7S0tL/2dnZ/ufn5/7w8PD/7+/v/t7e3v68vLzxqKioCwAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC+vr4Iu7u7wsTExP/q6ur/
-        8vLy/9PT0/+5ubn/w8PD/8/Pz//R0dH/1tbW/9nZ2f/a2tr/2dnZ/9bW1v/R0dH/0NDQ/8fHx/+7u7v/
-        zMzM/9bW1v+jo6P/Z2dn/3p6ev+fn5//yMjI/9DQ0P/m5ub/9/f3//39/f/+/v7//f39//X19f/Z2dn/
-        y8vLPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        vLy8Cra2tqy6urr+3d3d/vPz8/7s7Oz+z8/P/7q6uv66urr+vLy8/8DAwP7CwsL+v7+//7y8vP67u7v+
-        vLy8/9DQ0P7h4eH+wsLC/5WVlf6BgYH+XFxc/6ampv7Pz8//19fX/uzs7P77+/v//v7+/v7+/v7/////
-        /v7+/vz8/P7s7Oz/39/fTwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAALW1tQKvr69kqamp6L6+vv7W1tb+5OTk/+bm5v7i4uL+2tra/9PT0/7S0tL+
-        2dnZ/+Hh4f7n5+f+3Nzc/8nJyf6xsbH+jIyM/4CAgP51dXX+a2tr/8vLy/7k5OT/6enp/vr6+v7+/v7/
-        /v7+/v7+/v7//////v7+/v39/f7z8/P/7e3tNwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAm5ubEIaGho1tbW36a2tr/3p6ev+Li4v/
-        mZmZ/6SkpP+rq6v/rq6u/7Gxsf/ExMT/2tra/93d3f/FxcX/p6en/42Njf93d3f/eHh4/9vb2//u7u7/
-        +Pj4//7+/v///////v7+/+3t7f/x8fH//v7+//z8/P/29vbw8fHxBgAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAe3t7N3BwcLltbW31
-        b29v/2tra/5iYmL+WVlZ/1ZWVv5ra2v+kZGR/7e3t/7b29v+8/Pz//Ly8v7h4eH+wsLC/5iYmP5vb2/+
-        eXl5/+Pj4/7y8vL//f39/v7+/v7//////v7+/snJyf6ioqL//v7+/vz8/P7v7++NAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/f38Q
-        e3t76piYmP62trb+sLCw/7Kysv61tbX+tLS0/66urv6bm5v+eHh4/2xsbP5/f3/+pqam/8HBwf64uLj+
-        q6ur/6ioqP6kpKT+jIyM/9/f3/75+fn//v7+/v7+/v7//////v7+/vn5+f7j4+P//v7+/vn5+d/19fUT
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAACEhIRgk5OT/9HR0f/Jycn/xsbG/9jY2P/b29v/29vb/9vb2//V1dX/vr6+/7Gxsf95eXn/
-        iIiI/9LS0v/l5eX/4ODg/8zMzP/AwMD+zs7O1dnZ2Z35+fn7/f39//7+/v/////////////////8/Pz/
-        8/Pz1vb29icAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAACMjIxytLS0/uPj4/7Nzc3+3d3d/+jo6P7n5+f+5+fn/+bm5v7k5OT+
-        zs7O/9DQ0P7R0dH+lJSU+tLS0qnb29uS4eHhhOHh4VzX19cgAAAAAAAAAADu7u5A9PT0wvLy8vb39/f9
-        9fX19vDw8Mzt7e1s8/PzBwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACdnZ0vwMDA/Pb29v719fX++fn5//r6+v74+Pj+
-        9fX1//Ly8v7s7Oz+09PT/9/f3/7q6ur+qKio+bq6uhYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAO/v7w/w8PAb8PDwDgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvr6+g/Pz8/79/f3/
-        /v7+//z8/P/39/f//v7+//7+/v/5+fn/6+vr//Pz8//t7e3/rq6uyrOzswEAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAANvb21fq6urg+vr6//Ly8v6qqqr+/f39//7+/v7+/v7+/v7+//39/f7T09P8xMTERgAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAADl5eUI6+vrWfHx8ark5OTh8vLy+vT09P719fX+8vLy8ubm5rrZ2dlG
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADq6uoC6enpD+rq6h7t7e0c
-        7u7uCQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////AAD/////
-        //8AAP////A//wAA////4B//AAD////gH/8AAP///+Af/wAA///gAB//AAD//wAAA/8AAP/8AAAA/wAA
-        /wAAAAB/AAD8AAAAAD8AAPgAAAAAPwAA/AAAAAA/AAD+AAAAAD8AAP8AAAAAfwAA/wAAAAB/AAD/AAAA
-        AH8AAP4AAAAAfwAA/gAAAAA/AAD8AAAAAD8AAPwAAAAAPwAA/AAAAAAfAAD4AAAAAB8AAPgAAAAAHwAA
-        +AAAAAAfAAD4AAAAAB8AAPgAAAAAHwAA+AAAAAAfAAD4AAAAAB8AAPgAAAAAHwAA/AAAAAA/AAD8AAAA
-        AD8AAPwAAAAAPwAA/gAAAAA/AAD/AAAAAB8AAP8AAAAAHwAA/4AAAAAfAAD/wAAAAB8AAP/wAAAAHwAA
-        //AAAAA/AAD/4AAAAD8AAP/gAAAAfwAA/+AAAwD/AAD/4AA/x/8AAP/wAD///wAA//gAf///AAD//AD/
-        //8AAP//g////wAAKAAAACAAAABAAAAAAQAgAAAAAACAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAEBAQYGBgYPCgoKCgMDAwEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAARo6OjtNMTEyaAAAAGgAAAAEAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwc5OTmE4ODg/1FRUY0CAgIRAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAQEBAwAAAAwAAAAXAAAAIwAAACUAAAAgAgICNLe3t+TT09P/QkJCVAUFBQgAAAAC
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAwMDDQcHBy8sLCxxUlJSpnNzc8Z+fn7UfHx80GZmZrtaWlrBzs7O/8jIyP8TExNY
-        AAAAMwAAACEAAAAPAAAABgAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAgIC
-        AAAACAAAAAoAAAAFAwMDCg8PDz5jY2Oqubm5883Nzf/b29v/4ODg/+Pj4//i4uL/4ODg/9nZ2f/IyMj/
-        rq6u+g8PD2sAAABXAAAARgAAACkAAAAXAAAADQAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAcHByJgYGCmFxcXjAAAAFg5OTmIurq68dXV1f/g4OD/7u7u/+/v7//y8vL/8vLy//Ly8v/z8/P/
-        8vLy//Dw8P/b29v/v7+/8EVFRYwAAABQAAAAKwAAABoAAAAYAAAACgAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAR0dHF9ra2urLy8v8cXFx39PT0/7Y2Nj/7Ozs//Dw8P/7+/v/m5ub//j4+P//////
-        ///////////+/v7/9PT0//T09P/i4uL/xsbG/nd3d68DAwMsAAAAIAAAACMAAAANAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsrKyOa+vr/bV1dX/2tra/+7u7v/29vb/////////////////
-        ////////////////////////////////+vr6//Pz8//h4eH/qKio/42NjbkJCQk4AAAALAAAAAMAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACjo6MmycnJ9dvb2//t7e3/+fn5//7+/v/+/v7/
-        /v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7/9/f3//T09P/Ly8v/k5OT/52dnckKCgoo
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK2trbnf39//6Ojo//Ly8v/8/Pz/
-        /Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz/7+/v/+bm5v+0tLT/
-        q6ur/7S0tLAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACUlJQ31NTU/+Hh4f/m5ub/
-        9vb2//b29v/29vb/9vb2//b29v/29vb/9vb2//b29v/29vb/9vb2//b29v/29vb/9vb2/8DAwP/Ly8v/
-        6Ojo/729vf/V1dX/0dHR/+np6VMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJ6enprl5eX/
-        5OTk/+rq6v/x8fH/8fHx//Hx8f/x8fH/7+/v/+vr6//Gxsb/7u7u//Hx8f/x8fH/8fHx//Hx8f/x8fH/
-        6Ojo/+jo6P/m5ub/t7e3//b29v/Jycn/7e3tzgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        s7Oz5ODg4P/t7e3/9/f3/+rq6v/q6ur/2NjY/56env96enr/eHh4/0pKSv+3t7f/1dXV/+Tk5P/p6en/
-        6urq/+rq6v/q6ur/6Ojo/+Hh4f+1tbX//Pz8/8jIyP/t7e3+8PDwIAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAIqKihjIyMj/2tra//Ly8v/4+Pj/9vb2/+jo6P+3t7f/sbGx/9jY2P+EhIT/xcXF/+Tk5P/Q0ND/
-        wcHB/8PDw//a2tr/39/f/+Pj4//h4eH/2dnZ/7Ozs//s7Oz/x8fH/+np6f/v7+9PAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAi4uLNNTU1P/V1dX/8vLy//b29v/29vb/9vb2/+/v7//h4eH/lZWV/6ampv/e3t7/
-        3t7e/97e3v/e3t7/1dXV/7+/v/+7u7v/39/f/+rq6v/a2tr/np6e/8HBwf+1tbX/4eHh/+7u7l8AAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAACPj4851tbW/9PT0//l5eX/5+fn//Ly8v/y8vL/8PDw/+Dg4P/V1dX/
-        6Ojo/+Pj4//g4OD/4ODg/+Dg4P/j4+P/5+fn/+7u7v/w8PD/7+/v/83Nzf98fHz/jo6O/46Ojv/Kysr/
-        6urqXgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJGRkSjNzc3/2tra/+Hh4f/t7e3/7e3t/+zs7P/e3t7/
-        ycnJ/+zs7P/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+zs7P/Z2dn/r6+v/4yMjP+BgYH/
-        bGxs/6ysrP/n5+dJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAl5eXBbu7u/bo6Oj/0dHR/+jo6P/p6en/
-        5+fn/7+/v//k5OT/6enp/+np6f/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/5OTk/8rKyv+fn5//
-        paWl/4iIiP9ubm7/sLCw/uHh4RgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAr6+vte3t7f/Ly8v/
-        39/f/+bm5v/l5eX/2NjY/+bm5v/m5ub/5ubm/+bm5v/m5ub/5ubm/+bm5v/m5ub/5ubm/+Hh4f/MzMz/
-        ra2t/6+vr/+Ghob/YGBg/3BwcP/Pz8/MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwsLBP
-        09PT/+bm5v/IyMj/3t7e/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//d3d3/
-        ysrK/6qqqv+BgYH/d3d3/4ODg/9+fn7/bm5u/3t7e3YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAALS0tAG8vLzB5ubm/9nZ2f/Hx8f/2dnZ/+Dg4P/g4OD/4ODg/+Dg4P/g4OD/xMTE/93d3f/e3t7/
-        1tbW/8bGxv+urq7/bW1t/42Njf+9vb3/y8vL/9TU1P/R0dH/k5OTwQAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAL29vR2/v7/k5+fn/9/f3//CwsL/zMzM/9XV1f/Z2dn/29vb/9ra2v/S0tL/
-        09PT/8PDw//Kysr/vr6+/2xsbP+NjY3/x8fH/9vb2//z8/P/+/v7//n5+f/a2tr/w8PDIQAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALm5uSC1tbXM1tbW/+zs7P/W1tb/x8fH/8HBwf+/v7//
-        wcHB/8fHx//Ozs7/1NTU/6Wlpf+CgoL/dHR0/87Ozv/h4eH/+fn5//7+/v///////v7+//Pz8//h4eEy
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKmpqQObm5toioqK7JGRkf+mpqb/
-        tbW1/8DAwP/ExMT/zs7O/9PT0//CwsL/mZmZ/3t7e/+SkpL/6urq//f39//+/v7//f39//Ly8v/+/v7/
-        9/f3+O/v7wwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHl5eYl+fn7v
-        gYGB/3l5ef9ubm7/b29v/4mJif+9vb3/5+fn/97e3v+vr6//gICA/5+fn//y8vL//v7+///////39/f/
-        tra2//7+/v/09PScAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACCgoIy
-        m5ub/8rKyv/FxcX/1NTU/9XV1f/Pz8//qqqq/3t7e/+YmJj/z8/P/8/Pz//BwcH+vr6+1PLy8ur+/v7/
-        /v7+///////+/v7/9/f3xfb29g8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAI2NjUPJycn/3Nzc/+jo6P/s7Oz/6enp/+fn5//Ozs7/2dnZ/6ioqNTV1dVk4ODgUd3d3SEAAAAA
-        7e3tHPLy8o309PS58/Pzpe/v71nw8PADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        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
-
-  
-  
-    Telldus Scheduler
-  
-
\ No newline at end of file
diff --git a/scheduler/DeviceScheduler/frmMain.resx b/scheduler/DeviceScheduler/frmMain.resx
deleted file mode 100644
index c506c66e..00000000
--- a/scheduler/DeviceScheduler/frmMain.resx
+++ /dev/null
@@ -1,4001 +0,0 @@
-
-
-  
-  
-    
-    
-      
-        
-          
-            
-              
-                
-              
-              
-              
-              
-              
-            
-          
-          
-            
-              
-              
-            
-          
-          
-            
-              
-                
-                
-              
-              
-              
-              
-              
-            
-          
-          
-            
-              
-                
-              
-              
-            
-          
-        
-      
-    
-  
-  
-    text/microsoft-resx
-  
-  
-    2.0
-  
-  
-    System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-  
-    57, 123
-  
-  
-    48, 48
-  
-  
-  
-    5
-  
-  
-    System.Windows.Forms.ColumnHeader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    System.Windows.Forms.ListView, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    $this
-  
-  
-    
-        iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
-        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAC8dJREFUaEPtWAtY
-        j2cbX0cVplYr30KopFpIxvZR+xhW6SPVtRzSYW1JCcXWokIKw9ZBRSuSzkVKqRxCmBBySHMqjJVzZQ6l
-        ee7vd/+vf7u2bxupvl12fXuv677e9//+n/d57uPvPrz22v/DlVCVpfiXlHPJ3tDpMaeTKpKr8x/En8uq
-        jDyeaPmXEGTsl2YyUxImxQQUB9DGCxlUVH+EihvKKeZUSv3XR7/p/coLMdS/10fWEe/R/HxvEXM6TuTe
-        KqHSprOi4F4ZfVEQVPR5vq/sKy1E/09VMs1Ddckt2VYs3RckNl1Mo6SLGSKlegsF75knPNOcPP8MAcrK
-        ymyuXr2adf/+/eqmpqbi7777TqZN5/b8SCHeaN7rNCFyKM3KcqLlB8Mo8UIyzUg0o+23S+nTFMsHvjmf
-        6rdps3YsysvL09qzZ09hQ0MDPX78WELXrl1z5q2ys7MTDh48mFBQUPDHwmjayg99a4pC8zuBPcXEte+I
-        SVH6FF0RKyJPrCC/XAeR+X2ucNs4rtQvx02uHfz9/Mnq1atNvv3229QbN26Mr6urk7hlWlra4MLCwprb
-        t2/T3bt3BdOdO3euHz9+XHHTpk1muP/04MGDhvj4+B7PPfvNSfKLBnh2Ee+H6Qq7dcbQurVIhCsFFDmK
-        2IoIsaYsUMzOmO7XEQH8/f1nHD16lMCQqK+vP3nixIlF27dvb7h+/bqAUATiuzh9+vRnfE5oaGgyW0Xg
-        2rVrl+lzz9b+SF5Oz1WhxCKkO1lHmJJ9bF8K2rWAUmqyaHbmSNpWt5v8ciY/8s+b9XZ7hfDz8wsuLy+n
-        H374gWABunnzpuQOdyEIQ6WlpbRv377LJSUlagkJCVqgR7gkLoX/Jr/wXF1nhT5mfkq3LUI0yW7dCDEt
-        bgBFnYwWCVUx4vNcG5FTW0heqROOLCzwbFeiW7x4cWJVVRVdvHhRgFFRXV1NV65cEQhcJoJ1xMaNG09B
-        gDHJycnrYAnBQt66dUsgoF1fKAAv0JmqYPdBSDcxermumLZhGM1KG8uuJFYf9hZRx0JoXcVK4ZftHNSm
-        zf5r0apVq/JZgPz8AmFlaSW8vGbR3r17BfxfgEmqra0V7E4sDIRjAUVNTY1EyIqKCrc2n9l/uuL6CavU
-        yOprU3JLNKSgYh9Kv7qNAneMo+zv8yi4yKk5cMecoW3eEAszMzM1gCYPz58/Twnx8ZSRspnm+njRZwvm
-        06VLlzgu6Mcff6RWl3ny5Inkmd8jXghINbHN5xl+rNTNZKZypfWqnuSwfqSYudlQRJRHIC9spsWFViLv
-        5k7hlzXpVHDRbOW2blpUVOTLGt1Tsods7SaJZaHLRGpqEpWXHxNnzpwRbBnEgiSIYQmJ2wCNxL179/j5
-        cVRUlHZbz5KsG+CiZDom8PXHH37ZX7gmjRTzst6XJLhvzgSJyLIFIrEqiuZnz1jRlk3hJnLHjh2rvnDh
-        glgXt56mTnEUk+0nC9/5vhL3gFVEZWWlJAawTpw6dYrOnj3LQvF/FBEREd6Wc36zpu+ULnPtv9Ig668H
-        k3f6UAou9qCMa3m0utSO0qvTKXSX+9PPcjzNXrT5jh07XC5fvkwQgBlrycnZ+uQL/wXN+fnbJe9aiZlF
-        4NKBAwcIiY2QH554enpGg7q86Izf/d/oY2UZ/RlKOxyj3hIO68zhNiYUfnS1yPp+i1i+60NKv7JN+KS7
-        pj5vc2RSY0DnvXPnzjFzgplljZ+rrGySalhigdb3/AwUqvPy8koyMzN718HBoUPJ8zUjN5WeI+Z0r7UL
-        709uSf+iL3JGoWJNpS3XMyj35j7yzlrQ7Lr5k9+F1Q0bNvTduXPnFWRfiouLo7CwMImGf6l1fj558uSj
-        xMTESjCdMmzYMFcDA4N+5ubmCu3S+u99pDdN2com5I0W61VvIw+Yi7DSJSLxQibK7SThlub5zCVt5m8O
-        i42NHZCTk3MFCUhkZWWJ4uJi2rJli0DBxhZ4hueLrq6ucSYmJi6amppD9PT0tIyNjduVX9okaF8HlZDJ
-        K7TJPNBUTImxEx7JnjQjyV04pjnXzi9c9KtCKzIy8h24Th378bZt29glmAiWEIDSm7a2tjOHDBmiBW3L
-        t+nwzlg0yF0D8dBnnum8IY8sllqQ1Vobckx1ouCS5SKmYlPukuwVEissXbp0LDRezxpnOnToEIFpRhiC
-        m+y3sbEZ0Bn8tHuP4f4jeowMNh9u5D4w32zmIOG81kV8nh54d01yhErw0sXTt27d2gzMZ00LVJLEsAjm
-        WwIDA7+aNm1a13Yf3Nkfan2gZqth3vXZSJd3RcrWlJZly5dtRGXZwlpHUDKuc4IiCNHs4+Pj6eHh0TE0
-        6WwBtM3VZYb/21RjzNgx4ezr7Cp8Z1RhzOfyAPVLMxh3mzt3bts6q85m8kX7hYSFKKNmz1qzZo0E41nz
-        XNdzQQbtN7m4uEyH9l9N5gGR6qmpqfuOHDkigPUcoJyMJAkJ2faRs7PzVG9v71eTeaT4Pvv37z/LzQkz
-        zBUjwyRKBuKMGxQU5LFy5cpXk3lu7VBs3WDm2VUwPWCihw8fCmTbFnRW3KzkwUKv3igGmh8P365naETz
-        TS0tLYKpubmZUNc8AEw6ovAq444Laz95UQz9qf9jQuAM7TZxQuJG++nTpxJi7cNtGt3d3W3Y50ePHm24
-        du3aO2gBGzEK6f+nMik97Fe+Gx4eLotmIvjw4cPPELDcHQk02UzcQTHaNAJtrH7J6KhRo6YiH7RA2AOA
-        1s4ryp6jDU4yXHNzpuwGUlFTU1NEKauECjIBGC8YbdhtoH3BhOkZJ6x6JycnK4xLfiX0+PHjZS0tLWMR
-        KwK1UMD/2gocbCogVZA66E2QprKyssHs2bP3Q/PEFaS0zeP2TjIKQRDXOzo6WsJ1foM2PXr0kNHR0VHF
-        9xVwrydz5sx5z97eXrZ79+68li3CRVynohRvytpnId5UV1e3CAkJqWHGuYLksQf3qzy/4RYQQt2fMGHC
-        OJTDMtra2swIl8FKUivy/XXeR0VFZTyQqRF54vzgwYPVuuHCe+5t3wJ1B3UeUvXr108GJa7CoEGDbNGI
-        1EtLX0n31EoITAL+1xsaGk5Gt9R6ON/fAPWSEo/j+4F4lmqAfYPQEz9DlZqA3zogQ5CRdA0L0XlXQECA
-        DyrJZjDJjEqaa/ZjJi4TgO8N6JZ4PqMjJyfHFuPYYY3/A6QrZZoZ55LZADQQZIx4yEdd9BMQykP6H69l
-        S7BFOu5KqN8VYOpYngpwNclFGSNOK7ErwW2ejBgxYjoY15BqmrXMMKknZZaZZsb4fR/pGnaVnjIyMgYL
-        Fy68BKvW6evrm+rq6ir37t1bQVFRsePMA6uV0T3lon7h6lFgIiB4RsmtIN/ZEhDkJzs7u/k4tAsO5VkQ
-        C8HM8sD1n6B3QTwzZfdRBfEajgsOVjm4kSyQKZAtCSEer1+/PgTvO+fKz8/fzL6N8XUF+tgq9ncetO7e
-        vZtQNjACCaBJHLTITDOx6dmX+0oZ5t+t79girH1GMxbi5yCFAIvhgjxhIwQ1Ris5LHjHLhRf76FuF7BC
-        3rhx41SNjIx0EMAnUAow86wtniQUgXl2D2aMmeZ7TxDP69n/OQ7YFfjOcMwwzOvYQmwRtS64evXqZbRo
-        0aJaVgrnFNwPQ6CONTkZGRm+DJFwk7m+vr4yEydOlFuyZEk0T4253omOji6Xl5cfLtU4M6MJYuRg9/gj
-        /23FehaQkYldywTUT1VVdSqmbI9gcQk0A50cOmQCdEvWmP7y5PcQ4FMD+K+PTWu4RIZLnYHi3scBHIgM
-        k4w6L5uAWMNaII6VUaDRWlpaoQCNlsbGRh6zn0Pp3f7JxMCBA7uhDMjn6hEoUwvT3oN2nsEKJxGs9lLN
-        M9R1JOHwtxwP7FrsisOR/FYgxpoRB3V4Nobi2rd/165du8C/B1lYWMRganAcKf8o4iAeh7BpOdlwMHZm
-        MSaH85QVFBTAs7o1zjdAydINGbt9cIrNZIDriiBVWVlZxm89vGJNcTC+rLu8lDsrKSnJML3UR38v/lsD
-        HdfAfwC8OWB2rvuFqgAAAABJRU5ErkJggg==
-
-  
-  
-    102, 26
-  
-  
-    System.Windows.Forms.ColumnHeader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    pictureBox3
-  
-  
-    tabControl1
-  
-  
-    3, 3
-  
-  
-    638, 249
-  
-  
-    Beskrivning
-  
-  
-    tabPage3
-  
-  
-    System.Windows.Forms.StatusStrip, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    300
-  
-  
-    tabPage2
-  
-  
-    System.Windows.Forms.TabPage, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    tabPage3
-  
-  
-    linkLabel2
-  
-  
-    toolStrip1
-  
-  
-    188, 22
-  
-  
-    870, 24
-  
-  
-    
-        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
-        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAAewQAA
-        HsEBw2lUUwAAAWNJREFUOE+N0csvA1EUx/ErsbT1B9jYSfwLrGzYWPkv2LIVSwmJHYloUU00kZDQSFOv
-        SOrRTFtBK1WPmmpNr760nZnOV0uCours7jm/zz3JvS2AqCtDWHFRbdImWtvrR2+nKvgsK4Xpx4xghCmd
-        kj3GKNYFahd9VCWNcUJFxbxHD1M8JecmZsOqfDVfQN6DEaWi1UBRIbeNdHI1iqr8BiyL9DJGBEqYcV4O
-        kaskpjnqIehssCG5RGEL/ZpSkMwG6hSBIVyC4HoDkNjjaRLpIDXL7RiBPtyCecHTXQNQzHIxQnyU2DDn
-        gxx0YRfszzd+perkZpezXkL9HHazKpjrJKv9CXQd/ziPTrwDLAp8jm/p2i9/b52scDnDQgcTgodoc5BP
-        JuRtRFlf8yzYM/K5OXjOFB6Tcmdfca15tfQ/gJRZVU15vccOx6amyeYbymU9FArbbC6fTzFNszl4T+Ry
-        +Z/R984rn0GmMacbOKoAAAAASUVORK5CYII=
-
-  
-  
-    &Konfigurera enheter...
-  
-  
-    System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    1
-  
-  
-  
-    Bottom, Right
-  
-  
-    65, 20
-  
-  
-    Starta
-  
-  
-    True
-  
-  
-    System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    label3
-  
-  
-    108
-  
-  
-    9
-  
-  
-    True
-  
-  
-    Fill
-  
-  
-    tabPage3
-  
-  
-    mnuAbout
-  
-  
-    notifyIcon1
-  
-  
-    toolStripMenuItem2
-  
-  
-    2
-  
-  
-    112, 22
-  
-  
-    5
-  
-  
-    mnuNew
-  
-  
-    toolStrip1
-  
-  
-    mnuWebsite
-  
-  
-    System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    Benämning
-  
-  
-    Välj när och vilka enheter som skall schemaläggas.
-  
-  
-    59, 20
-  
-  
-    System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    255
-  
-  
-    Enheter
-  
-  
-    &Arkiv
-  
-  
-    111, 232
-  
-  
-    toolNew
-  
-  
-    111, 210
-  
-  
-    53, 23
-  
-  
-    6, 25
-  
-  
-    1
-  
-  
-    toolEdit
-  
-  
-    482, 13
-  
-  
-    6
-  
-  
-    
-        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
-        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAbFJREFUOE9jYCAD
-        rO/vF9gxc6YGGVoZGO5t3qz/7eixZ1+OHPn3ZsmSQpIMuXf0qPujLVs/P+vr//9swoT/j5ublxJtwI+X
-        a4If39j6fV9F4/8TXd3/L2RkHFsZEiJKlAH/3q3M+XM96s+nQ37/dy2f/D/X03Otj7ExF0HN//8zMP59
-        s6j99+Wgf1922fy/0q/6b0+jZhNQIyNBzTNnzmT9+2rmwj8XvP5/2GD2/3yPws/dDRrxBDWCFOzfP4Xn
-        7/PeHb9OOv9/vdTg/6kOxXdbKtUdidJ86fhs8T/Pms/8OGj7/9kczf/HWhTvLi9T1SRK8+OrS1X/PKq4
-        83W72f8Hk1X+H2lSOj4tQ0mMKM2v7m8z/HMv69Wntfr/b/Uq/j/QpLqmN0SGkyjN9fX1LN+eHbz0bpnh
-        /0vt8v/2Nal04whpUOjDMMLsR7cv5F7e2fd/VZvPy2xvsXxRUQYeoKwAEAsDMSixiEMxyDsgMW4gZoKZ
-        wGllqrNcX1O2iZmZ2QsoaA/E5kCsD8RqQCwPxBJQjXxAGpSAWJC9BnISOxCDbAVJsgExM9QGwgmGqEDC
-        owgAr0Wwanw/YAUAAAAASUVORK5CYII=
-
-  
-  
-    cmdTurnOn
-  
-  
-    helpToolStripMenuItem
-  
-  
-    Detta program låter dig på ett enkelt sätt hantera schemaläggning av en eller flera enhet(er) samtidigt.
-  
-  
-    0
-  
-  
-    0, 0
-  
-  
-    System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    &Hjälp
-  
-  
-    0, 49
-  
-  
-    System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    337, 24
-  
-  
-    856, 509
-  
-  
-    System.Windows.Forms.PictureBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    contextMenuStrip2
-  
-  
-    Välkommen till Telldus Schemaläggare
-  
-  
-    Schemalagda enheter
-  
-  
-    System.Windows.Forms.LinkLabel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    editToolStripMenuItem
-  
-  
-    
-        AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w
-        LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
-        ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAADU
-        DgAAAk1TRnQBSQFMAgEBBAEAAQwBAAEEAQABEAEAARABAAT/ASEBEAj/AUIBTQE2BwABNgMAASgDAAFA
-        AwABIAMAAQEBAAEgBgABIP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8AOQABAQMFAQcDDwQU
-        ARsDDQERAwMBBBQAAwUBBwMUARwDGgElAxoBJAMYASIDFwEgAxYBHgMUARwDEwEaAxIBGAMNAREDAwEE
-        EAAc/wH0AvMh/ycAAQEDBAEGJAADAwEEAw0BEQMgAS8DNwFbA0ABcAMyAVEDHQEpAw0BEQMDAQQMAAMU
-        ARwDPgFrA0oBigNIAYgDRwGDA0UBfQNDAXgDQQFzAz8BbQM7AWUDLwFKAw8BFBAAFP8B+gL5Af8B2gLU
-        Af8BrgKjAf8B0QLKAf8D/Bn/JAADJQE3A2YBvgMIAQsbAAEBAwcBCgMYASIDMwFSAVECTwGlA1gB3QFS
-        AlABowNQAZ4DRQF9AzIBUAMcAScDCwEPAwIBAwQAAWcCXAHqAYACaAH1AWcCWAHpAV8CVwHfAV4CWgHV
-        AVsCWAHLAVsCWQHDAVgCVgG8A1UBtQNTAaoDRgGAAxgBIhAAFP8B8gLvAf8B6wLnAf8BzALAAf8BuAKo
-        Af8B7wLtGf8UAAMLAQ8DLwFKA0IBdQNBAXQDXwG2A1wBqgMRARcDBAEFEAADAwEEAxEBFwMoATwDSAGG
-        AV4CWAHlA2QB/wNLAf8DQwH/A1cB3wFSAlABpANPAZwDRAF7ASwCKwFDAwsBDwQAAZICagH5Af8C9AL/
-        AuQB/wH9AuMB/wH7AuAB/wH8AuQB/wH9AuUB/wH5AdkB2AH/AcsBxQHZAf8BgwFrAW0B9wNLAY4DGwEm
-        AwABAQwAFP8B9QHxAfAB/wHvAeoB6QH/AdEBxAHBAf8BwAGxAa4B/wHwAe4B7Rn/CAADJAE1AygBPQNA
-        AXADmQHmA+EB/wPqAf8D6gH/A+EB/wN5AdUDOAFeAxgBIQMJAQwMAAMOARMDOgFhAVsCWQHDAXMCbwH+
-        A2cB/wNiAf8DWgH/A0cB/wNGAf8DQQH/A1oB2wNRAaEDQwF4AxYBHgQAAZICagH5Af8C7gH/AfsC3AH/
-        AfwB2QHWAf8B+AHTAdAB/wH5AdUBzwH/AfsB1QHNAf8B9gHLAcUB/wHUAcABzAH/AYQBbAFtAfcDSwGO
-        AxwBJwMAAQEMABT/AegB6gH0Af8B2wHiAe8B/wGxAbQB0QH/AaQBogG+Af8B8AHvAfEZ/wgAAzIBTwOj
-        AfQD2gH+A/QB/wPlAf8D/QX/A/wB/wPxAf8DnQHrAzEBTwMSARgMAAFJAkgBhwFtAlQB9wOCAf8DcAH/
-        A2QB/wNbAf8DawH/A0YB/wNHAf8DRQH/A0EB/wFaAlUB5AFJAkgBiAMaASQEAAGUAmoB+Qb/AfsB/wFp
-        AZcB/QH/Ad4B5QH8Af8BWQGIAf0B/wE7AWgB/QH/AVgBgAH6Av8B/AH0Af8BigJtAfcDTQGWAygBPQMO
-        ARMDBAEFCAAU/wGpAc0C/wGVAdkC/wEfAaIC/wEAAYYC/wHeAeYa/wgAAyUBNwPSAfwD9QH/A/0B/wP9
-        Af8D/QH/A/0B/wP9Af8D+wH/A+UB/wOXAfEDJAE2DAABYgJVAe8DiwH/A4EB/wNuAf8BigKLAf8BpAKl
-        Af8BngKfAf8DiQH/A2AB/wNIAf8DRAH/AVkCVQHrAUUCRAF8AxcBIAQAAY4CbQH3Bv8B+wH/AUgBhgH+
-        Af8BxQHYAfwB/wHhAeIB9wH/ARMBUgL/AcMBygH4Av8B/gH6Af8BqwKWAfsDUwGsA0cBgwE1AjQBVQMb
-        ASYDBQEHBAAQ/wL6Av8BhAHPAv8BqgHpAv8BTAHAAv8BAAGlAv8BqAHKGv8IAANwAbQD5QH/A/QB/wP0
-        Af8D8gH/A+gB/wP0Af8D9AH/A+QB/wPgAf8D0AH/A4sBxwwAAWUCUgH0A4cB/wOYAf8BsgK1Af8BgQJz
-        Af8BVwJMAf8BSQJFAf8BXgJhAf8BhwKIAf8DgQH/A2MB/wFZAk0B8gMuAUgDDQERBAABiQJkAfYE/wFm
-        AZwC/wEdAYcC/wHJAd0B/QH/AWgBlwH9Af8BvQHOAfkB/wGBAYwBuwH/AYMBhQGHAf8BbAFvAXAB/wFb
-        AloB2QNSAagDUAGaAz4BawMaASUDAwEEEP8BwgHhAv8BQAHVAv8BSwHUAv8BLgHHAv8BAAGtAv8BJAGd
-        Av8B7QHyFv8EAAMEAQYDwgH4A/QB/wPtAf8DuAH/A5QB/wOqAf8D0gH/A9wB/wPmAf8D4QH/A9QB/wPW
-        Af4DFAEcCAABeQJtAfgDzgH/AcMCxAH/AY8CgQH/AcECkgH/AdcCngH/AcsCjgH/AV0CRAH/AYQChwH/
-        AX8CfgH+AV4CXAHOA0EBcgMMARADAgEDBAABiQJnAfYI/wFzAaYC/wHdAegB+QH/AcYB2gH4Af8BjwGK
-        AZkB/wG1AaYBmQH/AfYB1QGvAv8B3wG0Af8B8wHSAawB/wGnAZkBigH/A1kByQNPAZsBNQI0AVUDDQES
-        DP8B8gH3Av8BbwHYAv8BeAHlAv8BbgHgAv8BUQHXAv8BKwHFAv8BAAGkAv8BoAHEFv8EAAMUARsD1QH/
-        A+0B/wP0Af8D6AH/A74B/wPgAf8D3wH/A9cB/wPeAf8D4AH/A5oB/wO7Af8DIQEvCAADMAJMAksBjwFe
-        AlwBzgF3Am0B/AHqAtkB/wHvAtEB/wHPApYB/wFhAlEB7gNQAZ0DKgFBAwcBCgMBAQIMAAGNAm0B9gH0
-        AvcB/wGKAosB/wFmAWQBYQH/Aa4BqAGnAf8BrwKiAf8BwgGwAaMC/wHmAbcC/wHlAbgC/wHmAbkC/wHl
-        Ab4C/wHpAcAB/wGpAZoBigH/A1IBqQNEAXkDFgEeDP8BwwHoAv8BjgHsAv8BqAHvAv8BnAHrAv8BeQHi
-        Av8BRgHSAv8BAAG6Av8BAAGgAv8B4wHsEv8EAAMIAQsDzAH8A+IB/wPqAf8D0gH/A+sB/wPrAf8D6wH/
-        A+sB/wPpAf8DvAH/A44B/wOLAf4DEgEYEwABAQMNARIDQAFwAVgCVgG5AVICUQGhASwCKwFDAw0BEgMB
-        AQIUAAFZAlcBwgFhAlwB3AFdAlMB7QFeAloB1QFhAlwB3AF+AXUBdgH6Af0B4gG8Av8B6QHBAv8B8AHG
-        Af8BsAGhAYQC/wHmAboC/wHnAb8B/wH6AdcBsAH/AVsCWgHZA0gBhQMZASMM/wGmAeoC/wG5AfUC/wHf
-        AfoC/wHTAfgC/wG1AfEC/wGRAecC/wFXAdIC/wEAAa4C/wG0AdMS/wgAA30BwAPWAf8D4wH/A+EB/wPk
-        Af8D5AH/A+QB/wPjAf8DyAH/A5UB/wN4Af8DcQHQGwABAQMlATcBNQI0AVUBPwI+AWwDJAE1AxEBFwMD
-        AQQUAAMGAQgBVgJVAbQBWQJXAb8DUgGpAVwCWAHRAYwBewF8AfwB/wHvAcsC/wH4AdcB/wHPAcQBpQH/
-        AUwBTwFXAf8BmAGLAWwC/wHpAbwC/wHoAbsB/wFnAlkB8gNEAXkDFgEeCP8C/gL/AacB7gL/AdsB+wL/
-        AfgD/wHlAfwC/wHHAfYC/wGtAe8C/wGSAegC/wE/AcsC/wGqAdMS/wgAAyYBOAPMAfgD0AH/A9gB/wPd
-        Af8D1AH/A9QB/wPJAf8DhQH/A7sB/wPjAf8DtgHvAwYBCBMAAQEDEAEVAx4BKwNDAXgDQAFwAzoBYQMk
-        ATUDEAEWAwMBBBsAAQEDAAEBAwABAQFgAlsB1gH/AfIB0wH/Ae4B6QHTAf8BPgE9ATgB/wHoAd0BvAH/
-        AkUBPwH/AdMBvgGdAv8B3wG3Af8BXgJaAdgBNQI0AVUDDQESDP8BvgH0Av8B3gH7Av8B7QH9Av8B5AH8
-        Av8B0QH3Av8BvAHzAv8BqgHvAv8BeAHcAv8B0QHnEv8MAAMoATwDiwHUA7UB/wO9Af8DxwH/A84B/wOP
-        Af8DrwH/A/QB/wP7Af8D9QH9AwsBDxAAAwYBCAMQARUDUAGeAVwCWgHNAVsCWQHEAUICQQFzAzMBUwMg
-        AS4DCAELJAADRAF7Ae0B1gHGAf8BoQGdAY0B/wLpAdMD/wHdAv8B8QHKAv8B8QHCAf8BvwGsAZwB/wFO
-        Ak0BlQMbASYDAwEEDP8B7gH9Av8BzQH7Av8B5wH9Av8B5AH8Av8B2gH6Av8BzgH3Av8BugHzAv8BowHg
-        Av8B/QH+Ev8MAAMJAQwDgAHdA6UB/wOgAf8DmwH/A8sB/wOtAf4DtwHvA/4B/wPqAf8DZgGbFAADCAEL
-        A1ABnQNEAXoBRQJEAXwBSQJIAYcBUQJPAZwBSgJJAYkDFAEbAwMBBCQAAwQBBgFaAlgBwAHvAdoByQL/
-        AfgB2AL/AfMBzwL/AesBxQH/AcgBtgGmAf8BWwJZAcQDHQEqAwYBCAQAEP8B6wH+Av8BzwH8Av8B2wH8
-        Av8B2gH7Av8BzgH4Av8BzAHyAv8B9wH7Fv8MAAMNARIDxQHxA/MB/wPxAf8D3wH/A0YBcwMUARwDBQEH
-        AzQBUQMqAT8cAAMYASIDVAGuAWsBTQFCAe8BYQFaAVYB4QNKAYoDEgEYAwQBBSwAAwQBBgNEAXsBYAJb
-        AdYBfQJqAfQBXQJZAdcBRwJGAYADEgEYAwQBBQgAFP8B+gP/Ad8B/QL/Ad4B/AL/AeoB+x7/EAADGQEj
-        A1cBiwN7AbEDWQGNAwUBBxwAAUIBTQE+BwABPgMAASgDAAFAAwABIAMAAQEBAAEBBgABARYAA/+BAAH4
-        AR8BAAEPAgAB/wGfAfABBwEAAQ8CAAH/AY8BwAEBAQABDwIAAfgBBwGAAQEBAAEHAgABwAEDAYABAQEA
-        AQcCAAHAAQMBgAEBAQABAwIAAcABAwGAAQEBAAEBAgABwAEDAYABAQQAAYABAQGAAQEEAAGAAQEBgAEH
-        BAABgAEBAeABHwQAAcABAwHwAR8EAAHAAQEB4AEPAcADAAHgAQEB4AEPAfgDAAHgAQMB4AEPAfgBAQIA
-        AeABBwHwAR8B/AEDAgAB8AF/FgAL
-
-  
-  
-    label4
-  
-  
-    Microsoft Sans Serif, 14.25pt
-  
-  
-    6, 13
-  
-  
-    tabPage3
-  
-  
-    toolStripMenuItem1
-  
-  
-    System.Windows.Forms.LinkLabel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    imageList1
-  
-  
-    73, 22
-  
-  
-    tabPage3
-  
-  
-    4
-  
-  
-    3
-  
-  
-    &Ta bort
-  
-  
-    Fill
-  
-  
-    &Redigera
-  
-  
-    True
-  
-  
-    Magenta
-  
-  
-    169, 22
-  
-  
-    8
-  
-  
-    mnuExit
-  
-  
-    5
-  
-  
-    4, 22
-  
-  
-    mnuRunTask
-  
-  
-    System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    True
-  
-  
-    110, 6
-  
-  
-    menuStrip1
-  
-  
-    132, 13
-  
-  
-    169, 22
-  
-  
-    System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    columnHeader5
-  
-  
-    856, 509
-  
-  
-    2
-  
-  
-    
-        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
-
-  
-  
-    System.Windows.Forms.Form, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    870, 22
-  
-  
-    notifyIcon1
-  
-  
-    CenterScreen
-  
-  
-    System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    Startar
-  
-  
-    7
-  
-  
-    109
-  
-  
-    System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    0
-  
-  
-    54, 56
-  
-  
-    6
-  
-  
-    toolRemove
-  
-  
-    tabPage1
-  
-  
-    True
-  
-  
-    10
-  
-  
-    fileToolStripMenuItem
-  
-  
-    
-        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
-        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAAewQAA
-        HsEBw2lUUwAAAUxJREFUOE+VU12rglAQ7EL//1f0oI+9mNSLQg9BQRJRGUZBQdiHGib2ZXObvRy4pRYN
-        HNTjzOye3bM/eKBSgCzLKupXtVotovzt0eA/HkJcr1dZl8sFaZoijmPcbrdXqnw/GVB8Pp+FTAO+K4PV
-        aoX7/Z4zeTI4Ho8iVFkocRiGWCwW2G637w1IZNqMRKMkScA93/cxHA7hed57A0agiCan0wmHw0HEruvC
-        sqzPBrvdDlxRFMmT56a40+mg0WjI/iueasCos9kM6/Uay+VSIvb7fTSbTQwGg89dIIPi6XQqy3EcSd0w
-        DDlaEXL3gC0cj8dS8V6vh1arhdFoVCjO3QPFmkwmmM/nME0TmqZJPcqQy4BEVUBG13VdWvmVAdu32WzQ
-        brdRr9cRBMF3BozIYtq2LRns9/vvDDgDvHm1Wg3dbrd0kEqLqMJxCj/hF5B2pm1BgCdyAAAAAElFTkSu
-        QmCC
-
-  
-  
-    Fill
-  
-  
-    48, 48
-  
-  
-    System.Windows.Forms.PictureBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    &Ta bort
-  
-  
-    255
-  
-  
-    System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    
-        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
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AwMDAQoKCgEQEBACFBQUAhUVFQEVFRUCFhYWAhcXFwEWFhYBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAwAAAAYDAwMHCQkJCgYGBgsAAAANAAAAEAAAABAAAAAP
-        FBQUCxISEggeHh4EEhISAgcHBwEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAUAAAAK
-        AAAAEAAAABcAAAAdAAAAIwAAACsAAAAxAAAAMQAAAC0AAAAlAAAAGgAAAA8FBQUJBwcHBgEBAQMAAAAB
-        AAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAQAAAAIAAAAIAAAADgAAABcAAAAiAAAALQAAADgAAABIEhISZGJiYruBgYHc
-        YGBguBYWFl0AAAA1AAAAJQAAABkAAAAPAAAACQAAAAQAAAACAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAABAAAABgAAAAwAAAAZ
-        AAAAJQAAADYAAABHAAAAWwEBAXN6enrhvLy8/8jIyP+urq7/eXl57AsLC1YAAAA7AAAAKgAAABwAAAAR
-        AAAACAAAAAQAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAQAAAAIAAAAHAAAAEQAAACAAAAAyAAAARAAAAF0AAAB6NDQ0sru7u//j4+P/
-        4+Pj/8nJyf+YmJj/Ly8vkwAAAEoAAAA5AAAAKAAAABcAAAAMAAAABQAAAAIAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAgAAAAS
-        AAAAIAAAADQAAABJAAAAaQQEBI+Ojo7w29vb/+zs7P/i4uL/ysrK/5ycnP8sLCyPAAAATgAAAD0AAAAr
-        AAAAGgAAAA4AAAAFAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAABgAAAA4AAAAZAAAAKgAAAEgAAAByQUFBvcPDw//r6+v/
-        6urq/9zc3P/Dw8P/lpaW/x0dHWoAAABEAAAANQAAACYAAAAXAAAADAAAAAQAAAABAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAD
-        AQEBCAAAABIAAAAjAAAASgsLC32amprz4ODg/+/v7//l5eX/1tbW/7u7u/+KiorzAgICPwAAADIAAAAl
-        AAAAGgAAABEAAAAIAAAAAwAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAgENDQ0EAAAACgAAACQAAABTUlJSt8nJyf/u7u7/
-        7e3t/9/f3//Pz8//srKy/35+fs0AAAAkAAAAHgAAABUAAAANAAAABwAAAAQAAAACAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAQAAAAEAAAABAAAAAQAAAAEAAAACAAAAAQAAAAEAAAABAAAAAQAAAAEAAAAC
-        BwcHAhYWFgQICAgPAAAANRISEm6lpaX35OTk//Ly8v/o6Oj/2dnZ/8nJyf+rq6v/dnZ2nQAAAA8AAAAM
-        FBQUCAoKCgUAAAADAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAEAAAACAAAAAwAAAAQAAAAGAAAACAAAAAkAAAAK
-        AAAACgAAAAkAAAAJAAAABwAAAAcAAAAGAAAABgEBAQcGBgYIAAAADgAAACUAAABRYWFhv87Ozv/y8vL/
-        8PDw/+Li4v/U1NT/w8PD/6ioqP9FRUVtWlpaBEBAQAMlJSUDCwsLAQAAAAIAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAwEBAQQAAAAG
-        AAAACAAAAAsAAAAPAAAAEwAAABYAAAAZAAAAGgAAABoAAAAaAAAAGgAAABgAAAAWAAAAFAAAABMAAAAT
-        AAAAFQAAABgAAAAjAAAARBsbG3murq776Ojo//b29v/r6+v/3Nzc/8/Pz/++vr7/qqqq/zs7O0IrKysH
-        KysrBSAgIAMHBwcCAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AQEBAQICAgICAgIEAQEBBwEBAQsAAAAPAAAAEwAAABYAAAAbAAAAHwAAACUAAAApAAAALAAAAC4AAAAw
-        AAAAMAAAADAAAAAuAAAALAAAACkAAAAnAAAAJgAAACYAAAAoAAAALQAAAEIAAABgb29vzdPT0//19fX/
-        8/Pz/+Xl5f/W1tb/y8vL/7y8vP+qqqr+ICAgIgAAABMAAAAPAAAADAAAAAoAAAAHAAAABQAAAAMAAAAC
-        AAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAADAwMBBwcHAwcHBwUCAgIKAAAADgAAABMAAAAYAAAAHwAAACYAAAAq
-        AAAALgAAADIAAAA4AAAAPQAAAEAAAABDAAAARQAAAEYAAABGAAAARgAAAEQAAABBAAAAPgAAAD0AAAA8
-        AAAAPAAAAD8AAABHAAAAXiQkJIuysrL+6urq//j4+P/u7u7/39/f/9HR0f/Hx8f/wsLC/52dneMAAAAk
-        AAAAIAAAABwAAAAZAAAAFgAAABMAAAAPAAAACwAAAAgAAAAGAAAABAAAAAIAAAABAAAAAQAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAEICAgCCQkJBQcHBwkAAAAQ
-        AAAAFwAAAB0AAAAlAAAALAAAADMAAAA5AAAAPwAAAEIAAABHAAAATAAAAFAAAABVAAAAWAAAAFkAAABb
-        AAAAXAAAAF0AAABcAAAAWQAAAFcAAABVAAAAUQAAAFIAAABSAAAAVQAAAF8AAABub29v28vLy//x8fH/
-        8/Pz/+jo6P/Z2dn/zc3N/8XFxf/MzMz/g4ODwAAAADEAAAAuAAAAKgAAACYAAAAjAAAAHwAAABsAAAAX
-        AAAAEgAAAA8AAAALAAAACAAAAAUAAAAEAAAAAgAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAcHBwENDQ0DBwcHBwAAAA4AAAAVAAAAHwAAACgAAAAxAAAAOAAAAEEAAABIAAAATgEBAVQmJiZw
-        PT09l0VFRa9bW1vEZGRk2GxsbOtubm70bGxs+mxsbPpra2v5bGxs92lpaepqamroZGRk1VVVVcE8PDyr
-        NTU1lSAgIHkAAABqAAAAcCIiIpuQkJD/ysrK/+bm5v/o6Oj/39/f/9PT0//Jycn/ysrK/87Ozv9XV1ej
-        AAAAQAAAADwAAAA4AAAANAAAADAAAAAsAAAAJwAAACMAAAAdAAAAGQAAABUAAAARAAAADQAAAAoAAAAH
-        AAAABQAAAAMAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkJCQEQEBAECQkJCAAAABAAAAAaAAAAJgAAADEAAAA8
-        AAAARQAAAE0JCQlYPT09iFdXV7V+fn7gg4OD+35+fv96enr/eXl5/4GBgf+Li4v/lZWV/5ubm/+kpKT/
-        paWl/6Wlpf+lpaX/m5ub/52dnf+RkZH/hYWF/319ff+Dg4P/iIiI/4eHh/FwcHDOampq6ZGRkf+3t7f/
-        y8vL/9HR0f/Ozs7/yMjI/8TExP/X19f/w8PD/zk5OYsAAABNAAAASQAAAEUAAABBAAAAPAAAADgAAAAz
-        AAAALgAAACgAAAAjAAAAHgAAABkAAAAUAAAAEQAAAA4AAAALAAAACAAAAAYAAAADAAAAAgAAAAEAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkJCQERERED
-        CgoKCAAAABEAAAAdAAAAKwAAADgAAABEAAAATxMTE2FKSkqdfHx8zJSUlPqOjo7/jo6O/5ubm/+np6f/
-        uLi4/87Ozv/i4uL/6Ojo/+zs7P/t7e3/7e3t/+zs7P/s7Oz/6+vr/+vr6//s7Oz/7e3t/+3t7f/t7e3/
-        5+fn/9nZ2f/Hx8f/tLS0/6Ghof+ZmZn/np6e/6Ojo/+rq6v/sbGx/7S0tP+0tLT/uLi4/9bW1v+qqqr/
-        IiIidgAAAFkAAABVAAAAUQAAAE0AAABIAAAAQwAAAD4AAAA5AAAAMwAAAC4AAAAoAAAAIgAAABwAAAAX
-        AAAAFAAAABIAAAAPAAAACwAAAAkAAAAGAAAABAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAPDw8BERERBgAAAA8AAAAdAAAALQAAADwAAABLAAAAVzw8PIV1dXXB
-        oaGh+Zubm/+goKD/r6+v/8LCwv/V1dX/4ODg/+fn5//s7Oz/6urq/+bm5v/i4uL/29vb/9TU1P/Pz8//
-        y8vL/8bGxv/ExMT/xcXF/8rKyv/MzMz/0NDQ/9bW1v/e3t7/4+Pj/+jo6P/r6+v/7Ozs/+Hh4f/IyMj/
-        tLS0/6mpqf+rq6v/paWl/5qamv+rq6v/vr6+/4mJifoEBARlAAAAYAAAAF0AAABaAAAAVwAAAFMAAABP
-        AAAASQAAAEUAAAA+AAAAOAAAADIAAAArAAAAIwAAABwAAAAYAAAAFgAAABQAAAARAAAADwAAAAwAAAAJ
-        AAAABQAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAEAAAACAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAQMDAwEKCgoBFBQUAwYGBgwAAAAa
-        AAAAKwAAAD0AAABNAAAAXUlJSZibm5vgqKio/6enp/+2trb/y8vL/9bW1v/c3Nz/5eXl/+rq6v/m5ub/
-        3d3d/9DQ0P/AwMD/rq6u/6Ojo/+qqqr/tbW1/7u7u//Dw8P/yMjI/8zMzP/Ly8v/wcHB/8PDw/+5ubn/
-        sLCw/6enp/+jo6P/s7Oz/8fHx//V1dX/4uLi/+np6f/s7Oz/4ODg/8LCwv+zs7P/srKy/62trf+YmJj/
-        Xl5e3wAAAGQAAABjAAAAYQAAAF4AAABcAAAAWQAAAFYAAABSAAAATQAAAEgAAABCAAAAOwAAADMAAAAq
-        AAAAIgAAABsAAAAaAAAAGAAAABYAAAATAAAAEAAAAA0AAAAKAAAABgAAAAMAAAABAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAACAgIBBgYGAgkJCQMCAgIFAgICBgICAgcCAgIIAgICCQEBAQgAAAAIAAAABQAAAAQAAAAE
-        AAAABAAAAAMBAQEGBQUFBwoKCggAAAATAAAAJAAAADoAAABOAAAAYEZGRpiioqLlr6+v/7Ozs//Dw8P/
-        1NTU/9fX1//f39//6Ojo/+fn5//b29v/yMjI/66urv+np6f/urq6/9DQ0P/q6ur//v7+////////////
-        //////////////////////////////////////////////////////z8/P/i4uL/xsbG/7Gxsf+mpqb/
-        vLy8/9TU1P/k5OT/6+vr/+bm5v/Nzc3/ubm5/7S0tP96enrVAwMDZQAAAGMAAABhAAAAXgAAAF0AAABb
-        AAAAWQAAAFYAAABSAAAATgAAAEkAAABDAAAAOwAAADEAAAAmAAAAHgAAABwAAAAbAAAAGQAAABcAAAAU
-        AAAAEAAAAA4AAAAMAAAACAAAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEAQ0NDQQJCQkIAAAADgAAABMAAAAY
-        AAAAHgAAACQAAAAoAAAAJwAAACAAAAAXAAAAEgAAABAAAAAOAAAADwAAABIAAAAWAAAAIAAAADEAAABJ
-        AAAAXzU1NYyenp7ftbW1/7e3t//IyMj/1tbW/9fX1//f39//6Ojo/+Pj4//Q0ND/s7Oz/6ioqP/FxcX/
-        6Ojo////////////////////////////////////////////////////////////////////////////
-        //////////////////////////////////////r6+v/U1NT/srKy/66urv/Ozs7/4+Pj/+vr6//l5eX/
-        yMjI/7u7u/+pqanhPz8/gwAAAGAAAABeAAAAXQAAAFsAAABZAAAAVwAAAFQAAABRAAAATQAAAEcAAAA/
-        AAAANQAAACkAAAAgAAAAHAAAABwAAAAcAAAAGgAAABYAAAATAAAAEQAAABAAAAAMAAAABgAAAAIAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAELCwsFBAQECgAAABUAAAAgAAAAKgAAADYAAABCAAAAUQAAAFoAAABUAAAASAAAADsAAAAx
-        AAAAKgAAACUAAAAiAAAAJgAAAC8AAAA/AAAAVw4ODnN3d3fCubm5/rq6uv/IyMj/1tbW/9fX1//c3Nz/
-        6Ojo/+Li4v/Kysr/qqqq/7i4uP/i4uL////////////////////////////+/v7/+fn5//Pz8//u7u7/
-        6enp/+jo6P/l5eX/5eXl/+Pj4//l5eX/5ubm/+np6f/t7e3/8vLy//f39//9/f3/////////////////
-        ////////////////6+vr/7m5uf+srKz/z8/P/+Xl5f/s7Oz/29vb/729vf+9vb3+lJSUwhoaGmUAAABc
-        AAAAWgAAAFgAAABXAAAAVQAAAFIAAABOAAAASAAAAD8AAAA1AAAAKQAAAB4AAAAaAAAAGwAAABwAAAAc
-        AAAAGQAAABUAAAATAAAAEwAAABAAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICAgMDAwkAAAAUAAAAIwAAADQAAABD
-        LS0tcDU1NZAMDAyEAAAAiAAAAIUAAAB3AAAAZQAAAFcAAABMAAAARQAAAEEAAABFAAAATwAAAGQ4ODiY
-        rKys7bu7u//ExMT/1dXV/9jY2P/Z2dn/4+Pj/+Tk5P/Nzc3/q6ur/7+/v//w8PD/////////////////
-        //////r6+v/x8fH/5+fn/97e3v/d3d3/3d3d/97e3v/j4+P/5eXl/+fn5//o6Oj/6enp/+jo6P/n5+f/
-        5eXl/+Hh4f/f39//39/f/+Dg4P/m5ub/7u7u//n5+f///////////////////////////+7u7v+3t7f/
-        tra2/9ra2v/q6ur/5ubm/8PDw/+2trb/yMjI8F5eXo0AAABaAAAAWAAAAFYAAABUAAAAUwAAAE8AAABJ
-        AAAAPgAAADMAAAAlAAAAGgAAABgAAAAZAAAAHQAAAB4AAAAcAAAAFwAAABUAAAAVAAAAFAAAAA0AAAAF
-        AAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAACAgIEAAAADAAAABoAAAAsDAwMQ3l5ecKsrKz/rKys/46OjvIoKCi6AAAApQAAAJgAAACJ
-        AAAAeAAAAGwAAABmAAAAYgAAAGYAAABzb29vwL29vf6/v7//0NDQ/9nZ2f/Z2dn/3t7e/+fn5//Y2Nj/
-        srKy/7y8vP/x8fH//////////////////Pz8//Dw8P/j4+P/3d3d/93d3f/i4uL/7Ozs//T09P/6+vr/
-        /v7+//////////////////////////////////////////////////z8/P/39/f/7+/v/+fn5//g4OD/
-        39/f/+Tk5P/w8PD//f39///////////////////////c3Nz/rKys/8zMzP/m5ub/6+vr/8zMzP+ysrL/
-        xMTE/6WlpcMUFBRdAAAAVgAAAFQAAABTAAAAUQAAAEoAAAA+AAAAMQAAACIAAAAWAAAAFAAAABcAAAAa
-        AAAAHgAAAB4AAAAaAAAAFwAAABgAAAAXAAAAEAAAAAYAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAgIEBAQKAAAAFgAAAChWVlaN
-        v7+//9vb2//Z2dn/yMjI/66urv91dXXlJSUlsgAAAJUAAACIAAAAggAAAIAAAACBExMTjpaWluG9vb3/
-        xsbG/9jY2P/a2tr/2tra/+Li4v/i4uL/w8PD/6ysrP/j4+P/////////////////+Pj4/+jo6P/d3d3/
-        3d3d/+Xl5f/x8fH/+Pj4/9zc3P/z8/P/////////////////////////////////////////////////
-        //////////////////////////////////////39/f/z8/P/5+fn/9/f3//g4OD/7u7u//z8/P//////
-        ///////////5+fn/ubm5/76+vv/i4uL/7Ozs/8/Pz/+tra3/uLi4/9fX1+Y9PT13AAAAVAAAAFMAAABR
-        AAAASwAAAD8AAAAuAAAAHgAAABQAAAAUAAAAFgAAABoAAAAdAAAAHgAAABwAAAAaAAAAHAAAABsAAAAS
-        AAAABwAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAgICAhEREQYAAAAOAAAAGomJia7U1NT/8fHx/+/v7//k5OT/1NTU/8DAwP+np6f+
-        cHBw2yEhIZsAAACKAAAAliAgIKmmpqbvvb29/83Nzf/a2tr/29vb/9zc3P/l5eX/2NjY/7CwsP/IyMj/
-        /Pz8////////////+Pj4/+Tk5P/c3Nz/3t7e/+zs7P/6+vr///////v7+/9wcHD/YGBg/3p6ev/r6+v/
-        ////////////////////////////////////////////////////////////////////////////////
-        ////////////////+vr6/+rq6v/f39//4eHh//Ly8v//////////////////////zc3N/7W1tf/e3t7/
-        6+vr/9HR0f+np6f/s7Oz/+Li4vyBgYGWAAAAUwAAAFEAAABMAAAAQQAAAC4AAAAdAAAAFQAAABYAAAAZ
-        AAAAGwAAAB0AAAAdAAAAHAAAAB8AAAAhAAAAHwAAABQAAAAHAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMBHh4eAi8vLwYXFxcL
-        W1tbe8TExP/v7+//9/f3//Hx8f/o6Oj/3Nzc/8zMzP+vr6//g4OD/kNDQ9swMDDDra2t9729vf/R0dH/
-        29vb/9vb2//e3t7/5OTk/83Nzf+urq7/6Ojo/////////////Pz8/+rq6v/b29v/3t7e/+/v7//9/f3/
-        ////////////////z8/P/01NTf9zc3P/hYWF/8PDw///////////////////////////////////////
-        //////////////////////////////////////////////////////////////////////r6+v/n5+f/
-        39/f/+bm5v/7+/v/////////////////3t7e/7Ozs//d3d3/6+vr/8rKyv+hoaH/rq6u/9zc3P+mpqa8
-        CwsLUgAAAEwAAABBAAAALQAAAB4AAAAZAAAAGgAAAB0AAAAgAAAAHwAAAB0AAAAeAAAAIwAAACcAAAAh
-        AAAAEwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHFxcQN/f38MlpaWxtbW1v/09PT/+Pj4//Ly8v/p6en/
-        2dnZ/7e3t/+Ghob/c3Nz/66urv+8vLz/1dXV/9zc3P/c3Nz/39/f/+Pj4//BwcH/tra2//f39///////
-        //////Ly8v/e3t7/29vb/+zs7P/9/f3////////////////////////////p6en/Tk5O/2tra/98fHz/
-        39/f////////////////////////////////////////////////////////////////////////////
-        ///////////////////////////////////////////z8/P/4eHh/+Hh4f/19fX/////////////////
-        4uLi/7S0tP/g4OD/7Ozs/8DAwP+ampr/ra2t/9nZ2f/MzMzXKCgoWgAAAD8AAAAuAAAAIwAAACAAAAAg
-        AAAAIwAAACUAAAAjAAAAHwAAACAAAAApAAAALAAAACMAAAAQAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAACcnJwUoqKi293d3f/29vb/+fn5/+/v7//U1NT/pqam/4qKiv+urq7/urq6/9bW1v/c3Nz/
-        3d3d/+Dg4P/h4eH/urq6/8rKyv/+/v7///////z8/P/m5ub/2tra/+Li4v/4+Pj/////////////////
-        ///////////////////////////Pz8//np6e/9LS0v//////////////////////////////////////
-        ////////////////////////////////////////////////////////////////////////////////
-        ///////////6+vr/5eXl/9/f3//x8fH/////////////////4ODg/7i4uP/k5OT/6urq/6ysrP+SkpL/
-        q6ur/9bW1v/d3d3kMzMzVwAAAC8AAAAoAAAAJgAAACYAAAApAAAAKwAAACcAAAAiAAAAJQAAAC8AAAAv
-        AAAAIAAAAAsAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACsrKwmra2t6+Li4v/19fX/
-        5ubm/76+vv+Xl5f/q6ur/7e3t//X19f/3d3d/93d3f/g4OD/39/f/7a2tv/T09P////////////5+fn/
-        39/f/9ra2v/u7u7//v7+////////////////////////////////////////////////////////////
-        ////////////////////////////////////////////////////////////////////////////////
-        ///////////////////////////////////////////////////////////+/v7/6enp/9/f3//x8fH/
-        ////////////////1NTU/8LCwv/n5+f/5OTk/5iYmP+Li4v/pKSk/9TU1P/l5eXuOTk5WAAAACwAAAAr
-        AAAAKwAAAC8AAAAvAAAAKwAAACYAAAArAAAAMwAAAC4AAAAYAAAABgAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAACQkJA8r6+v+NLS0v/ExMT/oqKi/6Wlpf+xsbH/1tbW/97e3v/e3t7/
-        4ODg/9/f3/+1tbX/2dnZ////////////8fHx/9ra2v/d3d3/9vb2////////////////////////////
-        ////////////////////////////////////////////////////////////////////////////////
-        ////////////////////////////////////////////////////////////////////////////////
-        ///////////////////////////+/v7/6urq/9/f3//x8fH/////////////////w8PD/9DQ0P/r6+v/
-        zs7O/4qKiv+CgoL/n5+f/9HR0f/o6Oj3ZGRkZgAAAC8AAAAwAAAAMgAAADMAAAAtAAAAKwAAADEAAAA1
-        AAAAJwAAAA8AAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACJiYlX
-        kJCQ/pWVlf+goKD/q6ur/9HR0f/f39//39/f/+Hh4f/h4eH/t7e3/97e3v///////////+/v7//Z2dn/
-        4uLi//v7+///////////////////////////////////////////////////////////////////////
-        ////////////////////////////////////////////////////////////////////////////////
-        ///////////////////////////////////////////////////////////////////////////+/v7/
-        6enp/9/f3//09PT////////////6+vr/uLi4/97e3v/s7Oz/qqqq/4KCgv9+fn7/m5ub/83Nzf/n5+f8
-        iIiIegAAADUAAAA2AAAANAAAADAAAAAxAAAANgAAADEAAAAbAAAABwAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABycnJ9kJCQ/6SkpP/Kysr/39/f/+Dg4P/h4eH/
-        4+Pj/7y8vP/V1dX////////////t7e3/2NjY/+Tk5P/9/f3/////////////////////////////////
-        ////////////////////////////////////////////////////////////////////////////////
-        ////////////////////////////////////////////////////////////////////////////////
-        ///////////////////////////////////////////+/v7/5ubm/+Dg4P/7+/v////////////n5+f/
-        v7+//+jo6P/j4+P/h4eH/4CAgP9+fn7/mJiY/8rKyv/o6Oj+nJyckwAAADkAAAA1AAAANAAAADcAAAA2
-        AAAAJgAAAA8AAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAJ6enmefn5//wcHB/+Dg4P/h4eH/4eHh/+Tk5P/Dw8P/zc3N////////////7e3t/9fX1//m5ub/
-        /v7+////////////////////////////////////////////////////////////////////////////
-        ////////////////////////////////////////////////////////////////////////////////
-        ////////////////////////////////////////////////////////////////////////////////
-        ///////////8/Pz/4eHh/+Xl5f/+/v7////////////Hx8f/19fX/+zs7P+3t7f/fHx8/4qKiv9/f3//
-        mJiY/8rKyv/o6Oj/o6OjnwAAADgAAAA5AAAAOgAAADEAAAAcBQUFCQUFBQEAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACrq6slmpqa+K6urv/e3t7/4uLi/+Li4v/k5OT/
-        z8/P/8PDw////////////+/v7//X19f/5eXl//7+/v//////////////////////////////////////
-        ////////////////////////////////////////////////////////////////////////////////
-        ////////////////////////////////////////////////////////////////////////////////
-        ///////////////////////////////////////////////////////////19fX/39/f//Dw8P//////
-        //////b29v+7u7v/5ubm/+bm5v+CgoL/i4uL/5CQkP+CgoL/m5ub/8vLy//p6en/pqampAAAADwAAAA5
-        AAAAKwAAABgAAAAKEhISAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        pqamBpWVlcqgoKD/2dnZ/+Li4v/j4+P/5OTk/9ra2v+2trb/+/v7///////y8vL/19fX/+Li4v/+/v7/
-        ////////////////////////////////////////////////////////////////////////////////
-        ////////////////////////////////////////////////////////////////////////////////
-        ////////////////////////////////////////////////////////////////////////////////
-        ///////////////////////////q6ur/4ODg//z8/P///////////9DQ0P/X19f/7Ozs/6+vr/95eXn/
-        ra2t/5GRkf+EhIT/oaGh/87Ozv/q6ur/p6enqAAAADUAAAAmAAAAGAAAAA4pKSkEAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACZmZlzlZWV/8bGxv/j4+P/5OTk/+Tk5P/i4uL/
-        t7e3/+3t7f/+/v7/+fn5/9jY2P/e3t7//Pz8//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7/
-        /v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7/
-        /v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7/
-        /v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//r6+v/f39//
-        6+vr//7+/v/+/v7/9PT0/7+/v//p6en/2tra/3Nzc/+lpaX/srKy/4+Pj/+JiYn/q6ur/9DQ0P/s7Oz/
-        qKionQAAACYAAAAbAAAAD0VFRQQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        qqqqGpCQkPWqqqr/4eHh/+Tk5P/l5eX/5ubm/8XFxf/Y2Nj//f39//v7+//d3d3/2NjY//j4+P/9/f3/
-        /f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3/
-        /f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3/
-        /f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3/
-        /f39//39/f/9/f3//f39//39/f/9/f3//f39/+zs7P/d3d3/+Pj4//39/f/9/f3/yMjI/93d3f/t7e3/
-        k5OT/4mJif/Pz8//rq6u/46Ojv+SkpL/tra2/9TU1P/w8PD/qamplAAAABwAAAAMY2NjAgAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACMjIymlJSU/9fX1//k5OT/5ubm/+bm5v/Z2dn/
-        v7+///39/f/9/f3/5ubm/9TU1P/w8PD//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3/
-        /f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3/
-        /f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3/
-        /f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3/
-        +vr6/97e3v/q6ur//f39//39/f/n5+f/ycnJ/+vr6/+6urr/bW1t/9XV1f/MzMz/pqam/46Ojv+hoaH/
-        wcHB/9/f3//y8vL/p6endERERAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        nJycNYuLi/+3t7f/4+Pj/+fn5//n5+f/5OTk/7q6uv/v7+//+/v7//Hx8f/T09P/5OTk//v7+//7+/v/
-        +/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/
-        +/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/
-        +/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/
-        +/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/6enp/93d3f/5+fn/+/v7//v7+//AwMD/
-        5ubm/+Dg4P9tbW3/ubm5/+Hh4f/Dw8P/np6e/5OTk/+1tbX/z8/P/+7u7v/y8vL8srKyKwAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACGhoa1lJSU/9vb2//m5ub/6Ojo/+jo6P/R0dH/
-        zc3N//r6+v/6+vr/2tra/9fX1//4+Pj/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/
-        +vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/
-        +vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/
-        +vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/
-        +vr6//r6+v/19fX/3Nzc/+7u7v/6+vr/+vr6/9HR0f/d3d3/7e3t/4ODg/+Wlpb/8PDw/9vb2/+5ubn/
-        l5eX/6SkpP/Jycn/4ODg//Hx8f/09PSzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        mZmZNIeHh/+4uLj/5OTk/+jo6P/o6Oj/4+Pj/7m5uf/19fX/+Pj4/+fn5//R0dH/7e3t//j4+P/4+Pj/
-        +Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/
-        +Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/
-        +Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/
-        +Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/l5eX/6urq//j4+P/g4OD/4+Pj//j4+P/4+Pj/
-        4uLi/9DQ0P/s7Oz/oaGh/3V1df/4+Pj/7Ozs/9LS0v+qqqr/mpqa/7y8vP/Y2Nj/5+fn//Hx8f/r6+te
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACCgoKtkJCQ/9vb2//o6Oj/6enp/+np6f/Pz8//
-        1NTU//j4+P/19fX/0tLS/9zc3P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/
-        +Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/
-        +Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/
-        +Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/
-        mJiY/2JiYv97e3v/xsbG/+np6f/a2tr/9vb2//j4+P/29vb/w8PD/+rq6v++vr7/aGho/+np6f/29vb/
-        5eXl/8PDw/+goKD/q6ur/9bW1v/f39//7u7u//Ly8vPn5+caAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        lZWVHYODg/yysrL/5OTk/+rq6v/q6ur/5OTk/7q6uv/09PT/9vb2/+Li4v/Pz8//8PDw//b29v/29vb/
-        9vb2//b29v/29vb/9vb2//b29v/29vb/9vb2//b29v/29vb/9vb2//b29v/29vb/9vb2//b29v/29vb/
-        9vb2//b29v/29vb/9vb2//b29v/29vb/9vb2//b29v/29vb/9vb2//b29v/29vb/9vb2//b29v/29vb/
-        9vb2//b29v/29vb/9vb2//b29v/29vb/9vb2//b29v/29vb/9vb2//b29v/29vb/9vb2//b29v/29vb/
-        9vb2//b29v/29vb/9vb2//b29v/29vb/9vb2/+Dg4P9QUFD/eXl5/5KSkv+goKD/7+/v/9nZ2f/u7u7/
-        9vb2//b29v/Gxsb/5+fn/9PT0/9oaGj/0dHR//z8/P/y8vL/2NjY/7CwsP+hoaH/ysrK/+Pj4//k5OT/
-        8fHx//Dw8KAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACMjIyEh4eH/9fX1//o6Oj/6+vr/+rq6v/U1NT/
-        z8/P//T09P/y8vL/z8/P/9vb2//09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/
-        9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/
-        9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/
-        9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/
-        6Ojo/1VVVf91dXX/i4uL/7Gxsf/09PT/2NjY/+Xl5f/09PT/9PT0/8/Pz//i4uL/6Ojo/2hoaP+5ubn/
-        /v7+//n5+f/n5+f/w8PD/6Ojo/+6urr/5ubm/+Hh4f/u7u7/8fHx/fLy8ioAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        nZ2dBX9/f+Sfn5//4uLi/+rq6v/s7Oz/6Ojo/76+vv/s7Oz/7e3t/9vb2//Ly8v/7Ozs//Pz8//z8/P/
-        8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/
-        8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/
-        8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/
-        8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/xMTE/5CQkP+vr6//7e3t//Pz8//d3d3/
-        39/f//Pz8//z8/P/1tbW/9zc3P/t7e3/dXV1/6enp////////Pz8//Hx8f/U1NT/ra2t/62trf/g4OD/
-        6urq/+Xl5f/y8vL/8fHxmwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACUlJRAgICA/8PDw//n5+f/7Ozs/+3t7f/e3t7/
-        x8fH/+vr6//n5+f/6urq/8vLy//x8fH/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/
-        8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/
-        8vLy//Ly8v/y8vL/8fHx//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/
-        8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/
-        8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy/+Hh4f/Z2dn/8vLy//Ly8v/c3Nz/1tbW/+3t7f+Dg4P/
-        mJiY///////+/v7/+Pj4/+Hh4f+6urr/p6en/9LS0v/z8/P/4ODg//Dw8P/y8vL58PDwEgAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAHt7e52Hh4f/2tra/+rq6v/t7e3/7Ozs/83Nzf/a2tr/3Nzc//Pz8//19fX/6enp/+Xl5f/w8PD/
-        8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/
-        8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/7+/v/+7u7v/t7e3/6+vr/+np6f/U1NT/wsLC/+jo6P/v7+//
-        7+/v//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/
-        8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/
-        4+Pj/9XV1f/v7+//8PDw/+Hh4f/R0dH/7e3t/4yMjP+Ojo7////////////7+/v/6+vr/8fHx/+np6f/
-        w8PD//X19f/l5eX/6urq//Ly8v/z8/N1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACcnJwCfHx86qKiov/i4uL/7Ozs/+7u7v/o6Oj/
-        vr6+/+vr6//Y2Nj/9/f3//X19f/8/Pz/6enp/+Xl5f/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/
-        7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7e3t/+vr6//r6+v/6Ojo/+Xl5f/i4uL/
-        3t7e/9nZ2f/U1NT/j4+P/0JCQv9BQUH/WFhY/9HR0f/n5+f/6+vr/+zs7P/u7u7/7u7u/+7u7v/u7u7/
-        7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/
-        7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/l5eX/09PT/+rq6v/u7u7/5ubm/8/Pz//t7e3/
-        kpKS/4iIiP////////////39/f/x8fH/0tLS/6ysrP+2trb/7+/v/+7u7v/i4uL/8/Pz//T09NYAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAJKSkjV9fX3/vLy8/+Xl5f/t7e3/7u7u/9/f3//Gxsb/5OTk/+Li4v/19fX/9/f3//z8/P/8/Pz/
-        5ubm/+Xl5f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/7Ozs/+rq6v/o6Oj/
-        5eXl/+Pj4//f39//2tra/9XV1f/R0dH/zMzM/8jIyP+9vb3/m5ub/3d3d/9BQUH/QUFB/0FBQf9BQUH/
-        fHx8/9vb2//d3d3/4eHh/+Xl5f/p6en/7Ozs/+3t7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/
-        7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/
-        7e3t/+Xl5f/S0tL/5+fn/+3t7f/o6Oj/zc3N/+3t7f+Tk5P/hoaG//7+/v///////v7+//b29v/a2tr/
-        srKy/66urv/m5ub/9vb2/93d3f/w8PD/8/Pz/vDw8BsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAh4eHen9/f//V1dX/6urq/+7u7v/u7u7/
-        1NTU/9PT0//X19f/8fHx//T09P/5+fn/+/v7//v7+//7+/v/5+fn/+Li4v/r6+v/6+vr/+vr6//r6+v/
-        6+vr/+vr6//r6+v/6+vr/+rq6v/l5eX/2tra/9PT0//Pz8//ysrK/8bGxv/ExMT/s7Oz/5CQkP9tbW3/
-        TU1N/zExMf8xMTH/NDQ0/0FBQf9BQUH/QUFB/0FBQf9aWlr/0tLS/97e3v/Z2dn/2dnZ/9vb2//h4eH/
-        5ubm/+np6f/q6ur/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/
-        6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/5eXl/9HR0f/l5eX/6+vr/+jo6P/Nzc3/
-        7e3t/5KSkv+Ghob//f39//7+/v/+/v7/+vr6/+Hh4f+6urr/qamp/9zc3P/7+/v/3Nzc/+3t7f/z8/P/
-        8PDwaQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAB6enq4jo6O/93d3f/s7Oz/7+/v/+zs7P/ExMT/4+Pj/9DQ0P/39/f/9PT0//r6+v/7+/v/
-        +/v7//v7+//7+/v/6urq/9/f3//o6Oj/6enp/+np6f/p6en/6enp/+np6f/p6en/5ubm/9fX1//Gxsb/
-        wcHB/6mpqf+Hh4f/ZWVl/0NDQ/8xMTH/MTEx/zExMf8xMTH/MTEx/0RERP9vb2//VVVV/0FBQf9BQUH/
-        QUFB/5SUlP94eHj/d3d3/76+vv/f39//2dnZ/9XV1f/X19f/3Nzc/+Li4v/m5ub/6Ojo/+np6f/p6en/
-        6enp/+np6f/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/
-        6enp/+np6f/j4+P/0dHR/+Pj4//p6en/5ubm/87Ozv/t7e3/jY2N/4uLi//7+/v//Pz8//39/f/7+/v/
-        5+fn/8HBwf+np6f/0dHR//z8/P/g4OD/5ubm//Pz8//19fWeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHt7e/Cjo6P/4eHh/+3t7f/w8PD/
-        6enp/8HBwf/j4+P/1tbW//X19f/19fX/+/v7//v7+//7+/v/+/v7//v7+//7+/v/7+/v/9zc3P/m5ub/
-        6Ojo/+jo6P/o6Oj/6Ojo/+fn5//g4OD/srKy/15eXv87Ozv/MTEx/zExMf8xMTH/MTEx/zExMf89PT3/
-        bGxs/5ycnP/Kysr/3Nzc/7S0tP88PDz/OTk5/2pqav+urq7/6Ojo/+jo6P/Y2Nj/jo6O/2tra/+jo6P/
-        29vb/9ra2v/V1dX/1NTU/9fX1//c3Nz/4ODg/+Xl5f/m5ub/5+fn/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/
-        6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+Li4v/Pz8//4uLi/+jo6P/h4eH/
-        0dHR/+3t7f+EhIT/kpKS//f39//6+vr//Pz8//v7+//q6ur/xsbG/6enp//Jycn/+/v7/+Pj4//f39//
-        8/Pz//T09OYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAACQkJAke3t7/7S0tP/k5OT/7+/v//Hx8f/k5OT/x8fH/9zc3P/d3d3/8/Pz//X19f/6+vr/
-        +vr6//r6+v/6+vr/+vr6//r6+v/6+vr/9PT0/9zc3P/i4uL/5ubm/+bm5v/m5ub/5eXl/+Li4v9hYWH/
-        MTEx/zExMf8xMTH/ODg4/2RkZP+RkZH/w8PD/+Tk5P/m5ub/5OTk/9vb2//AwMD/SUlJ/zExMf9sbGz/
-        4uLi/+bm5v/m5ub/5ubm/+bm5v/m5ub/4+Pj/6mpqf9sbGz/iIiI/87Ozv/c3Nz/19fX/9PT0//S0tL/
-        1dXV/9vb2//g4OD/5OTk/+Xl5f/m5ub/5ubm/+bm5v/m5ub/5ubm/+bm5v/m5ub/5ubm/+bm5v/m5ub/
-        5ubm/+bm5v/m5ub/39/f/87Ozv/h4eH/5ubm/9zc3P/V1dX/7e3t/3d3d/+bm5v/8fHx//b29v/5+fn/
-        +vr6/+3t7f/Kysr/qKio/8LCwv/5+fn/5+fn/9nZ2f/y8vL/8/Pz/e3t7QMAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJOTk1J8fHz/xMTE/+fn5//w8PD/
-        8fHx/97e3v/Nzc3/1NTU/+Xl5f/y8vL/9vb2//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/
-        +Pj4/+Pj4//b29v/4+Pj/+Tk5P/k5OT/wcHB/zQ0NP9aWlr/iYmJ/7m5uf/f39//5OTk/+Tk5P/k5OT/
-        5OTk/+Li4v/Z2dn/xcXF/19fX/8xMTH/UFBQ/9ra2v/k5OT/5OTk/+Tk5P/k5OT/5OTk/+Tk5P/k5OT/
-        5OTk/+Tk5P/CwsL/enp6/3Nzc/+4uLj/39/f/9ra2v/U1NT/z8/P/9HR0f/W1tb/29vb/9/f3//i4uL/
-        5OTk/+Tk5P/k5OT/5OTk/+Tk5P/k5OT/5OTk/+Tk5P/k5OT/5OTk/+Tk5P/b29v/zc3N/+Li4v/k5OT/
-        1dXV/9ra2v/q6ur/ampq/6ampv/p6en/7+/v//X19f/4+Pj/7e3t/83Nzf+oqKj/vb29//f39//q6ur/
-        1dXV//Dw8P/z8/P/8PDwNgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAlJSUeH5+fv/S0tL/6Ojo//Hx8f/x8fH/19fX/8/Pz//Kysr/7u7u//Hx8f/29vb/
-        +Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4/+/v7//a2tr/3t7e/+Li4v/Pz8//
-        2tra/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Li4v/g4OD/19fX/8TExP96enr/MTEx/z09Pf/Jycn/
-        4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/1tbW/5CQkP9paWn/
-        nZ2d/9nZ2f/b29v/1NTU/8/Pz//Nzc3/0NDQ/9XV1f/b29v/39/f/+Hh4f/i4uL/4+Pj/+Pj4//j4+P/
-        4+Pj/+Pj4//j4+P/4+Pj/9fX1//Ly8v/3d3d/+Hh4f/R0dH/4ODg/9fX1/9oaGj/r6+v/9/f3//n5+f/
-        7u7u//Pz8//r6+v/zc3N/6mpqf+6urr/9fX1/+zs7P/S0tL/7u7u//Pz8//v7+9bAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB5eXmchoaG/9bW1v/q6ur/
-        8vLy//Dw8P/R0dH/1NTU/8bGxv/19fX/8PDw//f39//4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/
-        +Pj4//j4+P/4+Pj/+Pj4//j4+P/m5ub/2NjY/9/f3//h4eH/4uLi/+Li4v/i4uL/4uLi/+Li4v/h4eH/
-        39/f/9bW1v/ExMT/k5OT/zIyMv8yMjL/r6+v/+Hh4f/i4uL/4uLi/+Li4v/i4uL/4uLi/+Li4v/i4uL/
-        4uLi/+Li4v/i4uL/4uLi/+Li4v/i4uL/4uLi/9/f3/+rq6v/bW1t/4KCgv/Kysr/3Nzc/9fX1//R0dH/
-        zc3N/8zMzP/Q0ND/19fX/9zc3P/f39//4eHh/+Li4v/i4uL/4uLi/+Li4v/h4eH/z8/P/8rKyv/u7u7/
-        1tbW/83Nzf/l5eX/vLy8/2hoaP+2trb/1NTU/93d3f/l5eX/7Ozs/+bm5v/Ly8v/qamp/7a2tv/z8/P/
-        7e3t/87Ozv/t7e3/8/Pz/+3t7W8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAHp6eriOjo7/2NjY/+vr6//z8/P/8PDw/83Nzf/Y2Nj/xMTE//Pz8//u7u7/
-        9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//09PT/
-        4ODg/9bW1v/d3d3/4ODg/+Dg4P/g4OD/4ODg/97e3v/U1NT/wcHB/6SkpP87Ozv/MTEx/42Njf/g4OD/
-        4ODg/+Dg4P/g4OD/4ODg/+Dg4P/g4OD/4ODg/+Dg4P/g4OD/4ODg/+Dg4P/g4OD/4ODg/+Dg4P/g4OD/
-        4ODg/+Dg4P/g4OD/w8PD/3t7e/9wcHD/sbGx/93d3f/Z2dn/09PT/83Nzf/Kysr/zc3N/9fX1//f39//
-        4ODg/+Dg4P/g4OD/3d3d/9fX1//d3d3/8/Pz//f39/++vr7/ycnJ/+np6f+mpqb/aWlp/7m5uf/Gxsb/
-        0dHR/9vb2//j4+P/4ODg/8bGxv+mpqb/tLS0//Hx8f/t7e3/y8vL/+vr6//z8/P/7OzsewAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAe3t7zpWVlf/Z2dn/
-        7e3t//Pz8//v7+//ysrK/9vb2//FxcX/8fHx/+7u7v/29vb/9vb2//b29v/29vb/9vb2//b29v/29vb/
-        9vb2//b29v/29vb/9vb2//b29v/29vb/9vb2//b29v/29vb/8vLy/+Dg4P/V1dX/29vb/93d3f/c3Nz/
-        09PT/7+/v/+urq7/SkpK/zExMf9ra2v/3t7e/97e3v/e3t7/3t7e/97e3v/e3t7/3t7e/97e3v/e3t7/
-        3t7e/97e3v/e3t7/3t7e/97e3v/e3t7/3t7e/97e3v/e3t7/3t7e/97e3v/e3t7/3t7e/9TU1P+SkpL/
-        Z2dn/5eXl//V1dX/2tra/9XV1f/S0tL/1tbW/93d3f/e3t7/2tra/9bW1v/i4uL/9PT0//Hx8f/09PT/
-        7+/v/7u7u//Nzc3/6+vr/4GBgf9zc3P/ra2t/7i4uP/ExMT/zs7O/9fX1//W1tb/v7+//6Ghof+wsLD/
-        7u7u/+rq6v/Jycn/6+vr//Pz8//r6+t+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAB8fHzfm5ub/9ra2v/t7e3/9PT0/+/v7//Jycn/2dnZ/8PDw//w8PD/
-        7e3t//X19f/19fX/9fX1//X19f/19fX/9fX1//X19f/19fX/9fX1//X19f/19fX/9fX1//X19f/19fX/
-        9fX1//X19f/19fX/9fX1//Pz8//k5OT/1dXV/8rKyv+9vb3/sbGx/2FhYf8xMTH/Tk5O/9XV1f/d3d3/
-        3d3d/93d3f/d3d3/3d3d/93d3f/d3d3/3d3d/93d3f/d3d3/3d3d/93d3f/d3d3/3d3d/93d3f/d3d3/
-        3d3d/93d3f/d3d3/3d3d/93d3f/d3d3/3d3d/93d3f/b29v/rKys/21tbf98fHz/xMTE/9vb2//Z2dn/
-        1dXV/9bW1v/l5eX/9PT0//X19f/z8/P/7+/v//T09P/Z2dn/wMDA/9bW1v/o6Oj/ampq/3x8fP+enp7/
-        qqqq/7W1tf/AwMD/y8vL/8rKyv+2trb/m5ub/62trf/q6ur/5ubm/8XFxf/q6ur/8/Pz/+rq6n8AAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH19femenp7/
-        2tra/+7u7v/09PT/7+/v/8nJyf/Y2Nj/wsLC/+/v7//s7Oz/9PT0//T09P/09PT/9PT0//T09P/09PT/
-        9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//Pz8//x8fH/
-        39/f/8TExP+IiIj/Ly8v/zw8PP/ExMT/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/
-        3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/
-        3Nzc/9zc3P/c3Nz/3Nzc/8LCwv93d3f/gYGB/83Nzf/s7Oz/9PT0//T09P/09PT/9PT0//Hx8f/u7u7/
-        9PT0/8bGxv/Dw8P/4uLi/8DAwP9oaGj/f39//5GRkf+bm5v/pqam/7Kysv+8vLz/vb29/6qqqv+Tk5P/
-        qqqq/+Tk5P/e3t7/wcHB/+np6f/z8/P/9fX1iQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfn5+7KCgoP/a2tr/7u7u//X19f/w8PD/y8vL/9bW1v/AwMD/
-        7u7u/+rq6v/z8/P/5+fn/9/f3//r6+v/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/
-        8/Pz//Pz8//z8/P/8/Pz//Pz8//y8vL/7+/v/+rq6v/m5ub/39/f/8TExP+srKz/vr6+/9fX1//S0tL/
-        1tbW/9nZ2f/a2tr/2tra/9ra2v/a2tr/2tra/9ra2v/a2tr/2tra/9ra2v/a2tr/2tra/9ra2v/a2tr/
-        2tra/9ra2v/a2tr/2tra/9ra2v/a2tr/2tra/9ra2v/Z2dn/1tbW/9LS0v/W1tb/39/f/+rq6v/w8PD/
-        4ODg//Pz8//z8/P/8/Pz//Pz8//z8/P/7u7u/+/v7//z8/P/tLS0/8nJyf/p6en/n5+f/2hoaP+AgID/
-        h4eH/4+Pj/+YmJj/o6Oj/66urv+urq7/nZ2d/4mJif+lpaX/3d3d/9TU1P+8vLz/6enp//Ly8v/o6Oh/
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/f3/s
-        oKCg/9nZ2f/t7e3/9vb2//Hx8f/Nzc3/1dXV/729vf/t7e3/6Ojo/+3t7f/Ly8v/2NjY/97e3v/w8PD/
-        8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//y8vL/8vLy/+7u7v/o6Oj/
-        5OTk/+Li4v/Dw8P/wMDA/9ra2v/z8/P/8/Pz//Hx8f/m5ub/39/f/9jY2P/T09P/0dHR/9PT0//V1dX/
-        1tbW/9fX1//Y2Nj/2dnZ/9nZ2f/Z2dn/2dnZ/9nZ2f/Y2Nj/19fX/9bW1v/U1NT/0tLS/9HR0f/U1NT/
-        2tra/+Dg4P/m5ub/8fHx//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Hx8f/r6+v/
-        8PDw/+Pj4/+3t7f/0dHR/+zs7P9ycnL/b29v/39/f/+AgID/hYWF/4yMjP+VlZX/n5+f/56env+Pj4//
-        f39//6CgoP/U1NT/x8fH/7e3t//p6en/8vLy/+fn534AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAgOaenp7/19fX/+zs7P/29vb/8vLy/9HR0f/Q0ND/
-        uLi4/+zs7P/m5ub/6enp/8nJyf/X19f/3t7e/+zs7P/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8fH/
-        8fHx//Hx8f/x8fH/8fHx//Dw8P/t7e3/5ubm/+Li4v/j4+P/xcXF/7y8vP/Nzc3/8fHx//Hx8f/x8fH/
-        8fHx//Hx8f/x8fH/8fHx//Hx8f/x8fH/7Ozs/+bm5v/h4eH/39/f/97e3v/c3Nz/3d3d/93d3f/d3d3/
-        3Nzc/9/f3//f39//4uLi/+bm5v/t7e3/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8fH/
-        8fHx//Hx8f/x8fH/8fHx//Hx8f/x8fH/7e3t/+rq6v/x8fH/xcXF/76+vv/g4OD/ycnJ/2hoaP94eHj/
-        gICA/39/f/9/f3//hISE/4qKiv+RkZH/j4+P/4CAgP92dnb/nJyc/8jIyP+4uLj/srKy/+jo6P/x8fH/
-        5eXlewAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        gYGB2pubm//U1NT/6+vr//b29v/z8/P/19fX/83Nzf+1tbX/7Ozs/+Tk5P/u7u7/2dnZ/9DQ0P/g4OD/
-        8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/v7+//6+vr/+Tk5P/g4OD/
-        5OTk/8vLy/+4uLj/wcHB/+3t7f/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/
-        8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/
-        8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/p6en/
-        6+vr//Dw8P+urq7/yMjI/+np6f+enp7/aWlp/4ODg/+CgoL/gICA/39/f/9/f3//goKC/4WFhf+AgID/
-        cnJy/21tbf+Wlpb/urq6/6enp/+vr6//6enp//Dw8P/l5eVzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACDg4PJmJiY/9HR0f/p6en/9vb2//T09P/e3t7/
-        ysrK/7m5uf/j4+P/4+Pj/+rq6v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/
-        7u7u/+7u7v/u7u7/7u7u/+rq6v/i4uL/3t7e/+Li4v/T09P/tbW1/7i4uP/m5ub/7u7u/+7u7v/u7u7/
-        7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/
-        7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/
-        7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7Ozs/+fn5//s7Oz/0tLS/7W1tf/X19f/5eXl/29vb/90dHT/
-        iYmJ/4aGhv+Dg4P/gYGB/39/f/9/f3//fX19/3V1df9lZWX/ZmZm/5GRkf+pqan/lpaW/62trf/p6en/
-        7+/v/+Tk5GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAISEhLGTk5P/zc3N/+fn5//19fX/9vb2/+Pj4//Kysr/v7+//9XV1f/i4uL/5+fn/+7u7v/u7u7/
-        7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+3t7f/o6Oj/4ODg/9zc3P/g4OD/
-        29vb/7Gxsf+wsLD/29vb/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/
-        7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/
-        7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/m5ub/
-        5+fn/+7u7v+xsbH/w8PD/+bm5v+zs7P/aGho/4iIiP+NjY3/ioqK/4aGhv+EhIT/goKC/39/f/95eXn/
-        a2tr/1tbW/9iYmL/ioqK/5iYmP+FhYX/sLCw/+vr6//u7u7/5eXlPAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhYWFlI+Pj//Jycn/4+Pj//T09P/4+Pj/
-        6enp/8jIyP/Gxsb/yMjI/+Pj4//j4+P/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/
-        7e3t/+3t7f/s7Oz/6Ojo/9/f3//a2tr/3t7e/+Hh4f+ysrL/rKys/83Nzf/t7e3/7e3t/+3t7f/t7e3/
-        7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/
-        7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/
-        7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/6urq/+Tk5P/q6ur/1tbW/7CwsP/S0tL/6enp/3x8fP91dXX/
-        l5eX/5KSkv+Ojo7/i4uL/4iIiP+EhIT/gYGB/3h4eP9mZmb/VFRU/2JiYv+EhIT/hoaG/3l5ef+3t7f/
-        7Ozs/+3t7f7Z2dkIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAACcnJxwjY2N/8HBwf/f39//8fHx//j4+P/t7e3/zMzM/83Nzf+5ubn/5eXl/97e3v/r6+v/
-        7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+rq6v/h4eH/2dnZ/9zc3P/k5OT/
-        t7e3/6ioqP+9vb3/6+vr/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/
-        7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/
-        7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+vr6//k5OT/
-        5OTk/+zs7P+xsbH/wcHB/+Xl5f+9vb3/aGho/5KSkv+cnJz/mJiY/5SUlP+Pj4//jIyM/4iIiP+Dg4P/
-        d3d3/2JiYv9TU1P/ZmZm/4CAgP94eHj/cnJy/8TExP/r6+v/7u7u7gAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJubm0mOjo7/tra2/9nZ2f/u7u7/
-        +fn5//Hx8f/W1tb/zc3N/6+vr//n5+f/3d3d/+bm5v/r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/
-        6+vr/+vr6//q6ur/6Ojo/9/f3//c3Nz/5OTk/8HBwf+kpKT/r6+v/+fn5//r6+v/6+vr/+vr6//r6+v/
-        6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/
-        6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/
-        6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/5ubm/+Hh4f/o6Oj/0tLS/6+vr//U1NT/5ubm/3h4eP93d3f/
-        p6en/6Ojo/+enp7/mZmZ/5WVlf+RkZH/jY2N/4WFhf91dXX/X19f/1ZWVv9vb2//fX19/2tra/9ycnL/
-        1NTU/+rq6v/v7++6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAm5ubFY+Pj/+srKz/0dHR/+rq6v/4+Pj/9fX1/+Li4v/Kysr/ubm5/9TU1P/c3Nz/
-        4ODg/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+np6f/n5+f/4uLi/+Tk5P/Nzc3/
-        oaGh/6Wlpf/e3t7/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/
-        6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/
-        6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+jo6P/g4OD/
-        4+Pj/+jo6P+oqKj/w8PD/+fn5/+xsbH/aGho/6Kiov+urq7/qqqq/6SkpP+fn5//mpqa/5aWlv+QkJD/
-        hoaG/3Nzc/9cXFz/Xl5e/3l5ef97e3v/ZGRk/4KCgv/e3t7/6enp/9jY2HwAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkJCQ3KSkpP/Kysr/
-        5OTk//X19f/5+fn/6enp/8zMzP/Hx8f/vLy8/+Dg4P/a2tr/6Ojo/+np6f/p6en/6enp/+np6f/p6en/
-        6enp/+np6f/p6en/6enp/+jo6P/n5+f/2NjY/56env+cnJz/0dHR/+np6f/p6en/6enp/+np6f/p6en/
-        6enp/+np6f/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/
-        6enp/+np6f/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/
-        6enp/+np6f/p6en/6enp/+np6f/o6Oj/4eHh/97e3v/o6Oj/v7+//7S0tP/b29v/5OTk/3Nzc/+EhIT/
-        urq6/7W1tf+wsLD/q6ur/6Wlpf+hoaH/nJyc/5WVlf+Hh4f/b29v/1xcXP9paWn/goKC/3d3d/9iYmL/
-        nJyc/+Xl5f/o6Oj/3NzcSAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAACSkpKenJyc/8LCwv/d3d3/8fHx//r6+v/w8PD/1dXV/87Ozv+rq6v/
-        4+Pj/9fX1//g4OD/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P+urq7/
-        mJiY/8DAwP/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/
-        6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/
-        6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+Pj4//d3d3/
-        5OTk/9nZ2f+np6f/zMzM/+rq6v+cnJz/bGxs/7m5uf/BwcH/vLy8/7e3t/+xsbH/rKys/6ampv+hoaH/
-        l5eX/4WFhf9ra2v/YGBg/3l5ef+Hh4f/cnJy/2dnZ/+6urr/6Ojo/+np6fnS0tIDAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKSkpFWampr/
-        t7e3/9TU1P/r6+v/+Pj4//b29v/k5OT/zMzM/7u7u//Hx8f/29vb/9jY2P/n5+f/6Ojo/+jo6P/o6Oj/
-        6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/56env+tra3/5+fn/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/
-        6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/
-        6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/
-        6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/k5OT/29vb/97e3v/m5ub/pqam/7+/v//k5OT/y8vL/2xsbP+fn5//
-        zc3N/8fHx//BwcH/uLi4/6+vr/+np6f/oaGh/5qamv+Ojo7/enp6/2RkZP9qamr/iIiI/4eHh/9tbW3/
-        d3d3/9XV1f/o6Oj/7e3ttwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAq6urDpubm/mtra3/ysrK/+Pj4//19fX/+/v7/+zs7P/R0dH/
-        y8vL/6urq//i4uL/1dXV/97e3v/n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//k5OT/
-        nZ2d/+Li4v/n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/
-        5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/
-        5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5eXl/9ra2v/b29v/
-        5ubm/7e3t/+0tLT/29vb/+Xl5f99fX3/gICA/9PT0//Nzc3/wcHB/7S0tP+mpqb/mZmZ/5CQkP+JiYn/
-        goKC/3V1df9iYmL/WFhY/3BwcP+MjIz/gYGB/2tra/+Xl5f/5OTk/+jo6P/W1tZqAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        nJyctKampv/AwMD/2dnZ/+/v7//6+vr/9PT0/+Pj4//MzMz/tbW1/8nJyf/Z2dn/09PT/+Pj4//m5ub/
-        5ubm/+bm5v/m5ub/5ubm/+bm5v/m5ub/5ubm/9vb2//X19f/5ubm/+bm5v/m5ub/5ubm/+bm5v/m5ub/
-        5ubm/+bm5v/m5ub/5ubm/+bm5v/m5ub/5ubm/+bm5v/m5ub/5ubm/+bm5v/m5ub/5ubm/+bm5v/m5ub/
-        5ubm/+bm5v/m5ub/5ubm/+bm5v/m5ub/5ubm/+bm5v/m5ub/5ubm/+bm5v/m5ub/5ubm/+bm5v/m5ub/
-        5ubm/+bm5v/m5ub/5ubm/+Xl5f/a2tr/2NjY/+Tk5P/Gxsb/qKio/9HR0f/s7Oz/l5eX/3BwcP/Dw8P/
-        ysrK/7e3t/+mpqb/lZWV/4aGhv95eXn/cHBw/2pqav9iYmL/VVVV/0ZGRv9KSkr/aGho/3x8fP9wcHD/
-        bW1t/7y8vP/o6Oj/6urq+sXFxQ4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACrq6tXpKSk/7a2tv/Nzc3/5ubm//f39//7+/v/
-        6+vr/9LS0v/Kysr/qKio/+Dg4P/S0tL/19fX/+Xl5f/l5eX/5eXl/+Xl5f/l5eX/5eXl/+Xl5f/l5eX/
-        5eXl/+Xl5f/l5eX/5eXl/+Xl5f/l5eX/5eXl/+Xl5f/l5eX/5eXl/+Xl5f/l5eX/5eXl/+Xl5f/l5eX/
-        5eXl/+Xl5f/l5eX/5eXl/+Xl5f/l5eX/5eXl/+Xl5f/l5eX/5eXl/+Xl5f/l5eX/5eXl/+Xl5f/l5eX/
-        5eXl/+Xl5f/l5eX/5eXl/+Xl5f/l5eX/5eXl/+Xl5f/l5eX/5eXl/+Xl5f/k5OT/2dnZ/9bW1v/g4OD/
-        0tLS/6Ojo//Jycn/6enp/7W1tf9tbW3/oqKi/76+vv+np6f/kpKS/4CAgP9zc3P/ampq/2FhYf9cXFz/
-        VlZW/0xMTP8/Pz//NTU1/z8/P/9UVFT/Wlpa/1ZWVv9wcHD/zc3N/+fn5//u7u6uAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAALGxsQulpaXkrq6u/8LCwv/a2tr/8PDw//v7+//09PT/5OTk/83Nzf+6urr/uLi4/9zc3P/Q0ND/
-        3Nzc/+Tk5P/k5OT/5OTk/+Tk5P/k5OT/5OTk/+Tk5P/k5OT/5OTk/+Tk5P/k5OT/5OTk/+Tk5P/k5OT/
-        5OTk/+Tk5P/k5OT/5OTk/+Tk5P/k5OT/5OTk/+Tk5P/k5OT/5OTk/+Tk5P/k5OT/5OTk/+Tk5P/k5OT/
-        5OTk/+Tk5P/k5OT/5OTk/+Tk5P/k5OT/5OTk/+Tk5P/k5OT/5OTk/+Tk5P/k5OT/5OTk/+Tk5P/k5OT/
-        5OTk/+Tk5P/k5OT/4+Pj/9nZ2f/U1NT/3t7e/9bW1v+hoaH/w8PD/+Xl5f/Hx8f/bW1t/4SEhP+vr6//
-        lZWV/4CAgP9ycnL/bGxs/2tra/9ubm7/cHBw/3Jycv9ycnL/a2tr/2JiYv9VVVX/UVFR/0lJSf9AQED/
-        Pj4+/3Fxcf+9vb3/3d3d/7+/v0sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKysrH2srKz/uLi4/83Nzf/l5eX/
-        9vb2//v7+//t7e3/2dnZ/8zMzP+oqKj/0tLS/9TU1P/Pz8//3t7e/+Pj4//j4+P/4+Pj/+Pj4//j4+P/
-        4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/
-        4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/
-        4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Li4v/X19f/09PT/9zc3P/Y2Nj/
-        n5+f/76+vv/h4eH/1dXV/3Nzc/9tbW3/np6e/4iIiP93d3f/cXFx/3Nzc/91dXX/dnZ2/3Z2dv93d3f/
-        dnZ2/3V1df9ycnL/cHBw/29vb/9ycnL/cXFx/1xcXP9BQUH/Z2dn/5ycnP/Hx8fjRUVFBwAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAtra2Eq2trfSzs7P/wMDA/9jY2P/u7u7/+/v7//f39//p6en/0dHR/8bGxv+kpKT/
-        3d3d/9DQ0P/Pz8//4ODg/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/
-        4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/
-        4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/
-        4+Pj/+Pj4//h4eH/1NTU/9HR0f/c3Nz/2NjY/6CgoP+9vb3/39/f/9bW1v93d3f/X19f/4yMjP+AgID/
-        dXV1/3V1df92dnb/d3d3/3d3d/95eXn/fX19/4GBgf+FhYX/hoaG/4WFhf+EhIT/hISE/4SEhP+CgoL/
-        fHx8/3d3d/9vb2//f39//1ZWVo0iIiITioqKAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsrKyibS0tP+3t7f/
-        ycnJ/+Hh4f/09PT//Pz8//Ly8v/l5eX/zs7O/7u7u/+qqqr/3t7e/87Ozv/Ozs7/39/f/+Li4v/i4uL/
-        4uLi/+Li4v/i4uL/4uLi/+Li4v/i4uL/4uLi/+Li4v/i4uL/4uLi/+Li4v/i4uL/4uLi/+Li4v/i4uL/
-        4uLi/+Li4v/i4uL/4uLi/+Li4v/i4uL/4uLi/+Li4v/i4uL/4uLi/+Li4v/i4uL/4uLi/+Li4v/i4uL/
-        4uLi/+Li4v/i4uL/4uLi/+Li4v/i4uL/4uLi/+Li4v/i4uL/3t7e/9LS0v/R0dH/3Nzc/9LS0v+dnZ3/
-        vb29/97e3v/W1tb/enp6/1hYWP94eHj/d3d3/3V1df93d3f/d3d3/3h4eP97e3v/g4OD/42Njf+Xl5f/
-        oqKi/6ioqP+qqqr/qKio/6ioqP+pqan/qqqq/6Wlpf+bm5v/kJCQ/4aGhv99fX3+HBwccwAAACFmZmYD
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAC6uroRtbW167a2tv+8vLz/0dHR/+jo6P/39/f//Pz8/+7u7v/f39//
-        zc3N/7Ozs/+vr6//3d3d/8zMzP/Nzc3/3d3d/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/
-        4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/
-        4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/
-        4eHh/9jY2P/Ozs7/0dHR/97e3v/Ly8v/nZ2d/7+/v//f39//19fX/319ff9WVlb/ampq/3Fxcf92dnb/
-        d3d3/3h4eP97e3v/g4OD/5KSkv+ioqL/sbGx/7y8vP/Dw8P/xMTE/8HBwf+/v7//wMDA/8TExP/IyMj/
-        xcXF/729vf+2trb/qKio/5WVlf96enrqFxcXPkVFRQYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC4uLhv
-        ubm5/7i4uP/CwsL/2NjY/+3t7f/6+vr/+vr6/+zs7P/c3Nz/zMzM/66urv+wsLD/3d3d/8zMzP/Ly8v/
-        2tra/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/
-        4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/8DAwP+goKD/t7e3/9nZ2f/h4eH/
-        4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/97e3v/S0tL/zc3N/9TU1P/f39//uLi4/5+fn//FxcX/
-        4+Pj/9bW1v9/f3//WVlZ/2NjY/9tbW3/d3d3/3h4eP95eXn/f39//46Ojv+hoaH/tbW1/8PDw//MzMz/
-        z8/P/87Ozv/Kysr/xsbG/8TExP/Hx8f/zc3N/9DQ0P/Q0ND/zs7O/87Ozv/IyMj/tra2/5+fn/97e3vF
-        Tk5OCQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC6urrAu7u7/7e3t//Gxsb/3d3d//Dw8P/7+/v/
-        +fn5/+vr6//b29v/y8vL/62trf+tra3/3Nzc/83Nzf/Jycn/0tLS/9/f3//g4OD/4ODg/+Dg4P/g4OD/
-        4ODg/+Dg4P/g4OD/4ODg/+Dg4P/g4OD/4ODg/+Dg4P/g4OD/4ODg/+Dg4P/g4OD/4ODg/+Dg4P/g4OD/
-        4ODg/+Dg4P/g4OD/kZGR/6ysrP/FxcX/zc3N/+Dg4P/g4OD/4ODg/+Dg4P/g4OD/4ODg/9/f3//W1tb/
-        zMzM/8zMzP/Y2Nj/2tra/6Wlpf+oqKj/zc3N/+jo6P/Y2Nj/g4OD/19fX/9iYmL/ampq/3h4eP95eXn/
-        e3t7/4WFhf+YmJj/r6+v/8LCwv/Ozs7/0tLS/9LS0v/Q0ND/zc3N/8rKyv/Kysr/z8/P/9fX1//d3d3/
-        3t7e/93d3f/c3Nz/2tra/9PT0//IyMj/ubm5/6Wlpf+QkJBYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAL+/vxy8vLzvu7u7/7m5uf/Kysr/4ODg//Ly8v/7+/v/+Pj4/+vr6//d3d3/y8vL/7Kysv+hoaH/
-        2NjY/9LS0v/Hx8f/y8vL/9nZ2f/f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//
-        39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3/+enp7/o6Oj/7y8vP/Nzc3/
-        39/f/9/f3//f39//39/f/9/f3//X19f/zc3N/8vLy//S0tL/3d3d/8PDw/+ZmZn/tbW1/9fX1//u7u7/
-        09PT/4mJif9paWn/ZWVl/2JiYv92dnb/eHh4/3t7e/+IiIj/n5+f/7m5uf/Ly8v/0tLS/9TU1P/T09P/
-        0dHR/8/Pz//S0tL/19fX/97e3v/k5OT/6urq/+zs7P/s7Oz/6+vr/+vr6//p6en/4eHh/9LS0v/FxcX/
-        u7u7/6enp80AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL6+vli9vb3/ubm5/7u7u//MzMz/
-        4eHh//Ly8v/7+/v/+Pj4/+zs7P/h4eH/zs7O/7m5uf+cnJz/x8fH/9jY2P/Ly8v/xsbG/83Nzf/Z2dn/
-        39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//
-        39/f/9/f3//f39//39/f/9nZ2f+6urr/xsbG/93d3f/f39//39/f/97e3v/V1dX/zMzM/8nJyf/Ozs7/
-        2dnZ/9XV1f+mpqb/oaGh/8TExP/i4uL/8PDw/8vLy/+RkZH/dnZ2/2pqav9aWlr/cHBw/3V1df96enr/
-        iIiI/6Ojo/+9vb3/zc3N/9PT0//S0tL/0tLS/9DQ0P/T09P/2tra/+Hh4f/o6Oj/7u7u//Ly8v/19fX/
-        9vb2//b29v/29vb/9fX1//Ly8v/r6+v/4ODg/9HR0f/FxcX/u7u7/7Kysi8AAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAL6+vnq9vb3/t7e3/7u7u//MzMz/4eHh//Hx8f/6+vr/+vr6/+7u7v/m5ub/
-        0tLS/8LCwv+fn5//q6ur/9jY2P/U1NT/yMjI/8XFxf/Ly8v/1dXV/93d3f/e3t7/3t7e/97e3v/e3t7/
-        3t7e/97e3v/e3t7/3t7e/97e3v/e3t7/3t7e/97e3v/e3t7/3t7e/97e3v/e3t7/3t7e/97e3v/e3t7/
-        3t7e/9jY2P/Q0ND/ycnJ/8jIyP/Nzc3/2NjY/9nZ2f+wsLD/mJiY/7a2tv/V1dX/7Ozs/+7u7v+9vb3/
-        nZ2d/4mJif9zc3P/WFhY/2NjY/93d3f/dnZ2/4KCgv+enp7/urq6/8nJyf/Pz8//z8/P/87Ozv/Ozs7/
-        1tbW/+Dg4P/o6Oj/7+/v//T09P/4+Pj/+vr6//v7+//8/Pz//Pz8//z8/P/7+/v/+fn5//T09P/q6ur/
-        3t7e/87Ozv/FxcX/vb29cwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL29vaK7u7v/
-        t7e3/7u7u//Ly8v/3t7e/+7u7v/5+fn/+/v7//Hx8f/q6ur/2tra/8rKyv+zs7P/l5eX/7W1tf/b29v/
-        1NTU/8nJyf/ExMT/xcXF/8zMzP/U1NT/29vb/97e3v/e3t7/3t7e/97e3v/e3t7/3t7e/97e3v/e3t7/
-        3t7e/97e3v/e3t7/3t7e/97e3v/c3Nz/1tbW/8/Pz//Jycn/x8fH/8jIyP/Q0ND/2dnZ/9fX1/+wsLD/
-        mJiY/6+vr//MzMz/5OTk//Hx8f/f39//s7Oz/6Wlpf+YmJj/gICA/19fX/9RUVH/cnJy/4ODg/9/f3//
-        lpaW/7Ozs//FxcX/ysrK/8vLy//Ly8v/zc3N/9jY2P/k5OT/7e3t//T09P/4+Pj/+/v7//39/f/9/f3/
-        /v7+//7+/v/+/v7//v7+//7+/v/9/f3/+vr6//Ly8v/o6Oj/2tra/8zMzP/ExMSrAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv7+/B7u7u6S5ubn/tbW1/7q6uv/IyMj/2tra/+vr6//29vb/
-        /Pz8//b29v/s7Oz/5eXl/9XV1f/FxcX/rKys/5eXl/+xsbH/1tbW/9fX1//Pz8//x8fH/8TExP/ExMT/
-        xsbG/8vLy//Ozs7/0dHR/9PT0//U1NT/1tbW/9XV1f/T09P/0dHR/9DQ0P/Ly8v/x8fH/8XFxf/FxcX/
-        yMjI/87Ozv/V1dX/3Nzc/8nJyf+oqKj/lpaW/6+vr//Jycn/4eHh//Dw8P/u7u7/y8vL/66urv+oqKj/
-        mpqa/4qKiv9tbW3/T09P/2NjY/9+fn7/kZGR/5SUlP+urq7/wsLC/8nJyf/Kysr/ysrK/87Ozv/b29v/
-        5+fn//Dw8P/39/f/+/v7//39/f/9/f3//v7+//////////////////////////////////7+/v/9/f3/
-        +Pj4/+/v7//j4+P/09PT/8zMzMkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAALq6upK2trb/tLS0/7e3t//Dw8P/1NTU/+Xl5f/y8vL/+fn5//v7+//z8/P/6+vr/+Pj4//U1NT/
-        xMTE/6+vr/+Xl5f/o6Oj/7+/v//a2tr/2dnZ/9PT0//Ozs7/ysrK/8fHx//ExMT/xMTE/8TExP/FxcX/
-        xcXF/8XFxf/FxcX/xsbG/8rKyv/Pz8//09PT/9nZ2f/d3d3/x8fH/66urv+Xl5f/nZ2d/7a2tv/Nzc3/
-        4uLi/+/v7//y8vL/29vb/7u7u/+ysrL/o6Oj/5CQkP+Ojo7/fX19/15eXv9GRkb/dnZ2/4+Pj/+ioqL/
-        srKy/8TExP/Ozs7/z8/P/8/Pz//S0tL/3t7e/+np6f/y8vL/+Pj4//z8/P/9/f3//v7+////////////
-        //////////////////////////////////////7+/v/7+/v/9PT0/+rq6v/c3Nz/09PT1gAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALi4uHGzs7P8sLCw/7S0tP+/v7//
-        zc3N/93d3f/r6+v/9fX1//v7+//6+vr/8vLy/+vr6//l5eX/19fX/8rKyv+6urr/pqam/5OTk/+cnJz/
-        q6ur/76+vv/MzMz/29vb/9zc3P/b29v/2tra/9jY2P/Z2dn/29vb/9zc3P/d3d3/z8/P/76+vv+vr6//
-        oKCg/5OTk/+enp7/sbGx/8bGxv/Y2Nj/6Ojo//Hx8f/z8/P/4uLi/8TExP+3t7f/r6+v/5OTk/+Ghob/
-        ioqK/4WFhf9xcXH/UlJS/1BQUP99fX3/n5+f/7S0tP/Nzc3/09PT/9fX1//X19f/2NjY/+Hh4f/s7Oz/
-        8/Pz//n5+f/8/Pz//f39//7+/v//////////////////////////////////////////////////////
-        /v7+//z8/P/4+Pj/8PDw/+Xl5f/c3NzXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAALi4uDyvr6/irKys/66urv+5ubn/xcXF/9PT0//h4eH/7e3t//X19f/5+fn/
-        +vr6//T09P/t7e3/6enp/+Hh4f/W1tb/zMzM/7+/v/+0tLT/p6en/5ubm/+RkZH/lJSU/5mZmf+Wlpb/
-        np6e/5eXl/+VlZX/lJSU/4+Pj/+ZmZn/paWl/7CwsP++vr7/zMzM/9nZ2f/m5ub/7+/v//Pz8//y8vL/
-        4eHh/8jIyP+6urr/uLi4/5ubm/+AgID/gYGB/4ODg/+Ghob/f39//2pqav9JSUn/X19f/4qKiv+rq6v/
-        xcXF/9zc3P/b29v/2tra/9vb2//h4eH/6+vr//Pz8//4+Pj//Pz8//39/f/+/v7/////////////////
-        ///////////////////////////////////////////+/v7//f39//n5+f/09PT/7e3t/+bm5ssAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALe3txKrq6ud
-        pqam/6Wlpf+vr6//vLy8/8fHx//T09P/39/f/+jo6P/v7+//9PT0//f39//19fX/8PDw/+vr6//o6Oj/
-        5eXl/+Dg4P/Y2Nj/0tLS/9DQ0P/Kysr/xsbG/8TExP/Dw8P/xcXF/8vLy//Nzc3/0dHR/9bW1v/e3t7/
-        5ubm/+zs7P/x8fH/8/Pz//T09P/u7u7/3Nzc/8TExP+6urr/u7u7/6urq/+Ojo7/goKC/39/f/9/f3//
-        gICA/4KCgv98fHz/ZmZm/0VFRf9tbW3/mpqa/7m5uf/T09P/4+Pj/+Pj4//a2tr/3d3d/+jo6P/x8fH/
-        9/f3//v7+//9/f3//v7+////////////////////////////////////////////////////////////
-        //////7+/v/8/Pz/+fn5//T09P/v7+//7e3trAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACvr689oqKi0J2dnf+enp7/q6ur/7m5uf+/v7//
-        xsbG/8/Pz//X19f/3d3d/+Pj4//n5+f/6+vr/+zs7P/r6+v/6+vr/+rq6v/q6ur/6enp/+np6f/p6en/
-        6Ojo/+vr6//t7e3/7+/v//Hx8f/y8vL/8/Pz//T09P/09PT/8vLy/+zs7P/g4OD/zMzM/7q6uv+2trb/
-        ubm5/7i4uP+qqqr/nZ2d/5OTk/+Kior/g4OD/39/f/9/f3//gICA/3t7e/9lZWX/RUVF/3V1df+qqqr/
-        x8fH/9/f3//p6en/6+vr/+Tk5P/m5ub/7u7u//X19f/6+vr//f39//7+/v//////////////////////
-        /////////////////////////////////////////////////v7+//z8/P/4+Pj/8/Pz/+/v7//u7u6A
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAACsrKwCpKSkWJeXl+ORkZH/jY2N/5CQkP+YmJj/oqKi/6ampv+srKz/s7Oz/7q6uv/BwcH/
-        x8fH/83Nzf/S0tL/19fX/9zc3P/g4OD/5OTk/+fn5//q6ur/7Ozs/+7u7v/v7+//7u7u/+3t7f/q6ur/
-        5ubm/9XV1f/Dw8P/tbW1/62trf+xsbH/ubm5/8jIyP/Kysr/wsLC/7a2tv+rq6v/oKCg/5WVlf+MjIz/
-        hYWF/4CAgP9/f3//e3t7/2dnZ/9HR0f/d3d3/7W1tf/Pz8//5eXl/+zs7P/u7u7/8PDw//Dw8P/z8/P/
-        +Pj4//z8/P/+/v7/////////////////////////////////////////////////////////////////
-        //////7+/v/9/f3//Pz8//n5+f/7+/v/7+/v//Dw8EUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoaGhApSUlIGAgID5
-        dnZ2/2VlZf9eXl7/Y2Nj/25ubv96enr/hYWF/4uLi/+RkZH/mJiY/56env+kpKT/qqqq/7CwsP+1tbX/
-        u7u7/8HBwf/FxcX/ycnJ/8fHx/+8vLz/srKy/6enp/+enp7/n5+f/6Wlpf+wsLD/ycnJ/9/f3//p6en/
-        4uLi/9nZ2f/Q0ND/xMTE/7q6uv+urq7/o6Oj/5iYmP+Pj4//h4eH/4GBgf98fHz/bGxs/05OTv93d3f/
-        vb29/9TU1P/l5eX/6+vr/+3t7f/x8fH/9/f3//n5+f/7+/v//f39//7+/v//////////////////////
-        ///////////+/v7/+/v7//n5+f/9/f3//////////////////v7+//z8/P/7+/v//f39//n5+f/x8fHz
-        8vLyBwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGtraydsbGy4W1tb/lBQUP9ISEj/QkJC/0FBQf9BQUH/
-        SEhI/05OTv9TU1P/WVlZ/1xcXP9jY2P/Y2Nj/2hoaP9paWn/aGho/2hoaP9paWn/bW1t/3Z2dv+AgID/
-        j4+P/6mpqf/Ly8v/6Ojo//n5+f/5+fn/9vb2//Hx8f/r6+v/5OTk/9zc3P/S0tL/yMjI/729vf+ysrL/
-        pqam/5ubm/+QkJD/h4eH/319ff9vb2//U1NT/3R0dP/Dw8P/2NjY/+Xl5f/p6en/7Ozs//Ly8v/39/f/
-        /Pz8//7+/v/+/v7//////////////////////////////////f39/+7u7v++vr7/m5ub/+bm5v/+/v7/
-        //////7+/v/9/f3//f39//7+/v/9/f3/8vLy//Hx8aQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABzc3Mk
-        cXFxbldXV69dXV3rWVlZ/1hYWP9WVlb/VVVV/1NTU/9QUFD/TU1N/0hISP9FRUX/QkJC/0BAQP9AQED/
-        QkJC/0lJSf9TU1P/X19f/3BwcP+Dg4P/mJiY/7S0tP/MzMz/2NjY/+Xl5f/u7u7/9vb2//n5+f/5+fn/
-        9/f3//Pz8//t7e3/5+fn/97e3v/V1dX/y8vL/7+/v/+ysrL/paWl/5aWlv+IiIj/eXl5/2lpaf9TU1P/
-        bW1t/8bGxv/c3Nz/6Ojo/+rq6v/t7e3/9fX1//v7+//9/f3//v7+////////////////////////////
-        ///////////09PT/wsLC/5KSkv9YWFj/kpKS//v7+/////////////7+/v/+/v7//f39//j4+P/o6Oj/
-        8fHxOQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAB6enodaGhotGpqav1sbGz/bm5u/3BwcP9ycnL/c3Nz/3R0dP9zc3P/
-        cXFx/29vb/9sbGz/aWlp/2VlZf9gYGD/W1tb/1VVVf9VVVX/Xl5e/25ubv+BgYH/jY2N/5KSkv+ZmZn/
-        oaGh/6urq/+4uLj/yMjI/9jY2P/m5ub/8PDw//b29v/5+fn/9/f3//Pz8//u7u7/5+fn/97e3v/S0tL/
-        xcXF/7W1tf+kpKT/kpKS/35+fv9tbW3/Xl5e/1VVVf9qamr/wcHB/+Dg4P/q6ur/7e3t//Ly8v/4+Pj/
-        /Pz8//7+/v////////////////////////////////////////////n5+f/k5OT/ysrK/35+fv9gYGD/
-        8vLy//////////////////7+/v/9/f3/7e3t/+fn58AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfHx8GHJyct51dXX/
-        d3d3/3t7e/+BgYH/iYmJ/5CQkP+Tk5P/k5OT/5GRkf+Pj4//jIyM/4qKiv+Hh4f/hISE/4GBgf9+fn7/
-        eHh4/3Jycv9ra2v/YmJi/1hYWP9WVlb/Z2dn/319ff+MjIz/kpKS/5qamv+oqKj/uLi4/8rKyv/b29v/
-        6enp//Hx8f/z8/P/8PDw/+rq6v/g4OD/1dXV/8fHx/+4uLj/paWl/5OTk/+BgYH/dHR0/21tbf9ubm7/
-        dXV1/3t7e/+zs7P/4+Pj/+7u7v/x8fH/9fX1//v7+//9/f3//v7+////////////////////////////
-        /////////////////v7+//f39//t7e3/q6ur/2VlZf/p6en///////////////////////n5+f/v7+/9
-        8fHxOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAB2dna1eXl5/3p6ev+BgYH/kZGR/6Ghof+urq7/srKy/7Gxsf+tra3/
-        qamp/6ioqP+pqan/qqqq/6qqqv+rq6v/qamp/6ioqP+lpaX/oaGh/5ycnP+VlZX/iIiI/3d3d/9mZmb/
-        VFRU/1RUVP9qamr/f39//4WFhf+Pj4//nZ2d/7CwsP/CwsL/0NDQ/9fX1//V1dX/z8/P/8TExP+4uLj/
-        rKys/52dnf+SkpL/i4uL/4uLi/+QkJD/mJiY/52dnf+ampr/jo6O/5ubm//m5ub/8PDw//T09P/4+Pj/
-        /Pz8//39/f/+/v7//////////////////////////////////////////////////f39//X19f+1tbX/
-        v7+///7+/v/////////////////+/v7/+Pj4//X19ZgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf39/RHt7e/98fHz/
-        hISE/5mZmf+zs7P/xMTE/8jIyP/Dw8P/u7u7/7W1tf+2trb/u7u7/7+/v//CwsL/xcXF/8bGxv/Gxsb/
-        xcXF/8XFxf/FxcX/xMTE/8TExP+6urr/qKio/5mZmf+Kior/c3Nz/1hYWP9PT0//X19f/2lpaf9wcHD/
-        fX19/4+Pj/+hoaH/q6ur/66urv+qqqr/pqam/6Kiov+ioqL/pqam/66urv+5ubn/wsLC/8XFxf+/v7//
-        r6+v/5iYmP+BgYH/f39//9bW1v/y8vL/9/f3//r6+v/9/f3//f39//7+/v//////////////////////
-        /////////////////////////////////////////////////////////////////v7+//r6+v/29vbO
-        9vb2CwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAB9fX2vfX19/4KCgv+Xl5f/t7e3/87Ozv/T09P/zc3N/8LCwv+6urr/
-        urq6/8LCwv/Kysr/z8/P/9HR0f/T09P/1NTU/9TU1P/U1NT/1NTU/9TU1P/V1dX/1tbW/9DQ0P/FxcX/
-        ubm5/7CwsP+oqKj/lZWV/3R0dP9aWlr/UVFR/1hYWP9hYWH/dHR0/4qKiv+enp7/rKys/7W1tf+/v7//
-        ysrK/9bW1v/i4uL/6Ojo/+fn5//c3Nz/ycnJ/7Kysv+cnJz/jY2N/4+Pj/+lpaX/urq6//Hx8f/5+fn/
-        /Pz8//39/f/9/f3//v7+////////////////////////////////////////////////////////////
-        //////////////////////39/f/39/f/9PT03vb29h4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAh4eHCYCAgPeBgYH/
-        j4+P/6+vr//Ozs7/2tra/9XV1f/Ly8v/v7+//729vf/FxcX/0NDQ/9fX1//a2tr/29vb/9vb2//b29v/
-        29vb/9zc3P/c3Nz/29vb/9vb2//Z2dn/1tbW/9DQ0P/FxcX/u7u7/7u7u/++vr7/sbGx/5CQkP9ubm7/
-        W1tb/3BwcP+NjY3/sLCw/9DQ0P/k5OT/8PDw//f39//6+vr/+Pj4//Hx8f/j4+P/0dHR/7+/v/+wsLD/
-        qKio/7CwsP/FxcX/3Nzc/+np6f7n5+fHzc3N3Pn5+f/9/f3//f39//39/f/+/v7//v7+////////////
-        ///////////////////////////////////////////////////////////5+fn/8vLy/+/v78/19fUY
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAACIiIgygoKC/4eHh/+fn5//xcXF/9zc3P/e3t7/1dXV/8nJyf/AwMD/
-        xcXF/9HR0f/a2tr/39/f/+Dg4P/g4OD/4ODg/+Dg4P/g4OD/39/f/9/f3//f39//39/f/97e3v/d3d3/
-        19fX/87Ozv/CwsL/vb29/8XFxf/Nzc3/w8PD/6Ojo/99fX3/aWlp/5+fn//Jycn/5OTk//Dw8P/v7+//
-        6urq/+Dg4P/U1NT/y8vL/8PDw/+/v7//xsbG/9HR0f/e3t7/6urq/vHx8drm5uaE39/fJQAAAADU1NQZ
-        4ODgwfn5+f/9/f3//f39//7+/v/+/v7//v7+//7+/v//////////////////////////////////////
-        ///////////8/Pz/8vLy/+zs7P3t7e2Q8/PzCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIuLi0OFhYX/
-        j4+P/6+vr//V1dX/5OTk/+Dg4P/V1dX/yMjI/8TExP/Nzc3/2tra/+Li4v/k5OT/5OTk/+Tk5P/k5OT/
-        5OTk/+Tk5P/k5OT/4+Pj/+Pj4//j4+P/4+Pj/+Li4v/f39//1tbW/8jIyP/AwMD/x8fH/9PT0//Z2dn/
-        ysrK/6ioqP+Dg4P/fHx8/7e3t//Jycn/z8/P/9DQ0P/Q0ND/0NDQ/9PT0//Y2Nj/4ODg/+rq6v7w8PDo
-        9PT0p+Dg4GrS0tIXAAAAAAAAAAAAAAAAAAAAAAAAAADj4+ME6+vrkfLy8v35+fn//f39//7+/v/+/v7/
-        /v7+//////////////////////////////////7+/v/6+vr/8fHx/+np6f/n5+e/7u7uNgAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAj4+PNoiIiP+Xl5f/vb29/+Dg4P/o6Oj/4+Pj/9fX1//Kysr/
-        ycnJ/9XV1f/h4eH/5+fn/+np6f/p6en/6Ojo/+jo6P/o6Oj/6Ojo/+fn5//n5+f/5+fn/+fn5//n5+f/
-        5+fn/+Pj4//a2tr/zc3N/8TExP/Kysr/19fX/+Dg4P/e3t7/x8fH/6CgoP+BgYH/t7e35eXl5cru7u6s
-        8vLyq+Li4n/o6Oh76urqc+vr62Xq6uo/4ODgCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAA7u7uOe7u7rHw8PD88PDw//Hx8f/29vb/+vr6//v7+//8/Pz/+vr6//b29v/x8fH/
-        6urq/+bm5vbk5OSh7OzsOgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACYmJgN
-        i4uL+52dnf/Gxsb/5ubm/+zs7P/n5+f/3t7e/9XV1f/X19f/4eHh/+rq6v/v7+//7+/v/+7u7v/t7e3/
-        7Ozs/+zs7P/s7Oz/7Ozs/+vr6//r6+v/6+vr/+vr6//q6ur/5ubm/9zc3P/Pz8//x8fH/87Ozv/b29v/
-        5eXl/+fn5//Z2dn/s7Oz/5CQkP+ampqzu7u7BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAO/v7yPt7e1q
-        3NzcqNzc3Nfg4ODo5ubm/Ofn5+Xm5ubb5eXls+np6Yfs7OxL8PDwCQAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACMjIy4oKCg/8rKyv/r6+v/9fX1//X19f/y8vL/
-        8PDw//Hx8f/09PT/+Pj4//n5+f/5+fn/+Pj4//f39//19fX/9PT0//Ly8v/w8PD/7+/v/+/v7//v7+//
-        7+/v/+3t7f/n5+f/3Nzc/8/Pz//Ly8v/1dXV/+Li4v/q6ur/7Ozs/+Li4v+/v7//mJiY/6SkpOS6uroB
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAKGhoUaenp7/x8fH/+7u7v/7+/v//Pz8//z8/P/8/Pz//Pz8//39/f/+/v7//v7+//39/f/9/f3/
-        /f39//z8/P/7+/v/+/v7//r6+v/5+fn/9vb2//X19f/z8/P/7+/v/+fn5//a2tr/z8/P/9HR0f/d3d3/
-        6enp/+/v7//x8fH/5+fn/8TExP+bm5v/q6ur2wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJiYmKq9vb3/6urq//z8/P/9/f3/
-        /v7+/////////////////////////////////////////////v7+//7+/v/+/v7//f39//39/f/9/f3/
-        /Pz8//r6+v/19fX/6+vr/9vb2//R0dH/2dnZ/+bm5v/w8PD/9PT0//Pz8//o6Oj/w8PD/5ubm//AwMCa
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAvb29E6urq9jY2Nj/9/f3//39/f/9/f3//f39//7+/v//////////////////////
-        //////7+/v////////////////////////////7+/v/+/v7//f39//v7+//19fX/7e3t/+jo6P/p6en/
-        8PDw//X19f/39/f/9fX1/+Pj4/+7u7v/mJiY/ru7uzsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAyMjIGLq6us/h4eH/
-        9/f3//z8/P/8/Pz//Pz8//7+/v/+/v7////////////4+Pj/4+Pj/+np6f/29vb//v7+////////////
-        ///////////+/v7//v7+//z8/P/6+vr/+fn5//n5+f/6+vr/+/v7//r6+v/z8/P/19fX/62trf+lpaW+
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0NDQCczMzJnf39//8vLy//z8/P/6+vr/+vr6//z8/P/+/v7/
-        /////+bm5v+enp7/ioqK/6qqqv/7+/v///////////////////////////////////////7+/v/+/v7/
-        /v7+//7+/v/+/v7/+/v7/+rq6v/FxcX/oaGh/sPDwz8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAANTU1ELU1NTW5+fn//f39//7+/v/+vr6//z8/P/9/f3/7u7u/9XV1f+fn5//kpKS//z8/P//////
-        //////////////////////////////////////////////////////7+/v/4+Pj/2NjY/6+vr//Dw8Or
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANvb2wTPz89e29vb1+zs7P/4+Pj/
-        /f39//39/f/6+vr/8PDw/7e3t//Gxsb//Pz8//39/f/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7/
-        ///////////+/v7/+vr6/+bm5v+6urr/v7+/yNvb2w0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAADi4uIC5OTkR+Dg4Krx8fH5+/v7//n5+f/z8/P/1tbW//Hx8f/4+Pj/
-        +Pj4//n5+f/6+vr/+/v7//z8/P/9/f3//f39//39/f/9/f3/+/v7//Pz8//e3t7/xMTE99LS0ofk5OQH
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAOnp6Q3p6elQ6+vrmObm5tXo6Oj+7u7u//Ly8v/09PT/9fX1//b29v/29vb/9vb2//X19f/y8vL/
-        7u7u/+Xl5f/e3t7+2NjYyuHh4Xbl5eUTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOXl5Qvd3d00
-        3d3dWN/f33ba2tqT2dnZmt3d3bLe3t6y4eHhoOPj45bp6el07u7uR/Pz8xUAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////////////
-        ///////////////////////////////////////////////////////////////////////8Af//////
-        ////////////4AA//////////////////4AAB/////////////////8AAAP////////////////+AAAD
-        /////////////////gAAA/////////////////4AAAP/////////////////AAAD////////////////
-        /wAAA/////////////////+AAAf///////////////gAAAAP//////////////8AAAAAH///////////
-        ///wAAAAAA//////////////gAAAAAAA/////////////AAAAAAAAB///////////+AAAAAAAAAH////
-        //////+AAAAAAAAAAP/////////+AAAAAAAAAAA/////////+AAAAAAAAAAAH/////////AAAAAAAAAA
-        AA///////x0AAAAAAAAAAAAD/////4AAAAAAAAAAAAAAAf////8AAAAAAAAAAAAAAAH////+AAAAAAAA
-        AAAAAAAB/////gAAAAAAAAAAAAAAAP////4AAAAAAAAAAAAAAAD////+AAAAAAAAAAAAAAAA/////gAA
-        AAAAAAAAAAAAAP////4AAAAAAAAAAAAAAAH/////wAAAAAAAAAAAAAAB//////AAAAAAAAAAAAAAAf//
-        ///4AAAAAAAAAAAAAAP//////AAAAAAAAAAAAAAD//////4AAAAAAAAAAAAAB///////AAAAAAAAAAAA
-        AAf//////wAAAAAAAAAAAAAH//////4AAAAAAAAAAAAAB//////8AAAAAAAAAAAAAAf//////AAAAAAA
-        AAAAAAAH//////gAAAAAAAAAAAAAB//////4AAAAAAAAAAAAAA//////8AAAAAAAAAAAAAAP//////AA
-        AAAAAAAAAAAAD//////gAAAAAAAAAAAAAAf/////4AAAAAAAAAAAAAAD/////8AAAAAAAAAAAAAAA///
-        ///AAAAAAAAAAAAAAAH/////gAAAAAAAAAAAAAAB/////4AAAAAAAAAAAAAAAP////+AAAAAAAAAAAAA
-        AAD/////AAAAAAAAAAAAAAAA/////wAAAAAAAAAAAAAAAH////8AAAAAAAAAAAAAAAB/////AAAAAAAA
-        AAAAAAAAf////wAAAAAAAAAAAAAAAH////4AAAAAAAAAAAAAAAA////+AAAAAAAAAAAAAAAAP////gAA
-        AAAAAAAAAAAAAD////4AAAAAAAAAAAAAAAA////+AAAAAAAAAAAAAAAAP////gAAAAAAAAAAAAAAAD//
-        //4AAAAAAAAAAAAAAAA////+AAAAAAAAAAAAAAAAP////gAAAAAAAAAAAAAAAD////4AAAAAAAAAAAAA
-        AAA////+AAAAAAAAAAAAAAAAP////gAAAAAAAAAAAAAAAD////4AAAAAAAAAAAAAAAA////+AAAAAAAA
-        AAAAAAAAP////gAAAAAAAAAAAAAAAD////4AAAAAAAAAAAAAAAB////+AAAAAAAAAAAAAAAAf////gAA
-        AAAAAAAAAAAAAH////8AAAAAAAAAAAAAAAB/////AAAAAAAAAAAAAAAAf////wAAAAAAAAAAAAAAAP//
-        //8AAAAAAAAAAAAAAAD/////gAAAAAAAAAAAAAAA/////4AAAAAAAAAAAAAAAf////+AAAAAAAAAAAAA
-        AAH/////wAAAAAAAAAAAAAAB/////8AAAAAAAAAAAAAAAP/////gAAAAAAAAAAAAAAD/////4AAAAAAA
-        AAAAAAAA//////AAAAAAAAAAAAAAAP/////4AAAAAAAAAAAAAAD/////+AAAAAAAAAAAAAAA//////wA
-        AAAAAAAAAAAAAH/////+AAAAAAAAAAAAAAB//////wAAAAAAAAAAAAAAf/////8AAAAAAAAAAAAAAH//
-        ////wAAAAAAAAAAAAAB//////+AAAAAAAAAAAAAAf//////wAAAAAAAAAAAAAH//////+AAAAAAAAAAA
-        AAB///////4AAAAAAAAAAAAAf///////AAAAAAAAAAAAAH///////8AAAAAAAAAAAAB////////wAAAA
-        AAAAAAAA////////4AAAAAAAAAAAAP///////4AAAAAAAAAAAAH///////8AAAAAAAAAAAAB////////
-        AAAAAAAAAAAAA////////gAAAAAAAAAAAAP///////4AAAAAAAAAAAAH///////8AAAAAAAAAAAAD///
-        /////AAAAAAAABAAAB////////wAAAAAAAD4AAB////////8AAAAAAAP/gAB/////////AAAAAAP//+A
-        B/////////4AAAAAD//////////////+AAAAAB///////////////wAAAAAf//////////////8AAAAA
-        H///////////////gAAAAD///////////////8AAAAA////////////////wAAAAf///////////////
-        +AAAAH////////////////4AAAD/////////////////wAAD//////////////////wAH///////////
-        //////////////////////////////////////////8oAAAAMAAAAGAAAAABACAAAAAAAIAlAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQDAwMMBgYGFQcHBxcODg4MBgYGAwAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAB0AAABFUFBQqJ+fn+caGhpi
-        AAAAHAAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAACYQEBB8
-        zMzM+s/Pz/4xMTGIAAAAKgAAAAkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        BAQEAgMDAx9ycnLA6enp/729vf4cHBxBBAQEDgAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAEAAAACQAAABEAAAAX
-        AAAAGQAAABYAAAASAQEBGBwcHGXa2tr739/f/6+vr/ApKSkQDAwMBAAAAAEAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwEDAwMIAQEBFAAAACMAAAAy
-        BgYGQw0NDVkNDQ1hDAwMXwcHB1EAAABHAAAAU35+fs7v7+/+0tLS/5mZmdMAAAAmAAAAHQAAABMAAAAK
-        AAAABAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGBgYBBQUFDgAAACYNDQ1L
-        Ojo6iV9fX76EhIThoKCg962trfyxsbH+r6+v/aenp/iTk5PobGxs0aOjo/3IyMj+xcXF/3Z2drwAAABK
-        AAAAPgAAADIAAAAkAAAAFgAAAA0AAAAGAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAEAAAABAwMDAQkJCQoBAQEr
-        IyMja3R0dMK0tLT5zc3N/9nZ2f/Q0ND/0dHR/9PT0//V1dX/1dXV/9PT0//Q0ND/0dHR/9PT0//CwsL/
-        r6+v/z8/P6gAAABfAAAAVwAAAE0AAAA/AAAAKgAAABoAAAAUAAAADQAAAAQAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgYGBwEBARsAAAAzAAAAPgAAACgAAAAb
-        AAAAJBAQEFh3d3fCw8PD/NnZ2f7S0tL+09PT/+Xl5f74+Pj+9vb2//Ly8v7w8PD+8fHx//X19f76+vr+
-        +Pj4/+Dg4P7Q0ND+2dnZ/7S0tOtGRkaRAAAAWwAAAFUAAABMAAAANgAAAB0AAAAbAAAAFQAAAA8AAAAC
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAFk1NTYmZmZnj
-        MjIytwAAAH8AAABpMjIykLKysvDW1tb/1tbW/9TU1P/y8vL/8vLy/+vr6//m5ub/9PT0//j4+P/6+vr/
-        +vr6//b29v/x8fH/7Ozs//Dw8P/8/Pz/4uLi/9TU1P/Pz8/+iYmJxBISEl8AAABPAAAAMgAAABcAAAAb
-        AAAAGwAAABcAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        IiIiB5SUlKnw8PD+1tbW/3x8fOVRUVHMx8fH/Nzc3P7R0dH+6Ojo//Ly8v7p6en+9vb2/+Hh4f5tbW3+
-        8PDw//7+/v7+/v7+//////7+/v7+/v7+//////n5+f7s7Oz+9fX1//Pz8/7T09P/ycnJ/q+vr+YwMDBu
-        AAAAMQAAABoAAAAfAAAAHwAAACIAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAKCgoBbMzMzZ5eXl/6Ojo/7Jycn/3t7e/tHR0f7z8/P+6enp//Pz8/7+/v7+
-        //////v7+/7S0tL+/v7+//7+/v7+/v7+//////7+/v7+/v7+//////7+/v7+/v7+8vLy//Dw8P729vb/
-        1tbW/rS0tP63t7f0RkZGZwAAACkAAAArAAAAKQAAACMAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACsrKwmm5ub7MHBwf7g4OD/0tLS/vT09P7m5ub+
-        +/v7//7+/v7+/v7+//////7+/v7+/v7+//////7+/v7+/v7+//////7+/v7+/v7+//////7+/v7+/v7+
-        //////Pz8/7y8vL/7u7u/tjY2P6Pj4//tbW1+GFhYXoAAAAzAAAAMgAAABEAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACoqKgWsrKy6OHh4f/U1NT/
-        8/Pz/+bm5v/9/f3/////////////////////////////////////////////////////////////////
-        ///////////////////////////u7u7/+fn5/97e3v+9vb3/i4uL/7m5ufxqamqJAAAALAkJCQcAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACfn5+n
-        3Nzc/9ra2v7s7Oz/5OTk/vr6+v79/f3+/f39//39/f79/f3+/f39//39/f79/f3+/f39//39/f79/f3+
-        /f39//39/f79/f3+/f39//39/f79/f3+/f39//39/f78/Pz/6urq/vT09P7a2tr/m5ub/pycnP7FxcX9
-        bGxseSwsLAkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAJ6enjy/v7/85eXl/9zc3P7o6Oj/8/Pz/vv7+/77+/v++/v7//v7+/77+/v++/v7//v7+/77+/v+
-        +/v7//v7+/77+/v++/v7//v7+/77+/v++/v7//v7+/77+/v++/v7//v7+/77+/v/7e3t/vb29v7d3d3/
-        pqam/tDQ0P6jo6P/4ODg+q+vrzkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAJeXl7jk5OT/2NjY/+7u7v/j4+P/9/f3//f39//39/f/9/f3//f39//39/f/
-        9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39/+1tbX/
-        yMjI/+np6f/i4uL/t7e3/97e3v+7u7v/ysrK/+vr69Hi4uIGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAl5eXJ7e3t/vq6ur+2tra/97e3v7w8PD/9PT0/vT09P709PT+
-        9PT0//T09P709PT+9PT0//T09P709PT+9PT0//T09P709PT+9PT0//T09P709PT+9PT0//T09P709PT+
-        9PT0//T09P6mpqb/yMjI/uTk5P7n5+f/yMjI/s7Ozv7j4+P/urq6/unp6f7w8PBkAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjo6Oftra2v7f39/+4eHh/+/v7/7t7e3/
-        8PDw/vDw8P7w8PD+8PDw//Dw8P7v7+/+7u7u/+vr6/7m5ub+sLCw/8vLy/7u7u7+8PDw//Dw8P7w8PD+
-        8PDw//Dw8P7w8PD+8PDw//Dw8P7w8PD/8PDw/uDg4P7q6ur/z8/P/sHBwf729vb/ubm5/ujo6P7x8fHQ
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlZWVyOrq6v/Z2dn/
-        6Ojo//n5+f/y8vL/6enp/+vr6//r6+v/6enp/9nZ2f/Hx8f/oqKi/3t7e/9aWlr/QkJC/2BgYP/MzMz/
-        4ODg/+bm5v/r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/93d3f/p6en/z8/P/76+vv/8/Pz/
-        w8PD/+Li4v/r6+v+7+/vIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACTk5MI
-        pqam+u7u7v7W1tb+6urq//n5+f76+vr/8/Pz/uXl5f7n5+f+0NDQ/1BQUP5RUVH+e3t7/6mpqf6hoaH+
-        YmJi/83Nzf7Kysr+tLS0/7u7u/7Y2Nj+3Nzc/+Pj4/7m5ub+5+fn/+fn5/7n5+f/5+fn/tra2v7j4+P/
-        ysrK/r+/v/76+vr/zc3N/tra2v7l5eX/7+/vWgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAACSkpIvuLi4/+/v7/7Ozs7+8fHx//j4+P74+Pj/+Pj4/vX19f7m5ub+zc3N/8zMzP7h4eH+
-        4eHh/7+/v/5VVVX+0tLS/+Li4v7i4uL+4uLi/9XV1f60tLT+sbGx/9DQ0P7U1NT+2tra/+Hh4f7i4uL/
-        4uLi/tTU1P7b29v/vb29/r6+vv7t7e3/z8/P/tTU1P7h4eH/7+/vgQAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAACRkZFLw8PD/+7u7v/MzMz/8fHx//b29v/29vb/9vb2//b29v/29vb/
-        7+/v/+Li4v/b29v/w8PD/1lZWf+5ubn/3t7e/97e3v/e3t7/3t7e/97e3v/e3t7/3d3d/7e3t/+vr6//
-        wsLC/9XV1f/d3d3/5OTk/+7u7v/Ozs7/pqam/6+vr//R0dH/wsLC/87Ozv/d3d3/7e3tjgAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACUlJRXyMjI/+/v7/7Kysr+7u7u/+vr6/7y8vL/
-        8/Pz/vPz8/7z8/P+9PT0//Pz8/7n5+f+q6ur/6SkpP7Z2dn+2tra/9vb2/7b29v+29vb/9vb2/7b29v+
-        29vb/9ra2v7a2tr+xsbG/9DQ0P7x8fH/8/Pz/uvr6/7Ozs7/iIiI/pGRkf6srKz/paWl/sDAwP7U1NT/
-        7OzskAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACVlZVVxsbG//Hx8f7Gxsb+
-        6urq/9bW1v7s7Oz/8fHx/vHx8f7x8fH+8PDw/+jo6P7V1dX+0tLS//Hx8f7v7+/+6urq/+Xl5f7j4+P+
-        4+Pj/+Pj4/7j4+P+5ubm/+vr6/7w8PD+8fHx//Hx8f7x8fH/7e3t/tjY2P7Ozs7/dnZ2/oCAgP6Kior/
-        gICA/qqqqv7Gxsb/6OjojAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACVlZVD
-        vr6+//Pz8//Kysr/39/f/+3t7f/u7u7/7e3t/+3t7f/t7e3/5OTk/9jY2P/CwsL/7Ozs/+3t7f/t7e3/
-        7u7u/+3t7f/t7e3/7u7u/+3t7f/t7e3/7u7u/+3t7f/t7e3/7u7u/+3t7f/t7e3/6Ojo/8fHx/+oqKj/
-        iYmJ/4WFhf9+fn7/ZGRk/42Njf+8vLz/5ubmdgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAACbm5sisbGx//Ly8v7W1tb+0dHR/+jo6P7r6+v/6+vr/uvr6/7m5ub+2tra/7e3t/7k5OT+
-        6+vr/+vr6/7r6+v+6+vr/+vr6/7r6+v+6+vr/+vr6/7r6+v+6+vr/+vr6/7r6+v+6+vr/+vr6/7n5+f/
-        1tbW/szMzP6Kior/nJyc/pCQkP6AgID/Xl5e/nV1df7Dw8P/39/fTQAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAACfn58BpKSk7Orq6v7k5OT+ycnJ/+Dg4P7o6Oj/6Ojo/ujo6P7n5+f+
-        tLS0/9jY2P7o6Oj+6Ojo/+jo6P7o6Oj+6Ojo/+jo6P7o6Oj+6Ojo/+jo6P7o6Oj+6Ojo/+jo6P7o6Oj+
-        6Ojo/+fn5/7h4eH/w8PD/qenp/6vr6//rKys/p+fn/6AgID/bGxs/nNzc/7Z2dn+29vbFgAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAApKSkptfX1//z8/P/xsbG/9bW1v/l5eX/
-        5+fn/+fn5//l5eX/x8fH/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/
-        5+fn/+fn5//n5+f/5ubm/97e3v/ExMT/x8fH/6SkpP+8vLz/nZ2d/4eHh/9lZWX/fHx8/4qKiv/j4+PJ
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAq6urTL6+vv7x8fH+
-        39/f/8PDw/7Z2dn/5OTk/uTk5P7k5OT+5OTk/+Tk5P7k5OT+5OTk/+Tk5P7k5OT+5OTk/+Tk5P7k5OT+
-        5OTk/+Tk5P7k5OT+5OTk/+Tk5P7k5OT+29vb/8nJyf7Ly8v/j4+P/p2dnf56enr/bGxs/mFhYf5NTU3/
-        UVFR/peXl/7AwMBuAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        sbGxBLOzs9XY2Nj/9PT0/8zMzP/Jycn/2dnZ/+Li4v/i4uL/4uLi/+Li4v/i4uL/4uLi/+Li4v/i4uL/
-        4uLi/+Li4v/i4uL/4uLi/+Li4v/i4uL/4uLi/+Hh4f/X19f/yMjI/8fHx/+FhYX/f39//3Z2dv98fHz/
-        ioqK/46Ojv+NjY3/goKC/3x8fPhNTU0nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAALm5uVC+vr796enp/+/v7/7ExMT/ycnJ/tXV1f7g4OD+4ODg/+Dg4P7g4OD+
-        4ODg/+Dg4P7g4OD+4ODg/97e3v7BwcH+3t7e/+Dg4P7g4OD+29vb/9TU1P7BwcH+ysrK/4ODg/5tbW3/
-        e3t7/paWlv67u7v/ycnJ/sXFxf7Nzc3/y8vL/rW1tf5qamqCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC9vb2gxMTE/+3t7f7t7e3/xcXF/sHBwf7Q0ND+
-        2dnZ/9/f3/7f39/+39/f/9/f3/7f39/+39/f/9vb2/67u7v+29vb/9ra2v7S0tL+ysrK/7y8vP7V1dX+
-        kZGR/2ZmZv58fHz/qamp/s3Nzf7S0tL/2dnZ/ufn5/7w8PD/7+/v/t7e3v68vLzxqKioCwAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC+vr4Iu7u7wsTExP/q6ur/
-        8vLy/9PT0/+5ubn/w8PD/8/Pz//R0dH/1tbW/9nZ2f/a2tr/2dnZ/9bW1v/R0dH/0NDQ/8fHx/+7u7v/
-        zMzM/9bW1v+jo6P/Z2dn/3p6ev+fn5//yMjI/9DQ0P/m5ub/9/f3//39/f/+/v7//f39//X19f/Z2dn/
-        y8vLPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        vLy8Cra2tqy6urr+3d3d/vPz8/7s7Oz+z8/P/7q6uv66urr+vLy8/8DAwP7CwsL+v7+//7y8vP67u7v+
-        vLy8/9DQ0P7h4eH+wsLC/5WVlf6BgYH+XFxc/6ampv7Pz8//19fX/uzs7P77+/v//v7+/v7+/v7/////
-        /v7+/vz8/P7s7Oz/39/fTwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAALW1tQKvr69kqamp6L6+vv7W1tb+5OTk/+bm5v7i4uL+2tra/9PT0/7S0tL+
-        2dnZ/+Hh4f7n5+f+3Nzc/8nJyf6xsbH+jIyM/4CAgP51dXX+a2tr/8vLy/7k5OT/6enp/vr6+v7+/v7/
-        /v7+/v7+/v7//////v7+/v39/f7z8/P/7e3tNwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAm5ubEIaGho1tbW36a2tr/3p6ev+Li4v/
-        mZmZ/6SkpP+rq6v/rq6u/7Gxsf/ExMT/2tra/93d3f/FxcX/p6en/42Njf93d3f/eHh4/9vb2//u7u7/
-        +Pj4//7+/v///////v7+/+3t7f/x8fH//v7+//z8/P/29vbw8fHxBgAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAe3t7N3BwcLltbW31
-        b29v/2tra/5iYmL+WVlZ/1ZWVv5ra2v+kZGR/7e3t/7b29v+8/Pz//Ly8v7h4eH+wsLC/5iYmP5vb2/+
-        eXl5/+Pj4/7y8vL//f39/v7+/v7//////v7+/snJyf6ioqL//v7+/vz8/P7v7++NAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/f38Q
-        e3t76piYmP62trb+sLCw/7Kysv61tbX+tLS0/66urv6bm5v+eHh4/2xsbP5/f3/+pqam/8HBwf64uLj+
-        q6ur/6ioqP6kpKT+jIyM/9/f3/75+fn//v7+/v7+/v7//////v7+/vn5+f7j4+P//v7+/vn5+d/19fUT
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAACEhIRgk5OT/9HR0f/Jycn/xsbG/9jY2P/b29v/29vb/9vb2//V1dX/vr6+/7Gxsf95eXn/
-        iIiI/9LS0v/l5eX/4ODg/8zMzP/AwMD+zs7O1dnZ2Z35+fn7/f39//7+/v/////////////////8/Pz/
-        8/Pz1vb29icAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAACMjIxytLS0/uPj4/7Nzc3+3d3d/+jo6P7n5+f+5+fn/+bm5v7k5OT+
-        zs7O/9DQ0P7R0dH+lJSU+tLS0qnb29uS4eHhhOHh4VzX19cgAAAAAAAAAADu7u5A9PT0wvLy8vb39/f9
-        9fX19vDw8Mzt7e1s8/PzBwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACdnZ0vwMDA/Pb29v719fX++fn5//r6+v74+Pj+
-        9fX1//Ly8v7s7Oz+09PT/9/f3/7q6ur+qKio+bq6uhYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAO/v7w/w8PAb8PDwDgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvr6+g/Pz8/79/f3/
-        /v7+//z8/P/39/f//v7+//7+/v/5+fn/6+vr//Pz8//t7e3/rq6uyrOzswEAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAANvb21fq6urg+vr6//Ly8v6qqqr+/f39//7+/v7+/v7+/v7+//39/f7T09P8xMTERgAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAADl5eUI6+vrWfHx8ark5OTh8vLy+vT09P719fX+8vLy8ubm5rrZ2dlG
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADq6uoC6enpD+rq6h7t7e0c
-        7u7uCQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////AAD/////
-        //8AAP////A//wAA////4B//AAD////gH/8AAP///+Af/wAA///gAB//AAD//wAAA/8AAP/8AAAA/wAA
-        /wAAAAB/AAD8AAAAAD8AAPgAAAAAPwAA/AAAAAA/AAD+AAAAAD8AAP8AAAAAfwAA/wAAAAB/AAD/AAAA
-        AH8AAP4AAAAAfwAA/gAAAAA/AAD8AAAAAD8AAPwAAAAAPwAA/AAAAAAfAAD4AAAAAB8AAPgAAAAAHwAA
-        +AAAAAAfAAD4AAAAAB8AAPgAAAAAHwAA+AAAAAAfAAD4AAAAAB8AAPgAAAAAHwAA/AAAAAA/AAD8AAAA
-        AD8AAPwAAAAAPwAA/gAAAAA/AAD/AAAAAB8AAP8AAAAAHwAA/4AAAAAfAAD/wAAAAB8AAP/wAAAAHwAA
-        //AAAAA/AAD/4AAAAD8AAP/gAAAAfwAA/+AAAwD/AAD/4AA/x/8AAP/wAD///wAA//gAf///AAD//AD/
-        //8AAP//g////wAAKAAAACAAAABAAAAAAQAgAAAAAACAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAEBAQYGBgYPCgoKCgMDAwEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAARo6OjtNMTEyaAAAAGgAAAAEAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwc5OTmE4ODg/1FRUY0CAgIRAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAQEBAwAAAAwAAAAXAAAAIwAAACUAAAAgAgICNLe3t+TT09P/QkJCVAUFBQgAAAAC
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAwMDDQcHBy8sLCxxUlJSpnNzc8Z+fn7UfHx80GZmZrtaWlrBzs7O/8jIyP8TExNY
-        AAAAMwAAACEAAAAPAAAABgAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAgIC
-        AAAACAAAAAoAAAAFAwMDCg8PDz5jY2Oqubm5883Nzf/b29v/4ODg/+Pj4//i4uL/4ODg/9nZ2f/IyMj/
-        rq6u+g8PD2sAAABXAAAARgAAACkAAAAXAAAADQAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAcHByJgYGCmFxcXjAAAAFg5OTmIurq68dXV1f/g4OD/7u7u/+/v7//y8vL/8vLy//Ly8v/z8/P/
-        8vLy//Dw8P/b29v/v7+/8EVFRYwAAABQAAAAKwAAABoAAAAYAAAACgAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAR0dHF9ra2urLy8v8cXFx39PT0/7Y2Nj/7Ozs//Dw8P/7+/v/m5ub//j4+P//////
-        ///////////+/v7/9PT0//T09P/i4uL/xsbG/nd3d68DAwMsAAAAIAAAACMAAAANAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsrKyOa+vr/bV1dX/2tra/+7u7v/29vb/////////////////
-        ////////////////////////////////+vr6//Pz8//h4eH/qKio/42NjbkJCQk4AAAALAAAAAMAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACjo6MmycnJ9dvb2//t7e3/+fn5//7+/v/+/v7/
-        /v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7/9/f3//T09P/Ly8v/k5OT/52dnckKCgoo
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK2trbnf39//6Ojo//Ly8v/8/Pz/
-        /Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz/7+/v/+bm5v+0tLT/
-        q6ur/7S0tLAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACUlJQ31NTU/+Hh4f/m5ub/
-        9vb2//b29v/29vb/9vb2//b29v/29vb/9vb2//b29v/29vb/9vb2//b29v/29vb/9vb2/8DAwP/Ly8v/
-        6Ojo/729vf/V1dX/0dHR/+np6VMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJ6enprl5eX/
-        5OTk/+rq6v/x8fH/8fHx//Hx8f/x8fH/7+/v/+vr6//Gxsb/7u7u//Hx8f/x8fH/8fHx//Hx8f/x8fH/
-        6Ojo/+jo6P/m5ub/t7e3//b29v/Jycn/7e3tzgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        s7Oz5ODg4P/t7e3/9/f3/+rq6v/q6ur/2NjY/56env96enr/eHh4/0pKSv+3t7f/1dXV/+Tk5P/p6en/
-        6urq/+rq6v/q6ur/6Ojo/+Hh4f+1tbX//Pz8/8jIyP/t7e3+8PDwIAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAIqKihjIyMj/2tra//Ly8v/4+Pj/9vb2/+jo6P+3t7f/sbGx/9jY2P+EhIT/xcXF/+Tk5P/Q0ND/
-        wcHB/8PDw//a2tr/39/f/+Pj4//h4eH/2dnZ/7Ozs//s7Oz/x8fH/+np6f/v7+9PAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAi4uLNNTU1P/V1dX/8vLy//b29v/29vb/9vb2/+/v7//h4eH/lZWV/6ampv/e3t7/
-        3t7e/97e3v/e3t7/1dXV/7+/v/+7u7v/39/f/+rq6v/a2tr/np6e/8HBwf+1tbX/4eHh/+7u7l8AAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAACPj4851tbW/9PT0//l5eX/5+fn//Ly8v/y8vL/8PDw/+Dg4P/V1dX/
-        6Ojo/+Pj4//g4OD/4ODg/+Dg4P/j4+P/5+fn/+7u7v/w8PD/7+/v/83Nzf98fHz/jo6O/46Ojv/Kysr/
-        6urqXgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJGRkSjNzc3/2tra/+Hh4f/t7e3/7e3t/+zs7P/e3t7/
-        ycnJ/+zs7P/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+zs7P/Z2dn/r6+v/4yMjP+BgYH/
-        bGxs/6ysrP/n5+dJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAl5eXBbu7u/bo6Oj/0dHR/+jo6P/p6en/
-        5+fn/7+/v//k5OT/6enp/+np6f/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/5OTk/8rKyv+fn5//
-        paWl/4iIiP9ubm7/sLCw/uHh4RgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAr6+vte3t7f/Ly8v/
-        39/f/+bm5v/l5eX/2NjY/+bm5v/m5ub/5ubm/+bm5v/m5ub/5ubm/+bm5v/m5ub/5ubm/+Hh4f/MzMz/
-        ra2t/6+vr/+Ghob/YGBg/3BwcP/Pz8/MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwsLBP
-        09PT/+bm5v/IyMj/3t7e/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//d3d3/
-        ysrK/6qqqv+BgYH/d3d3/4ODg/9+fn7/bm5u/3t7e3YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAALS0tAG8vLzB5ubm/9nZ2f/Hx8f/2dnZ/+Dg4P/g4OD/4ODg/+Dg4P/g4OD/xMTE/93d3f/e3t7/
-        1tbW/8bGxv+urq7/bW1t/42Njf+9vb3/y8vL/9TU1P/R0dH/k5OTwQAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAL29vR2/v7/k5+fn/9/f3//CwsL/zMzM/9XV1f/Z2dn/29vb/9ra2v/S0tL/
-        09PT/8PDw//Kysr/vr6+/2xsbP+NjY3/x8fH/9vb2//z8/P/+/v7//n5+f/a2tr/w8PDIQAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALm5uSC1tbXM1tbW/+zs7P/W1tb/x8fH/8HBwf+/v7//
-        wcHB/8fHx//Ozs7/1NTU/6Wlpf+CgoL/dHR0/87Ozv/h4eH/+fn5//7+/v///////v7+//Pz8//h4eEy
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKmpqQObm5toioqK7JGRkf+mpqb/
-        tbW1/8DAwP/ExMT/zs7O/9PT0//CwsL/mZmZ/3t7e/+SkpL/6urq//f39//+/v7//f39//Ly8v/+/v7/
-        9/f3+O/v7wwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHl5eYl+fn7v
-        gYGB/3l5ef9ubm7/b29v/4mJif+9vb3/5+fn/97e3v+vr6//gICA/5+fn//y8vL//v7+///////39/f/
-        tra2//7+/v/09PScAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACCgoIy
-        m5ub/8rKyv/FxcX/1NTU/9XV1f/Pz8//qqqq/3t7e/+YmJj/z8/P/8/Pz//BwcH+vr6+1PLy8ur+/v7/
-        /v7+///////+/v7/9/f3xfb29g8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAI2NjUPJycn/3Nzc/+jo6P/s7Oz/6enp/+fn5//Ozs7/2dnZ/6ioqNTV1dVk4ODgUd3d3SEAAAAA
-        7e3tHPLy8o309PS58/Pzpe/v71nw8PADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        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
-
-  
-  
-    &Om...
-  
-  
-    lvwTasks
-  
-  
-    newToolStripMenuItem
-  
-  
-    3, 3
-  
-  
-    &Redigera
-  
-  
-    tabPage3
-  
-  
-    mnuRemove
-  
-  
-    $this
-  
-  
-    
-        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
-        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAA2ZJREFUOE91U21M
-        U2cUbo1MDa7bUiMxRj7iHxmZyNRItBGVmjESdAZZMj/ohlrAhuzPUJHEKCNmg0URAoFEh9SxhNQV2qKW
-        tlRoXbHlQ0trewF7295bLf3gw0UJjNJntzcxi7id5Px4T/I855z3OQ+Xsyza2toSBQLBKR6PJ4yLi0vh
-        crkrIpGIz+/3G8fGxm7n5+dbl2PevrkajeZSKBCYn6G8mLQ+AW0ywtuvB/WoH/7Rp/DTVNRms7VKpdL4
-        90gUCkWb3+MB/acBVK8G3p57cKs64ZJ3YLzjDog7t2D7tQWk+TGcTudAbW3tvyRyubzE53LBdV8Fr1aN
-        uXAIlE4NorUFjuYbILtkeOV2YfBSOR5+9zWsSjlGRkZa2CkKCgo+IAhicqxbAaf0Fv5iwLFYikTguHEV
-        wz+cxuL8PBYWFhDwuPFH2nr8nroehN0eqamp2cypqKjIfukm8bTuZ1hrqmC6cg5BH41oNIrFxb8x9+YN
-        Zmdn8YKmoT3zFXq3rMG9zasxLL0JlUp1ntPY2Pi9Z8gCy4Uy6L/cCW1qPHSHdiDgf4mpqSkEg0EEAgFY
-        zuZhXPARrLt4eJS+FoM/VcJoNMo49fX1FzxmEzT7P0NP6lqYdnyMidY6FhTLUCiEcDgMv16BQH4K6IN8
-        2PZ8AmvdFRgMhi5OGRPTzMhdW3jQf87HhKyV7RoDeYlnGDXo4GHUcbvd8Fn6ERRtw/PsdSA1ytgKUk5m
-        Zmbe9PQ0DJLj6M3cAIvyLtuZGDSBFu9C+Ns0jKg7WVJqgoD7zG6MHtuOudevUV1d/SOHz+d/KJPJZmdo
-        L7TZn8KQtQm6a5dBnNiGuW+SMH88GSFRGoY7bmJccgDkkRSQRi0oiooKhUIBK2Vubm6V3W5HmJzAw2NC
-        DOxJgPOLjfDkJcJ3JAkvmPQcToTl6FY8vvsbSJJEc3NzLwPlvr3I1RKJRN/X18fKNv6gEwMXxTCKsmE8
-        uQ/9ZQXQXK+CrkcNs9mM7u5ub0ZGRtI755yQkBDPGEXKMC8NDQ3B5/Oxe9OM/g6HA2q1GkqlMtrU1GRJ
-        T09P/k9DicXidUVFRb9UVlZONjQ0LLW3t0eZ/4kyDl0qLy+fKSkpkZWWlm79Pzey9aysrJWFhYUbGbK9
-        xcXFR2PJgPaLRKLknJycVcvB/wD+blEYqZtj7gAAAABJRU5ErkJggg==
-
-  
-  
-    label6
-  
-  
-    199, 243
-  
-  
-    True
-  
-  
-    columnHeader3
-  
-  
-    Skapa ny schemaläggning
-  
-  
-    119, 22
-  
-  
-    label2
-  
-  
-    &Verktyg
-  
-  
-    2
-  
-  
-    111, 136
-  
-  
-    System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    5
-  
-  
-    System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    Telldus Schemaläggare
-  
-  
-    System.Windows.Forms.ColumnHeader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    92, 22
-  
-  
-    0, 590
-  
-  
-    3
-  
-  
-    131, 13
-  
-  
-    System.Windows.Forms.ImageList, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    119, 22
-  
-  
-    Senast körd
-  
-  
-    System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    pictureBox2
-  
-  
-    111, 158
-  
-  
-    0
-  
-  
-    2
-  
-  
-    contextMenuStrip1
-  
-  
-    frmMain
-  
-  
-    2
-  
-  
-    tabPage3
-  
-  
-    119, 13
-  
-  
-    113, 22
-  
-  
-    8
-  
-  
-    Magenta
-  
-  
-    Telldus hemsida...
-  
-  
-    
-        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
-        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAA01JREFUOE91U2tI
-        k2EUXnQFG1Ysi+5REfTDGEQJSRD+qWEGYkVChe7HlHU3c7RuFrIoK3Jpm0NikhfYJrqt3OalOafbbE3d
-        pruY07lZc1NLnZmYe/r2QUVWBw68533PeTjnfZ5DoSwwsVi8xePx5I+NjbVNTk5+nJqaCoyPj5vtdvtT
-        qVS6d2H+rzg9PX2RRqO5HQyNfPOFvLAOdcL4oRWtrma0u1tg83ZhOOCP2Gy2lyKRKOYvILlcLvZ+HISh
-        TwetS4MWdwPaP2ih62uEoluCyo4ylLcJ8c5pgMPhMJSUlPwGkclkWZ6hfqjtCiisEtR0VsA+1IWfprbV
-        Iq8uE+elp5BdfQJKUw0sFouQ7CIlJWWZy+UKqLprUWkphfjdc4gMj9DmbEIkEiG9sOEq9vOXYF/RYtCf
-        LcaBQhp6nPbvPB5vB4XD4SQN+j0QGB9A2VONrmEj6l2VcH3qxuzsLMLhMNqdGlSaHqPC9AQs2UEkli1F
-        tV4EhUKRRykuLr5k6TeBZzyPVrcKc3NzmJmZwcTEBEZHRzEyMkJ6MBgkY4H+Ko7XrABfewN6vV5CKSoq
-        4pj723H27R5IDWUgKITb7YbX6yULQ6EQfD4feUdQidK3V8BsXoky4x3odLpaygXChkd9YKhicPLNGmTI
-        1+Pi6w1Qd5SD0AIJIjNwUaDZgnz1ZtzUxeGyYRVaXHXREcopCQkJxwih4K7+NM6YqWB3rsZN61o0vBdj
-        YGCAdKWVg1LnJhQ7NuJhz3oChI7w1zAKCgruU2g0GlUikXwZHvOCSYzB6lyH69ZNqDe9gt/vRyAQwJue
-        fDx37sZTxy7cMu5EB6ER4i2SlJSUSFLJYDDuRecbDPbhctNRnNNvB7suETmSI8iTMnCj6SC45r3IUSdA
-        rq8g/0koFDbFxcUtIgGoVOoKNpvdrNVqMT09jcZeOR60XMQ19XHkqJJxp/4cXrzmQd2ogslkglKp9MbH
-        x2/9Q86xsbExaWlp5QKBYN5sNpPtR6mLMtDb2wuVShUtjBAS7qDT6dv+uVQsFouWmZlZyOVyA3w+f76q
-        qipCyDxCbOh8bm7u5+zsbAmRE//fjYw+JCcnL8nIyNiYlZV1iEhOizpxPsxkMrelpqYuX1j8A/bFYLQi
-        FLFKAAAAAElFTkSuQmCC
-
-  
-  
-    System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    $this
-  
-  
-    4
-  
-  
-    pictureBox1
-  
-  
-    tabControl1
-  
-  
-    System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    Microsoft Sans Serif, 8.25pt, style=Bold
-  
-  
-    Schemalägg enhet(er)
-  
-  
-    111, 116
-  
-  
-    System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    System.Windows.Forms.ColumnHeader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    Magenta
-  
-  
-    4, 22
-  
-  
-    10
-  
-  
-    System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    System.Windows.Forms.PictureBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    Kör...
-  
-  
-    System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    toolsToolStripMenuItem
-  
-  
-    57, 197
-  
-  
-    &Avsluta
-  
-  
-    System.Windows.Forms.NotifyIcon, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    
-        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
-        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAt1JREFUOE+V030s
-        1HEcB/DfeUrDsd1wtNap8xTNnIcjj5vCRIfWZfOUKKeIowcP1ehhkTxlidrE1GweNg8RFksoD5kwI+c0
-        PUhUl4c7ws+7a23MUOv7z2ef7z6f13ff7fOhEJucwOoc+k42w3FuQVGru2V2amV+YKAtJL5ns9p1d0a8
-        QqXAEnHWjW7xYvbQNFIFkzheO4f9pa0r5iXp7cyMMOstEbNrRbTQBlFv7SiJwW8k3k1L43cS9WMkkl4u
-        wfaxAHLcComcTbr7BsSY70IJ6GpprhCSEEgbv86TmPlJYlIah6V5mRQ93fYROrc7oBt/Z0bVOUpnHWJf
-        H3PoXM8bNH8mMTpLQiRtlixJgYU/ecW4BIkjfeC2PYNlWQ7YpfySdQCrJqzgQucw6j6R6PtB4oOYxIT0
-        9d+xQ7SIlKlKXBxpAE+QA5+BZNjWRs3TvE0UVxGtfLfOE41dKBhdxpMJEu0iEnUiIe6LqnB9/C7ihHkI
-        63oFl6o6eLamgVXIB9WTvXcV2J7Afu1QlI8r3QtIHVlGikCIiP4ExLyNx/nhS4gcjENobxqYmR0wzEuG
-        6lk/KDiaGa99gxP9UDe5H/6VX8BrnYFvSwdcazg40nQM3Oe+cH3qDfcmfzg38kG/Gg31dPtFwpiutAbo
-        Z7rKBtRgX9oQXB+9h1v5GCweRMKswA7sYgeYFtvBoNAKzCJrqCU6Q+mMXdXGeTDKfSHjXw31yz3QSx2C
-        UZYAzJRy7E6yAOOWCTRuGoKWoQ95vwOL8hyG5UZAjb+DYGQIiYMFIPyqIBPaCNmTuaCGGkA1WhfUWCa2
-        hTNXKFZOvK1HWjFYnVCNLSO0k0nCMAWEjQsoXrugHGgAFR+2hGLqlE1ouVH/vhN0D3UVVsg9E27ShElQ
-        sNgsIlxsfCp6UoHl20nR804n6B7afwdodjKE9mFNBSNfayo72EvZPIgryzzqRjA4LGKPpwah6Sjzz638
-        n4JfHjGLP3wxItMAAAAASUVORK5CYII=
-
-  
-  
-    3, 3, 3, 3
-  
-  
-    
-        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
-
-  
-  
-    Konfigurera enheter
-  
-  
-    
-        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
-        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAAK7wAA
-        Cu8BfXaKSAAAAyRJREFUOE9Vk3tIUwEYxWeiFZHNICkIojAsMBmJJRkhGiKZGUUPSkoriVolzSiopMyw
-        1NCsiZr0QE0LjVDzUc3HFJ1uaWsmPipd6dbcarO0bGqdzl3+sS78uJd7v3Pu9333XBeR05GaWuk19s0m
-        9ZjvFuEpnuM9NWWH0WR5b/lirunrV99vbHxuZPkkgbPOcZ2fr91R8rDFavpsxuDoFLSWSagNP6Hu/wxF
-        rQJXk7Ise/ccjWGpmLj+ZyCIm+q7p38B0E0BRp6HfgMDdkA7AdSagAZ1N26kZtpDQiJOULyIzHKYCG0X
-        FzVZxyl62tGDu0UFoA76aaCb4ld80E7qbECVUoMzp8+ZxGJxJKULiIso8WJhkkE/DA2LegxGuHG+0sZm
-        DNOklzQMfcdl+QO0jgGVvJmfk42AgIA8in2Jm+h6SklH38gPDLL1bxRUaF5jnqsLqnsG0WqewGJPD0Qf
-        l0HJDpq+AiU1LdgWsbWd4p3EU5SbXTbabhiHngv4IECTW6WVCN0YiECJH8oVSvRZuVQaqASDhl4ciT1g
-        oDiBLBXdziy2tQxY8e4noLECaraqpdH28DDcy89FaFYoNt/ajCdvnuPjD6BQ0YVDB6OHKb5CVogunpdr
-        WnXvUfeF83LbTWag7TsX+tYMnXEUQTcCcV+XhYSqk5A+jUdHVz+Oxh3upDjZYRB3JPFKbUUFyvWAggYv
-        uag6A1A/wnFotDbFD9kdyUhUxWKXYhXCC4IQL4/XUZxIlomCg8OXJyfdtLxQqlBOcS2p+gg8o2E/55Zc
-        XwOpcgt2N/hAqg1A+tcoBN1bbaf4ElkuRMF93764mLRrGfbyGgXKev+gmp3UkwF+WkmaL2TqMJx664+r
-        I5HYVCKZYOMF1F1wdOAIA+MZEhIplcWfNd2R30RRWRUKq9vQ2fsJ/pl+kI/EYH/zBoTmBFtYW0ZSSNhM
-        mByBFGLpJSTM3399XtS2rW2HYw8MlT5+ZJOkrZmWpPvaYzNiVKwpnnnzuhnxvzjPHMIPIsRTSJgQEhkR
-        Np1GMkgqOUb8yFxnofO1MI47WUiWkhVkJfEh3mQJme0s+Au+QgUxI1c9OgAAAABJRU5ErkJggg==
-
-  
-  
-    &Schemalägg
-  
-  
-    statusStrip1
-  
-  
-    Schemaläggning...
-  
-  
-    219, 13
-  
-  
-    tabPage3
-  
-  
-    1
-  
-  
-    0, 24
-  
-  
-    Startar konfigurationsprogrammet för enheter.
-  
-  
-    System.Windows.Forms.ColumnHeader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    System.Windows.Forms.ColumnHeader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    3, 3, 3, 3
-  
-  
-    196
-  
-  
-    tabControl1
-  
-  
-    35, 13
-  
-  
-    System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    862, 515
-  
-  
-    tabPage3
-  
-  
-    166, 6
-  
-  
-    cmdTurnOff
-  
-  
-    $this
-  
-  
-    AutoSize
-  
-  
-    46, 20
-  
-  
-    System.Windows.Forms.TabPage, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    870, 25
-  
-  
-    AutoSize
-  
-  
-    47, 20
-  
-  
-    Protokoll
-  
-  
-    1
-  
-  
-    Stäng av
-  
-  
-    System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    True
-  
-  
-    tabControl1
-  
-  
-    True
-  
-  
-    System.Windows.Forms.ListView, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    0
-  
-  
-    120, 48
-  
-  
-    143
-  
-  
-    Microsoft Sans Serif, 8.25pt, style=Bold
-  
-  
-    System.Windows.Forms.TabPage, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    862, 515
-  
-  
-    
-        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
-        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAidJREFUOE9jYICC
-        3HnFii3bJ1rD+CTRst58Mnnr0z+vebrrb/7qbHtCmtesWWOyfv16Ebg6XhMmMYtqhfdVO7P+N+8vvRfS
-        4smLbkhnZ6fdtWvXPA8ePLjk1atXb/bt25ezYsUKf7g6pRi2iKApev96T9T9b9iVNwvdgOnTp3fs3r37
-        /927d/+fOHHi2OnTp2+cO3euGEWdaaHA/Py1gf+nnWv6V74+1RNZ8tChQxeqKsv/AzX9f/To0f/nz5//
-        nzdvXjCKAcKWLDweLXK3Og8X/O873nIXJrl27dqkY8eO/Tty5Mifixcv/lywYMGJ+Pj4RKxhpRjAaeTb
-        Zf0uZ0Pxn7yZJaJTpkxJ2rlz529goN2NjIwMERYWFiIUyAxybnLsBuE6C+avWHDk5MmT/4Chvt/JyUmQ
-        oEaYgsysTObVa1ZPP3DgwH+g7XttbGy4iNacn5/PBQzhjR8/fvy/ZcuWncuBoKSkhJmQAYxABVyKiory
-        27ZtO/ny5UuQ5q0WFhYcVlZWFqtXr66QkpICqcEN7O3tzZcuXfrk6tWr/ydPnrxHTk6OG6haFIhl3d3d
-        24yNjb2BbHGsJgBTlPOuXbteAuP6/8yZM09ycXHJABWqQrEIGxsbd29v75G8vDwjrAbs2bNnWWxsrA8w
-        tO/x8/PrAxXxAzHI3yBn8wCxNNArDWfOnDmC1QCQ85KTk2cANZsCFTBhUQQyiM/Q0DCYg4ODjVCAkiQP
-        ADBk5tzXJg/8AAAAAElFTkSuQmCC
-
-  
-  
-    9
-  
-  
-    System.Windows.Forms.ColumnHeader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    Sätt på
-  
-  
-    columnHeader4
-  
-  
-    3
-  
-  
-    172, 22
-  
-  
-    menuStrip1
-  
-  
-    862, 515
-  
-  
-    tabPage3
-  
-  
-    ID
-  
-  
-    870, 541
-  
-  
-    AutoSize
-  
-  
-    111, 190
-  
-  
-    tabPage2
-  
-  
-    System.Windows.Forms.MenuStrip, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    0
-  
-  
-    linkLabel1
-  
-  
-    870, 612
-  
-  
-    System.Windows.Forms.TabControl, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    2
-  
-  
-    System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    4, 22
-  
-  
-    columnHeader1
-  
-  
-    tabPage3
-  
-  
-    System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    columnHeader2
-  
-  
-    5
-  
-  
-    
-        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
-        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAA1VJREFUOE91U21I
-        0wkc3s68Akvq7DJ6j4qDPiSDo4RGEvnBRtEHs7gP50jBKTN78cyXddebR6HWcS5tGVIbTYTZcC/lNl+a
-        23Kb7aZuc2/qdC/m3NQS5pmoe/rvDxJZ/eD58PvB8/B7e6iUVcHn83fR6fTcxMTE9Pj4+L1UKvWHpaWl
-        wMTEhNblcj3LzMwcWM1ZyakqleqvUHjyoz/shcXXB8OwFlpXF3rc3bB6++F/54tardanAoEg4SsRiUTC
-        974bg35IA7VLhW53O3qG1dAMdUA2IEJTbyMEbx7jrVMPh8Ohr66u/iwiFovzPb4RKG0yyCwiiPuEsPn6
-        sRJKaytKJTkobDmPguYsyI1imM3mx2QXWVlZPzqdzqBioBVN5gbw3z7EE3013jg7EY1GSdS0X8Vh7hr8
-        WhsH2r9xOFKzGTa7bamqqmofpby8/MRYwAOe4R7kg83oHzegzdUE18QAFhYWEIlE0ONUocl4H0LjA7Be
-        HAW9MR7NuieQyWSllLq6ukvmESPuGgqhdSuwuLiI+fl5zM7OYmpqCpOTkyRCoRCZ83RXcUa8Dlx1BbRa
-        rYhSW1tbZhrpQfbrg2jRN8Lj8cDtdsPr9ZLEcDgMv99P1mw2GxpeX0Fu13o0Gm5Ao9G0Ui4SMT7lB0OR
-        gHOvfsIF6VYUvdwGZa8A09PTpMgLPQd/q3bhlnInrmu24LJ+I7pdktgIAkpqaurpmZkZ3NT9ht9NG8Du
-        24Trlp/R/h8fo6OjJOSWMjQ4d6DOsR1Vg1sJERoi/0dQWVl5h5KUlLRBJBJ9GJ/2IpcYg9WXjGuWHWgz
-        PkcgEEAwGMSrwVt46PwF/zgO4E/DfvQSP+Lz+aLp6el08pQMBuN2bL6x0BAud54EU7cXbAkdxaIMlLYw
-        UNF5FBxTCoqVqZDqhOSeeDxeJ0GlrnzkOjab3aVWqzE3N4cOuxT3uovwh/IMihWncKONiUcv70LZoYDR
-        aIRcLvfSaLTdX7xzcnJyAmEUAaG8bDKZyPZjp4tdwG63Q6FQQCqVRuvr63tTUlL2fNNQeXl5m3Nycmo4
-        HE6Qy+UuC4XCKLGfKOHQ5ZKSkvf5+fmigoKCQ99zI1lPS0tbk52dvZ0QO8Zisc7GQJCOM5nMPRkZGWtX
-        kz8B5RdV6J337i8AAAAASUVORK5CYII=
-
-  
-  
-    label5
-  
-  
-    
-        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
-        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAA2RJREFUOE91U2tM
-        k2cUrsniXBDR2NQYI2D8IxKrTI1kGi+ri5EAKtYlq1sYoAI2ZH9EG0mMsDA2syhCIDSoBDQS0nKxRS1t
-        qVBqsaWgpdiWYr9evnL52nIZKIEBffz6/dCIepKTvG/e8zznvHmew2Iti9ra2miCIArHx8efT09Pj8zM
-        zIxNTEyYBgYGbkml0p3L6z/cBQLBCqVSeS1AUXOTXg/GzC9B6rvg6dTAq+vEaP8rUMO+kMViqamuro74
-        jEgmk9WOut0gn2vhbVfC0/YYLnkznE0NcDTch/3+XVjuiUEYXsBms3VXVlZ+JGlsbMzxOZ1wPpHDo1Jg
-        NhiAV62AvUYMa9VtEC0S/OdyoudaPp5l/AyzrAl9fX1iZorU1NSVg4ODY4Otj2Cru4tpGhyOpcVFWG//
-        hd5L57AwN4f5+XlQbhca4zl4GMeB4/XAYklJyVaWSCTijbgIvCr9B+YbRdAXXobfRyIUCmFh4X/MvnuH
-        qakpDJMkVOdPon3bd3i8dRV66+5ALpdfYVVUVPzhNhlhFOVBc3wvVHERUKfuATU6AloJ+P1+UBQF48UU
-        OA5EwbxvDXQ7V6Pn7wLodDoJq6ysTOQ26KE8sgNtcauh37MWQzWlDCicgUAAwWAQo5pHoE5vAfnTelj2
-        r4O5tBBarbaFlUfHBD1yy7Y10Hy/HkOSGqZrGOSxv0a/Vg03rY7L5YLP2Al/+i684bFBKGXhL9SxEhMT
-        U2ijQCs8i/bEjTDKpExne48e5IV9CP4ejz5FM0PqHbLDdf4H9At2Y/btWxQXF//JYrPZkRKJZGqS9EDF
-        2w7toc1Q37wO+6+7MPtLDObOxiKQHo/ehjtwCH8EcWoLiC4VfD5fiMfjHWCkTEpKKqKtiiAxhGeCo+je
-        vwG2Y5vgTomG71QMhul0n4iGkc/FC+kD0FaHWCxu53A4KxiCyMjIVUKhUNPR0cHI5njajO6rF9CVzkPX
-        b4fRmXcGyltFULcpYDAY0Nra6uFyuTGf2DkqKiqCz+fXVVVVLZlMpvCIzL9JWn+r1QqFQhEGhmgLGxMS
-        EmK/uFTZ2dnszMzMfwsKCsbKy8uX6uvrQ7TNQ/SGLuXn50/m5uZK6BruVzcy/JCcnPxNRkbGppycnIN0
-        MT+c9PlIVlZWbFpa2rfLwe8BECxb5G8PU2sAAAAASUVORK5CYII=
-
-  
-  
-    toolStripSeparator
-  
-  
-    4
-  
-  
-    System.Windows.Forms.ToolStrip, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    Schemaläggning
-  
-  
-    113, 22
-  
-  
-    columnHeader7
-  
-  
-    lvwCommon
-  
-  
-    columnHeader6
-  
-  
-    label1
-  
-  
-    &Ny
-  
-  
-    tabPage3
-  
-  
-    1
-  
-  
-    statusStrip1
-  
-  
-    101, 22
-  
-  
-    System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    toolManageDevices
-  
-  
-    0
-  
-  
-    65, 22
-  
-  
-    0
-  
-  
-    4
-  
-  
-    tabPage1
-  
-  
-    247, 13
-  
-  
-    7
-  
-  
-    True
-  
-  
-    Välkommen
-  
-  
-    442, 17
-  
-  
-    0, 0
-  
-  
-    0, 24
-  
-  
-    552, 17
-  
-  
-    335, 17
-  
-  
-    True
-  
-  
-    707, 17
-  
-  
-    0, 590
-  
-  
-    English
-  
-
\ No newline at end of file
diff --git a/scheduler/DeviceScheduler/frmMain.sv.resx b/scheduler/DeviceScheduler/frmMain.sv.resx
deleted file mode 100644
index af9f0537..00000000
--- a/scheduler/DeviceScheduler/frmMain.sv.resx
+++ /dev/null
@@ -1,3072 +0,0 @@
-
-
-  
-  
-    
-    
-      
-        
-          
-            
-              
-                
-              
-              
-              
-              
-              
-            
-          
-          
-            
-              
-              
-            
-          
-          
-            
-              
-                
-                
-              
-              
-              
-              
-              
-            
-          
-          
-            
-              
-                
-              
-              
-            
-          
-        
-      
-    
-  
-  
-    text/microsoft-resx
-  
-  
-    2.0
-  
-  
-    System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-  
-    
-        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
-        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAA01JREFUOE91U2tI
-        k2EUXnQFG1Ysi+5REfTDGEQJSRD+qWEGYkVChe7HlHU3c7RuFrIoK3Jpm0NikhfYJrqt3OalOafbbE3d
-        pruY07lZc1NLnZmYe/r2QUVWBw68533PeTjnfZ5DoSwwsVi8xePx5I+NjbVNTk5+nJqaCoyPj5vtdvtT
-        qVS6d2H+rzg9PX2RRqO5HQyNfPOFvLAOdcL4oRWtrma0u1tg83ZhOOCP2Gy2lyKRKOYvILlcLvZ+HISh
-        TwetS4MWdwPaP2ih62uEoluCyo4ylLcJ8c5pgMPhMJSUlPwGkclkWZ6hfqjtCiisEtR0VsA+1IWfprbV
-        Iq8uE+elp5BdfQJKUw0sFouQ7CIlJWWZy+UKqLprUWkphfjdc4gMj9DmbEIkEiG9sOEq9vOXYF/RYtCf
-        LcaBQhp6nPbvPB5vB4XD4SQN+j0QGB9A2VONrmEj6l2VcH3qxuzsLMLhMNqdGlSaHqPC9AQs2UEkli1F
-        tV4EhUKRRykuLr5k6TeBZzyPVrcKc3NzmJmZwcTEBEZHRzEyMkJ6MBgkY4H+Ko7XrABfewN6vV5CKSoq
-        4pj723H27R5IDWUgKITb7YbX6yULQ6EQfD4feUdQidK3V8BsXoky4x3odLpaygXChkd9YKhicPLNGmTI
-        1+Pi6w1Qd5SD0AIJIjNwUaDZgnz1ZtzUxeGyYRVaXHXREcopCQkJxwih4K7+NM6YqWB3rsZN61o0vBdj
-        YGCAdKWVg1LnJhQ7NuJhz3oChI7w1zAKCgruU2g0GlUikXwZHvOCSYzB6lyH69ZNqDe9gt/vRyAQwJue
-        fDx37sZTxy7cMu5EB6ER4i2SlJSUSFLJYDDuRecbDPbhctNRnNNvB7suETmSI8iTMnCj6SC45r3IUSdA
-        rq8g/0koFDbFxcUtIgGoVOoKNpvdrNVqMT09jcZeOR60XMQ19XHkqJJxp/4cXrzmQd2ogslkglKp9MbH
-        x2/9Q86xsbExaWlp5QKBYN5sNpPtR6mLMtDb2wuVShUtjBAS7qDT6dv+uVQsFouWmZlZyOVyA3w+f76q
-        qipCyDxCbOh8bm7u5+zsbAmRE//fjYw+JCcnL8nIyNiYlZV1iEhOizpxPsxkMrelpqYuX1j8A/bFYLQi
-        FLFKAAAAAElFTkSuQmCC
-
-  
-  
-    
-        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
-        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAA2RJREFUOE91U2tM
-        k2cUrsniXBDR2NQYI2D8IxKrTI1kGi+ri5EAKtYlq1sYoAI2ZH9EG0mMsDA2syhCIDSoBDQS0nKxRS1t
-        qVBqsaWgpdiWYr9evnL52nIZKIEBffz6/dCIepKTvG/e8zznvHmew2Iti9ra2miCIArHx8efT09Pj8zM
-        zIxNTEyYBgYGbkml0p3L6z/cBQLBCqVSeS1AUXOTXg/GzC9B6rvg6dTAq+vEaP8rUMO+kMViqamuro74
-        jEgmk9WOut0gn2vhbVfC0/YYLnkznE0NcDTch/3+XVjuiUEYXsBms3VXVlZ+JGlsbMzxOZ1wPpHDo1Jg
-        NhiAV62AvUYMa9VtEC0S/OdyoudaPp5l/AyzrAl9fX1iZorU1NSVg4ODY4Otj2Cru4tpGhyOpcVFWG//
-        hd5L57AwN4f5+XlQbhca4zl4GMeB4/XAYklJyVaWSCTijbgIvCr9B+YbRdAXXobfRyIUCmFh4X/MvnuH
-        qakpDJMkVOdPon3bd3i8dRV66+5ALpdfYVVUVPzhNhlhFOVBc3wvVHERUKfuATU6AloJ+P1+UBQF48UU
-        OA5EwbxvDXQ7V6Pn7wLodDoJq6ysTOQ26KE8sgNtcauh37MWQzWlDCicgUAAwWAQo5pHoE5vAfnTelj2
-        r4O5tBBarbaFlUfHBD1yy7Y10Hy/HkOSGqZrGOSxv0a/Vg03rY7L5YLP2Al/+i684bFBKGXhL9SxEhMT
-        U2ijQCs8i/bEjTDKpExne48e5IV9CP4ejz5FM0PqHbLDdf4H9At2Y/btWxQXF//JYrPZkRKJZGqS9EDF
-        2w7toc1Q37wO+6+7MPtLDObOxiKQHo/ehjtwCH8EcWoLiC4VfD5fiMfjHWCkTEpKKqKtiiAxhGeCo+je
-        vwG2Y5vgTomG71QMhul0n4iGkc/FC+kD0FaHWCxu53A4KxiCyMjIVUKhUNPR0cHI5njajO6rF9CVzkPX
-        b4fRmXcGyltFULcpYDAY0Nra6uFyuTGf2DkqKiqCz+fXVVVVLZlMpvCIzL9JWn+r1QqFQhEGhmgLGxMS
-        EmK/uFTZ2dnszMzMfwsKCsbKy8uX6uvrQ7TNQ/SGLuXn50/m5uZK6BruVzcy/JCcnPxNRkbGppycnIN0
-        MT+c9PlIVlZWbFpa2rfLwe8BECxb5G8PU2sAAAAASUVORK5CYII=
-
-  
-  
-    
-        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
-        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAidJREFUOE9jYICC
-        3HnFii3bJ1rD+CTRst58Mnnr0z+vebrrb/7qbHtCmtesWWOyfv16Ebg6XhMmMYtqhfdVO7P+N+8vvRfS
-        4smLbkhnZ6fdtWvXPA8ePLjk1atXb/bt25ezYsUKf7g6pRi2iKApev96T9T9b9iVNwvdgOnTp3fs3r37
-        /927d/+fOHHi2OnTp2+cO3euGEWdaaHA/Py1gf+nnWv6V74+1RNZ8tChQxeqKsv/AzX9f/To0f/nz5//
-        nzdvXjCKAcKWLDweLXK3Og8X/O873nIXJrl27dqkY8eO/Tty5Mifixcv/lywYMGJ+Pj4RKxhpRjAaeTb
-        Zf0uZ0Pxn7yZJaJTpkxJ2rlz529goN2NjIwMERYWFiIUyAxybnLsBuE6C+avWHDk5MmT/4Chvt/JyUmQ
-        oEaYgsysTObVa1ZPP3DgwH+g7XttbGy4iNacn5/PBQzhjR8/fvy/ZcuWncuBoKSkhJmQAYxABVyKiory
-        27ZtO/ny5UuQ5q0WFhYcVlZWFqtXr66QkpICqcEN7O3tzZcuXfrk6tWr/ydPnrxHTk6OG6haFIhl3d3d
-        24yNjb2BbHGsJgBTlPOuXbteAuP6/8yZM09ycXHJABWqQrEIGxsbd29v75G8vDwjrAbs2bNnWWxsrA8w
-        tO/x8/PrAxXxAzHI3yBn8wCxNNArDWfOnDmC1QCQ85KTk2cANZsCFTBhUQQyiM/Q0DCYg4ODjVCAkiQP
-        ADBk5tzXJg/8AAAAAElFTkSuQmCC
-
-  
-  
-    
-        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
-        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAt1JREFUOE+V030s
-        1HEcB/DfeUrDsd1wtNap8xTNnIcjj5vCRIfWZfOUKKeIowcP1ehhkTxlidrE1GweNg8RFksoD5kwI+c0
-        PUhUl4c7ws+7a23MUOv7z2ef7z6f13ff7fOhEJucwOoc+k42w3FuQVGru2V2amV+YKAtJL5ns9p1d0a8
-        QqXAEnHWjW7xYvbQNFIFkzheO4f9pa0r5iXp7cyMMOstEbNrRbTQBlFv7SiJwW8k3k1L43cS9WMkkl4u
-        wfaxAHLcComcTbr7BsSY70IJ6GpprhCSEEgbv86TmPlJYlIah6V5mRQ93fYROrc7oBt/Z0bVOUpnHWJf
-        H3PoXM8bNH8mMTpLQiRtlixJgYU/ecW4BIkjfeC2PYNlWQ7YpfySdQCrJqzgQucw6j6R6PtB4oOYxIT0
-        9d+xQ7SIlKlKXBxpAE+QA5+BZNjWRs3TvE0UVxGtfLfOE41dKBhdxpMJEu0iEnUiIe6LqnB9/C7ihHkI
-        63oFl6o6eLamgVXIB9WTvXcV2J7Afu1QlI8r3QtIHVlGikCIiP4ExLyNx/nhS4gcjENobxqYmR0wzEuG
-        6lk/KDiaGa99gxP9UDe5H/6VX8BrnYFvSwdcazg40nQM3Oe+cH3qDfcmfzg38kG/Gg31dPtFwpiutAbo
-        Z7rKBtRgX9oQXB+9h1v5GCweRMKswA7sYgeYFtvBoNAKzCJrqCU6Q+mMXdXGeTDKfSHjXw31yz3QSx2C
-        UZYAzJRy7E6yAOOWCTRuGoKWoQ95vwOL8hyG5UZAjb+DYGQIiYMFIPyqIBPaCNmTuaCGGkA1WhfUWCa2
-        hTNXKFZOvK1HWjFYnVCNLSO0k0nCMAWEjQsoXrugHGgAFR+2hGLqlE1ouVH/vhN0D3UVVsg9E27ShElQ
-        sNgsIlxsfCp6UoHl20nR804n6B7afwdodjKE9mFNBSNfayo72EvZPIgryzzqRjA4LGKPpwah6Sjzz638
-        n4JfHjGLP3wxItMAAAAASUVORK5CYII=
-
-  
-  
-    
-        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
-        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAA1lJREFUOE91U21M
-        k2cULdo5E5Rs4sSIn9nMkv0YaWKUhEZi5Ac2Gn8gGn+MZpBQSJlTERGrIsqCAdwyKlgxxLUMAik2La3S
-        lq/SVtpiV6At9AMofWmR0gIbSRkSpGdv34QY0d3k/rj3yTm557n3xNA2hFAo3M9kMnPi4uLS6HT6IfJ5
-        UyQS8c/MzOhcLtcfGRkZwxsx63WMWq2+EwzNvvWFCFinBmEc10Hn6kG/uw82YgiE3xux2WzPRCJR7Eck
-        MplMSLzxwjCmhcalRp+7E/3jGmjHuiAfFqN5oAGiV0/w2mmAw+EwVFVVvSeRSCR5nqkJqOxyyK1iSAab
-        YJ8awnqobFIUy7JR0HYB+S2ZUJgksFgsT6gpMjMztzidzoByWIpmSz2Erx/hqaEKr5zdILVTWd15FUf5
-        dByp2QzG75txrHon7Hb7u8rKyq9pJSUlJ71+DwTGB1CMtGBo2ogOVzNcM8NYWVlBOBxGv1ONZtNDNJl+
-        Bed5CpgNn6FF/xRyubyYVltb+7NlwoQKYwF0biVWV1exvLyMxcVFzM3NYXZ2lspgMEjVAv1VnJVsBV9z
-        EzqdTkyrqam5YZ7oR1bvd2gzNMDj8cDtdoMgCAoYCoXg8/moHjk26nuvIKdnGxqMpdBqtVLaT2RMz/nA
-        Usbi/Msd+LF9Ny692APVgAjz8/MUyXMDD7+o96NMtQ+3tLtw2fAF+lyyqAQRLTk5+czCwgLu6i/iB/N2
-        cAe/xC3rV+j8S4jJyUkqFdYbqHfuRa0jEZUju0kSBsL/hlFeXn6fFh8fv10sFv8zPU8gh5TBGUzAdete
-        dJj+hN/vRyAQwMuRMjxyfovfHIdx2/gNBsgb8Xq9kbS0NCa1ShaLdS+qzxscw+XuU2DrD4ErY6JQnI7i
-        NhZudqeAZ05CoSoZ7fom6p8EAkE3CY1Zv8itXC63R6PRYGlpCV2j7XjQdwnXVGdRqDyN0g42Hr+ogKpL
-        CZPJBIVCQTAYjAMfnHNCQkIsaRQRybxmNpup8aOri25gdHQUSqUSUqk0UldXN5CUlHTwk4bKzc3dmZ2d
-        Xc3j8QJ8Pn+tsbEx0traGiEdulZUVPR3Xl6eOD8///v/cyPVT01NpWdlZSWSZMc5HM65aJKgE2w2+2B6
-        evrnG8H/AbmrVcjwu0QfAAAAAElFTkSuQmCC
-
-  
-  
-    
-        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
-        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAbFJREFUOE9jYCAD
-        rO/vF9gxc6YGGVoZGO5t3qz/7eixZ58OHfr3ZsmSQpIMuXf0qPuDLVs+P+vr//9swoT/j5ublxJtwI+X
-        a4IfX9v8fV9F4/8TXd3/L2RkHFsZEiJKlAH/3q3M+XU16s+nQ37/dy2f/D/X03Otj7ExF0HN//8zMP59
-        s6j958Wgf1922fy/1Kv6b0+jZhNQIyNBzTNnzmT9+2rmwj8XvP5/2GD2/2yP3M/dDRrxBDWCFOzfP4Xn
-        7/PeHb9OOv9/vdTg/6kOxXdbKtUdidJ86fhs8T/Pms/8OGj7/9kczf/HmhXvLi9T1SRK8+OrS1V/P6q4
-        83W72f8Hk1X+H2lUOj4tQ0mMKM2v7m8z/HUv49Wntfr/b/Uq/j/QpLqmN0SGkyjN9fX1LN+eHrz0bpnh
-        /wut8v/2Nal04whpUOjDMMLsR7cv5F7e2fd/Rav3y2xvsXxRUQYeoKwAEAsDMSixiEMxyDsgMW4gZoKZ
-        wGllqrNcX1O2iZmZ2QsoaA/E5kCsD8RqQCwPxBJQjXxAGpSAWJC9BnISOxCDbAVJsgExM9QGwgmGqEDC
-        owgARBuwPYj2XjEAAAAASUVORK5CYII=
-
-  
-  
-    
-        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
-        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAA2RJREFUOE91U2tM
-        U2cYLoZsGlynqZEsZlziH5FMZNNIZjN01IgkeAmwxBvdmBZYQ/ZnbDISM5EsDsyGEAgkKtIak6ZaWopa
-        2lKhdcWWyyzt2gOsp6c9xdILF40SEOiz05MYI+qbvD++78vzvO/7Pe8Tx1kVHR0dSXw+/3sulyuIj49P
-        ZZ7XRKNRfyAQMI2Njd0oKCiwrca8Osdptdrz4WBwYdbnxZTtH9BmE7z9Bvge9iMw+hiTXipqt9vbJRJJ
-        wlskKpWqI0BRoP82wterhbfnLjzqTrgVMozLpCCk12C/3gbS8ggul2ugvr7+NYlCoSjzu91w31PDq9Ng
-        PhKGT68B0d4GZ+sVkEo5nnrcGDxfiQfffQNblwIjIyNtbBdFRUUfEAQxNdatgktyDc8YcCxWlpfhvPI7
-        hn86g6WFBSwuLiJIeXAnfTNupW2G0+FYrqur28qpqqrKeeIh8bjhD9jqamC+8DNCfhrMx2Fp6SXmX7zA
-        3NwcJmkaurNH0bttHe5uXYthyVWo1epfOM3NzT9SQ1ZYz1XAcGg3dGkJ0B/ehWDgCaanpxEKhRAMBmH9
-        IR/j/I9h28PFw4z1GLxUDZPJJOc0NjaeoyxmaPd/hp609TDv2oCJ9gYWFMtwOIxIJIKAQYVgQSroAzzY
-        926EreECjEajklPBxAzTsnIbF4bPeZiQt7NVYyAv8S9GjXpQjDoejwd+az9Cwp34L2cTSG1XbAQJJysr
-        K39mZgZG8Un0Zn0Ca9dttjIxaAYt2oPIt+kY0XSypL4JAp6zX2L0xBeYf/4ctbW1Fzk8Hu8juVw+N0t7
-        ocvZDmP2p9D/+RuIUzsxfzwZCydTEBamY1h2FePir0EeSwVp0sW6igoEAj4rZV5eXo3D4UCEnMCDEwIM
-        7E2E6+AWUPlJ8B9LxiST1JEkWAt34NHtmyBJEq2trb0MNO7VRq4Vi8WGvr4+Vrbx+50Y+FUEkzAHptP7
-        0F9RBO1fNdD3aGCxWNDd3e3NzMxMfmOdExMTExijSBjmlaGhIfj9fnZumtHf6XRCo9FAqVRGW1parBkZ
-        GSnvNJRIJNpUUlJyubq6eqqpqWlFKpVGZTJZlHHoSmVl5WxZWZm8vLx8x/vcyN5nZ2fHFxcXb2HIviot
-        LS2MJQPaLxQKU3Jzcz9cDf4f0wBQ+Ip15d4AAAAASUVORK5CYII=
-
-  
-  
-    
-        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
-        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAAewQAA
-        HsEBw2lUUwAAAWNJREFUOE+N0csvA1EUx/ErsbT1B9jYSfwLrGzYWPkv2LIVSwmJHYloUU00kZDQSFOv
-        SOrRTFtBK1WPmmpNr760nZnOV0uCours7jm/zz3JvS2AqCtDWHFRbdImWtvrR2+nKvgsK4Xpx4xghCmd
-        kj3GKNYFahd9VCWNcUJFxbxHD1M8JecmZsOqfDVfQN6DEaWi1UBRIbeNdHI1iqr8BiyL9DJGBEqYcV4O
-        kaskpjnqIehssCG5RGEL/ZpSkMwG6hSBIVyC4HoDkNjjaRLpIDXL7RiBPtyCecHTXQNQzHIxQnyU2DDn
-        gxx0YRfszzd+perkZpezXkL9HHazKpjrJKv9CXQd/ziPTrwDLAp8jm/p2i9/b52scDnDQgcTgodoc5BP
-        JuRtRFlf8yzYM/K5OXjOFB6Tcmdfca15tfQ/gJRZVU15vccOx6amyeYbymU9FArbbC6fTzFNszl4T+Ry
-        +Z/R984rn0GmMacbOKoAAAAASUVORK5CYII=
-
-  
-  
-    
-        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
-        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAAewQAA
-        HsEBw2lUUwAAAUxJREFUOE+VU12rglAQ7EL//1f0oI+9mNSLQg9BQRJRGUZBQdiHGib2ZXObvRy4pRYN
-        HNTjzOye3bM/eKBSgCzLKupXtVotovzt0eA/HkJcr1dZl8sFaZoijmPcbrdXqnw/GVB8Pp+FTAO+K4PV
-        aoX7/Z4zeTI4Ho8iVFkocRiGWCwW2G637w1IZNqMRKMkScA93/cxHA7hed57A0agiCan0wmHw0HEruvC
-        sqzPBrvdDlxRFMmT56a40+mg0WjI/iueasCos9kM6/Uay+VSIvb7fTSbTQwGg89dIIPi6XQqy3EcSd0w
-        DDlaEXL3gC0cj8dS8V6vh1arhdFoVCjO3QPFmkwmmM/nME0TmqZJPcqQy4BEVUBG13VdWvmVAdu32WzQ
-        brdRr9cRBMF3BozIYtq2LRns9/vvDDgDvHm1Wg3dbrd0kEqLqMJxCj/hF5B2pm1BgCdyAAAAAElFTkSu
-        QmCC
-
-  
-  
-    
-        AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w
-        LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
-        ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAADO
-        DgAAAk1TRnQBSQFMAgEBBAEAAQwBAAEEAQABEAEAARABAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAFA
-        AwABIAMAAQEBAAEgBgABIP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8AOQABAQMFAQcDDwQU
-        ARsDDQERAwMBBBQAAwUBBwMUARwDGgElAxoBJAMYASIDFwEgAxYBHgMUARwDEwEaAxIBGAMNAREDAwEE
-        EAAc/wH0AvMh/ycAAQEDBAEGJAADAwEEAw0BEQMgAS8DNwFbA0ABcAMyAVEDHQEpAw0BEQMDAQQMAAMU
-        ARwDPgFrA0oBigNIAYgDRwGDA0UBfQNDAXgDQQFzAz8BbQM7AWUDLwFKAw8BFBAAFP8B+gL5Af8B2gLU
-        Af8BrgKjAf8B0QLKAf8D/Bn/JAADJQE3A10BvgMIAQsbAAEBAwcBCgMYASIDMwFSAVECTwGlA1gB3QFS
-        AlABowNQAZ4DRQF9AzIBUAMcAScDCwEPAwIBAwQAAWUCXAHqAXsCZgH1AWMCWAHpAV0CVwHfAV4CWgHV
-        AVsCWAHLAVsCWQHDAVgCVgG8A1UBtQNTAaoDRgGAAxgBIhAAFP8B8gLvAf8B6wLnAf8BzALAAf8BuAKo
-        Af8B7wLtGf8UAAMLAQ8DLwFKA0IBdQNCAXQDWAG2A1UBqgMRARcDBAEFEAADAwEEAxEBFwMoATwDSAGG
-        AV4CWwHlA2IB/wNJAf8DQQH/A1cB3wFSAlABpANPAZwDRAF7ASwCKwFDAwsBDwQAAY4CagH5Af8C9AL/
-        AuQB/wH9AuMB/wH7AuAB/wH8AuQB/wH9AuUB/wH5AdkB2AH/AcsBxQHZAf8BgQFrAW0B9wNLAY4DGwEm
-        AwABAQwAFP8B9QHxAfAB/wHvAeoB6QH/AdEBxAHBAf8BwAGxAa4B/wHwAe4B7Rn/CAADJAE1AygBPQNA
-        AXADhQHmA+EB/wPqAf8D6gH/A+EB/wNsAdUDOAFeAxgBIQMJAQwMAAMOARMDOgFhAVsCWQHDAXMCbwH+
-        A2UB/wNgAf8DWAH/A0UB/wNEAf8DPwH/A1oB2wNRAaEDQwF4AxYBHgQAAY4CagH5Af8C7gH/AfsC3AH/
-        AfwB2QHWAf8B+AHTAdAB/wH5AdUBzwH/AfsB1QHNAf8B9gHLAcUB/wHUAcABzAH/AYIBbAFtAfcDSwGO
-        AxwBJwMAAQEMABT/AegB6gH0Af8B2wHiAe8B/wGxAbQB0QH/AaQBogG+Af8B8AHvAfEZ/wgAAzEBTwOY
-        AfQD1gH+A/QB/wPlAf8D/QX/A/wB/wPxAf8DjQHrAzEBTwMSARgMAAFJAkgBhwFtAlIB9wOCAf8DbgH/
-        A2IB/wNZAf8DaQH/A0QB/wNFAf8DQwH/Az8B/wFaAlgB5AFJAkgBiAMaASQEAAGQAmoB+Qb/AfsB/wFn
-        AZcB/QH/Ad4B5QH8Af8BVwGIAf0B/wE5AWYB/QH/AVYBgAH6Av8B/AH0Af8BiAJtAfcDTQGWAygBPQMO
-        ARMDBAEFCAAU/wGpAc0C/wGVAdkC/wEdAaIC/wEAAYYC/wHeAeYa/wgAAyUBNwPMAfwD9QH/A/0B/wP9
-        Af8D/QH/A/0B/wP9Af8D+wH/A+UB/wOOAfEDJAE2DAABYgJXAe8DiwH/A4EB/wNsAf8BigKLAf8BpAKl
-        Af8BngKfAf8DiQH/A14B/wNGAf8DQgH/AVkCVwHrAUUCRAF8AxcBIAQAAYoCbQH3Bv8B+wH/AUYBhgH+
-        Af8BxQHYAfwB/wHhAeIB9wH/AREBUAL/AcMBygH4Av8B/gH6Af8BowKUAfsDUwGsA0cBgwE1AjQBVQMb
-        ASYDBQEHBAAQ/wL6Av8BhAHPAv8BqgHpAv8BSgHAAv8BAAGlAv8BqAHKGv8IAANdAbQD5QH/A/QB/wP0
-        Af8D8gH/A+gB/wP0Af8D9AH/A+QB/wPgAf8D0AH/A20BxwwAAWUCUgH0A4cB/wOYAf8BsgK1Af8BgQJx
-        Af8BVQJKAf8BRwJDAf8BXAJfAf8BhwKIAf8DgQH/A2EB/wFZAk8B8gMuAUgDDQERBAABgQJiAfYE/wFk
-        AZwC/wEbAYcC/wHJAd0B/QH/AWYBlwH9Af8BvQHOAfkB/wGBAYwBuwH/AYMBhQGHAf8BagFtAW4B/wNb
-        AdkDUgGoA1ABmgM+AWsDGgElAwMBBBD/AcIB4QL/AT4B1QL/AUkB1AL/ASwBxwL/AQABrQL/ASIBnQL/
-        Ae0B8hb/BAADBAEGA7kB+AP0Af8D7QH/A7gB/wOUAf8DqgH/A9IB/wPcAf8D5gH/A+EB/wPUAf8D0gH+
-        AxQBHAgAAXcCaQH4A84B/wHDAsQB/wGPAoEB/wHBApIB/wHXAp4B/wHLAo4B/wFbAkIB/wGEAocB/wF/
-        An4B/gFeAlwBzgNBAXIDDAEQAwIBAwQAAYECYgH2CP8BcQGmAv8B3QHoAfkB/wHGAdoB+AH/AY8BigGZ
-        Af8BtQGmAZkB/wH2AdUBrwL/Ad8BtAH/AfMB0gGsAf8BpwGZAYoB/wNZAckDTwGbATUCNAFVAw0BEgz/
-        AfIB9wL/AW0B2AL/AXYB5QL/AWwB4AL/AU8B1wL/ASkBxQL/AQABpAL/AaABxBb/BAADFAEbA9UB/wPt
-        Af8D9AH/A+gB/wO+Af8D4AH/A98B/wPXAf8D3gH/A+AB/wOaAf8DuwH/AyABLwgAAzACTAJLAY8BXgJc
-        Ac4BdQJrAfwB6gLZAf8B7wLRAf8BzwKWAf8BYQJUAe4DUAGdAyoBQQMHAQoDAQECDAABhQJnAfYB9AL3
-        Af8BigKLAf8BZAFiAV8B/wGuAagBpwH/Aa8CogH/AcIBsAGjAv8B5gG3Av8B5QG4Av8B5gG5Av8B5QG+
-        Av8B6QHAAf8BqQGaAYoB/wNSAakDRAF5AxYBHgz/AcMB6AL/AY4B7AL/AagB7wL/AZwB6wL/AXcB4gL/
-        AUQB0gL/AQABugL/AQABoAL/AeMB7BL/BAADCAELA8YB/APiAf8D6gH/A9IB/wPrAf8D6wH/A+sB/wPr
-        Af8D6QH/A7wB/wOOAf8DhwH+AxIBGBMAAQEDDQESA0ABcAFYAlYBuQFSAlEBoQEsAisBQwMNARIDAQEC
-        FAABWQJXAcIBYQJcAdwBXQJVAe0BXgJaAdUBYQJcAdwBfAFzAXQB+gH9AeIBvAL/AekBwQL/AfABxgH/
-        AbABoQGEAv8B5gG6Av8B5wG/Af8B+gHXAbAB/wNbAdkDSAGFAxkBIwz/AaYB6gL/AbkB9QL/Ad8B+gL/
-        AdMB+AL/AbUB8QL/AZEB5wL/AVUB0gL/AQABrgL/AbQB0xL/CAADZAHAA9YB/wPjAf8D4QH/A+QB/wPk
-        Af8D5AH/A+MB/wPIAf8DlQH/A3YB/wNlAdAbAAEBAyUBNwE1AjQBVQE/Aj4BbAMkATUDEQEXAwMBBBQA
-        AwYBCAFWAlUBtAFZAlcBvwNSAakBXAJYAdEBhgF5AXoB/AH/Ae8BywL/AfgB1wH/Ac8BxAGlAf8BSgFN
-        AVUB/wGYAYsBagL/AekBvAL/AegBuwH/AWcCWQHyA0QBeQMWAR4I/wL+Av8BpwHuAv8B2wH7Av8B+AP/
-        AeUB/AL/AccB9gL/Aa0B7wL/AZIB6AL/AT0BywL/AaoB0xL/CAADJgE4A8AB+APQAf8D2AH/A90B/wPU
-        Af8D1AH/A8kB/wOFAf8DuwH/A+MB/wOiAe8DBgEIEwABAQMQARUDHgErA0MBeANAAXADOgFhAyQBNQMQ
-        ARYDAwEEGwABAQMAAQEDAAEBAWACWwHWAf8B8gHTAf8B7gHpAdMB/wE8ATsBNgH/AegB3QG8Af8CQwE9
-        Af8B0wG+AZ0C/wHfAbcB/wFeAloB2AE1AjQBVQMNARIM/wG+AfQC/wHeAfsC/wHtAf0C/wHkAfwC/wHR
-        AfcC/wG8AfMC/wGqAe8C/wF2AdwC/wHRAecS/wwAAygBPAN1AdQDtQH/A70B/wPHAf8DzgH/A48B/wOv
-        Af8D9AH/A/sB/wPvAf0DCwEPEAADBgEIAxABFQNQAZ4BXAJaAc0BWwJZAcQBQgJBAXMDMwFTAyABLgMI
-        AQskAANEAXsB7QHWAcYB/wGhAZ0BjQH/AukB0wP/Ad0C/wHxAcoC/wHxAcIB/wG/AawBnAH/AU4CTQGV
-        AxsBJgMDAQQM/wHuAf0C/wHNAfsC/wHnAf0C/wHkAfwC/wHaAfoC/wHOAfcC/wG6AfMC/wGjAeAC/wH9
-        Af4S/wwAAwkBDANxAd0DpQH/A6AB/wObAf8DywH/A6kB/gOjAe8D/gH/A+oB/wNSAZsUAAMIAQsDUAGd
-        A0QBegFFAkQBfAFJAkgBhwFRAk8BnAFKAkkBiQMUARsDAwEEJAADBAEGAVoCWAHAAe8B2gHJAv8B+AHY
-        Av8B8wHPAv8B6wHFAf8ByAG2AaYB/wFbAlkBxAMdASoDBgEIBAAQ/wHrAf4C/wHPAfwC/wHbAfwC/wHa
-        AfsC/wHOAfgC/wHMAfIC/wH3AfsW/wwAAw0BEgOxAfED8wH/A/EB/wPfAf8DQgFzAxQBHAMFAQcDMgFR
-        AykBPxwAAxgBIgNUAa4BZgFPAUkB7wFhAVsBWgHhA0oBigMSARgDBAEFLAADBAEGA0QBewFgAlsB1gF5
-        AmYB9AFdAlkB1wFHAkYBgAMSARgDBAEFCAAU/wH6A/8B3wH9Av8B3gH8Av8B6gH7Hv8QAAMZASMDTAGL
-        A14BsQNMAY0DBQEHHAABQgFNAT4HAAE+AwABKAMAAUADAAEgAwABAQEAAQEGAAEBFgAD/4EAAfgBHwEA
-        AQ8CAAH/AZ8B8AEHAQABDwIAAf8BjwHAAQEBAAEPAgAB+AEHAYABAQEAAQcCAAHAAQMBgAEBAQABBwIA
-        AcABAwGAAQEBAAEDAgABwAEDAYABAQEAAQECAAHAAQMBgAEBBAABgAEBAYABAQQAAYABAQGAAQcEAAGA
-        AQEB4AEfBAABwAEDAfABHwQAAcABAQHgAQ8BwAMAAeABAQHgAQ8B+AMAAeABAwHgAQ8B+AEBAgAB4AEH
-        AfABHwH8AQMCAAHwAX8L
-
-  
-  
-    
-        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
-
-  
-  
-    
-        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
-        HdfAfwC8OWB2rvuFqgAAAABJRU5ErkJggg==
-
-  
-  
-    
-        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
-
-  
-  
-    
-        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
-        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAAK7wAA
-        Cu8BfXaKSAAAAyRJREFUOE9Vk3tIUwEYxWeiFZHNICkIojAsMBmJJRkhGiKZGUUPSkoriVolzSiopMyw
-        1NCsiZr0QE0LjVDzUc3HFJ1uaWsmPipd6dbcarO0bGqdzl3+sS78uJd7v3Pu9333XBeR05GaWuk19s0m
-        9ZjvFuEpnuM9NWWH0WR5b/lirunrV99vbHxuZPkkgbPOcZ2fr91R8rDFavpsxuDoFLSWSagNP6Hu/wxF
-        rQJXk7Ise/ccjWGpmLj+ZyCIm+q7p38B0E0BRp6HfgMDdkA7AdSagAZ1N26kZtpDQiJOULyIzHKYCG0X
-        FzVZxyl62tGDu0UFoA76aaCb4ld80E7qbECVUoMzp8+ZxGJxJKULiIso8WJhkkE/DA2LegxGuHG+0sZm
-        DNOklzQMfcdl+QO0jgGVvJmfk42AgIA8in2Jm+h6SklH38gPDLL1bxRUaF5jnqsLqnsG0WqewGJPD0Qf
-        l0HJDpq+AiU1LdgWsbWd4p3EU5SbXTbabhiHngv4IECTW6WVCN0YiECJH8oVSvRZuVQaqASDhl4ciT1g
-        oDiBLBXdziy2tQxY8e4noLECaraqpdH28DDcy89FaFYoNt/ajCdvnuPjD6BQ0YVDB6OHKb5CVogunpdr
-        WnXvUfeF83LbTWag7TsX+tYMnXEUQTcCcV+XhYSqk5A+jUdHVz+Oxh3upDjZYRB3JPFKbUUFyvWAggYv
-        uag6A1A/wnFotDbFD9kdyUhUxWKXYhXCC4IQL4/XUZxIlomCg8OXJyfdtLxQqlBOcS2p+gg8o2E/55Zc
-        XwOpcgt2N/hAqg1A+tcoBN1bbaf4ElkuRMF93764mLRrGfbyGgXKev+gmp3UkwF+WkmaL2TqMJx664+r
-        I5HYVCKZYOMF1F1wdOAIA+MZEhIplcWfNd2R30RRWRUKq9vQ2fsJ/pl+kI/EYH/zBoTmBFtYW0ZSSNhM
-        mByBFGLpJSTM3399XtS2rW2HYw8MlT5+ZJOkrZmWpPvaYzNiVKwpnnnzuhnxvzjPHMIPIsRTSJgQEhkR
-        Np1GMkgqOUb8yFxnofO1MI47WUiWkhVkJfEh3mQJme0s+Au+QgUxI1c9OgAAAABJRU5ErkJggg==
-
-  
-  
-    
-        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
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AwMDAQoKCgEQEBACFBQUAhUVFQEVFRUCFhYWAhcXFwEWFhYBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAwAAAAYDAwMHCQkJCgYGBgsAAAANAAAAEAAAABAAAAAP
-        FBQUCxISEggeHh4EEhISAgcHBwEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAUAAAAK
-        AAAAEAAAABcAAAAdAAAAIwAAACsAAAAxAAAAMQAAAC0AAAAlAAAAGgAAAA8FBQUJBwcHBgEBAQMAAAAB
-        AAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAQAAAAIAAAAIAAAADgAAABcAAAAiAAAALQAAADgAAABIEhISZGJiYruBgYHc
-        YGBguBYWFl0AAAA1AAAAJQAAABkAAAAPAAAACQAAAAQAAAACAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAABAAAABgAAAAwAAAAZ
-        AAAAJQAAADYAAABHAAAAWwEBAXN6enrhvLy8/8jIyP+urq7/eXl57AsLC1YAAAA7AAAAKgAAABwAAAAR
-        AAAACAAAAAQAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAQAAAAIAAAAHAAAAEQAAACAAAAAyAAAARAAAAF0AAAB6NDQ0sru7u//j4+P/
-        4+Pj/8nJyf+YmJj/Ly8vkwAAAEoAAAA5AAAAKAAAABcAAAAMAAAABQAAAAIAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAgAAAAS
-        AAAAIAAAADQAAABJAAAAaQQEBI+Ojo7w29vb/+zs7P/i4uL/ysrK/5ycnP8sLCyPAAAATgAAAD0AAAAr
-        AAAAGgAAAA4AAAAFAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAABgAAAA4AAAAZAAAAKgAAAEgAAAByQUFBvcPDw//r6+v/
-        6urq/9zc3P/Dw8P/lpaW/x0dHWoAAABEAAAANQAAACYAAAAXAAAADAAAAAQAAAABAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAD
-        AQEBCAAAABIAAAAjAAAASgsLC32amprz4ODg/+/v7//l5eX/1tbW/7u7u/+KiorzAgICPwAAADIAAAAl
-        AAAAGgAAABEAAAAIAAAAAwAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAgENDQ0EAAAACgAAACQAAABTUlJSt8nJyf/u7u7/
-        7e3t/9/f3//Pz8//srKy/35+fs0AAAAkAAAAHgAAABUAAAANAAAABwAAAAQAAAACAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAQAAAAEAAAABAAAAAQAAAAEAAAACAAAAAQAAAAEAAAABAAAAAQAAAAEAAAAC
-        BwcHAhYWFgQICAgPAAAANRISEm6lpaX35OTk//Ly8v/o6Oj/2dnZ/8nJyf+rq6v/dnZ2nQAAAA8AAAAM
-        FBQUCAoKCgUAAAADAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAEAAAACAAAAAwAAAAQAAAAGAAAACAAAAAkAAAAK
-        AAAACgAAAAkAAAAJAAAABwAAAAcAAAAGAAAABgEBAQcGBgYIAAAADgAAACUAAABRYWFhv87Ozv/y8vL/
-        8PDw/+Li4v/U1NT/w8PD/6ioqP9FRUVtWlpaBEBAQAMlJSUDCwsLAQAAAAIAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAwEBAQQAAAAG
-        AAAACAAAAAsAAAAPAAAAEwAAABYAAAAZAAAAGgAAABoAAAAaAAAAGgAAABgAAAAWAAAAFAAAABMAAAAT
-        AAAAFQAAABgAAAAjAAAARBsbG3murq776Ojo//b29v/r6+v/3Nzc/8/Pz/++vr7/qqqq/zs7O0IrKysH
-        KysrBSAgIAMHBwcCAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AQEBAQICAgICAgIEAQEBBwEBAQsAAAAPAAAAEwAAABYAAAAbAAAAHwAAACUAAAApAAAALAAAAC4AAAAw
-        AAAAMAAAADAAAAAuAAAALAAAACkAAAAnAAAAJgAAACYAAAAoAAAALQAAAEIAAABgb29vzdPT0//19fX/
-        8/Pz/+Xl5f/W1tb/y8vL/7y8vP+qqqr+ICAgIgAAABMAAAAPAAAADAAAAAoAAAAHAAAABQAAAAMAAAAC
-        AAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAADAwMBBwcHAwcHBwUCAgIKAAAADgAAABMAAAAYAAAAHwAAACYAAAAq
-        AAAALgAAADIAAAA4AAAAPQAAAEAAAABDAAAARQAAAEYAAABGAAAARgAAAEQAAABBAAAAPgAAAD0AAAA8
-        AAAAPAAAAD8AAABHAAAAXiQkJIuysrL+6urq//j4+P/u7u7/39/f/9HR0f/Hx8f/wsLC/52dneMAAAAk
-        AAAAIAAAABwAAAAZAAAAFgAAABMAAAAPAAAACwAAAAgAAAAGAAAABAAAAAIAAAABAAAAAQAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAEICAgCCQkJBQcHBwkAAAAQ
-        AAAAFwAAAB0AAAAlAAAALAAAADMAAAA5AAAAPwAAAEIAAABHAAAATAAAAFAAAABVAAAAWAAAAFkAAABb
-        AAAAXAAAAF0AAABcAAAAWQAAAFcAAABVAAAAUQAAAFIAAABSAAAAVQAAAF8AAABub29v28vLy//x8fH/
-        8/Pz/+jo6P/Z2dn/zc3N/8XFxf/MzMz/g4ODwAAAADEAAAAuAAAAKgAAACYAAAAjAAAAHwAAABsAAAAX
-        AAAAEgAAAA8AAAALAAAACAAAAAUAAAAEAAAAAgAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAcHBwENDQ0DBwcHBwAAAA4AAAAVAAAAHwAAACgAAAAxAAAAOAAAAEEAAABIAAAATgEBAVQmJiZw
-        PT09l0VFRa9bW1vEZGRk2GxsbOtubm70bGxs+mxsbPpra2v5bGxs92lpaepqamroZGRk1VVVVcE8PDyr
-        NTU1lSAgIHkAAABqAAAAcCIiIpuQkJD/ysrK/+bm5v/o6Oj/39/f/9PT0//Jycn/ysrK/87Ozv9XV1ej
-        AAAAQAAAADwAAAA4AAAANAAAADAAAAAsAAAAJwAAACMAAAAdAAAAGQAAABUAAAARAAAADQAAAAoAAAAH
-        AAAABQAAAAMAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkJCQEQEBAECQkJCAAAABAAAAAaAAAAJgAAADEAAAA8
-        AAAARQAAAE0JCQlYPT09iFdXV7V+fn7gg4OD+35+fv96enr/eXl5/4GBgf+Li4v/lZWV/5ubm/+kpKT/
-        paWl/6Wlpf+lpaX/m5ub/52dnf+RkZH/hYWF/319ff+Dg4P/iIiI/4eHh/FwcHDOampq6ZGRkf+3t7f/
-        y8vL/9HR0f/Ozs7/yMjI/8TExP/X19f/w8PD/zk5OYsAAABNAAAASQAAAEUAAABBAAAAPAAAADgAAAAz
-        AAAALgAAACgAAAAjAAAAHgAAABkAAAAUAAAAEQAAAA4AAAALAAAACAAAAAYAAAADAAAAAgAAAAEAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkJCQERERED
-        CgoKCAAAABEAAAAdAAAAKwAAADgAAABEAAAATxMTE2FKSkqdfHx8zJSUlPqOjo7/jo6O/5ubm/+np6f/
-        uLi4/87Ozv/i4uL/6Ojo/+zs7P/t7e3/7e3t/+zs7P/s7Oz/6+vr/+vr6//s7Oz/7e3t/+3t7f/t7e3/
-        5+fn/9nZ2f/Hx8f/tLS0/6Ghof+ZmZn/np6e/6Ojo/+rq6v/sbGx/7S0tP+0tLT/uLi4/9bW1v+qqqr/
-        IiIidgAAAFkAAABVAAAAUQAAAE0AAABIAAAAQwAAAD4AAAA5AAAAMwAAAC4AAAAoAAAAIgAAABwAAAAX
-        AAAAFAAAABIAAAAPAAAACwAAAAkAAAAGAAAABAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAPDw8BERERBgAAAA8AAAAdAAAALQAAADwAAABLAAAAVzw8PIV1dXXB
-        oaGh+Zubm/+goKD/r6+v/8LCwv/V1dX/4ODg/+fn5//s7Oz/6urq/+bm5v/i4uL/29vb/9TU1P/Pz8//
-        y8vL/8bGxv/ExMT/xcXF/8rKyv/MzMz/0NDQ/9bW1v/e3t7/4+Pj/+jo6P/r6+v/7Ozs/+Hh4f/IyMj/
-        tLS0/6mpqf+rq6v/paWl/5qamv+rq6v/vr6+/4mJifoEBARlAAAAYAAAAF0AAABaAAAAVwAAAFMAAABP
-        AAAASQAAAEUAAAA+AAAAOAAAADIAAAArAAAAIwAAABwAAAAYAAAAFgAAABQAAAARAAAADwAAAAwAAAAJ
-        AAAABQAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAEAAAACAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAQMDAwEKCgoBFBQUAwYGBgwAAAAa
-        AAAAKwAAAD0AAABNAAAAXUlJSZibm5vgqKio/6enp/+2trb/y8vL/9bW1v/c3Nz/5eXl/+rq6v/m5ub/
-        3d3d/9DQ0P/AwMD/rq6u/6Ojo/+qqqr/tbW1/7u7u//Dw8P/yMjI/8zMzP/Ly8v/wcHB/8PDw/+5ubn/
-        sLCw/6enp/+jo6P/s7Oz/8fHx//V1dX/4uLi/+np6f/s7Oz/4ODg/8LCwv+zs7P/srKy/62trf+YmJj/
-        Xl5e3wAAAGQAAABjAAAAYQAAAF4AAABcAAAAWQAAAFYAAABSAAAATQAAAEgAAABCAAAAOwAAADMAAAAq
-        AAAAIgAAABsAAAAaAAAAGAAAABYAAAATAAAAEAAAAA0AAAAKAAAABgAAAAMAAAABAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAACAgIBBgYGAgkJCQMCAgIFAgICBgICAgcCAgIIAgICCQEBAQgAAAAIAAAABQAAAAQAAAAE
-        AAAABAAAAAMBAQEGBQUFBwoKCggAAAATAAAAJAAAADoAAABOAAAAYEZGRpiioqLlr6+v/7Ozs//Dw8P/
-        1NTU/9fX1//f39//6Ojo/+fn5//b29v/yMjI/66urv+np6f/urq6/9DQ0P/q6ur//v7+////////////
-        //////////////////////////////////////////////////////z8/P/i4uL/xsbG/7Gxsf+mpqb/
-        vLy8/9TU1P/k5OT/6+vr/+bm5v/Nzc3/ubm5/7S0tP96enrVAwMDZQAAAGMAAABhAAAAXgAAAF0AAABb
-        AAAAWQAAAFYAAABSAAAATgAAAEkAAABDAAAAOwAAADEAAAAmAAAAHgAAABwAAAAbAAAAGQAAABcAAAAU
-        AAAAEAAAAA4AAAAMAAAACAAAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEAQ0NDQQJCQkIAAAADgAAABMAAAAY
-        AAAAHgAAACQAAAAoAAAAJwAAACAAAAAXAAAAEgAAABAAAAAOAAAADwAAABIAAAAWAAAAIAAAADEAAABJ
-        AAAAXzU1NYyenp7ftbW1/7e3t//IyMj/1tbW/9fX1//f39//6Ojo/+Pj4//Q0ND/s7Oz/6ioqP/FxcX/
-        6Ojo////////////////////////////////////////////////////////////////////////////
-        //////////////////////////////////////r6+v/U1NT/srKy/66urv/Ozs7/4+Pj/+vr6//l5eX/
-        yMjI/7u7u/+pqanhPz8/gwAAAGAAAABeAAAAXQAAAFsAAABZAAAAVwAAAFQAAABRAAAATQAAAEcAAAA/
-        AAAANQAAACkAAAAgAAAAHAAAABwAAAAcAAAAGgAAABYAAAATAAAAEQAAABAAAAAMAAAABgAAAAIAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAELCwsFBAQECgAAABUAAAAgAAAAKgAAADYAAABCAAAAUQAAAFoAAABUAAAASAAAADsAAAAx
-        AAAAKgAAACUAAAAiAAAAJgAAAC8AAAA/AAAAVw4ODnN3d3fCubm5/rq6uv/IyMj/1tbW/9fX1//c3Nz/
-        6Ojo/+Li4v/Kysr/qqqq/7i4uP/i4uL////////////////////////////+/v7/+fn5//Pz8//u7u7/
-        6enp/+jo6P/l5eX/5eXl/+Pj4//l5eX/5ubm/+np6f/t7e3/8vLy//f39//9/f3/////////////////
-        ////////////////6+vr/7m5uf+srKz/z8/P/+Xl5f/s7Oz/29vb/729vf+9vb3+lJSUwhoaGmUAAABc
-        AAAAWgAAAFgAAABXAAAAVQAAAFIAAABOAAAASAAAAD8AAAA1AAAAKQAAAB4AAAAaAAAAGwAAABwAAAAc
-        AAAAGQAAABUAAAATAAAAEwAAABAAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICAgMDAwkAAAAUAAAAIwAAADQAAABD
-        LS0tcDU1NZAMDAyEAAAAiAAAAIUAAAB3AAAAZQAAAFcAAABMAAAARQAAAEEAAABFAAAATwAAAGQ4ODiY
-        rKys7bu7u//ExMT/1dXV/9jY2P/Z2dn/4+Pj/+Tk5P/Nzc3/q6ur/7+/v//w8PD/////////////////
-        //////r6+v/x8fH/5+fn/97e3v/d3d3/3d3d/97e3v/j4+P/5eXl/+fn5//o6Oj/6enp/+jo6P/n5+f/
-        5eXl/+Hh4f/f39//39/f/+Dg4P/m5ub/7u7u//n5+f///////////////////////////+7u7v+3t7f/
-        tra2/9ra2v/q6ur/5ubm/8PDw/+2trb/yMjI8F5eXo0AAABaAAAAWAAAAFYAAABUAAAAUwAAAE8AAABJ
-        AAAAPgAAADMAAAAlAAAAGgAAABgAAAAZAAAAHQAAAB4AAAAcAAAAFwAAABUAAAAVAAAAFAAAAA0AAAAF
-        AAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAACAgIEAAAADAAAABoAAAAsDAwMQ3l5ecKsrKz/rKys/46OjvIoKCi6AAAApQAAAJgAAACJ
-        AAAAeAAAAGwAAABmAAAAYgAAAGYAAABzb29vwL29vf6/v7//0NDQ/9nZ2f/Z2dn/3t7e/+fn5//Y2Nj/
-        srKy/7y8vP/x8fH//////////////////Pz8//Dw8P/j4+P/3d3d/93d3f/i4uL/7Ozs//T09P/6+vr/
-        /v7+//////////////////////////////////////////////////z8/P/39/f/7+/v/+fn5//g4OD/
-        39/f/+Tk5P/w8PD//f39///////////////////////c3Nz/rKys/8zMzP/m5ub/6+vr/8zMzP+ysrL/
-        xMTE/6WlpcMUFBRdAAAAVgAAAFQAAABTAAAAUQAAAEoAAAA+AAAAMQAAACIAAAAWAAAAFAAAABcAAAAa
-        AAAAHgAAAB4AAAAaAAAAFwAAABgAAAAXAAAAEAAAAAYAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAgIEBAQKAAAAFgAAAChWVlaN
-        v7+//9vb2//Z2dn/yMjI/66urv91dXXlJSUlsgAAAJUAAACIAAAAggAAAIAAAACBExMTjpaWluG9vb3/
-        xsbG/9jY2P/a2tr/2tra/+Li4v/i4uL/w8PD/6ysrP/j4+P/////////////////+Pj4/+jo6P/d3d3/
-        3d3d/+Xl5f/x8fH/+Pj4/9zc3P/z8/P/////////////////////////////////////////////////
-        //////////////////////////////////////39/f/z8/P/5+fn/9/f3//g4OD/7u7u//z8/P//////
-        ///////////5+fn/ubm5/76+vv/i4uL/7Ozs/8/Pz/+tra3/uLi4/9fX1+Y9PT13AAAAVAAAAFMAAABR
-        AAAASwAAAD8AAAAuAAAAHgAAABQAAAAUAAAAFgAAABoAAAAdAAAAHgAAABwAAAAaAAAAHAAAABsAAAAS
-        AAAABwAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAgICAhEREQYAAAAOAAAAGomJia7U1NT/8fHx/+/v7//k5OT/1NTU/8DAwP+np6f+
-        cHBw2yEhIZsAAACKAAAAliAgIKmmpqbvvb29/83Nzf/a2tr/29vb/9zc3P/l5eX/2NjY/7CwsP/IyMj/
-        /Pz8////////////+Pj4/+Tk5P/c3Nz/3t7e/+zs7P/6+vr///////v7+/9wcHD/YGBg/3p6ev/r6+v/
-        ////////////////////////////////////////////////////////////////////////////////
-        ////////////////+vr6/+rq6v/f39//4eHh//Ly8v//////////////////////zc3N/7W1tf/e3t7/
-        6+vr/9HR0f+np6f/s7Oz/+Li4vyBgYGWAAAAUwAAAFEAAABMAAAAQQAAAC4AAAAdAAAAFQAAABYAAAAZ
-        AAAAGwAAAB0AAAAdAAAAHAAAAB8AAAAhAAAAHwAAABQAAAAHAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMBHh4eAi8vLwYXFxcL
-        W1tbe8TExP/v7+//9/f3//Hx8f/o6Oj/3Nzc/8zMzP+vr6//g4OD/kNDQ9swMDDDra2t9729vf/R0dH/
-        29vb/9vb2//e3t7/5OTk/83Nzf+urq7/6Ojo/////////////Pz8/+rq6v/b29v/3t7e/+/v7//9/f3/
-        ////////////////z8/P/01NTf9zc3P/hYWF/8PDw///////////////////////////////////////
-        //////////////////////////////////////////////////////////////////////r6+v/n5+f/
-        39/f/+bm5v/7+/v/////////////////3t7e/7Ozs//d3d3/6+vr/8rKyv+hoaH/rq6u/9zc3P+mpqa8
-        CwsLUgAAAEwAAABBAAAALQAAAB4AAAAZAAAAGgAAAB0AAAAgAAAAHwAAAB0AAAAeAAAAIwAAACcAAAAh
-        AAAAEwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHFxcQN/f38MlpaWxtbW1v/09PT/+Pj4//Ly8v/p6en/
-        2dnZ/7e3t/+Ghob/c3Nz/66urv+8vLz/1dXV/9zc3P/c3Nz/39/f/+Pj4//BwcH/tra2//f39///////
-        //////Ly8v/e3t7/29vb/+zs7P/9/f3////////////////////////////p6en/Tk5O/2tra/98fHz/
-        39/f////////////////////////////////////////////////////////////////////////////
-        ///////////////////////////////////////////z8/P/4eHh/+Hh4f/19fX/////////////////
-        4uLi/7S0tP/g4OD/7Ozs/8DAwP+ampr/ra2t/9nZ2f/MzMzXKCgoWgAAAD8AAAAuAAAAIwAAACAAAAAg
-        AAAAIwAAACUAAAAjAAAAHwAAACAAAAApAAAALAAAACMAAAAQAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAACcnJwUoqKi293d3f/29vb/+fn5/+/v7//U1NT/pqam/4qKiv+urq7/urq6/9bW1v/c3Nz/
-        3d3d/+Dg4P/h4eH/urq6/8rKyv/+/v7///////z8/P/m5ub/2tra/+Li4v/4+Pj/////////////////
-        ///////////////////////////Pz8//np6e/9LS0v//////////////////////////////////////
-        ////////////////////////////////////////////////////////////////////////////////
-        ///////////6+vr/5eXl/9/f3//x8fH/////////////////4ODg/7i4uP/k5OT/6urq/6ysrP+SkpL/
-        q6ur/9bW1v/d3d3kMzMzVwAAAC8AAAAoAAAAJgAAACYAAAApAAAAKwAAACcAAAAiAAAAJQAAAC8AAAAv
-        AAAAIAAAAAsAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACsrKwmra2t6+Li4v/19fX/
-        5ubm/76+vv+Xl5f/q6ur/7e3t//X19f/3d3d/93d3f/g4OD/39/f/7a2tv/T09P////////////5+fn/
-        39/f/9ra2v/u7u7//v7+////////////////////////////////////////////////////////////
-        ////////////////////////////////////////////////////////////////////////////////
-        ///////////////////////////////////////////////////////////+/v7/6enp/9/f3//x8fH/
-        ////////////////1NTU/8LCwv/n5+f/5OTk/5iYmP+Li4v/pKSk/9TU1P/l5eXuOTk5WAAAACwAAAAr
-        AAAAKwAAAC8AAAAvAAAAKwAAACYAAAArAAAAMwAAAC4AAAAYAAAABgAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAACQkJA8r6+v+NLS0v/ExMT/oqKi/6Wlpf+xsbH/1tbW/97e3v/e3t7/
-        4ODg/9/f3/+1tbX/2dnZ////////////8fHx/9ra2v/d3d3/9vb2////////////////////////////
-        ////////////////////////////////////////////////////////////////////////////////
-        ////////////////////////////////////////////////////////////////////////////////
-        ///////////////////////////+/v7/6urq/9/f3//x8fH/////////////////w8PD/9DQ0P/r6+v/
-        zs7O/4qKiv+CgoL/n5+f/9HR0f/o6Oj3ZGRkZgAAAC8AAAAwAAAAMgAAADMAAAAtAAAAKwAAADEAAAA1
-        AAAAJwAAAA8AAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACJiYlX
-        kJCQ/pWVlf+goKD/q6ur/9HR0f/f39//39/f/+Hh4f/h4eH/t7e3/97e3v///////////+/v7//Z2dn/
-        4uLi//v7+///////////////////////////////////////////////////////////////////////
-        ////////////////////////////////////////////////////////////////////////////////
-        ///////////////////////////////////////////////////////////////////////////+/v7/
-        6enp/9/f3//09PT////////////6+vr/uLi4/97e3v/s7Oz/qqqq/4KCgv9+fn7/m5ub/83Nzf/n5+f8
-        iIiIegAAADUAAAA2AAAANAAAADAAAAAxAAAANgAAADEAAAAbAAAABwAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABycnJ9kJCQ/6SkpP/Kysr/39/f/+Dg4P/h4eH/
-        4+Pj/7y8vP/V1dX////////////t7e3/2NjY/+Tk5P/9/f3/////////////////////////////////
-        ////////////////////////////////////////////////////////////////////////////////
-        ////////////////////////////////////////////////////////////////////////////////
-        ///////////////////////////////////////////+/v7/5ubm/+Dg4P/7+/v////////////n5+f/
-        v7+//+jo6P/j4+P/h4eH/4CAgP9+fn7/mJiY/8rKyv/o6Oj+nJyckwAAADkAAAA1AAAANAAAADcAAAA2
-        AAAAJgAAAA8AAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAJ6enmefn5//wcHB/+Dg4P/h4eH/4eHh/+Tk5P/Dw8P/zc3N////////////7e3t/9fX1//m5ub/
-        /v7+////////////////////////////////////////////////////////////////////////////
-        ////////////////////////////////////////////////////////////////////////////////
-        ////////////////////////////////////////////////////////////////////////////////
-        ///////////8/Pz/4eHh/+Xl5f/+/v7////////////Hx8f/19fX/+zs7P+3t7f/fHx8/4qKiv9/f3//
-        mJiY/8rKyv/o6Oj/o6OjnwAAADgAAAA5AAAAOgAAADEAAAAcBQUFCQUFBQEAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACrq6slmpqa+K6urv/e3t7/4uLi/+Li4v/k5OT/
-        z8/P/8PDw////////////+/v7//X19f/5eXl//7+/v//////////////////////////////////////
-        ////////////////////////////////////////////////////////////////////////////////
-        ////////////////////////////////////////////////////////////////////////////////
-        ///////////////////////////////////////////////////////////19fX/39/f//Dw8P//////
-        //////b29v+7u7v/5ubm/+bm5v+CgoL/i4uL/5CQkP+CgoL/m5ub/8vLy//p6en/pqampAAAADwAAAA5
-        AAAAKwAAABgAAAAKEhISAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        pqamBpWVlcqgoKD/2dnZ/+Li4v/j4+P/5OTk/9ra2v+2trb/+/v7///////y8vL/19fX/+Li4v/+/v7/
-        ////////////////////////////////////////////////////////////////////////////////
-        ////////////////////////////////////////////////////////////////////////////////
-        ////////////////////////////////////////////////////////////////////////////////
-        ///////////////////////////q6ur/4ODg//z8/P///////////9DQ0P/X19f/7Ozs/6+vr/95eXn/
-        ra2t/5GRkf+EhIT/oaGh/87Ozv/q6ur/p6enqAAAADUAAAAmAAAAGAAAAA4pKSkEAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACZmZlzlZWV/8bGxv/j4+P/5OTk/+Tk5P/i4uL/
-        t7e3/+3t7f/+/v7/+fn5/9jY2P/e3t7//Pz8//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7/
-        /v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7/
-        /v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7/
-        /v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//r6+v/f39//
-        6+vr//7+/v/+/v7/9PT0/7+/v//p6en/2tra/3Nzc/+lpaX/srKy/4+Pj/+JiYn/q6ur/9DQ0P/s7Oz/
-        qKionQAAACYAAAAbAAAAD0VFRQQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        qqqqGpCQkPWqqqr/4eHh/+Tk5P/l5eX/5ubm/8XFxf/Y2Nj//f39//v7+//d3d3/2NjY//j4+P/9/f3/
-        /f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3/
-        /f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3/
-        /f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3/
-        /f39//39/f/9/f3//f39//39/f/9/f3//f39/+zs7P/d3d3/+Pj4//39/f/9/f3/yMjI/93d3f/t7e3/
-        k5OT/4mJif/Pz8//rq6u/46Ojv+SkpL/tra2/9TU1P/w8PD/qamplAAAABwAAAAMY2NjAgAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACMjIymlJSU/9fX1//k5OT/5ubm/+bm5v/Z2dn/
-        v7+///39/f/9/f3/5ubm/9TU1P/w8PD//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3/
-        /f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3/
-        /f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3/
-        /f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3/
-        +vr6/97e3v/q6ur//f39//39/f/n5+f/ycnJ/+vr6/+6urr/bW1t/9XV1f/MzMz/pqam/46Ojv+hoaH/
-        wcHB/9/f3//y8vL/p6endERERAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        nJycNYuLi/+3t7f/4+Pj/+fn5//n5+f/5OTk/7q6uv/v7+//+/v7//Hx8f/T09P/5OTk//v7+//7+/v/
-        +/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/
-        +/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/
-        +/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/
-        +/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/6enp/93d3f/5+fn/+/v7//v7+//AwMD/
-        5ubm/+Dg4P9tbW3/ubm5/+Hh4f/Dw8P/np6e/5OTk/+1tbX/z8/P/+7u7v/y8vL8srKyKwAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACGhoa1lJSU/9vb2//m5ub/6Ojo/+jo6P/R0dH/
-        zc3N//r6+v/6+vr/2tra/9fX1//4+Pj/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/
-        +vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/
-        +vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/
-        +vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/
-        +vr6//r6+v/19fX/3Nzc/+7u7v/6+vr/+vr6/9HR0f/d3d3/7e3t/4ODg/+Wlpb/8PDw/9vb2/+5ubn/
-        l5eX/6SkpP/Jycn/4ODg//Hx8f/09PSzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        mZmZNIeHh/+4uLj/5OTk/+jo6P/o6Oj/4+Pj/7m5uf/19fX/+Pj4/+fn5//R0dH/7e3t//j4+P/4+Pj/
-        +Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/
-        +Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/
-        +Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/
-        +Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/l5eX/6urq//j4+P/g4OD/4+Pj//j4+P/4+Pj/
-        4uLi/9DQ0P/s7Oz/oaGh/3V1df/4+Pj/7Ozs/9LS0v+qqqr/mpqa/7y8vP/Y2Nj/5+fn//Hx8f/r6+te
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACCgoKtkJCQ/9vb2//o6Oj/6enp/+np6f/Pz8//
-        1NTU//j4+P/19fX/0tLS/9zc3P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/
-        +Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/
-        +Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/
-        +Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/
-        mJiY/2JiYv97e3v/xsbG/+np6f/a2tr/9vb2//j4+P/29vb/w8PD/+rq6v++vr7/aGho/+np6f/29vb/
-        5eXl/8PDw/+goKD/q6ur/9bW1v/f39//7u7u//Ly8vPn5+caAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        lZWVHYODg/yysrL/5OTk/+rq6v/q6ur/5OTk/7q6uv/09PT/9vb2/+Li4v/Pz8//8PDw//b29v/29vb/
-        9vb2//b29v/29vb/9vb2//b29v/29vb/9vb2//b29v/29vb/9vb2//b29v/29vb/9vb2//b29v/29vb/
-        9vb2//b29v/29vb/9vb2//b29v/29vb/9vb2//b29v/29vb/9vb2//b29v/29vb/9vb2//b29v/29vb/
-        9vb2//b29v/29vb/9vb2//b29v/29vb/9vb2//b29v/29vb/9vb2//b29v/29vb/9vb2//b29v/29vb/
-        9vb2//b29v/29vb/9vb2//b29v/29vb/9vb2/+Dg4P9QUFD/eXl5/5KSkv+goKD/7+/v/9nZ2f/u7u7/
-        9vb2//b29v/Gxsb/5+fn/9PT0/9oaGj/0dHR//z8/P/y8vL/2NjY/7CwsP+hoaH/ysrK/+Pj4//k5OT/
-        8fHx//Dw8KAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACMjIyEh4eH/9fX1//o6Oj/6+vr/+rq6v/U1NT/
-        z8/P//T09P/y8vL/z8/P/9vb2//09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/
-        9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/
-        9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/
-        9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/
-        6Ojo/1VVVf91dXX/i4uL/7Gxsf/09PT/2NjY/+Xl5f/09PT/9PT0/8/Pz//i4uL/6Ojo/2hoaP+5ubn/
-        /v7+//n5+f/n5+f/w8PD/6Ojo/+6urr/5ubm/+Hh4f/u7u7/8fHx/fLy8ioAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        nZ2dBX9/f+Sfn5//4uLi/+rq6v/s7Oz/6Ojo/76+vv/s7Oz/7e3t/9vb2//Ly8v/7Ozs//Pz8//z8/P/
-        8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/
-        8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/
-        8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/
-        8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/xMTE/5CQkP+vr6//7e3t//Pz8//d3d3/
-        39/f//Pz8//z8/P/1tbW/9zc3P/t7e3/dXV1/6enp////////Pz8//Hx8f/U1NT/ra2t/62trf/g4OD/
-        6urq/+Xl5f/y8vL/8fHxmwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACUlJRAgICA/8PDw//n5+f/7Ozs/+3t7f/e3t7/
-        x8fH/+vr6//n5+f/6urq/8vLy//x8fH/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/
-        8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/
-        8vLy//Ly8v/y8vL/8fHx//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/
-        8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/
-        8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy/+Hh4f/Z2dn/8vLy//Ly8v/c3Nz/1tbW/+3t7f+Dg4P/
-        mJiY///////+/v7/+Pj4/+Hh4f+6urr/p6en/9LS0v/z8/P/4ODg//Dw8P/y8vL58PDwEgAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAHt7e52Hh4f/2tra/+rq6v/t7e3/7Ozs/83Nzf/a2tr/3Nzc//Pz8//19fX/6enp/+Xl5f/w8PD/
-        8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/
-        8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/7+/v/+7u7v/t7e3/6+vr/+np6f/U1NT/wsLC/+jo6P/v7+//
-        7+/v//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/
-        8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/
-        4+Pj/9XV1f/v7+//8PDw/+Hh4f/R0dH/7e3t/4yMjP+Ojo7////////////7+/v/6+vr/8fHx/+np6f/
-        w8PD//X19f/l5eX/6urq//Ly8v/z8/N1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACcnJwCfHx86qKiov/i4uL/7Ozs/+7u7v/o6Oj/
-        vr6+/+vr6//Y2Nj/9/f3//X19f/8/Pz/6enp/+Xl5f/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/
-        7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7e3t/+vr6//r6+v/6Ojo/+Xl5f/i4uL/
-        3t7e/9nZ2f/U1NT/j4+P/0JCQv9BQUH/WFhY/9HR0f/n5+f/6+vr/+zs7P/u7u7/7u7u/+7u7v/u7u7/
-        7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/
-        7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/l5eX/09PT/+rq6v/u7u7/5ubm/8/Pz//t7e3/
-        kpKS/4iIiP////////////39/f/x8fH/0tLS/6ysrP+2trb/7+/v/+7u7v/i4uL/8/Pz//T09NYAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAJKSkjV9fX3/vLy8/+Xl5f/t7e3/7u7u/9/f3//Gxsb/5OTk/+Li4v/19fX/9/f3//z8/P/8/Pz/
-        5ubm/+Xl5f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/7Ozs/+rq6v/o6Oj/
-        5eXl/+Pj4//f39//2tra/9XV1f/R0dH/zMzM/8jIyP+9vb3/m5ub/3d3d/9BQUH/QUFB/0FBQf9BQUH/
-        fHx8/9vb2//d3d3/4eHh/+Xl5f/p6en/7Ozs/+3t7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/
-        7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/
-        7e3t/+Xl5f/S0tL/5+fn/+3t7f/o6Oj/zc3N/+3t7f+Tk5P/hoaG//7+/v///////v7+//b29v/a2tr/
-        srKy/66urv/m5ub/9vb2/93d3f/w8PD/8/Pz/vDw8BsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAh4eHen9/f//V1dX/6urq/+7u7v/u7u7/
-        1NTU/9PT0//X19f/8fHx//T09P/5+fn/+/v7//v7+//7+/v/5+fn/+Li4v/r6+v/6+vr/+vr6//r6+v/
-        6+vr/+vr6//r6+v/6+vr/+rq6v/l5eX/2tra/9PT0//Pz8//ysrK/8bGxv/ExMT/s7Oz/5CQkP9tbW3/
-        TU1N/zExMf8xMTH/NDQ0/0FBQf9BQUH/QUFB/0FBQf9aWlr/0tLS/97e3v/Z2dn/2dnZ/9vb2//h4eH/
-        5ubm/+np6f/q6ur/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/
-        6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/5eXl/9HR0f/l5eX/6+vr/+jo6P/Nzc3/
-        7e3t/5KSkv+Ghob//f39//7+/v/+/v7/+vr6/+Hh4f+6urr/qamp/9zc3P/7+/v/3Nzc/+3t7f/z8/P/
-        8PDwaQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAB6enq4jo6O/93d3f/s7Oz/7+/v/+zs7P/ExMT/4+Pj/9DQ0P/39/f/9PT0//r6+v/7+/v/
-        +/v7//v7+//7+/v/6urq/9/f3//o6Oj/6enp/+np6f/p6en/6enp/+np6f/p6en/5ubm/9fX1//Gxsb/
-        wcHB/6mpqf+Hh4f/ZWVl/0NDQ/8xMTH/MTEx/zExMf8xMTH/MTEx/0RERP9vb2//VVVV/0FBQf9BQUH/
-        QUFB/5SUlP94eHj/d3d3/76+vv/f39//2dnZ/9XV1f/X19f/3Nzc/+Li4v/m5ub/6Ojo/+np6f/p6en/
-        6enp/+np6f/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/
-        6enp/+np6f/j4+P/0dHR/+Pj4//p6en/5ubm/87Ozv/t7e3/jY2N/4uLi//7+/v//Pz8//39/f/7+/v/
-        5+fn/8HBwf+np6f/0dHR//z8/P/g4OD/5ubm//Pz8//19fWeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHt7e/Cjo6P/4eHh/+3t7f/w8PD/
-        6enp/8HBwf/j4+P/1tbW//X19f/19fX/+/v7//v7+//7+/v/+/v7//v7+//7+/v/7+/v/9zc3P/m5ub/
-        6Ojo/+jo6P/o6Oj/6Ojo/+fn5//g4OD/srKy/15eXv87Ozv/MTEx/zExMf8xMTH/MTEx/zExMf89PT3/
-        bGxs/5ycnP/Kysr/3Nzc/7S0tP88PDz/OTk5/2pqav+urq7/6Ojo/+jo6P/Y2Nj/jo6O/2tra/+jo6P/
-        29vb/9ra2v/V1dX/1NTU/9fX1//c3Nz/4ODg/+Xl5f/m5ub/5+fn/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/
-        6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+Li4v/Pz8//4uLi/+jo6P/h4eH/
-        0dHR/+3t7f+EhIT/kpKS//f39//6+vr//Pz8//v7+//q6ur/xsbG/6enp//Jycn/+/v7/+Pj4//f39//
-        8/Pz//T09OYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAACQkJAke3t7/7S0tP/k5OT/7+/v//Hx8f/k5OT/x8fH/9zc3P/d3d3/8/Pz//X19f/6+vr/
-        +vr6//r6+v/6+vr/+vr6//r6+v/6+vr/9PT0/9zc3P/i4uL/5ubm/+bm5v/m5ub/5eXl/+Li4v9hYWH/
-        MTEx/zExMf8xMTH/ODg4/2RkZP+RkZH/w8PD/+Tk5P/m5ub/5OTk/9vb2//AwMD/SUlJ/zExMf9sbGz/
-        4uLi/+bm5v/m5ub/5ubm/+bm5v/m5ub/4+Pj/6mpqf9sbGz/iIiI/87Ozv/c3Nz/19fX/9PT0//S0tL/
-        1dXV/9vb2//g4OD/5OTk/+Xl5f/m5ub/5ubm/+bm5v/m5ub/5ubm/+bm5v/m5ub/5ubm/+bm5v/m5ub/
-        5ubm/+bm5v/m5ub/39/f/87Ozv/h4eH/5ubm/9zc3P/V1dX/7e3t/3d3d/+bm5v/8fHx//b29v/5+fn/
-        +vr6/+3t7f/Kysr/qKio/8LCwv/5+fn/5+fn/9nZ2f/y8vL/8/Pz/e3t7QMAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJOTk1J8fHz/xMTE/+fn5//w8PD/
-        8fHx/97e3v/Nzc3/1NTU/+Xl5f/y8vL/9vb2//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/
-        +Pj4/+Pj4//b29v/4+Pj/+Tk5P/k5OT/wcHB/zQ0NP9aWlr/iYmJ/7m5uf/f39//5OTk/+Tk5P/k5OT/
-        5OTk/+Li4v/Z2dn/xcXF/19fX/8xMTH/UFBQ/9ra2v/k5OT/5OTk/+Tk5P/k5OT/5OTk/+Tk5P/k5OT/
-        5OTk/+Tk5P/CwsL/enp6/3Nzc/+4uLj/39/f/9ra2v/U1NT/z8/P/9HR0f/W1tb/29vb/9/f3//i4uL/
-        5OTk/+Tk5P/k5OT/5OTk/+Tk5P/k5OT/5OTk/+Tk5P/k5OT/5OTk/+Tk5P/b29v/zc3N/+Li4v/k5OT/
-        1dXV/9ra2v/q6ur/ampq/6ampv/p6en/7+/v//X19f/4+Pj/7e3t/83Nzf+oqKj/vb29//f39//q6ur/
-        1dXV//Dw8P/z8/P/8PDwNgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAlJSUeH5+fv/S0tL/6Ojo//Hx8f/x8fH/19fX/8/Pz//Kysr/7u7u//Hx8f/29vb/
-        +Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4/+/v7//a2tr/3t7e/+Li4v/Pz8//
-        2tra/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Li4v/g4OD/19fX/8TExP96enr/MTEx/z09Pf/Jycn/
-        4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/1tbW/5CQkP9paWn/
-        nZ2d/9nZ2f/b29v/1NTU/8/Pz//Nzc3/0NDQ/9XV1f/b29v/39/f/+Hh4f/i4uL/4+Pj/+Pj4//j4+P/
-        4+Pj/+Pj4//j4+P/4+Pj/9fX1//Ly8v/3d3d/+Hh4f/R0dH/4ODg/9fX1/9oaGj/r6+v/9/f3//n5+f/
-        7u7u//Pz8//r6+v/zc3N/6mpqf+6urr/9fX1/+zs7P/S0tL/7u7u//Pz8//v7+9bAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB5eXmchoaG/9bW1v/q6ur/
-        8vLy//Dw8P/R0dH/1NTU/8bGxv/19fX/8PDw//f39//4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/
-        +Pj4//j4+P/4+Pj/+Pj4//j4+P/m5ub/2NjY/9/f3//h4eH/4uLi/+Li4v/i4uL/4uLi/+Li4v/h4eH/
-        39/f/9bW1v/ExMT/k5OT/zIyMv8yMjL/r6+v/+Hh4f/i4uL/4uLi/+Li4v/i4uL/4uLi/+Li4v/i4uL/
-        4uLi/+Li4v/i4uL/4uLi/+Li4v/i4uL/4uLi/9/f3/+rq6v/bW1t/4KCgv/Kysr/3Nzc/9fX1//R0dH/
-        zc3N/8zMzP/Q0ND/19fX/9zc3P/f39//4eHh/+Li4v/i4uL/4uLi/+Li4v/h4eH/z8/P/8rKyv/u7u7/
-        1tbW/83Nzf/l5eX/vLy8/2hoaP+2trb/1NTU/93d3f/l5eX/7Ozs/+bm5v/Ly8v/qamp/7a2tv/z8/P/
-        7e3t/87Ozv/t7e3/8/Pz/+3t7W8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAHp6eriOjo7/2NjY/+vr6//z8/P/8PDw/83Nzf/Y2Nj/xMTE//Pz8//u7u7/
-        9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//09PT/
-        4ODg/9bW1v/d3d3/4ODg/+Dg4P/g4OD/4ODg/97e3v/U1NT/wcHB/6SkpP87Ozv/MTEx/42Njf/g4OD/
-        4ODg/+Dg4P/g4OD/4ODg/+Dg4P/g4OD/4ODg/+Dg4P/g4OD/4ODg/+Dg4P/g4OD/4ODg/+Dg4P/g4OD/
-        4ODg/+Dg4P/g4OD/w8PD/3t7e/9wcHD/sbGx/93d3f/Z2dn/09PT/83Nzf/Kysr/zc3N/9fX1//f39//
-        4ODg/+Dg4P/g4OD/3d3d/9fX1//d3d3/8/Pz//f39/++vr7/ycnJ/+np6f+mpqb/aWlp/7m5uf/Gxsb/
-        0dHR/9vb2//j4+P/4ODg/8bGxv+mpqb/tLS0//Hx8f/t7e3/y8vL/+vr6//z8/P/7OzsewAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAe3t7zpWVlf/Z2dn/
-        7e3t//Pz8//v7+//ysrK/9vb2//FxcX/8fHx/+7u7v/29vb/9vb2//b29v/29vb/9vb2//b29v/29vb/
-        9vb2//b29v/29vb/9vb2//b29v/29vb/9vb2//b29v/29vb/8vLy/+Dg4P/V1dX/29vb/93d3f/c3Nz/
-        09PT/7+/v/+urq7/SkpK/zExMf9ra2v/3t7e/97e3v/e3t7/3t7e/97e3v/e3t7/3t7e/97e3v/e3t7/
-        3t7e/97e3v/e3t7/3t7e/97e3v/e3t7/3t7e/97e3v/e3t7/3t7e/97e3v/e3t7/3t7e/9TU1P+SkpL/
-        Z2dn/5eXl//V1dX/2tra/9XV1f/S0tL/1tbW/93d3f/e3t7/2tra/9bW1v/i4uL/9PT0//Hx8f/09PT/
-        7+/v/7u7u//Nzc3/6+vr/4GBgf9zc3P/ra2t/7i4uP/ExMT/zs7O/9fX1//W1tb/v7+//6Ghof+wsLD/
-        7u7u/+rq6v/Jycn/6+vr//Pz8//r6+t+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAB8fHzfm5ub/9ra2v/t7e3/9PT0/+/v7//Jycn/2dnZ/8PDw//w8PD/
-        7e3t//X19f/19fX/9fX1//X19f/19fX/9fX1//X19f/19fX/9fX1//X19f/19fX/9fX1//X19f/19fX/
-        9fX1//X19f/19fX/9fX1//Pz8//k5OT/1dXV/8rKyv+9vb3/sbGx/2FhYf8xMTH/Tk5O/9XV1f/d3d3/
-        3d3d/93d3f/d3d3/3d3d/93d3f/d3d3/3d3d/93d3f/d3d3/3d3d/93d3f/d3d3/3d3d/93d3f/d3d3/
-        3d3d/93d3f/d3d3/3d3d/93d3f/d3d3/3d3d/93d3f/b29v/rKys/21tbf98fHz/xMTE/9vb2//Z2dn/
-        1dXV/9bW1v/l5eX/9PT0//X19f/z8/P/7+/v//T09P/Z2dn/wMDA/9bW1v/o6Oj/ampq/3x8fP+enp7/
-        qqqq/7W1tf/AwMD/y8vL/8rKyv+2trb/m5ub/62trf/q6ur/5ubm/8XFxf/q6ur/8/Pz/+rq6n8AAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH19femenp7/
-        2tra/+7u7v/09PT/7+/v/8nJyf/Y2Nj/wsLC/+/v7//s7Oz/9PT0//T09P/09PT/9PT0//T09P/09PT/
-        9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//Pz8//x8fH/
-        39/f/8TExP+IiIj/Ly8v/zw8PP/ExMT/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/
-        3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/
-        3Nzc/9zc3P/c3Nz/3Nzc/8LCwv93d3f/gYGB/83Nzf/s7Oz/9PT0//T09P/09PT/9PT0//Hx8f/u7u7/
-        9PT0/8bGxv/Dw8P/4uLi/8DAwP9oaGj/f39//5GRkf+bm5v/pqam/7Kysv+8vLz/vb29/6qqqv+Tk5P/
-        qqqq/+Tk5P/e3t7/wcHB/+np6f/z8/P/9fX1iQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfn5+7KCgoP/a2tr/7u7u//X19f/w8PD/y8vL/9bW1v/AwMD/
-        7u7u/+rq6v/z8/P/5+fn/9/f3//r6+v/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/
-        8/Pz//Pz8//z8/P/8/Pz//Pz8//y8vL/7+/v/+rq6v/m5ub/39/f/8TExP+srKz/vr6+/9fX1//S0tL/
-        1tbW/9nZ2f/a2tr/2tra/9ra2v/a2tr/2tra/9ra2v/a2tr/2tra/9ra2v/a2tr/2tra/9ra2v/a2tr/
-        2tra/9ra2v/a2tr/2tra/9ra2v/a2tr/2tra/9ra2v/Z2dn/1tbW/9LS0v/W1tb/39/f/+rq6v/w8PD/
-        4ODg//Pz8//z8/P/8/Pz//Pz8//z8/P/7u7u/+/v7//z8/P/tLS0/8nJyf/p6en/n5+f/2hoaP+AgID/
-        h4eH/4+Pj/+YmJj/o6Oj/66urv+urq7/nZ2d/4mJif+lpaX/3d3d/9TU1P+8vLz/6enp//Ly8v/o6Oh/
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/f3/s
-        oKCg/9nZ2f/t7e3/9vb2//Hx8f/Nzc3/1dXV/729vf/t7e3/6Ojo/+3t7f/Ly8v/2NjY/97e3v/w8PD/
-        8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//y8vL/8vLy/+7u7v/o6Oj/
-        5OTk/+Li4v/Dw8P/wMDA/9ra2v/z8/P/8/Pz//Hx8f/m5ub/39/f/9jY2P/T09P/0dHR/9PT0//V1dX/
-        1tbW/9fX1//Y2Nj/2dnZ/9nZ2f/Z2dn/2dnZ/9nZ2f/Y2Nj/19fX/9bW1v/U1NT/0tLS/9HR0f/U1NT/
-        2tra/+Dg4P/m5ub/8fHx//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Hx8f/r6+v/
-        8PDw/+Pj4/+3t7f/0dHR/+zs7P9ycnL/b29v/39/f/+AgID/hYWF/4yMjP+VlZX/n5+f/56env+Pj4//
-        f39//6CgoP/U1NT/x8fH/7e3t//p6en/8vLy/+fn534AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAgOaenp7/19fX/+zs7P/29vb/8vLy/9HR0f/Q0ND/
-        uLi4/+zs7P/m5ub/6enp/8nJyf/X19f/3t7e/+zs7P/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8fH/
-        8fHx//Hx8f/x8fH/8fHx//Dw8P/t7e3/5ubm/+Li4v/j4+P/xcXF/7y8vP/Nzc3/8fHx//Hx8f/x8fH/
-        8fHx//Hx8f/x8fH/8fHx//Hx8f/x8fH/7Ozs/+bm5v/h4eH/39/f/97e3v/c3Nz/3d3d/93d3f/d3d3/
-        3Nzc/9/f3//f39//4uLi/+bm5v/t7e3/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8fH/
-        8fHx//Hx8f/x8fH/8fHx//Hx8f/x8fH/7e3t/+rq6v/x8fH/xcXF/76+vv/g4OD/ycnJ/2hoaP94eHj/
-        gICA/39/f/9/f3//hISE/4qKiv+RkZH/j4+P/4CAgP92dnb/nJyc/8jIyP+4uLj/srKy/+jo6P/x8fH/
-        5eXlewAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        gYGB2pubm//U1NT/6+vr//b29v/z8/P/19fX/83Nzf+1tbX/7Ozs/+Tk5P/u7u7/2dnZ/9DQ0P/g4OD/
-        8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/v7+//6+vr/+Tk5P/g4OD/
-        5OTk/8vLy/+4uLj/wcHB/+3t7f/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/
-        8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/
-        8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/p6en/
-        6+vr//Dw8P+urq7/yMjI/+np6f+enp7/aWlp/4ODg/+CgoL/gICA/39/f/9/f3//goKC/4WFhf+AgID/
-        cnJy/21tbf+Wlpb/urq6/6enp/+vr6//6enp//Dw8P/l5eVzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACDg4PJmJiY/9HR0f/p6en/9vb2//T09P/e3t7/
-        ysrK/7m5uf/j4+P/4+Pj/+rq6v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/
-        7u7u/+7u7v/u7u7/7u7u/+rq6v/i4uL/3t7e/+Li4v/T09P/tbW1/7i4uP/m5ub/7u7u/+7u7v/u7u7/
-        7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/
-        7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/
-        7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7Ozs/+fn5//s7Oz/0tLS/7W1tf/X19f/5eXl/29vb/90dHT/
-        iYmJ/4aGhv+Dg4P/gYGB/39/f/9/f3//fX19/3V1df9lZWX/ZmZm/5GRkf+pqan/lpaW/62trf/p6en/
-        7+/v/+Tk5GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAISEhLGTk5P/zc3N/+fn5//19fX/9vb2/+Pj4//Kysr/v7+//9XV1f/i4uL/5+fn/+7u7v/u7u7/
-        7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+3t7f/o6Oj/4ODg/9zc3P/g4OD/
-        29vb/7Gxsf+wsLD/29vb/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/
-        7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/
-        7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/m5ub/
-        5+fn/+7u7v+xsbH/w8PD/+bm5v+zs7P/aGho/4iIiP+NjY3/ioqK/4aGhv+EhIT/goKC/39/f/95eXn/
-        a2tr/1tbW/9iYmL/ioqK/5iYmP+FhYX/sLCw/+vr6//u7u7/5eXlPAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhYWFlI+Pj//Jycn/4+Pj//T09P/4+Pj/
-        6enp/8jIyP/Gxsb/yMjI/+Pj4//j4+P/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/
-        7e3t/+3t7f/s7Oz/6Ojo/9/f3//a2tr/3t7e/+Hh4f+ysrL/rKys/83Nzf/t7e3/7e3t/+3t7f/t7e3/
-        7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/
-        7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/
-        7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/6urq/+Tk5P/q6ur/1tbW/7CwsP/S0tL/6enp/3x8fP91dXX/
-        l5eX/5KSkv+Ojo7/i4uL/4iIiP+EhIT/gYGB/3h4eP9mZmb/VFRU/2JiYv+EhIT/hoaG/3l5ef+3t7f/
-        7Ozs/+3t7f7Z2dkIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAACcnJxwjY2N/8HBwf/f39//8fHx//j4+P/t7e3/zMzM/83Nzf+5ubn/5eXl/97e3v/r6+v/
-        7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+rq6v/h4eH/2dnZ/9zc3P/k5OT/
-        t7e3/6ioqP+9vb3/6+vr/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/
-        7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/
-        7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+vr6//k5OT/
-        5OTk/+zs7P+xsbH/wcHB/+Xl5f+9vb3/aGho/5KSkv+cnJz/mJiY/5SUlP+Pj4//jIyM/4iIiP+Dg4P/
-        d3d3/2JiYv9TU1P/ZmZm/4CAgP94eHj/cnJy/8TExP/r6+v/7u7u7gAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJubm0mOjo7/tra2/9nZ2f/u7u7/
-        +fn5//Hx8f/W1tb/zc3N/6+vr//n5+f/3d3d/+bm5v/r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/
-        6+vr/+vr6//q6ur/6Ojo/9/f3//c3Nz/5OTk/8HBwf+kpKT/r6+v/+fn5//r6+v/6+vr/+vr6//r6+v/
-        6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/
-        6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/
-        6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/5ubm/+Hh4f/o6Oj/0tLS/6+vr//U1NT/5ubm/3h4eP93d3f/
-        p6en/6Ojo/+enp7/mZmZ/5WVlf+RkZH/jY2N/4WFhf91dXX/X19f/1ZWVv9vb2//fX19/2tra/9ycnL/
-        1NTU/+rq6v/v7++6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAm5ubFY+Pj/+srKz/0dHR/+rq6v/4+Pj/9fX1/+Li4v/Kysr/ubm5/9TU1P/c3Nz/
-        4ODg/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+np6f/n5+f/4uLi/+Tk5P/Nzc3/
-        oaGh/6Wlpf/e3t7/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/
-        6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/
-        6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+jo6P/g4OD/
-        4+Pj/+jo6P+oqKj/w8PD/+fn5/+xsbH/aGho/6Kiov+urq7/qqqq/6SkpP+fn5//mpqa/5aWlv+QkJD/
-        hoaG/3Nzc/9cXFz/Xl5e/3l5ef97e3v/ZGRk/4KCgv/e3t7/6enp/9jY2HwAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkJCQ3KSkpP/Kysr/
-        5OTk//X19f/5+fn/6enp/8zMzP/Hx8f/vLy8/+Dg4P/a2tr/6Ojo/+np6f/p6en/6enp/+np6f/p6en/
-        6enp/+np6f/p6en/6enp/+jo6P/n5+f/2NjY/56env+cnJz/0dHR/+np6f/p6en/6enp/+np6f/p6en/
-        6enp/+np6f/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/
-        6enp/+np6f/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/
-        6enp/+np6f/p6en/6enp/+np6f/o6Oj/4eHh/97e3v/o6Oj/v7+//7S0tP/b29v/5OTk/3Nzc/+EhIT/
-        urq6/7W1tf+wsLD/q6ur/6Wlpf+hoaH/nJyc/5WVlf+Hh4f/b29v/1xcXP9paWn/goKC/3d3d/9iYmL/
-        nJyc/+Xl5f/o6Oj/3NzcSAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAACSkpKenJyc/8LCwv/d3d3/8fHx//r6+v/w8PD/1dXV/87Ozv+rq6v/
-        4+Pj/9fX1//g4OD/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P+urq7/
-        mJiY/8DAwP/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/
-        6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/
-        6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+Pj4//d3d3/
-        5OTk/9nZ2f+np6f/zMzM/+rq6v+cnJz/bGxs/7m5uf/BwcH/vLy8/7e3t/+xsbH/rKys/6ampv+hoaH/
-        l5eX/4WFhf9ra2v/YGBg/3l5ef+Hh4f/cnJy/2dnZ/+6urr/6Ojo/+np6fnS0tIDAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKSkpFWampr/
-        t7e3/9TU1P/r6+v/+Pj4//b29v/k5OT/zMzM/7u7u//Hx8f/29vb/9jY2P/n5+f/6Ojo/+jo6P/o6Oj/
-        6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/56env+tra3/5+fn/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/
-        6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/
-        6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/
-        6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/k5OT/29vb/97e3v/m5ub/pqam/7+/v//k5OT/y8vL/2xsbP+fn5//
-        zc3N/8fHx//BwcH/uLi4/6+vr/+np6f/oaGh/5qamv+Ojo7/enp6/2RkZP9qamr/iIiI/4eHh/9tbW3/
-        d3d3/9XV1f/o6Oj/7e3ttwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAq6urDpubm/mtra3/ysrK/+Pj4//19fX/+/v7/+zs7P/R0dH/
-        y8vL/6urq//i4uL/1dXV/97e3v/n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//k5OT/
-        nZ2d/+Li4v/n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/
-        5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/
-        5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5eXl/9ra2v/b29v/
-        5ubm/7e3t/+0tLT/29vb/+Xl5f99fX3/gICA/9PT0//Nzc3/wcHB/7S0tP+mpqb/mZmZ/5CQkP+JiYn/
-        goKC/3V1df9iYmL/WFhY/3BwcP+MjIz/gYGB/2tra/+Xl5f/5OTk/+jo6P/W1tZqAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        nJyctKampv/AwMD/2dnZ/+/v7//6+vr/9PT0/+Pj4//MzMz/tbW1/8nJyf/Z2dn/09PT/+Pj4//m5ub/
-        5ubm/+bm5v/m5ub/5ubm/+bm5v/m5ub/5ubm/9vb2//X19f/5ubm/+bm5v/m5ub/5ubm/+bm5v/m5ub/
-        5ubm/+bm5v/m5ub/5ubm/+bm5v/m5ub/5ubm/+bm5v/m5ub/5ubm/+bm5v/m5ub/5ubm/+bm5v/m5ub/
-        5ubm/+bm5v/m5ub/5ubm/+bm5v/m5ub/5ubm/+bm5v/m5ub/5ubm/+bm5v/m5ub/5ubm/+bm5v/m5ub/
-        5ubm/+bm5v/m5ub/5ubm/+Xl5f/a2tr/2NjY/+Tk5P/Gxsb/qKio/9HR0f/s7Oz/l5eX/3BwcP/Dw8P/
-        ysrK/7e3t/+mpqb/lZWV/4aGhv95eXn/cHBw/2pqav9iYmL/VVVV/0ZGRv9KSkr/aGho/3x8fP9wcHD/
-        bW1t/7y8vP/o6Oj/6urq+sXFxQ4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACrq6tXpKSk/7a2tv/Nzc3/5ubm//f39//7+/v/
-        6+vr/9LS0v/Kysr/qKio/+Dg4P/S0tL/19fX/+Xl5f/l5eX/5eXl/+Xl5f/l5eX/5eXl/+Xl5f/l5eX/
-        5eXl/+Xl5f/l5eX/5eXl/+Xl5f/l5eX/5eXl/+Xl5f/l5eX/5eXl/+Xl5f/l5eX/5eXl/+Xl5f/l5eX/
-        5eXl/+Xl5f/l5eX/5eXl/+Xl5f/l5eX/5eXl/+Xl5f/l5eX/5eXl/+Xl5f/l5eX/5eXl/+Xl5f/l5eX/
-        5eXl/+Xl5f/l5eX/5eXl/+Xl5f/l5eX/5eXl/+Xl5f/l5eX/5eXl/+Xl5f/k5OT/2dnZ/9bW1v/g4OD/
-        0tLS/6Ojo//Jycn/6enp/7W1tf9tbW3/oqKi/76+vv+np6f/kpKS/4CAgP9zc3P/ampq/2FhYf9cXFz/
-        VlZW/0xMTP8/Pz//NTU1/z8/P/9UVFT/Wlpa/1ZWVv9wcHD/zc3N/+fn5//u7u6uAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAALGxsQulpaXkrq6u/8LCwv/a2tr/8PDw//v7+//09PT/5OTk/83Nzf+6urr/uLi4/9zc3P/Q0ND/
-        3Nzc/+Tk5P/k5OT/5OTk/+Tk5P/k5OT/5OTk/+Tk5P/k5OT/5OTk/+Tk5P/k5OT/5OTk/+Tk5P/k5OT/
-        5OTk/+Tk5P/k5OT/5OTk/+Tk5P/k5OT/5OTk/+Tk5P/k5OT/5OTk/+Tk5P/k5OT/5OTk/+Tk5P/k5OT/
-        5OTk/+Tk5P/k5OT/5OTk/+Tk5P/k5OT/5OTk/+Tk5P/k5OT/5OTk/+Tk5P/k5OT/5OTk/+Tk5P/k5OT/
-        5OTk/+Tk5P/k5OT/4+Pj/9nZ2f/U1NT/3t7e/9bW1v+hoaH/w8PD/+Xl5f/Hx8f/bW1t/4SEhP+vr6//
-        lZWV/4CAgP9ycnL/bGxs/2tra/9ubm7/cHBw/3Jycv9ycnL/a2tr/2JiYv9VVVX/UVFR/0lJSf9AQED/
-        Pj4+/3Fxcf+9vb3/3d3d/7+/v0sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKysrH2srKz/uLi4/83Nzf/l5eX/
-        9vb2//v7+//t7e3/2dnZ/8zMzP+oqKj/0tLS/9TU1P/Pz8//3t7e/+Pj4//j4+P/4+Pj/+Pj4//j4+P/
-        4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/
-        4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/
-        4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Li4v/X19f/09PT/9zc3P/Y2Nj/
-        n5+f/76+vv/h4eH/1dXV/3Nzc/9tbW3/np6e/4iIiP93d3f/cXFx/3Nzc/91dXX/dnZ2/3Z2dv93d3f/
-        dnZ2/3V1df9ycnL/cHBw/29vb/9ycnL/cXFx/1xcXP9BQUH/Z2dn/5ycnP/Hx8fjRUVFBwAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAtra2Eq2trfSzs7P/wMDA/9jY2P/u7u7/+/v7//f39//p6en/0dHR/8bGxv+kpKT/
-        3d3d/9DQ0P/Pz8//4ODg/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/
-        4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/
-        4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/
-        4+Pj/+Pj4//h4eH/1NTU/9HR0f/c3Nz/2NjY/6CgoP+9vb3/39/f/9bW1v93d3f/X19f/4yMjP+AgID/
-        dXV1/3V1df92dnb/d3d3/3d3d/95eXn/fX19/4GBgf+FhYX/hoaG/4WFhf+EhIT/hISE/4SEhP+CgoL/
-        fHx8/3d3d/9vb2//f39//1ZWVo0iIiITioqKAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsrKyibS0tP+3t7f/
-        ycnJ/+Hh4f/09PT//Pz8//Ly8v/l5eX/zs7O/7u7u/+qqqr/3t7e/87Ozv/Ozs7/39/f/+Li4v/i4uL/
-        4uLi/+Li4v/i4uL/4uLi/+Li4v/i4uL/4uLi/+Li4v/i4uL/4uLi/+Li4v/i4uL/4uLi/+Li4v/i4uL/
-        4uLi/+Li4v/i4uL/4uLi/+Li4v/i4uL/4uLi/+Li4v/i4uL/4uLi/+Li4v/i4uL/4uLi/+Li4v/i4uL/
-        4uLi/+Li4v/i4uL/4uLi/+Li4v/i4uL/4uLi/+Li4v/i4uL/3t7e/9LS0v/R0dH/3Nzc/9LS0v+dnZ3/
-        vb29/97e3v/W1tb/enp6/1hYWP94eHj/d3d3/3V1df93d3f/d3d3/3h4eP97e3v/g4OD/42Njf+Xl5f/
-        oqKi/6ioqP+qqqr/qKio/6ioqP+pqan/qqqq/6Wlpf+bm5v/kJCQ/4aGhv99fX3+HBwccwAAACFmZmYD
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAC6uroRtbW167a2tv+8vLz/0dHR/+jo6P/39/f//Pz8/+7u7v/f39//
-        zc3N/7Ozs/+vr6//3d3d/8zMzP/Nzc3/3d3d/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/
-        4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/
-        4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/
-        4eHh/9jY2P/Ozs7/0dHR/97e3v/Ly8v/nZ2d/7+/v//f39//19fX/319ff9WVlb/ampq/3Fxcf92dnb/
-        d3d3/3h4eP97e3v/g4OD/5KSkv+ioqL/sbGx/7y8vP/Dw8P/xMTE/8HBwf+/v7//wMDA/8TExP/IyMj/
-        xcXF/729vf+2trb/qKio/5WVlf96enrqFxcXPkVFRQYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC4uLhv
-        ubm5/7i4uP/CwsL/2NjY/+3t7f/6+vr/+vr6/+zs7P/c3Nz/zMzM/66urv+wsLD/3d3d/8zMzP/Ly8v/
-        2tra/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/
-        4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/8DAwP+goKD/t7e3/9nZ2f/h4eH/
-        4eHh/+Hh4f/h4eH/4eHh/+Hh4f/h4eH/4eHh/97e3v/S0tL/zc3N/9TU1P/f39//uLi4/5+fn//FxcX/
-        4+Pj/9bW1v9/f3//WVlZ/2NjY/9tbW3/d3d3/3h4eP95eXn/f39//46Ojv+hoaH/tbW1/8PDw//MzMz/
-        z8/P/87Ozv/Kysr/xsbG/8TExP/Hx8f/zc3N/9DQ0P/Q0ND/zs7O/87Ozv/IyMj/tra2/5+fn/97e3vF
-        Tk5OCQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC6urrAu7u7/7e3t//Gxsb/3d3d//Dw8P/7+/v/
-        +fn5/+vr6//b29v/y8vL/62trf+tra3/3Nzc/83Nzf/Jycn/0tLS/9/f3//g4OD/4ODg/+Dg4P/g4OD/
-        4ODg/+Dg4P/g4OD/4ODg/+Dg4P/g4OD/4ODg/+Dg4P/g4OD/4ODg/+Dg4P/g4OD/4ODg/+Dg4P/g4OD/
-        4ODg/+Dg4P/g4OD/kZGR/6ysrP/FxcX/zc3N/+Dg4P/g4OD/4ODg/+Dg4P/g4OD/4ODg/9/f3//W1tb/
-        zMzM/8zMzP/Y2Nj/2tra/6Wlpf+oqKj/zc3N/+jo6P/Y2Nj/g4OD/19fX/9iYmL/ampq/3h4eP95eXn/
-        e3t7/4WFhf+YmJj/r6+v/8LCwv/Ozs7/0tLS/9LS0v/Q0ND/zc3N/8rKyv/Kysr/z8/P/9fX1//d3d3/
-        3t7e/93d3f/c3Nz/2tra/9PT0//IyMj/ubm5/6Wlpf+QkJBYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAL+/vxy8vLzvu7u7/7m5uf/Kysr/4ODg//Ly8v/7+/v/+Pj4/+vr6//d3d3/y8vL/7Kysv+hoaH/
-        2NjY/9LS0v/Hx8f/y8vL/9nZ2f/f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//
-        39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3/+enp7/o6Oj/7y8vP/Nzc3/
-        39/f/9/f3//f39//39/f/9/f3//X19f/zc3N/8vLy//S0tL/3d3d/8PDw/+ZmZn/tbW1/9fX1//u7u7/
-        09PT/4mJif9paWn/ZWVl/2JiYv92dnb/eHh4/3t7e/+IiIj/n5+f/7m5uf/Ly8v/0tLS/9TU1P/T09P/
-        0dHR/8/Pz//S0tL/19fX/97e3v/k5OT/6urq/+zs7P/s7Oz/6+vr/+vr6//p6en/4eHh/9LS0v/FxcX/
-        u7u7/6enp80AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL6+vli9vb3/ubm5/7u7u//MzMz/
-        4eHh//Ly8v/7+/v/+Pj4/+zs7P/h4eH/zs7O/7m5uf+cnJz/x8fH/9jY2P/Ly8v/xsbG/83Nzf/Z2dn/
-        39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//
-        39/f/9/f3//f39//39/f/9nZ2f+6urr/xsbG/93d3f/f39//39/f/97e3v/V1dX/zMzM/8nJyf/Ozs7/
-        2dnZ/9XV1f+mpqb/oaGh/8TExP/i4uL/8PDw/8vLy/+RkZH/dnZ2/2pqav9aWlr/cHBw/3V1df96enr/
-        iIiI/6Ojo/+9vb3/zc3N/9PT0//S0tL/0tLS/9DQ0P/T09P/2tra/+Hh4f/o6Oj/7u7u//Ly8v/19fX/
-        9vb2//b29v/29vb/9fX1//Ly8v/r6+v/4ODg/9HR0f/FxcX/u7u7/7Kysi8AAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAL6+vnq9vb3/t7e3/7u7u//MzMz/4eHh//Hx8f/6+vr/+vr6/+7u7v/m5ub/
-        0tLS/8LCwv+fn5//q6ur/9jY2P/U1NT/yMjI/8XFxf/Ly8v/1dXV/93d3f/e3t7/3t7e/97e3v/e3t7/
-        3t7e/97e3v/e3t7/3t7e/97e3v/e3t7/3t7e/97e3v/e3t7/3t7e/97e3v/e3t7/3t7e/97e3v/e3t7/
-        3t7e/9jY2P/Q0ND/ycnJ/8jIyP/Nzc3/2NjY/9nZ2f+wsLD/mJiY/7a2tv/V1dX/7Ozs/+7u7v+9vb3/
-        nZ2d/4mJif9zc3P/WFhY/2NjY/93d3f/dnZ2/4KCgv+enp7/urq6/8nJyf/Pz8//z8/P/87Ozv/Ozs7/
-        1tbW/+Dg4P/o6Oj/7+/v//T09P/4+Pj/+vr6//v7+//8/Pz//Pz8//z8/P/7+/v/+fn5//T09P/q6ur/
-        3t7e/87Ozv/FxcX/vb29cwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL29vaK7u7v/
-        t7e3/7u7u//Ly8v/3t7e/+7u7v/5+fn/+/v7//Hx8f/q6ur/2tra/8rKyv+zs7P/l5eX/7W1tf/b29v/
-        1NTU/8nJyf/ExMT/xcXF/8zMzP/U1NT/29vb/97e3v/e3t7/3t7e/97e3v/e3t7/3t7e/97e3v/e3t7/
-        3t7e/97e3v/e3t7/3t7e/97e3v/c3Nz/1tbW/8/Pz//Jycn/x8fH/8jIyP/Q0ND/2dnZ/9fX1/+wsLD/
-        mJiY/6+vr//MzMz/5OTk//Hx8f/f39//s7Oz/6Wlpf+YmJj/gICA/19fX/9RUVH/cnJy/4ODg/9/f3//
-        lpaW/7Ozs//FxcX/ysrK/8vLy//Ly8v/zc3N/9jY2P/k5OT/7e3t//T09P/4+Pj/+/v7//39/f/9/f3/
-        /v7+//7+/v/+/v7//v7+//7+/v/9/f3/+vr6//Ly8v/o6Oj/2tra/8zMzP/ExMSrAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv7+/B7u7u6S5ubn/tbW1/7q6uv/IyMj/2tra/+vr6//29vb/
-        /Pz8//b29v/s7Oz/5eXl/9XV1f/FxcX/rKys/5eXl/+xsbH/1tbW/9fX1//Pz8//x8fH/8TExP/ExMT/
-        xsbG/8vLy//Ozs7/0dHR/9PT0//U1NT/1tbW/9XV1f/T09P/0dHR/9DQ0P/Ly8v/x8fH/8XFxf/FxcX/
-        yMjI/87Ozv/V1dX/3Nzc/8nJyf+oqKj/lpaW/6+vr//Jycn/4eHh//Dw8P/u7u7/y8vL/66urv+oqKj/
-        mpqa/4qKiv9tbW3/T09P/2NjY/9+fn7/kZGR/5SUlP+urq7/wsLC/8nJyf/Kysr/ysrK/87Ozv/b29v/
-        5+fn//Dw8P/39/f/+/v7//39/f/9/f3//v7+//////////////////////////////////7+/v/9/f3/
-        +Pj4/+/v7//j4+P/09PT/8zMzMkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAALq6upK2trb/tLS0/7e3t//Dw8P/1NTU/+Xl5f/y8vL/+fn5//v7+//z8/P/6+vr/+Pj4//U1NT/
-        xMTE/6+vr/+Xl5f/o6Oj/7+/v//a2tr/2dnZ/9PT0//Ozs7/ysrK/8fHx//ExMT/xMTE/8TExP/FxcX/
-        xcXF/8XFxf/FxcX/xsbG/8rKyv/Pz8//09PT/9nZ2f/d3d3/x8fH/66urv+Xl5f/nZ2d/7a2tv/Nzc3/
-        4uLi/+/v7//y8vL/29vb/7u7u/+ysrL/o6Oj/5CQkP+Ojo7/fX19/15eXv9GRkb/dnZ2/4+Pj/+ioqL/
-        srKy/8TExP/Ozs7/z8/P/8/Pz//S0tL/3t7e/+np6f/y8vL/+Pj4//z8/P/9/f3//v7+////////////
-        //////////////////////////////////////7+/v/7+/v/9PT0/+rq6v/c3Nz/09PT1gAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALi4uHGzs7P8sLCw/7S0tP+/v7//
-        zc3N/93d3f/r6+v/9fX1//v7+//6+vr/8vLy/+vr6//l5eX/19fX/8rKyv+6urr/pqam/5OTk/+cnJz/
-        q6ur/76+vv/MzMz/29vb/9zc3P/b29v/2tra/9jY2P/Z2dn/29vb/9zc3P/d3d3/z8/P/76+vv+vr6//
-        oKCg/5OTk/+enp7/sbGx/8bGxv/Y2Nj/6Ojo//Hx8f/z8/P/4uLi/8TExP+3t7f/r6+v/5OTk/+Ghob/
-        ioqK/4WFhf9xcXH/UlJS/1BQUP99fX3/n5+f/7S0tP/Nzc3/09PT/9fX1//X19f/2NjY/+Hh4f/s7Oz/
-        8/Pz//n5+f/8/Pz//f39//7+/v//////////////////////////////////////////////////////
-        /v7+//z8/P/4+Pj/8PDw/+Xl5f/c3NzXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAALi4uDyvr6/irKys/66urv+5ubn/xcXF/9PT0//h4eH/7e3t//X19f/5+fn/
-        +vr6//T09P/t7e3/6enp/+Hh4f/W1tb/zMzM/7+/v/+0tLT/p6en/5ubm/+RkZH/lJSU/5mZmf+Wlpb/
-        np6e/5eXl/+VlZX/lJSU/4+Pj/+ZmZn/paWl/7CwsP++vr7/zMzM/9nZ2f/m5ub/7+/v//Pz8//y8vL/
-        4eHh/8jIyP+6urr/uLi4/5ubm/+AgID/gYGB/4ODg/+Ghob/f39//2pqav9JSUn/X19f/4qKiv+rq6v/
-        xcXF/9zc3P/b29v/2tra/9vb2//h4eH/6+vr//Pz8//4+Pj//Pz8//39/f/+/v7/////////////////
-        ///////////////////////////////////////////+/v7//f39//n5+f/09PT/7e3t/+bm5ssAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALe3txKrq6ud
-        pqam/6Wlpf+vr6//vLy8/8fHx//T09P/39/f/+jo6P/v7+//9PT0//f39//19fX/8PDw/+vr6//o6Oj/
-        5eXl/+Dg4P/Y2Nj/0tLS/9DQ0P/Kysr/xsbG/8TExP/Dw8P/xcXF/8vLy//Nzc3/0dHR/9bW1v/e3t7/
-        5ubm/+zs7P/x8fH/8/Pz//T09P/u7u7/3Nzc/8TExP+6urr/u7u7/6urq/+Ojo7/goKC/39/f/9/f3//
-        gICA/4KCgv98fHz/ZmZm/0VFRf9tbW3/mpqa/7m5uf/T09P/4+Pj/+Pj4//a2tr/3d3d/+jo6P/x8fH/
-        9/f3//v7+//9/f3//v7+////////////////////////////////////////////////////////////
-        //////7+/v/8/Pz/+fn5//T09P/v7+//7e3trAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACvr689oqKi0J2dnf+enp7/q6ur/7m5uf+/v7//
-        xsbG/8/Pz//X19f/3d3d/+Pj4//n5+f/6+vr/+zs7P/r6+v/6+vr/+rq6v/q6ur/6enp/+np6f/p6en/
-        6Ojo/+vr6//t7e3/7+/v//Hx8f/y8vL/8/Pz//T09P/09PT/8vLy/+zs7P/g4OD/zMzM/7q6uv+2trb/
-        ubm5/7i4uP+qqqr/nZ2d/5OTk/+Kior/g4OD/39/f/9/f3//gICA/3t7e/9lZWX/RUVF/3V1df+qqqr/
-        x8fH/9/f3//p6en/6+vr/+Tk5P/m5ub/7u7u//X19f/6+vr//f39//7+/v//////////////////////
-        /////////////////////////////////////////////////v7+//z8/P/4+Pj/8/Pz/+/v7//u7u6A
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAACsrKwCpKSkWJeXl+ORkZH/jY2N/5CQkP+YmJj/oqKi/6ampv+srKz/s7Oz/7q6uv/BwcH/
-        x8fH/83Nzf/S0tL/19fX/9zc3P/g4OD/5OTk/+fn5//q6ur/7Ozs/+7u7v/v7+//7u7u/+3t7f/q6ur/
-        5ubm/9XV1f/Dw8P/tbW1/62trf+xsbH/ubm5/8jIyP/Kysr/wsLC/7a2tv+rq6v/oKCg/5WVlf+MjIz/
-        hYWF/4CAgP9/f3//e3t7/2dnZ/9HR0f/d3d3/7W1tf/Pz8//5eXl/+zs7P/u7u7/8PDw//Dw8P/z8/P/
-        +Pj4//z8/P/+/v7/////////////////////////////////////////////////////////////////
-        //////7+/v/9/f3//Pz8//n5+f/7+/v/7+/v//Dw8EUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoaGhApSUlIGAgID5
-        dnZ2/2VlZf9eXl7/Y2Nj/25ubv96enr/hYWF/4uLi/+RkZH/mJiY/56env+kpKT/qqqq/7CwsP+1tbX/
-        u7u7/8HBwf/FxcX/ycnJ/8fHx/+8vLz/srKy/6enp/+enp7/n5+f/6Wlpf+wsLD/ycnJ/9/f3//p6en/
-        4uLi/9nZ2f/Q0ND/xMTE/7q6uv+urq7/o6Oj/5iYmP+Pj4//h4eH/4GBgf98fHz/bGxs/05OTv93d3f/
-        vb29/9TU1P/l5eX/6+vr/+3t7f/x8fH/9/f3//n5+f/7+/v//f39//7+/v//////////////////////
-        ///////////+/v7/+/v7//n5+f/9/f3//////////////////v7+//z8/P/7+/v//f39//n5+f/x8fHz
-        8vLyBwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGtraydsbGy4W1tb/lBQUP9ISEj/QkJC/0FBQf9BQUH/
-        SEhI/05OTv9TU1P/WVlZ/1xcXP9jY2P/Y2Nj/2hoaP9paWn/aGho/2hoaP9paWn/bW1t/3Z2dv+AgID/
-        j4+P/6mpqf/Ly8v/6Ojo//n5+f/5+fn/9vb2//Hx8f/r6+v/5OTk/9zc3P/S0tL/yMjI/729vf+ysrL/
-        pqam/5ubm/+QkJD/h4eH/319ff9vb2//U1NT/3R0dP/Dw8P/2NjY/+Xl5f/p6en/7Ozs//Ly8v/39/f/
-        /Pz8//7+/v/+/v7//////////////////////////////////f39/+7u7v++vr7/m5ub/+bm5v/+/v7/
-        //////7+/v/9/f3//f39//7+/v/9/f3/8vLy//Hx8aQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABzc3Mk
-        cXFxbldXV69dXV3rWVlZ/1hYWP9WVlb/VVVV/1NTU/9QUFD/TU1N/0hISP9FRUX/QkJC/0BAQP9AQED/
-        QkJC/0lJSf9TU1P/X19f/3BwcP+Dg4P/mJiY/7S0tP/MzMz/2NjY/+Xl5f/u7u7/9vb2//n5+f/5+fn/
-        9/f3//Pz8//t7e3/5+fn/97e3v/V1dX/y8vL/7+/v/+ysrL/paWl/5aWlv+IiIj/eXl5/2lpaf9TU1P/
-        bW1t/8bGxv/c3Nz/6Ojo/+rq6v/t7e3/9fX1//v7+//9/f3//v7+////////////////////////////
-        ///////////09PT/wsLC/5KSkv9YWFj/kpKS//v7+/////////////7+/v/+/v7//f39//j4+P/o6Oj/
-        8fHxOQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAB6enodaGhotGpqav1sbGz/bm5u/3BwcP9ycnL/c3Nz/3R0dP9zc3P/
-        cXFx/29vb/9sbGz/aWlp/2VlZf9gYGD/W1tb/1VVVf9VVVX/Xl5e/25ubv+BgYH/jY2N/5KSkv+ZmZn/
-        oaGh/6urq/+4uLj/yMjI/9jY2P/m5ub/8PDw//b29v/5+fn/9/f3//Pz8//u7u7/5+fn/97e3v/S0tL/
-        xcXF/7W1tf+kpKT/kpKS/35+fv9tbW3/Xl5e/1VVVf9qamr/wcHB/+Dg4P/q6ur/7e3t//Ly8v/4+Pj/
-        /Pz8//7+/v////////////////////////////////////////////n5+f/k5OT/ysrK/35+fv9gYGD/
-        8vLy//////////////////7+/v/9/f3/7e3t/+fn58AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfHx8GHJyct51dXX/
-        d3d3/3t7e/+BgYH/iYmJ/5CQkP+Tk5P/k5OT/5GRkf+Pj4//jIyM/4qKiv+Hh4f/hISE/4GBgf9+fn7/
-        eHh4/3Jycv9ra2v/YmJi/1hYWP9WVlb/Z2dn/319ff+MjIz/kpKS/5qamv+oqKj/uLi4/8rKyv/b29v/
-        6enp//Hx8f/z8/P/8PDw/+rq6v/g4OD/1dXV/8fHx/+4uLj/paWl/5OTk/+BgYH/dHR0/21tbf9ubm7/
-        dXV1/3t7e/+zs7P/4+Pj/+7u7v/x8fH/9fX1//v7+//9/f3//v7+////////////////////////////
-        /////////////////v7+//f39//t7e3/q6ur/2VlZf/p6en///////////////////////n5+f/v7+/9
-        8fHxOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAB2dna1eXl5/3p6ev+BgYH/kZGR/6Ghof+urq7/srKy/7Gxsf+tra3/
-        qamp/6ioqP+pqan/qqqq/6qqqv+rq6v/qamp/6ioqP+lpaX/oaGh/5ycnP+VlZX/iIiI/3d3d/9mZmb/
-        VFRU/1RUVP9qamr/f39//4WFhf+Pj4//nZ2d/7CwsP/CwsL/0NDQ/9fX1//V1dX/z8/P/8TExP+4uLj/
-        rKys/52dnf+SkpL/i4uL/4uLi/+QkJD/mJiY/52dnf+ampr/jo6O/5ubm//m5ub/8PDw//T09P/4+Pj/
-        /Pz8//39/f/+/v7//////////////////////////////////////////////////f39//X19f+1tbX/
-        v7+///7+/v/////////////////+/v7/+Pj4//X19ZgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf39/RHt7e/98fHz/
-        hISE/5mZmf+zs7P/xMTE/8jIyP/Dw8P/u7u7/7W1tf+2trb/u7u7/7+/v//CwsL/xcXF/8bGxv/Gxsb/
-        xcXF/8XFxf/FxcX/xMTE/8TExP+6urr/qKio/5mZmf+Kior/c3Nz/1hYWP9PT0//X19f/2lpaf9wcHD/
-        fX19/4+Pj/+hoaH/q6ur/66urv+qqqr/pqam/6Kiov+ioqL/pqam/66urv+5ubn/wsLC/8XFxf+/v7//
-        r6+v/5iYmP+BgYH/f39//9bW1v/y8vL/9/f3//r6+v/9/f3//f39//7+/v//////////////////////
-        /////////////////////////////////////////////////////////////////v7+//r6+v/29vbO
-        9vb2CwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAB9fX2vfX19/4KCgv+Xl5f/t7e3/87Ozv/T09P/zc3N/8LCwv+6urr/
-        urq6/8LCwv/Kysr/z8/P/9HR0f/T09P/1NTU/9TU1P/U1NT/1NTU/9TU1P/V1dX/1tbW/9DQ0P/FxcX/
-        ubm5/7CwsP+oqKj/lZWV/3R0dP9aWlr/UVFR/1hYWP9hYWH/dHR0/4qKiv+enp7/rKys/7W1tf+/v7//
-        ysrK/9bW1v/i4uL/6Ojo/+fn5//c3Nz/ycnJ/7Kysv+cnJz/jY2N/4+Pj/+lpaX/urq6//Hx8f/5+fn/
-        /Pz8//39/f/9/f3//v7+////////////////////////////////////////////////////////////
-        //////////////////////39/f/39/f/9PT03vb29h4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAh4eHCYCAgPeBgYH/
-        j4+P/6+vr//Ozs7/2tra/9XV1f/Ly8v/v7+//729vf/FxcX/0NDQ/9fX1//a2tr/29vb/9vb2//b29v/
-        29vb/9zc3P/c3Nz/29vb/9vb2//Z2dn/1tbW/9DQ0P/FxcX/u7u7/7u7u/++vr7/sbGx/5CQkP9ubm7/
-        W1tb/3BwcP+NjY3/sLCw/9DQ0P/k5OT/8PDw//f39//6+vr/+Pj4//Hx8f/j4+P/0dHR/7+/v/+wsLD/
-        qKio/7CwsP/FxcX/3Nzc/+np6f7n5+fHzc3N3Pn5+f/9/f3//f39//39/f/+/v7//v7+////////////
-        ///////////////////////////////////////////////////////////5+fn/8vLy/+/v78/19fUY
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAACIiIgygoKC/4eHh/+fn5//xcXF/9zc3P/e3t7/1dXV/8nJyf/AwMD/
-        xcXF/9HR0f/a2tr/39/f/+Dg4P/g4OD/4ODg/+Dg4P/g4OD/39/f/9/f3//f39//39/f/97e3v/d3d3/
-        19fX/87Ozv/CwsL/vb29/8XFxf/Nzc3/w8PD/6Ojo/99fX3/aWlp/5+fn//Jycn/5OTk//Dw8P/v7+//
-        6urq/+Dg4P/U1NT/y8vL/8PDw/+/v7//xsbG/9HR0f/e3t7/6urq/vHx8drm5uaE39/fJQAAAADU1NQZ
-        4ODgwfn5+f/9/f3//f39//7+/v/+/v7//v7+//7+/v//////////////////////////////////////
-        ///////////8/Pz/8vLy/+zs7P3t7e2Q8/PzCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIuLi0OFhYX/
-        j4+P/6+vr//V1dX/5OTk/+Dg4P/V1dX/yMjI/8TExP/Nzc3/2tra/+Li4v/k5OT/5OTk/+Tk5P/k5OT/
-        5OTk/+Tk5P/k5OT/4+Pj/+Pj4//j4+P/4+Pj/+Li4v/f39//1tbW/8jIyP/AwMD/x8fH/9PT0//Z2dn/
-        ysrK/6ioqP+Dg4P/fHx8/7e3t//Jycn/z8/P/9DQ0P/Q0ND/0NDQ/9PT0//Y2Nj/4ODg/+rq6v7w8PDo
-        9PT0p+Dg4GrS0tIXAAAAAAAAAAAAAAAAAAAAAAAAAADj4+ME6+vrkfLy8v35+fn//f39//7+/v/+/v7/
-        /v7+//////////////////////////////////7+/v/6+vr/8fHx/+np6f/n5+e/7u7uNgAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAj4+PNoiIiP+Xl5f/vb29/+Dg4P/o6Oj/4+Pj/9fX1//Kysr/
-        ycnJ/9XV1f/h4eH/5+fn/+np6f/p6en/6Ojo/+jo6P/o6Oj/6Ojo/+fn5//n5+f/5+fn/+fn5//n5+f/
-        5+fn/+Pj4//a2tr/zc3N/8TExP/Kysr/19fX/+Dg4P/e3t7/x8fH/6CgoP+BgYH/t7e35eXl5cru7u6s
-        8vLyq+Li4n/o6Oh76urqc+vr62Xq6uo/4ODgCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAA7u7uOe7u7rHw8PD88PDw//Hx8f/29vb/+vr6//v7+//8/Pz/+vr6//b29v/x8fH/
-        6urq/+bm5vbk5OSh7OzsOgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACYmJgN
-        i4uL+52dnf/Gxsb/5ubm/+zs7P/n5+f/3t7e/9XV1f/X19f/4eHh/+rq6v/v7+//7+/v/+7u7v/t7e3/
-        7Ozs/+zs7P/s7Oz/7Ozs/+vr6//r6+v/6+vr/+vr6//q6ur/5ubm/9zc3P/Pz8//x8fH/87Ozv/b29v/
-        5eXl/+fn5//Z2dn/s7Oz/5CQkP+ampqzu7u7BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAO/v7yPt7e1q
-        3NzcqNzc3Nfg4ODo5ubm/Ofn5+Xm5ubb5eXls+np6Yfs7OxL8PDwCQAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACMjIy4oKCg/8rKyv/r6+v/9fX1//X19f/y8vL/
-        8PDw//Hx8f/09PT/+Pj4//n5+f/5+fn/+Pj4//f39//19fX/9PT0//Ly8v/w8PD/7+/v/+/v7//v7+//
-        7+/v/+3t7f/n5+f/3Nzc/8/Pz//Ly8v/1dXV/+Li4v/q6ur/7Ozs/+Li4v+/v7//mJiY/6SkpOS6uroB
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAKGhoUaenp7/x8fH/+7u7v/7+/v//Pz8//z8/P/8/Pz//Pz8//39/f/+/v7//v7+//39/f/9/f3/
-        /f39//z8/P/7+/v/+/v7//r6+v/5+fn/9vb2//X19f/z8/P/7+/v/+fn5//a2tr/z8/P/9HR0f/d3d3/
-        6enp/+/v7//x8fH/5+fn/8TExP+bm5v/q6ur2wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJiYmKq9vb3/6urq//z8/P/9/f3/
-        /v7+/////////////////////////////////////////////v7+//7+/v/+/v7//f39//39/f/9/f3/
-        /Pz8//r6+v/19fX/6+vr/9vb2//R0dH/2dnZ/+bm5v/w8PD/9PT0//Pz8//o6Oj/w8PD/5ubm//AwMCa
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAvb29E6urq9jY2Nj/9/f3//39/f/9/f3//f39//7+/v//////////////////////
-        //////7+/v////////////////////////////7+/v/+/v7//f39//v7+//19fX/7e3t/+jo6P/p6en/
-        8PDw//X19f/39/f/9fX1/+Pj4/+7u7v/mJiY/ru7uzsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAyMjIGLq6us/h4eH/
-        9/f3//z8/P/8/Pz//Pz8//7+/v/+/v7////////////4+Pj/4+Pj/+np6f/29vb//v7+////////////
-        ///////////+/v7//v7+//z8/P/6+vr/+fn5//n5+f/6+vr/+/v7//r6+v/z8/P/19fX/62trf+lpaW+
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0NDQCczMzJnf39//8vLy//z8/P/6+vr/+vr6//z8/P/+/v7/
-        /////+bm5v+enp7/ioqK/6qqqv/7+/v///////////////////////////////////////7+/v/+/v7/
-        /v7+//7+/v/+/v7/+/v7/+rq6v/FxcX/oaGh/sPDwz8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAANTU1ELU1NTW5+fn//f39//7+/v/+vr6//z8/P/9/f3/7u7u/9XV1f+fn5//kpKS//z8/P//////
-        //////////////////////////////////////////////////////7+/v/4+Pj/2NjY/6+vr//Dw8Or
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANvb2wTPz89e29vb1+zs7P/4+Pj/
-        /f39//39/f/6+vr/8PDw/7e3t//Gxsb//Pz8//39/f/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7/
-        ///////////+/v7/+vr6/+bm5v+6urr/v7+/yNvb2w0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAADi4uIC5OTkR+Dg4Krx8fH5+/v7//n5+f/z8/P/1tbW//Hx8f/4+Pj/
-        +Pj4//n5+f/6+vr/+/v7//z8/P/9/f3//f39//39/f/9/f3/+/v7//Pz8//e3t7/xMTE99LS0ofk5OQH
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAOnp6Q3p6elQ6+vrmObm5tXo6Oj+7u7u//Ly8v/09PT/9fX1//b29v/29vb/9vb2//X19f/y8vL/
-        7u7u/+Xl5f/e3t7+2NjYyuHh4Xbl5eUTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOXl5Qvd3d00
-        3d3dWN/f33ba2tqT2dnZmt3d3bLe3t6y4eHhoOPj45bp6el07u7uR/Pz8xUAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////////////
-        ///////////////////////////////////////////////////////////////////////8Af//////
-        ////////////4AA//////////////////4AAB/////////////////8AAAP////////////////+AAAD
-        /////////////////gAAA/////////////////4AAAP/////////////////AAAD////////////////
-        /wAAA/////////////////+AAAf///////////////gAAAAP//////////////8AAAAAH///////////
-        ///wAAAAAA//////////////gAAAAAAA/////////////AAAAAAAAB///////////+AAAAAAAAAH////
-        //////+AAAAAAAAAAP/////////+AAAAAAAAAAA/////////+AAAAAAAAAAAH/////////AAAAAAAAAA
-        AA///////x0AAAAAAAAAAAAD/////4AAAAAAAAAAAAAAAf////8AAAAAAAAAAAAAAAH////+AAAAAAAA
-        AAAAAAAB/////gAAAAAAAAAAAAAAAP////4AAAAAAAAAAAAAAAD////+AAAAAAAAAAAAAAAA/////gAA
-        AAAAAAAAAAAAAP////4AAAAAAAAAAAAAAAH/////wAAAAAAAAAAAAAAB//////AAAAAAAAAAAAAAAf//
-        ///4AAAAAAAAAAAAAAP//////AAAAAAAAAAAAAAD//////4AAAAAAAAAAAAAB///////AAAAAAAAAAAA
-        AAf//////wAAAAAAAAAAAAAH//////4AAAAAAAAAAAAAB//////8AAAAAAAAAAAAAAf//////AAAAAAA
-        AAAAAAAH//////gAAAAAAAAAAAAAB//////4AAAAAAAAAAAAAA//////8AAAAAAAAAAAAAAP//////AA
-        AAAAAAAAAAAAD//////gAAAAAAAAAAAAAAf/////4AAAAAAAAAAAAAAD/////8AAAAAAAAAAAAAAA///
-        ///AAAAAAAAAAAAAAAH/////gAAAAAAAAAAAAAAB/////4AAAAAAAAAAAAAAAP////+AAAAAAAAAAAAA
-        AAD/////AAAAAAAAAAAAAAAA/////wAAAAAAAAAAAAAAAH////8AAAAAAAAAAAAAAAB/////AAAAAAAA
-        AAAAAAAAf////wAAAAAAAAAAAAAAAH////4AAAAAAAAAAAAAAAA////+AAAAAAAAAAAAAAAAP////gAA
-        AAAAAAAAAAAAAD////4AAAAAAAAAAAAAAAA////+AAAAAAAAAAAAAAAAP////gAAAAAAAAAAAAAAAD//
-        //4AAAAAAAAAAAAAAAA////+AAAAAAAAAAAAAAAAP////gAAAAAAAAAAAAAAAD////4AAAAAAAAAAAAA
-        AAA////+AAAAAAAAAAAAAAAAP////gAAAAAAAAAAAAAAAD////4AAAAAAAAAAAAAAAA////+AAAAAAAA
-        AAAAAAAAP////gAAAAAAAAAAAAAAAD////4AAAAAAAAAAAAAAAB////+AAAAAAAAAAAAAAAAf////gAA
-        AAAAAAAAAAAAAH////8AAAAAAAAAAAAAAAB/////AAAAAAAAAAAAAAAAf////wAAAAAAAAAAAAAAAP//
-        //8AAAAAAAAAAAAAAAD/////gAAAAAAAAAAAAAAA/////4AAAAAAAAAAAAAAAf////+AAAAAAAAAAAAA
-        AAH/////wAAAAAAAAAAAAAAB/////8AAAAAAAAAAAAAAAP/////gAAAAAAAAAAAAAAD/////4AAAAAAA
-        AAAAAAAA//////AAAAAAAAAAAAAAAP/////4AAAAAAAAAAAAAAD/////+AAAAAAAAAAAAAAA//////wA
-        AAAAAAAAAAAAAH/////+AAAAAAAAAAAAAAB//////wAAAAAAAAAAAAAAf/////8AAAAAAAAAAAAAAH//
-        ////wAAAAAAAAAAAAAB//////+AAAAAAAAAAAAAAf//////wAAAAAAAAAAAAAH//////+AAAAAAAAAAA
-        AAB///////4AAAAAAAAAAAAAf///////AAAAAAAAAAAAAH///////8AAAAAAAAAAAAB////////wAAAA
-        AAAAAAAA////////4AAAAAAAAAAAAP///////4AAAAAAAAAAAAH///////8AAAAAAAAAAAAB////////
-        AAAAAAAAAAAAA////////gAAAAAAAAAAAAP///////4AAAAAAAAAAAAH///////8AAAAAAAAAAAAD///
-        /////AAAAAAAABAAAB////////wAAAAAAAD4AAB////////8AAAAAAAP/gAB/////////AAAAAAP//+A
-        B/////////4AAAAAD//////////////+AAAAAB///////////////wAAAAAf//////////////8AAAAA
-        H///////////////gAAAAD///////////////8AAAAA////////////////wAAAAf///////////////
-        +AAAAH////////////////4AAAD/////////////////wAAD//////////////////wAH///////////
-        //////////////////////////////////////////8oAAAAMAAAAGAAAAABACAAAAAAAIAlAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQDAwMMBgYGFQcHBxcODg4MBgYGAwAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAB0AAABFUFBQqJ+fn+caGhpi
-        AAAAHAAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAACYQEBB8
-        zMzM+s/Pz/4xMTGIAAAAKgAAAAkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        BAQEAgMDAx9ycnLA6enp/729vf4cHBxBBAQEDgAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAEAAAACQAAABEAAAAX
-        AAAAGQAAABYAAAASAQEBGBwcHGXa2tr739/f/6+vr/ApKSkQDAwMBAAAAAEAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwEDAwMIAQEBFAAAACMAAAAy
-        BgYGQw0NDVkNDQ1hDAwMXwcHB1EAAABHAAAAU35+fs7v7+/+0tLS/5mZmdMAAAAmAAAAHQAAABMAAAAK
-        AAAABAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGBgYBBQUFDgAAACYNDQ1L
-        Ojo6iV9fX76EhIThoKCg962trfyxsbH+r6+v/aenp/iTk5PobGxs0aOjo/3IyMj+xcXF/3Z2drwAAABK
-        AAAAPgAAADIAAAAkAAAAFgAAAA0AAAAGAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAEAAAABAwMDAQkJCQoBAQEr
-        IyMja3R0dMK0tLT5zc3N/9nZ2f/Q0ND/0dHR/9PT0//V1dX/1dXV/9PT0//Q0ND/0dHR/9PT0//CwsL/
-        r6+v/z8/P6gAAABfAAAAVwAAAE0AAAA/AAAAKgAAABoAAAAUAAAADQAAAAQAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgYGBwEBARsAAAAzAAAAPgAAACgAAAAb
-        AAAAJBAQEFh3d3fCw8PD/NnZ2f7S0tL+09PT/+Xl5f74+Pj+9vb2//Ly8v7w8PD+8fHx//X19f76+vr+
-        +Pj4/+Dg4P7Q0ND+2dnZ/7S0tOtGRkaRAAAAWwAAAFUAAABMAAAANgAAAB0AAAAbAAAAFQAAAA8AAAAC
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAFk1NTYmZmZnj
-        MjIytwAAAH8AAABpMjIykLKysvDW1tb/1tbW/9TU1P/y8vL/8vLy/+vr6//m5ub/9PT0//j4+P/6+vr/
-        +vr6//b29v/x8fH/7Ozs//Dw8P/8/Pz/4uLi/9TU1P/Pz8/+iYmJxBISEl8AAABPAAAAMgAAABcAAAAb
-        AAAAGwAAABcAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        IiIiB5SUlKnw8PD+1tbW/3x8fOVRUVHMx8fH/Nzc3P7R0dH+6Ojo//Ly8v7p6en+9vb2/+Hh4f5tbW3+
-        8PDw//7+/v7+/v7+//////7+/v7+/v7+//////n5+f7s7Oz+9fX1//Pz8/7T09P/ycnJ/q+vr+YwMDBu
-        AAAAMQAAABoAAAAfAAAAHwAAACIAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAKCgoBbMzMzZ5eXl/6Ojo/7Jycn/3t7e/tHR0f7z8/P+6enp//Pz8/7+/v7+
-        //////v7+/7S0tL+/v7+//7+/v7+/v7+//////7+/v7+/v7+//////7+/v7+/v7+8vLy//Dw8P729vb/
-        1tbW/rS0tP63t7f0RkZGZwAAACkAAAArAAAAKQAAACMAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACsrKwmm5ub7MHBwf7g4OD/0tLS/vT09P7m5ub+
-        +/v7//7+/v7+/v7+//////7+/v7+/v7+//////7+/v7+/v7+//////7+/v7+/v7+//////7+/v7+/v7+
-        //////Pz8/7y8vL/7u7u/tjY2P6Pj4//tbW1+GFhYXoAAAAzAAAAMgAAABEAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACoqKgWsrKy6OHh4f/U1NT/
-        8/Pz/+bm5v/9/f3/////////////////////////////////////////////////////////////////
-        ///////////////////////////u7u7/+fn5/97e3v+9vb3/i4uL/7m5ufxqamqJAAAALAkJCQcAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACfn5+n
-        3Nzc/9ra2v7s7Oz/5OTk/vr6+v79/f3+/f39//39/f79/f3+/f39//39/f79/f3+/f39//39/f79/f3+
-        /f39//39/f79/f3+/f39//39/f79/f3+/f39//39/f78/Pz/6urq/vT09P7a2tr/m5ub/pycnP7FxcX9
-        bGxseSwsLAkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAJ6enjy/v7/85eXl/9zc3P7o6Oj/8/Pz/vv7+/77+/v++/v7//v7+/77+/v++/v7//v7+/77+/v+
-        +/v7//v7+/77+/v++/v7//v7+/77+/v++/v7//v7+/77+/v++/v7//v7+/77+/v/7e3t/vb29v7d3d3/
-        pqam/tDQ0P6jo6P/4ODg+q+vrzkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAJeXl7jk5OT/2NjY/+7u7v/j4+P/9/f3//f39//39/f/9/f3//f39//39/f/
-        9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39/+1tbX/
-        yMjI/+np6f/i4uL/t7e3/97e3v+7u7v/ysrK/+vr69Hi4uIGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAl5eXJ7e3t/vq6ur+2tra/97e3v7w8PD/9PT0/vT09P709PT+
-        9PT0//T09P709PT+9PT0//T09P709PT+9PT0//T09P709PT+9PT0//T09P709PT+9PT0//T09P709PT+
-        9PT0//T09P6mpqb/yMjI/uTk5P7n5+f/yMjI/s7Ozv7j4+P/urq6/unp6f7w8PBkAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjo6Oftra2v7f39/+4eHh/+/v7/7t7e3/
-        8PDw/vDw8P7w8PD+8PDw//Dw8P7v7+/+7u7u/+vr6/7m5ub+sLCw/8vLy/7u7u7+8PDw//Dw8P7w8PD+
-        8PDw//Dw8P7w8PD+8PDw//Dw8P7w8PD/8PDw/uDg4P7q6ur/z8/P/sHBwf729vb/ubm5/ujo6P7x8fHQ
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlZWVyOrq6v/Z2dn/
-        6Ojo//n5+f/y8vL/6enp/+vr6//r6+v/6enp/9nZ2f/Hx8f/oqKi/3t7e/9aWlr/QkJC/2BgYP/MzMz/
-        4ODg/+bm5v/r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/93d3f/p6en/z8/P/76+vv/8/Pz/
-        w8PD/+Li4v/r6+v+7+/vIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACTk5MI
-        pqam+u7u7v7W1tb+6urq//n5+f76+vr/8/Pz/uXl5f7n5+f+0NDQ/1BQUP5RUVH+e3t7/6mpqf6hoaH+
-        YmJi/83Nzf7Kysr+tLS0/7u7u/7Y2Nj+3Nzc/+Pj4/7m5ub+5+fn/+fn5/7n5+f/5+fn/tra2v7j4+P/
-        ysrK/r+/v/76+vr/zc3N/tra2v7l5eX/7+/vWgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAACSkpIvuLi4/+/v7/7Ozs7+8fHx//j4+P74+Pj/+Pj4/vX19f7m5ub+zc3N/8zMzP7h4eH+
-        4eHh/7+/v/5VVVX+0tLS/+Li4v7i4uL+4uLi/9XV1f60tLT+sbGx/9DQ0P7U1NT+2tra/+Hh4f7i4uL/
-        4uLi/tTU1P7b29v/vb29/r6+vv7t7e3/z8/P/tTU1P7h4eH/7+/vgQAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAACRkZFLw8PD/+7u7v/MzMz/8fHx//b29v/29vb/9vb2//b29v/29vb/
-        7+/v/+Li4v/b29v/w8PD/1lZWf+5ubn/3t7e/97e3v/e3t7/3t7e/97e3v/e3t7/3d3d/7e3t/+vr6//
-        wsLC/9XV1f/d3d3/5OTk/+7u7v/Ozs7/pqam/6+vr//R0dH/wsLC/87Ozv/d3d3/7e3tjgAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACUlJRXyMjI/+/v7/7Kysr+7u7u/+vr6/7y8vL/
-        8/Pz/vPz8/7z8/P+9PT0//Pz8/7n5+f+q6ur/6SkpP7Z2dn+2tra/9vb2/7b29v+29vb/9vb2/7b29v+
-        29vb/9ra2v7a2tr+xsbG/9DQ0P7x8fH/8/Pz/uvr6/7Ozs7/iIiI/pGRkf6srKz/paWl/sDAwP7U1NT/
-        7OzskAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACVlZVVxsbG//Hx8f7Gxsb+
-        6urq/9bW1v7s7Oz/8fHx/vHx8f7x8fH+8PDw/+jo6P7V1dX+0tLS//Hx8f7v7+/+6urq/+Xl5f7j4+P+
-        4+Pj/+Pj4/7j4+P+5ubm/+vr6/7w8PD+8fHx//Hx8f7x8fH/7e3t/tjY2P7Ozs7/dnZ2/oCAgP6Kior/
-        gICA/qqqqv7Gxsb/6OjojAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACVlZVD
-        vr6+//Pz8//Kysr/39/f/+3t7f/u7u7/7e3t/+3t7f/t7e3/5OTk/9jY2P/CwsL/7Ozs/+3t7f/t7e3/
-        7u7u/+3t7f/t7e3/7u7u/+3t7f/t7e3/7u7u/+3t7f/t7e3/7u7u/+3t7f/t7e3/6Ojo/8fHx/+oqKj/
-        iYmJ/4WFhf9+fn7/ZGRk/42Njf+8vLz/5ubmdgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAACbm5sisbGx//Ly8v7W1tb+0dHR/+jo6P7r6+v/6+vr/uvr6/7m5ub+2tra/7e3t/7k5OT+
-        6+vr/+vr6/7r6+v+6+vr/+vr6/7r6+v+6+vr/+vr6/7r6+v+6+vr/+vr6/7r6+v+6+vr/+vr6/7n5+f/
-        1tbW/szMzP6Kior/nJyc/pCQkP6AgID/Xl5e/nV1df7Dw8P/39/fTQAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAACfn58BpKSk7Orq6v7k5OT+ycnJ/+Dg4P7o6Oj/6Ojo/ujo6P7n5+f+
-        tLS0/9jY2P7o6Oj+6Ojo/+jo6P7o6Oj+6Ojo/+jo6P7o6Oj+6Ojo/+jo6P7o6Oj+6Ojo/+jo6P7o6Oj+
-        6Ojo/+fn5/7h4eH/w8PD/qenp/6vr6//rKys/p+fn/6AgID/bGxs/nNzc/7Z2dn+29vbFgAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAApKSkptfX1//z8/P/xsbG/9bW1v/l5eX/
-        5+fn/+fn5//l5eX/x8fH/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/
-        5+fn/+fn5//n5+f/5ubm/97e3v/ExMT/x8fH/6SkpP+8vLz/nZ2d/4eHh/9lZWX/fHx8/4qKiv/j4+PJ
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAq6urTL6+vv7x8fH+
-        39/f/8PDw/7Z2dn/5OTk/uTk5P7k5OT+5OTk/+Tk5P7k5OT+5OTk/+Tk5P7k5OT+5OTk/+Tk5P7k5OT+
-        5OTk/+Tk5P7k5OT+5OTk/+Tk5P7k5OT+29vb/8nJyf7Ly8v/j4+P/p2dnf56enr/bGxs/mFhYf5NTU3/
-        UVFR/peXl/7AwMBuAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        sbGxBLOzs9XY2Nj/9PT0/8zMzP/Jycn/2dnZ/+Li4v/i4uL/4uLi/+Li4v/i4uL/4uLi/+Li4v/i4uL/
-        4uLi/+Li4v/i4uL/4uLi/+Li4v/i4uL/4uLi/+Hh4f/X19f/yMjI/8fHx/+FhYX/f39//3Z2dv98fHz/
-        ioqK/46Ojv+NjY3/goKC/3x8fPhNTU0nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAALm5uVC+vr796enp/+/v7/7ExMT/ycnJ/tXV1f7g4OD+4ODg/+Dg4P7g4OD+
-        4ODg/+Dg4P7g4OD+4ODg/97e3v7BwcH+3t7e/+Dg4P7g4OD+29vb/9TU1P7BwcH+ysrK/4ODg/5tbW3/
-        e3t7/paWlv67u7v/ycnJ/sXFxf7Nzc3/y8vL/rW1tf5qamqCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC9vb2gxMTE/+3t7f7t7e3/xcXF/sHBwf7Q0ND+
-        2dnZ/9/f3/7f39/+39/f/9/f3/7f39/+39/f/9vb2/67u7v+29vb/9ra2v7S0tL+ysrK/7y8vP7V1dX+
-        kZGR/2ZmZv58fHz/qamp/s3Nzf7S0tL/2dnZ/ufn5/7w8PD/7+/v/t7e3v68vLzxqKioCwAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC+vr4Iu7u7wsTExP/q6ur/
-        8vLy/9PT0/+5ubn/w8PD/8/Pz//R0dH/1tbW/9nZ2f/a2tr/2dnZ/9bW1v/R0dH/0NDQ/8fHx/+7u7v/
-        zMzM/9bW1v+jo6P/Z2dn/3p6ev+fn5//yMjI/9DQ0P/m5ub/9/f3//39/f/+/v7//f39//X19f/Z2dn/
-        y8vLPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        vLy8Cra2tqy6urr+3d3d/vPz8/7s7Oz+z8/P/7q6uv66urr+vLy8/8DAwP7CwsL+v7+//7y8vP67u7v+
-        vLy8/9DQ0P7h4eH+wsLC/5WVlf6BgYH+XFxc/6ampv7Pz8//19fX/uzs7P77+/v//v7+/v7+/v7/////
-        /v7+/vz8/P7s7Oz/39/fTwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAALW1tQKvr69kqamp6L6+vv7W1tb+5OTk/+bm5v7i4uL+2tra/9PT0/7S0tL+
-        2dnZ/+Hh4f7n5+f+3Nzc/8nJyf6xsbH+jIyM/4CAgP51dXX+a2tr/8vLy/7k5OT/6enp/vr6+v7+/v7/
-        /v7+/v7+/v7//////v7+/v39/f7z8/P/7e3tNwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAm5ubEIaGho1tbW36a2tr/3p6ev+Li4v/
-        mZmZ/6SkpP+rq6v/rq6u/7Gxsf/ExMT/2tra/93d3f/FxcX/p6en/42Njf93d3f/eHh4/9vb2//u7u7/
-        +Pj4//7+/v///////v7+/+3t7f/x8fH//v7+//z8/P/29vbw8fHxBgAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAe3t7N3BwcLltbW31
-        b29v/2tra/5iYmL+WVlZ/1ZWVv5ra2v+kZGR/7e3t/7b29v+8/Pz//Ly8v7h4eH+wsLC/5iYmP5vb2/+
-        eXl5/+Pj4/7y8vL//f39/v7+/v7//////v7+/snJyf6ioqL//v7+/vz8/P7v7++NAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/f38Q
-        e3t76piYmP62trb+sLCw/7Kysv61tbX+tLS0/66urv6bm5v+eHh4/2xsbP5/f3/+pqam/8HBwf64uLj+
-        q6ur/6ioqP6kpKT+jIyM/9/f3/75+fn//v7+/v7+/v7//////v7+/vn5+f7j4+P//v7+/vn5+d/19fUT
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAACEhIRgk5OT/9HR0f/Jycn/xsbG/9jY2P/b29v/29vb/9vb2//V1dX/vr6+/7Gxsf95eXn/
-        iIiI/9LS0v/l5eX/4ODg/8zMzP/AwMD+zs7O1dnZ2Z35+fn7/f39//7+/v/////////////////8/Pz/
-        8/Pz1vb29icAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAACMjIxytLS0/uPj4/7Nzc3+3d3d/+jo6P7n5+f+5+fn/+bm5v7k5OT+
-        zs7O/9DQ0P7R0dH+lJSU+tLS0qnb29uS4eHhhOHh4VzX19cgAAAAAAAAAADu7u5A9PT0wvLy8vb39/f9
-        9fX19vDw8Mzt7e1s8/PzBwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACdnZ0vwMDA/Pb29v719fX++fn5//r6+v74+Pj+
-        9fX1//Ly8v7s7Oz+09PT/9/f3/7q6ur+qKio+bq6uhYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAO/v7w/w8PAb8PDwDgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvr6+g/Pz8/79/f3/
-        /v7+//z8/P/39/f//v7+//7+/v/5+fn/6+vr//Pz8//t7e3/rq6uyrOzswEAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAANvb21fq6urg+vr6//Ly8v6qqqr+/f39//7+/v7+/v7+/v7+//39/f7T09P8xMTERgAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAADl5eUI6+vrWfHx8ark5OTh8vLy+vT09P719fX+8vLy8ubm5rrZ2dlG
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADq6uoC6enpD+rq6h7t7e0c
-        7u7uCQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////AAD/////
-        //8AAP////A//wAA////4B//AAD////gH/8AAP///+Af/wAA///gAB//AAD//wAAA/8AAP/8AAAA/wAA
-        /wAAAAB/AAD8AAAAAD8AAPgAAAAAPwAA/AAAAAA/AAD+AAAAAD8AAP8AAAAAfwAA/wAAAAB/AAD/AAAA
-        AH8AAP4AAAAAfwAA/gAAAAA/AAD8AAAAAD8AAPwAAAAAPwAA/AAAAAAfAAD4AAAAAB8AAPgAAAAAHwAA
-        +AAAAAAfAAD4AAAAAB8AAPgAAAAAHwAA+AAAAAAfAAD4AAAAAB8AAPgAAAAAHwAA/AAAAAA/AAD8AAAA
-        AD8AAPwAAAAAPwAA/gAAAAA/AAD/AAAAAB8AAP8AAAAAHwAA/4AAAAAfAAD/wAAAAB8AAP/wAAAAHwAA
-        //AAAAA/AAD/4AAAAD8AAP/gAAAAfwAA/+AAAwD/AAD/4AA/x/8AAP/wAD///wAA//gAf///AAD//AD/
-        //8AAP//g////wAAKAAAACAAAABAAAAAAQAgAAAAAACAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAEBAQYGBgYPCgoKCgMDAwEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAARo6OjtNMTEyaAAAAGgAAAAEAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwc5OTmE4ODg/1FRUY0CAgIRAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAQEBAwAAAAwAAAAXAAAAIwAAACUAAAAgAgICNLe3t+TT09P/QkJCVAUFBQgAAAAC
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAwMDDQcHBy8sLCxxUlJSpnNzc8Z+fn7UfHx80GZmZrtaWlrBzs7O/8jIyP8TExNY
-        AAAAMwAAACEAAAAPAAAABgAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAgIC
-        AAAACAAAAAoAAAAFAwMDCg8PDz5jY2Oqubm5883Nzf/b29v/4ODg/+Pj4//i4uL/4ODg/9nZ2f/IyMj/
-        rq6u+g8PD2sAAABXAAAARgAAACkAAAAXAAAADQAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAcHByJgYGCmFxcXjAAAAFg5OTmIurq68dXV1f/g4OD/7u7u/+/v7//y8vL/8vLy//Ly8v/z8/P/
-        8vLy//Dw8P/b29v/v7+/8EVFRYwAAABQAAAAKwAAABoAAAAYAAAACgAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAR0dHF9ra2urLy8v8cXFx39PT0/7Y2Nj/7Ozs//Dw8P/7+/v/m5ub//j4+P//////
-        ///////////+/v7/9PT0//T09P/i4uL/xsbG/nd3d68DAwMsAAAAIAAAACMAAAANAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsrKyOa+vr/bV1dX/2tra/+7u7v/29vb/////////////////
-        ////////////////////////////////+vr6//Pz8//h4eH/qKio/42NjbkJCQk4AAAALAAAAAMAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACjo6MmycnJ9dvb2//t7e3/+fn5//7+/v/+/v7/
-        /v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7/9/f3//T09P/Ly8v/k5OT/52dnckKCgoo
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK2trbnf39//6Ojo//Ly8v/8/Pz/
-        /Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz/7+/v/+bm5v+0tLT/
-        q6ur/7S0tLAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACUlJQ31NTU/+Hh4f/m5ub/
-        9vb2//b29v/29vb/9vb2//b29v/29vb/9vb2//b29v/29vb/9vb2//b29v/29vb/9vb2/8DAwP/Ly8v/
-        6Ojo/729vf/V1dX/0dHR/+np6VMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJ6enprl5eX/
-        5OTk/+rq6v/x8fH/8fHx//Hx8f/x8fH/7+/v/+vr6//Gxsb/7u7u//Hx8f/x8fH/8fHx//Hx8f/x8fH/
-        6Ojo/+jo6P/m5ub/t7e3//b29v/Jycn/7e3tzgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        s7Oz5ODg4P/t7e3/9/f3/+rq6v/q6ur/2NjY/56env96enr/eHh4/0pKSv+3t7f/1dXV/+Tk5P/p6en/
-        6urq/+rq6v/q6ur/6Ojo/+Hh4f+1tbX//Pz8/8jIyP/t7e3+8PDwIAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAIqKihjIyMj/2tra//Ly8v/4+Pj/9vb2/+jo6P+3t7f/sbGx/9jY2P+EhIT/xcXF/+Tk5P/Q0ND/
-        wcHB/8PDw//a2tr/39/f/+Pj4//h4eH/2dnZ/7Ozs//s7Oz/x8fH/+np6f/v7+9PAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAi4uLNNTU1P/V1dX/8vLy//b29v/29vb/9vb2/+/v7//h4eH/lZWV/6ampv/e3t7/
-        3t7e/97e3v/e3t7/1dXV/7+/v/+7u7v/39/f/+rq6v/a2tr/np6e/8HBwf+1tbX/4eHh/+7u7l8AAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAACPj4851tbW/9PT0//l5eX/5+fn//Ly8v/y8vL/8PDw/+Dg4P/V1dX/
-        6Ojo/+Pj4//g4OD/4ODg/+Dg4P/j4+P/5+fn/+7u7v/w8PD/7+/v/83Nzf98fHz/jo6O/46Ojv/Kysr/
-        6urqXgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJGRkSjNzc3/2tra/+Hh4f/t7e3/7e3t/+zs7P/e3t7/
-        ycnJ/+zs7P/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+zs7P/Z2dn/r6+v/4yMjP+BgYH/
-        bGxs/6ysrP/n5+dJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAl5eXBbu7u/bo6Oj/0dHR/+jo6P/p6en/
-        5+fn/7+/v//k5OT/6enp/+np6f/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/5OTk/8rKyv+fn5//
-        paWl/4iIiP9ubm7/sLCw/uHh4RgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAr6+vte3t7f/Ly8v/
-        39/f/+bm5v/l5eX/2NjY/+bm5v/m5ub/5ubm/+bm5v/m5ub/5ubm/+bm5v/m5ub/5ubm/+Hh4f/MzMz/
-        ra2t/6+vr/+Ghob/YGBg/3BwcP/Pz8/MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwsLBP
-        09PT/+bm5v/IyMj/3t7e/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//d3d3/
-        ysrK/6qqqv+BgYH/d3d3/4ODg/9+fn7/bm5u/3t7e3YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAALS0tAG8vLzB5ubm/9nZ2f/Hx8f/2dnZ/+Dg4P/g4OD/4ODg/+Dg4P/g4OD/xMTE/93d3f/e3t7/
-        1tbW/8bGxv+urq7/bW1t/42Njf+9vb3/y8vL/9TU1P/R0dH/k5OTwQAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAL29vR2/v7/k5+fn/9/f3//CwsL/zMzM/9XV1f/Z2dn/29vb/9ra2v/S0tL/
-        09PT/8PDw//Kysr/vr6+/2xsbP+NjY3/x8fH/9vb2//z8/P/+/v7//n5+f/a2tr/w8PDIQAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALm5uSC1tbXM1tbW/+zs7P/W1tb/x8fH/8HBwf+/v7//
-        wcHB/8fHx//Ozs7/1NTU/6Wlpf+CgoL/dHR0/87Ozv/h4eH/+fn5//7+/v///////v7+//Pz8//h4eEy
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKmpqQObm5toioqK7JGRkf+mpqb/
-        tbW1/8DAwP/ExMT/zs7O/9PT0//CwsL/mZmZ/3t7e/+SkpL/6urq//f39//+/v7//f39//Ly8v/+/v7/
-        9/f3+O/v7wwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHl5eYl+fn7v
-        gYGB/3l5ef9ubm7/b29v/4mJif+9vb3/5+fn/97e3v+vr6//gICA/5+fn//y8vL//v7+///////39/f/
-        tra2//7+/v/09PScAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACCgoIy
-        m5ub/8rKyv/FxcX/1NTU/9XV1f/Pz8//qqqq/3t7e/+YmJj/z8/P/8/Pz//BwcH+vr6+1PLy8ur+/v7/
-        /v7+///////+/v7/9/f3xfb29g8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAI2NjUPJycn/3Nzc/+jo6P/s7Oz/6enp/+fn5//Ozs7/2dnZ/6ioqNTV1dVk4ODgUd3d3SEAAAAA
-        7e3tHPLy8o309PS58/Pzpe/v71nw8PADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        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
-
-  
-
\ No newline at end of file
diff --git a/scheduler/DeviceScheduler/frmSchedule.Designer.cs b/scheduler/DeviceScheduler/frmSchedule.Designer.cs
deleted file mode 100644
index 9fea2b92..00000000
--- a/scheduler/DeviceScheduler/frmSchedule.Designer.cs
+++ /dev/null
@@ -1,960 +0,0 @@
-namespace DeviceScheduler
-{
-    partial class frmSchedule
-    {
-        /// 
-        /// Required designer variable.
-        /// 
-        private System.ComponentModel.IContainer components = null;
-
-        /// 
-        /// Clean up any resources being used.
-        /// 
-        /// true if managed resources should be disposed; otherwise, false.
-        protected override void Dispose(bool disposing)
-        {
-            if (disposing && (components != null))
-            {
-                components.Dispose();
-            }
-            base.Dispose(disposing);
-        }
-
-        #region Windows Form Designer generated code
-
-        /// 
-        /// Required method for Designer support - do not modify
-        /// the contents of this method with the code editor.
-        /// 
-        private void InitializeComponent()
-        {
-            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(frmSchedule));
-            this.cmdCancel = new System.Windows.Forms.Button();
-            this.cmdOK = new System.Windows.Forms.Button();
-            this.txtName = new System.Windows.Forms.TextBox();
-            this.label1 = new System.Windows.Forms.Label();
-            this.lvwDevices = new System.Windows.Forms.ListView();
-            this.columnHeader1 = new System.Windows.Forms.ColumnHeader();
-            this.columnHeader2 = new System.Windows.Forms.ColumnHeader();
-            this.label2 = new System.Windows.Forms.Label();
-            this.txtDescription = new System.Windows.Forms.TextBox();
-            this.cmdAdd = new System.Windows.Forms.Button();
-            this.cmdRemove = new System.Windows.Forms.Button();
-            this.label4 = new System.Windows.Forms.Label();
-            this.dtpDate = new System.Windows.Forms.DateTimePicker();
-            this.groupBox1 = new System.Windows.Forms.GroupBox();
-            this.groupBox2 = new System.Windows.Forms.GroupBox();
-            this.groupBox3 = new System.Windows.Forms.GroupBox();
-            this.grpMonth = new System.Windows.Forms.GroupBox();
-            this.nupMonth = new System.Windows.Forms.NumericUpDown();
-            this.label12 = new System.Windows.Forms.Label();
-            this.cboMontDec = new System.Windows.Forms.CheckBox();
-            this.cboMonthNov = new System.Windows.Forms.CheckBox();
-            this.cboMontOct = new System.Windows.Forms.CheckBox();
-            this.cboMontSept = new System.Windows.Forms.CheckBox();
-            this.cboMonthAug = new System.Windows.Forms.CheckBox();
-            this.cboMonthJuly = new System.Windows.Forms.CheckBox();
-            this.cboMonthJune = new System.Windows.Forms.CheckBox();
-            this.cboMonthMay = new System.Windows.Forms.CheckBox();
-            this.cboMonthApr = new System.Windows.Forms.CheckBox();
-            this.cboMonthMar = new System.Windows.Forms.CheckBox();
-            this.cboMonthFeb = new System.Windows.Forms.CheckBox();
-            this.cboMonthJan = new System.Windows.Forms.CheckBox();
-            this.cboMonthDays = new System.Windows.Forms.ComboBox();
-            this.cboOrder = new System.Windows.Forms.ComboBox();
-            this.rdbMonthThe = new System.Windows.Forms.RadioButton();
-            this.rdbMonthDay = new System.Windows.Forms.RadioButton();
-            this.label11 = new System.Windows.Forms.Label();
-            this.grpOnce = new System.Windows.Forms.GroupBox();
-            this.label14 = new System.Windows.Forms.Label();
-            this.grpDay = new System.Windows.Forms.GroupBox();
-            this.nupDay = new System.Windows.Forms.NumericUpDown();
-            this.label8 = new System.Windows.Forms.Label();
-            this.label5 = new System.Windows.Forms.Label();
-            this.dtpTime = new System.Windows.Forms.DateTimePicker();
-            this.grpWeek = new System.Windows.Forms.GroupBox();
-            this.nupWeek = new System.Windows.Forms.NumericUpDown();
-            this.label9 = new System.Windows.Forms.Label();
-            this.label10 = new System.Windows.Forms.Label();
-            this.cboWeekSaturday = new System.Windows.Forms.CheckBox();
-            this.cboWeekSunday = new System.Windows.Forms.CheckBox();
-            this.cboWeekFriday = new System.Windows.Forms.CheckBox();
-            this.cboWeekThursday = new System.Windows.Forms.CheckBox();
-            this.cboWeekWednesday = new System.Windows.Forms.CheckBox();
-            this.cboWeekTuesday = new System.Windows.Forms.CheckBox();
-            this.cboWeekMonday = new System.Windows.Forms.CheckBox();
-            this.cboSchedule = new System.Windows.Forms.ComboBox();
-            this.label7 = new System.Windows.Forms.Label();
-            this.label6 = new System.Windows.Forms.Label();
-            this.tabControl1 = new System.Windows.Forms.TabControl();
-            this.tabPage1 = new System.Windows.Forms.TabPage();
-            this.tabPage2 = new System.Windows.Forms.TabPage();
-            this.panel1 = new System.Windows.Forms.Panel();
-            this.label13 = new System.Windows.Forms.Label();
-            this.label3 = new System.Windows.Forms.Label();
-            this.pictureBox1 = new System.Windows.Forms.PictureBox();
-            this.groupBox1.SuspendLayout();
-            this.groupBox2.SuspendLayout();
-            this.groupBox3.SuspendLayout();
-            this.grpMonth.SuspendLayout();
-            ((System.ComponentModel.ISupportInitialize)(this.nupMonth)).BeginInit();
-            this.grpOnce.SuspendLayout();
-            this.grpDay.SuspendLayout();
-            ((System.ComponentModel.ISupportInitialize)(this.nupDay)).BeginInit();
-            this.grpWeek.SuspendLayout();
-            ((System.ComponentModel.ISupportInitialize)(this.nupWeek)).BeginInit();
-            this.tabControl1.SuspendLayout();
-            this.tabPage1.SuspendLayout();
-            this.tabPage2.SuspendLayout();
-            this.panel1.SuspendLayout();
-            ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit();
-            this.SuspendLayout();
-            // 
-            // cmdCancel
-            // 
-            this.cmdCancel.AccessibleDescription = null;
-            this.cmdCancel.AccessibleName = null;
-            resources.ApplyResources(this.cmdCancel, "cmdCancel");
-            this.cmdCancel.BackgroundImage = null;
-            this.cmdCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
-            this.cmdCancel.Font = null;
-            this.cmdCancel.Name = "cmdCancel";
-            this.cmdCancel.UseVisualStyleBackColor = true;
-            this.cmdCancel.Click += new System.EventHandler(this.cmdCancel_Click);
-            // 
-            // cmdOK
-            // 
-            this.cmdOK.AccessibleDescription = null;
-            this.cmdOK.AccessibleName = null;
-            resources.ApplyResources(this.cmdOK, "cmdOK");
-            this.cmdOK.BackgroundImage = null;
-            this.cmdOK.Font = null;
-            this.cmdOK.Name = "cmdOK";
-            this.cmdOK.UseVisualStyleBackColor = true;
-            this.cmdOK.Click += new System.EventHandler(this.cmdOK_Click);
-            // 
-            // txtName
-            // 
-            this.txtName.AccessibleDescription = null;
-            this.txtName.AccessibleName = null;
-            resources.ApplyResources(this.txtName, "txtName");
-            this.txtName.BackgroundImage = null;
-            this.txtName.Font = null;
-            this.txtName.Name = "txtName";
-            // 
-            // label1
-            // 
-            this.label1.AccessibleDescription = null;
-            this.label1.AccessibleName = null;
-            resources.ApplyResources(this.label1, "label1");
-            this.label1.Font = null;
-            this.label1.Name = "label1";
-            // 
-            // lvwDevices
-            // 
-            this.lvwDevices.AccessibleDescription = null;
-            this.lvwDevices.AccessibleName = null;
-            resources.ApplyResources(this.lvwDevices, "lvwDevices");
-            this.lvwDevices.BackgroundImage = null;
-            this.lvwDevices.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
-            this.columnHeader1,
-            this.columnHeader2});
-            this.lvwDevices.Font = null;
-            this.lvwDevices.Name = "lvwDevices";
-            this.lvwDevices.UseCompatibleStateImageBehavior = false;
-            this.lvwDevices.View = System.Windows.Forms.View.Details;
-            // 
-            // columnHeader1
-            // 
-            resources.ApplyResources(this.columnHeader1, "columnHeader1");
-            // 
-            // columnHeader2
-            // 
-            resources.ApplyResources(this.columnHeader2, "columnHeader2");
-            // 
-            // label2
-            // 
-            this.label2.AccessibleDescription = null;
-            this.label2.AccessibleName = null;
-            resources.ApplyResources(this.label2, "label2");
-            this.label2.Font = null;
-            this.label2.Name = "label2";
-            // 
-            // txtDescription
-            // 
-            this.txtDescription.AccessibleDescription = null;
-            this.txtDescription.AccessibleName = null;
-            resources.ApplyResources(this.txtDescription, "txtDescription");
-            this.txtDescription.BackgroundImage = null;
-            this.txtDescription.Font = null;
-            this.txtDescription.Name = "txtDescription";
-            // 
-            // cmdAdd
-            // 
-            this.cmdAdd.AccessibleDescription = null;
-            this.cmdAdd.AccessibleName = null;
-            resources.ApplyResources(this.cmdAdd, "cmdAdd");
-            this.cmdAdd.BackgroundImage = null;
-            this.cmdAdd.Font = null;
-            this.cmdAdd.Name = "cmdAdd";
-            this.cmdAdd.UseVisualStyleBackColor = true;
-            this.cmdAdd.Click += new System.EventHandler(this.cmdAdd_Click);
-            // 
-            // cmdRemove
-            // 
-            this.cmdRemove.AccessibleDescription = null;
-            this.cmdRemove.AccessibleName = null;
-            resources.ApplyResources(this.cmdRemove, "cmdRemove");
-            this.cmdRemove.BackgroundImage = null;
-            this.cmdRemove.Font = null;
-            this.cmdRemove.Name = "cmdRemove";
-            this.cmdRemove.UseVisualStyleBackColor = true;
-            this.cmdRemove.Click += new System.EventHandler(this.cmdRemove_Click);
-            // 
-            // label4
-            // 
-            this.label4.AccessibleDescription = null;
-            this.label4.AccessibleName = null;
-            resources.ApplyResources(this.label4, "label4");
-            this.label4.Font = null;
-            this.label4.Name = "label4";
-           
-            // 
-            // dtpDate
-            // 
-            this.dtpDate.AccessibleDescription = null;
-            this.dtpDate.AccessibleName = null;
-            resources.ApplyResources(this.dtpDate, "dtpDate");
-            this.dtpDate.BackgroundImage = null;
-            this.dtpDate.CalendarFont = null;
-            this.dtpDate.CustomFormat = null;
-            this.dtpDate.Font = null;
-            this.dtpDate.Name = "dtpDate";
-         
-            // 
-            // groupBox1
-            // 
-            this.groupBox1.AccessibleDescription = null;
-            this.groupBox1.AccessibleName = null;
-            resources.ApplyResources(this.groupBox1, "groupBox1");
-            this.groupBox1.BackgroundImage = null;
-            this.groupBox1.Controls.Add(this.txtDescription);
-            this.groupBox1.Controls.Add(this.label1);
-            this.groupBox1.Controls.Add(this.txtName);
-            this.groupBox1.Controls.Add(this.label2);
-            this.groupBox1.Font = null;
-            this.groupBox1.Name = "groupBox1";
-            this.groupBox1.TabStop = false;
-            // 
-            // groupBox2
-            // 
-            this.groupBox2.AccessibleDescription = null;
-            this.groupBox2.AccessibleName = null;
-            resources.ApplyResources(this.groupBox2, "groupBox2");
-            this.groupBox2.BackgroundImage = null;
-            this.groupBox2.Controls.Add(this.lvwDevices);
-            this.groupBox2.Controls.Add(this.cmdAdd);
-            this.groupBox2.Controls.Add(this.cmdRemove);
-            this.groupBox2.Font = null;
-            this.groupBox2.Name = "groupBox2";
-            this.groupBox2.TabStop = false;
-            // 
-            // groupBox3
-            // 
-            this.groupBox3.AccessibleDescription = null;
-            this.groupBox3.AccessibleName = null;
-            resources.ApplyResources(this.groupBox3, "groupBox3");
-            this.groupBox3.BackgroundImage = null;
-            this.groupBox3.Controls.Add(this.grpMonth);
-            this.groupBox3.Controls.Add(this.grpOnce);
-            this.groupBox3.Controls.Add(this.grpDay);
-            this.groupBox3.Controls.Add(this.dtpTime);
-            this.groupBox3.Controls.Add(this.grpWeek);
-            this.groupBox3.Controls.Add(this.cboSchedule);
-            this.groupBox3.Controls.Add(this.label7);
-            this.groupBox3.Controls.Add(this.label4);
-            this.groupBox3.Controls.Add(this.label6);
-            this.groupBox3.Controls.Add(this.dtpDate);
-            this.groupBox3.Font = null;
-            this.groupBox3.Name = "groupBox3";
-            this.groupBox3.TabStop = false;
-            // 
-            // grpMonth
-            // 
-            this.grpMonth.AccessibleDescription = null;
-            this.grpMonth.AccessibleName = null;
-            resources.ApplyResources(this.grpMonth, "grpMonth");
-            this.grpMonth.BackgroundImage = null;
-            this.grpMonth.Controls.Add(this.nupMonth);
-            this.grpMonth.Controls.Add(this.label12);
-            this.grpMonth.Controls.Add(this.cboMontDec);
-            this.grpMonth.Controls.Add(this.cboMonthNov);
-            this.grpMonth.Controls.Add(this.cboMontOct);
-            this.grpMonth.Controls.Add(this.cboMontSept);
-            this.grpMonth.Controls.Add(this.cboMonthAug);
-            this.grpMonth.Controls.Add(this.cboMonthJuly);
-            this.grpMonth.Controls.Add(this.cboMonthJune);
-            this.grpMonth.Controls.Add(this.cboMonthMay);
-            this.grpMonth.Controls.Add(this.cboMonthApr);
-            this.grpMonth.Controls.Add(this.cboMonthMar);
-            this.grpMonth.Controls.Add(this.cboMonthFeb);
-            this.grpMonth.Controls.Add(this.cboMonthJan);
-            this.grpMonth.Controls.Add(this.cboMonthDays);
-            this.grpMonth.Controls.Add(this.cboOrder);
-            this.grpMonth.Controls.Add(this.rdbMonthThe);
-            this.grpMonth.Controls.Add(this.rdbMonthDay);
-            this.grpMonth.Controls.Add(this.label11);
-            this.grpMonth.Font = null;
-            this.grpMonth.Name = "grpMonth";
-            this.grpMonth.TabStop = false;
-            // 
-            // nupMonth
-            // 
-            this.nupMonth.AccessibleDescription = null;
-            this.nupMonth.AccessibleName = null;
-            resources.ApplyResources(this.nupMonth, "nupMonth");
-            this.nupMonth.Font = null;
-            this.nupMonth.Maximum = new decimal(new int[] {
-            30,
-            0,
-            0,
-            0});
-            this.nupMonth.Minimum = new decimal(new int[] {
-            1,
-            0,
-            0,
-            0});
-            this.nupMonth.Name = "nupMonth";
-            this.nupMonth.Value = new decimal(new int[] {
-            1,
-            0,
-            0,
-            0});
-            // 
-            // label12
-            // 
-            this.label12.AccessibleDescription = null;
-            this.label12.AccessibleName = null;
-            resources.ApplyResources(this.label12, "label12");
-            this.label12.Font = null;
-            this.label12.Name = "label12";
-            // 
-            // cboMontDec
-            // 
-            this.cboMontDec.AccessibleDescription = null;
-            this.cboMontDec.AccessibleName = null;
-            resources.ApplyResources(this.cboMontDec, "cboMontDec");
-            this.cboMontDec.BackgroundImage = null;
-            this.cboMontDec.Font = null;
-            this.cboMontDec.Name = "cboMontDec";
-            this.cboMontDec.UseVisualStyleBackColor = true;
-            // 
-            // cboMonthNov
-            // 
-            this.cboMonthNov.AccessibleDescription = null;
-            this.cboMonthNov.AccessibleName = null;
-            resources.ApplyResources(this.cboMonthNov, "cboMonthNov");
-            this.cboMonthNov.BackgroundImage = null;
-            this.cboMonthNov.Font = null;
-            this.cboMonthNov.Name = "cboMonthNov";
-            this.cboMonthNov.UseVisualStyleBackColor = true;
-            // 
-            // cboMontOct
-            // 
-            this.cboMontOct.AccessibleDescription = null;
-            this.cboMontOct.AccessibleName = null;
-            resources.ApplyResources(this.cboMontOct, "cboMontOct");
-            this.cboMontOct.BackgroundImage = null;
-            this.cboMontOct.Font = null;
-            this.cboMontOct.Name = "cboMontOct";
-            this.cboMontOct.UseVisualStyleBackColor = true;
-            // 
-            // cboMontSept
-            // 
-            this.cboMontSept.AccessibleDescription = null;
-            this.cboMontSept.AccessibleName = null;
-            resources.ApplyResources(this.cboMontSept, "cboMontSept");
-            this.cboMontSept.BackgroundImage = null;
-            this.cboMontSept.Font = null;
-            this.cboMontSept.Name = "cboMontSept";
-            this.cboMontSept.UseVisualStyleBackColor = true;
-            // 
-            // cboMonthAug
-            // 
-            this.cboMonthAug.AccessibleDescription = null;
-            this.cboMonthAug.AccessibleName = null;
-            resources.ApplyResources(this.cboMonthAug, "cboMonthAug");
-            this.cboMonthAug.BackgroundImage = null;
-            this.cboMonthAug.Font = null;
-            this.cboMonthAug.Name = "cboMonthAug";
-            this.cboMonthAug.UseVisualStyleBackColor = true;
-            // 
-            // cboMonthJuly
-            // 
-            this.cboMonthJuly.AccessibleDescription = null;
-            this.cboMonthJuly.AccessibleName = null;
-            resources.ApplyResources(this.cboMonthJuly, "cboMonthJuly");
-            this.cboMonthJuly.BackgroundImage = null;
-            this.cboMonthJuly.Font = null;
-            this.cboMonthJuly.Name = "cboMonthJuly";
-            this.cboMonthJuly.UseVisualStyleBackColor = true;
-            // 
-            // cboMonthJune
-            // 
-            this.cboMonthJune.AccessibleDescription = null;
-            this.cboMonthJune.AccessibleName = null;
-            resources.ApplyResources(this.cboMonthJune, "cboMonthJune");
-            this.cboMonthJune.BackgroundImage = null;
-            this.cboMonthJune.Font = null;
-            this.cboMonthJune.Name = "cboMonthJune";
-            this.cboMonthJune.UseVisualStyleBackColor = true;
-            // 
-            // cboMonthMay
-            // 
-            this.cboMonthMay.AccessibleDescription = null;
-            this.cboMonthMay.AccessibleName = null;
-            resources.ApplyResources(this.cboMonthMay, "cboMonthMay");
-            this.cboMonthMay.BackgroundImage = null;
-            this.cboMonthMay.Font = null;
-            this.cboMonthMay.Name = "cboMonthMay";
-            this.cboMonthMay.UseVisualStyleBackColor = true;
-            // 
-            // cboMonthApr
-            // 
-            this.cboMonthApr.AccessibleDescription = null;
-            this.cboMonthApr.AccessibleName = null;
-            resources.ApplyResources(this.cboMonthApr, "cboMonthApr");
-            this.cboMonthApr.BackgroundImage = null;
-            this.cboMonthApr.Font = null;
-            this.cboMonthApr.Name = "cboMonthApr";
-            this.cboMonthApr.UseVisualStyleBackColor = true;
-            // 
-            // cboMonthMar
-            // 
-            this.cboMonthMar.AccessibleDescription = null;
-            this.cboMonthMar.AccessibleName = null;
-            resources.ApplyResources(this.cboMonthMar, "cboMonthMar");
-            this.cboMonthMar.BackgroundImage = null;
-            this.cboMonthMar.Font = null;
-            this.cboMonthMar.Name = "cboMonthMar";
-            this.cboMonthMar.UseVisualStyleBackColor = true;
-            // 
-            // cboMonthFeb
-            // 
-            this.cboMonthFeb.AccessibleDescription = null;
-            this.cboMonthFeb.AccessibleName = null;
-            resources.ApplyResources(this.cboMonthFeb, "cboMonthFeb");
-            this.cboMonthFeb.BackgroundImage = null;
-            this.cboMonthFeb.Font = null;
-            this.cboMonthFeb.Name = "cboMonthFeb";
-            this.cboMonthFeb.UseVisualStyleBackColor = true;
-            // 
-            // cboMonthJan
-            // 
-            this.cboMonthJan.AccessibleDescription = null;
-            this.cboMonthJan.AccessibleName = null;
-            resources.ApplyResources(this.cboMonthJan, "cboMonthJan");
-            this.cboMonthJan.BackgroundImage = null;
-            this.cboMonthJan.Font = null;
-            this.cboMonthJan.Name = "cboMonthJan";
-            this.cboMonthJan.UseVisualStyleBackColor = true;
-            // 
-            // cboMonthDays
-            // 
-            this.cboMonthDays.AccessibleDescription = null;
-            this.cboMonthDays.AccessibleName = null;
-            resources.ApplyResources(this.cboMonthDays, "cboMonthDays");
-            this.cboMonthDays.BackgroundImage = null;
-            this.cboMonthDays.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
-            this.cboMonthDays.Font = null;
-            this.cboMonthDays.FormattingEnabled = true;
-            this.cboMonthDays.Items.AddRange(new object[] {
-            resources.GetString("cboMonthDays.Items"),
-            resources.GetString("cboMonthDays.Items1"),
-            resources.GetString("cboMonthDays.Items2"),
-            resources.GetString("cboMonthDays.Items3"),
-            resources.GetString("cboMonthDays.Items4"),
-            resources.GetString("cboMonthDays.Items5"),
-            resources.GetString("cboMonthDays.Items6")});
-            this.cboMonthDays.Name = "cboMonthDays";
-            // 
-            // cboOrder
-            // 
-            this.cboOrder.AccessibleDescription = null;
-            this.cboOrder.AccessibleName = null;
-            resources.ApplyResources(this.cboOrder, "cboOrder");
-            this.cboOrder.BackgroundImage = null;
-            this.cboOrder.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
-            this.cboOrder.Font = null;
-            this.cboOrder.FormattingEnabled = true;
-            this.cboOrder.Items.AddRange(new object[] {
-            resources.GetString("cboOrder.Items"),
-            resources.GetString("cboOrder.Items1"),
-            resources.GetString("cboOrder.Items2"),
-            resources.GetString("cboOrder.Items3"),
-            resources.GetString("cboOrder.Items4")});
-            this.cboOrder.Name = "cboOrder";
-            // 
-            // rdbMonthThe
-            // 
-            this.rdbMonthThe.AccessibleDescription = null;
-            this.rdbMonthThe.AccessibleName = null;
-            resources.ApplyResources(this.rdbMonthThe, "rdbMonthThe");
-            this.rdbMonthThe.BackgroundImage = null;
-            this.rdbMonthThe.Font = null;
-            this.rdbMonthThe.Name = "rdbMonthThe";
-            this.rdbMonthThe.UseVisualStyleBackColor = true;
-            // 
-            // rdbMonthDay
-            // 
-            this.rdbMonthDay.AccessibleDescription = null;
-            this.rdbMonthDay.AccessibleName = null;
-            resources.ApplyResources(this.rdbMonthDay, "rdbMonthDay");
-            this.rdbMonthDay.BackgroundImage = null;
-            this.rdbMonthDay.Checked = true;
-            this.rdbMonthDay.Font = null;
-            this.rdbMonthDay.Name = "rdbMonthDay";
-            this.rdbMonthDay.TabStop = true;
-            this.rdbMonthDay.UseVisualStyleBackColor = true;
-            // 
-            // label11
-            // 
-            this.label11.AccessibleDescription = null;
-            this.label11.AccessibleName = null;
-            resources.ApplyResources(this.label11, "label11");
-            this.label11.Font = null;
-            this.label11.Name = "label11";
-            // 
-            // grpOnce
-            // 
-            this.grpOnce.AccessibleDescription = null;
-            this.grpOnce.AccessibleName = null;
-            resources.ApplyResources(this.grpOnce, "grpOnce");
-            this.grpOnce.BackgroundImage = null;
-            this.grpOnce.Controls.Add(this.label14);
-            this.grpOnce.Font = null;
-            this.grpOnce.Name = "grpOnce";
-            this.grpOnce.TabStop = false;
-            // 
-            // label14
-            // 
-            this.label14.AccessibleDescription = null;
-            this.label14.AccessibleName = null;
-            resources.ApplyResources(this.label14, "label14");
-            this.label14.Font = null;
-            this.label14.Name = "label14";
-            // 
-            // grpDay
-            // 
-            this.grpDay.AccessibleDescription = null;
-            this.grpDay.AccessibleName = null;
-            resources.ApplyResources(this.grpDay, "grpDay");
-            this.grpDay.BackgroundImage = null;
-            this.grpDay.Controls.Add(this.nupDay);
-            this.grpDay.Controls.Add(this.label8);
-            this.grpDay.Controls.Add(this.label5);
-            this.grpDay.Font = null;
-            this.grpDay.Name = "grpDay";
-            this.grpDay.TabStop = false;
-            // 
-            // nupDay
-            // 
-            this.nupDay.AccessibleDescription = null;
-            this.nupDay.AccessibleName = null;
-            resources.ApplyResources(this.nupDay, "nupDay");
-            this.nupDay.Font = null;
-            this.nupDay.Maximum = new decimal(new int[] {
-            7,
-            0,
-            0,
-            0});
-            this.nupDay.Minimum = new decimal(new int[] {
-            1,
-            0,
-            0,
-            0});
-            this.nupDay.Name = "nupDay";
-            this.nupDay.Value = new decimal(new int[] {
-            1,
-            0,
-            0,
-            0});
-            // 
-            // label8
-            // 
-            this.label8.AccessibleDescription = null;
-            this.label8.AccessibleName = null;
-            resources.ApplyResources(this.label8, "label8");
-            this.label8.Font = null;
-            this.label8.Name = "label8";
-            // 
-            // label5
-            // 
-            this.label5.AccessibleDescription = null;
-            this.label5.AccessibleName = null;
-            resources.ApplyResources(this.label5, "label5");
-            this.label5.Font = null;
-            this.label5.Name = "label5";
-            // 
-            // dtpTime
-            // 
-            this.dtpTime.AccessibleDescription = null;
-            this.dtpTime.AccessibleName = null;
-            resources.ApplyResources(this.dtpTime, "dtpTime");
-            this.dtpTime.BackgroundImage = null;
-            this.dtpTime.CalendarFont = null;
-            this.dtpTime.Font = null;
-            this.dtpTime.Format = System.Windows.Forms.DateTimePickerFormat.Custom;
-            this.dtpTime.Name = "dtpTime";
-            this.dtpTime.ShowUpDown = true;
-            // 
-            // grpWeek
-            // 
-            this.grpWeek.AccessibleDescription = null;
-            this.grpWeek.AccessibleName = null;
-            resources.ApplyResources(this.grpWeek, "grpWeek");
-            this.grpWeek.BackgroundImage = null;
-            this.grpWeek.Controls.Add(this.nupWeek);
-            this.grpWeek.Controls.Add(this.label9);
-            this.grpWeek.Controls.Add(this.label10);
-            this.grpWeek.Controls.Add(this.cboWeekSaturday);
-            this.grpWeek.Controls.Add(this.cboWeekSunday);
-            this.grpWeek.Controls.Add(this.cboWeekFriday);
-            this.grpWeek.Controls.Add(this.cboWeekThursday);
-            this.grpWeek.Controls.Add(this.cboWeekWednesday);
-            this.grpWeek.Controls.Add(this.cboWeekTuesday);
-            this.grpWeek.Controls.Add(this.cboWeekMonday);
-            this.grpWeek.Font = null;
-            this.grpWeek.Name = "grpWeek";
-            this.grpWeek.TabStop = false;
-            // 
-            // nupWeek
-            // 
-            this.nupWeek.AccessibleDescription = null;
-            this.nupWeek.AccessibleName = null;
-            resources.ApplyResources(this.nupWeek, "nupWeek");
-            this.nupWeek.Font = null;
-            this.nupWeek.Maximum = new decimal(new int[] {
-            52,
-            0,
-            0,
-            0});
-            this.nupWeek.Minimum = new decimal(new int[] {
-            1,
-            0,
-            0,
-            0});
-            this.nupWeek.Name = "nupWeek";
-            this.nupWeek.Value = new decimal(new int[] {
-            1,
-            0,
-            0,
-            0});
-            // 
-            // label9
-            // 
-            this.label9.AccessibleDescription = null;
-            this.label9.AccessibleName = null;
-            resources.ApplyResources(this.label9, "label9");
-            this.label9.Font = null;
-            this.label9.Name = "label9";
-            // 
-            // label10
-            // 
-            this.label10.AccessibleDescription = null;
-            this.label10.AccessibleName = null;
-            resources.ApplyResources(this.label10, "label10");
-            this.label10.Font = null;
-            this.label10.Name = "label10";
-            // 
-            // cboWeekSaturday
-            // 
-            this.cboWeekSaturday.AccessibleDescription = null;
-            this.cboWeekSaturday.AccessibleName = null;
-            resources.ApplyResources(this.cboWeekSaturday, "cboWeekSaturday");
-            this.cboWeekSaturday.BackgroundImage = null;
-            this.cboWeekSaturday.Font = null;
-            this.cboWeekSaturday.Name = "cboWeekSaturday";
-            this.cboWeekSaturday.UseVisualStyleBackColor = true;
-            // 
-            // cboWeekSunday
-            // 
-            this.cboWeekSunday.AccessibleDescription = null;
-            this.cboWeekSunday.AccessibleName = null;
-            resources.ApplyResources(this.cboWeekSunday, "cboWeekSunday");
-            this.cboWeekSunday.BackgroundImage = null;
-            this.cboWeekSunday.Font = null;
-            this.cboWeekSunday.Name = "cboWeekSunday";
-            this.cboWeekSunday.UseVisualStyleBackColor = true;
-            // 
-            // cboWeekFriday
-            // 
-            this.cboWeekFriday.AccessibleDescription = null;
-            this.cboWeekFriday.AccessibleName = null;
-            resources.ApplyResources(this.cboWeekFriday, "cboWeekFriday");
-            this.cboWeekFriday.BackgroundImage = null;
-            this.cboWeekFriday.Font = null;
-            this.cboWeekFriday.Name = "cboWeekFriday";
-            this.cboWeekFriday.UseVisualStyleBackColor = true;
-            // 
-            // cboWeekThursday
-            // 
-            this.cboWeekThursday.AccessibleDescription = null;
-            this.cboWeekThursday.AccessibleName = null;
-            resources.ApplyResources(this.cboWeekThursday, "cboWeekThursday");
-            this.cboWeekThursday.BackgroundImage = null;
-            this.cboWeekThursday.Font = null;
-            this.cboWeekThursday.Name = "cboWeekThursday";
-            this.cboWeekThursday.UseVisualStyleBackColor = true;
-            // 
-            // cboWeekWednesday
-            // 
-            this.cboWeekWednesday.AccessibleDescription = null;
-            this.cboWeekWednesday.AccessibleName = null;
-            resources.ApplyResources(this.cboWeekWednesday, "cboWeekWednesday");
-            this.cboWeekWednesday.BackgroundImage = null;
-            this.cboWeekWednesday.Font = null;
-            this.cboWeekWednesday.Name = "cboWeekWednesday";
-            this.cboWeekWednesday.UseVisualStyleBackColor = true;
-            // 
-            // cboWeekTuesday
-            // 
-            this.cboWeekTuesday.AccessibleDescription = null;
-            this.cboWeekTuesday.AccessibleName = null;
-            resources.ApplyResources(this.cboWeekTuesday, "cboWeekTuesday");
-            this.cboWeekTuesday.BackgroundImage = null;
-            this.cboWeekTuesday.Font = null;
-            this.cboWeekTuesday.Name = "cboWeekTuesday";
-            this.cboWeekTuesday.UseVisualStyleBackColor = true;
-            // 
-            // cboWeekMonday
-            // 
-            this.cboWeekMonday.AccessibleDescription = null;
-            this.cboWeekMonday.AccessibleName = null;
-            resources.ApplyResources(this.cboWeekMonday, "cboWeekMonday");
-            this.cboWeekMonday.BackgroundImage = null;
-            this.cboWeekMonday.Font = null;
-            this.cboWeekMonday.Name = "cboWeekMonday";
-            this.cboWeekMonday.UseVisualStyleBackColor = true;
-            // 
-            // cboSchedule
-            // 
-            this.cboSchedule.AccessibleDescription = null;
-            this.cboSchedule.AccessibleName = null;
-            resources.ApplyResources(this.cboSchedule, "cboSchedule");
-            this.cboSchedule.BackgroundImage = null;
-            this.cboSchedule.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
-            this.cboSchedule.Font = null;
-            this.cboSchedule.FormattingEnabled = true;
-            this.cboSchedule.Items.AddRange(new object[] {
-            resources.GetString("cboSchedule.Items"),
-            resources.GetString("cboSchedule.Items1"),
-            resources.GetString("cboSchedule.Items2"),
-            resources.GetString("cboSchedule.Items3")});
-            this.cboSchedule.Name = "cboSchedule";
-            this.cboSchedule.SelectedIndexChanged += new System.EventHandler(this.cboSchedule_SelectedIndexChanged);
-            // 
-            // label7
-            // 
-            this.label7.AccessibleDescription = null;
-            this.label7.AccessibleName = null;
-            resources.ApplyResources(this.label7, "label7");
-            this.label7.Font = null;
-            this.label7.Name = "label7";
-            // 
-            // label6
-            // 
-            this.label6.AccessibleDescription = null;
-            this.label6.AccessibleName = null;
-            resources.ApplyResources(this.label6, "label6");
-            this.label6.Font = null;
-            this.label6.Name = "label6";
-            // 
-            // tabControl1
-            // 
-            this.tabControl1.AccessibleDescription = null;
-            this.tabControl1.AccessibleName = null;
-            resources.ApplyResources(this.tabControl1, "tabControl1");
-            this.tabControl1.BackgroundImage = null;
-            this.tabControl1.Controls.Add(this.tabPage1);
-            this.tabControl1.Controls.Add(this.tabPage2);
-            this.tabControl1.Font = null;
-            this.tabControl1.Name = "tabControl1";
-            this.tabControl1.SelectedIndex = 0;
-            // 
-            // tabPage1
-            // 
-            this.tabPage1.AccessibleDescription = null;
-            this.tabPage1.AccessibleName = null;
-            resources.ApplyResources(this.tabPage1, "tabPage1");
-            this.tabPage1.BackgroundImage = null;
-            this.tabPage1.Controls.Add(this.groupBox1);
-            this.tabPage1.Controls.Add(this.groupBox2);
-            this.tabPage1.Font = null;
-            this.tabPage1.Name = "tabPage1";
-            this.tabPage1.UseVisualStyleBackColor = true;
-            // 
-            // tabPage2
-            // 
-            this.tabPage2.AccessibleDescription = null;
-            this.tabPage2.AccessibleName = null;
-            resources.ApplyResources(this.tabPage2, "tabPage2");
-            this.tabPage2.BackgroundImage = null;
-            this.tabPage2.Controls.Add(this.groupBox3);
-            this.tabPage2.Font = null;
-            this.tabPage2.Name = "tabPage2";
-            this.tabPage2.UseVisualStyleBackColor = true;
-            // 
-            // panel1
-            // 
-            this.panel1.AccessibleDescription = null;
-            this.panel1.AccessibleName = null;
-            resources.ApplyResources(this.panel1, "panel1");
-            this.panel1.BackColor = System.Drawing.Color.White;
-            this.panel1.BackgroundImage = null;
-            this.panel1.Controls.Add(this.label13);
-            this.panel1.Controls.Add(this.label3);
-            this.panel1.Controls.Add(this.pictureBox1);
-            this.panel1.Font = null;
-            this.panel1.Name = "panel1";
-            // 
-            // label13
-            // 
-            this.label13.AccessibleDescription = null;
-            this.label13.AccessibleName = null;
-            resources.ApplyResources(this.label13, "label13");
-            this.label13.Font = null;
-            this.label13.Name = "label13";
-            // 
-            // label3
-            // 
-            this.label3.AccessibleDescription = null;
-            this.label3.AccessibleName = null;
-            resources.ApplyResources(this.label3, "label3");
-            this.label3.Name = "label3";
-            // 
-            // pictureBox1
-            // 
-            this.pictureBox1.AccessibleDescription = null;
-            this.pictureBox1.AccessibleName = null;
-            resources.ApplyResources(this.pictureBox1, "pictureBox1");
-            this.pictureBox1.BackgroundImage = null;
-            this.pictureBox1.Font = null;
-            this.pictureBox1.ImageLocation = null;
-            this.pictureBox1.Name = "pictureBox1";
-            this.pictureBox1.TabStop = false;
-            // 
-            // frmSchedule
-            // 
-            this.AcceptButton = this.cmdOK;
-            this.AccessibleDescription = null;
-            this.AccessibleName = null;
-            resources.ApplyResources(this, "$this");
-            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
-            this.BackgroundImage = null;
-            this.CancelButton = this.cmdCancel;
-            this.Controls.Add(this.panel1);
-            this.Controls.Add(this.tabControl1);
-            this.Controls.Add(this.cmdOK);
-            this.Controls.Add(this.cmdCancel);
-            this.Font = null;
-            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
-            this.Icon = null;
-            this.MaximizeBox = false;
-            this.MinimizeBox = false;
-            this.Name = "frmSchedule";
-            this.Load += new System.EventHandler(this.frmSchedule_Load);
-            this.groupBox1.ResumeLayout(false);
-            this.groupBox1.PerformLayout();
-            this.groupBox2.ResumeLayout(false);
-            this.groupBox3.ResumeLayout(false);
-            this.groupBox3.PerformLayout();
-            this.grpMonth.ResumeLayout(false);
-            this.grpMonth.PerformLayout();
-            ((System.ComponentModel.ISupportInitialize)(this.nupMonth)).EndInit();
-            this.grpOnce.ResumeLayout(false);
-            this.grpOnce.PerformLayout();
-            this.grpDay.ResumeLayout(false);
-            this.grpDay.PerformLayout();
-            ((System.ComponentModel.ISupportInitialize)(this.nupDay)).EndInit();
-            this.grpWeek.ResumeLayout(false);
-            this.grpWeek.PerformLayout();
-            ((System.ComponentModel.ISupportInitialize)(this.nupWeek)).EndInit();
-            this.tabControl1.ResumeLayout(false);
-            this.tabPage1.ResumeLayout(false);
-            this.tabPage2.ResumeLayout(false);
-            this.panel1.ResumeLayout(false);
-            this.panel1.PerformLayout();
-            ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit();
-            this.ResumeLayout(false);
-
-        }
-
-        #endregion
-
-        private System.Windows.Forms.Button cmdCancel;
-        private System.Windows.Forms.Button cmdOK;
-        private System.Windows.Forms.TextBox txtName;
-        private System.Windows.Forms.Label label1;
-        private System.Windows.Forms.ListView lvwDevices;
-        private System.Windows.Forms.Label label2;
-        private System.Windows.Forms.TextBox txtDescription;
-        private System.Windows.Forms.Button cmdAdd;
-        private System.Windows.Forms.Button cmdRemove;
-        private System.Windows.Forms.ColumnHeader columnHeader1;
-        private System.Windows.Forms.ColumnHeader columnHeader2;
-        private System.Windows.Forms.Label label4;
-        private System.Windows.Forms.DateTimePicker dtpDate;
-        private System.Windows.Forms.GroupBox groupBox1;
-        private System.Windows.Forms.GroupBox groupBox2;
-        private System.Windows.Forms.GroupBox groupBox3;
-        private System.Windows.Forms.TabControl tabControl1;
-        private System.Windows.Forms.TabPage tabPage1;
-        private System.Windows.Forms.TabPage tabPage2;
-        private System.Windows.Forms.ComboBox cboSchedule;
-        private System.Windows.Forms.Label label7;
-        private System.Windows.Forms.Label label6;
-        private System.Windows.Forms.GroupBox grpDay;
-        private System.Windows.Forms.Label label8;
-        private System.Windows.Forms.Label label5;
-        private System.Windows.Forms.GroupBox grpWeek;
-        private System.Windows.Forms.Label label9;
-        private System.Windows.Forms.Label label10;
-        private System.Windows.Forms.CheckBox cboWeekSaturday;
-        private System.Windows.Forms.CheckBox cboWeekSunday;
-        private System.Windows.Forms.CheckBox cboWeekFriday;
-        private System.Windows.Forms.CheckBox cboWeekThursday;
-        private System.Windows.Forms.CheckBox cboWeekWednesday;
-        private System.Windows.Forms.CheckBox cboWeekTuesday;
-        private System.Windows.Forms.CheckBox cboWeekMonday;
-        private System.Windows.Forms.GroupBox grpMonth;
-        private System.Windows.Forms.CheckBox cboMonthApr;
-        private System.Windows.Forms.CheckBox cboMonthMar;
-        private System.Windows.Forms.CheckBox cboMonthFeb;
-        private System.Windows.Forms.CheckBox cboMonthJan;
-        private System.Windows.Forms.ComboBox cboMonthDays;
-        private System.Windows.Forms.ComboBox cboOrder;
-        private System.Windows.Forms.RadioButton rdbMonthThe;
-        private System.Windows.Forms.RadioButton rdbMonthDay;
-        private System.Windows.Forms.Label label11;
-        private System.Windows.Forms.CheckBox cboMontDec;
-        private System.Windows.Forms.CheckBox cboMonthNov;
-        private System.Windows.Forms.CheckBox cboMontOct;
-        private System.Windows.Forms.CheckBox cboMontSept;
-        private System.Windows.Forms.CheckBox cboMonthAug;
-        private System.Windows.Forms.CheckBox cboMonthJuly;
-        private System.Windows.Forms.CheckBox cboMonthJune;
-        private System.Windows.Forms.CheckBox cboMonthMay;
-        private System.Windows.Forms.Label label12;
-        private System.Windows.Forms.NumericUpDown nupWeek;
-        private System.Windows.Forms.Panel panel1;
-        private System.Windows.Forms.Label label13;
-        private System.Windows.Forms.Label label3;
-        private System.Windows.Forms.PictureBox pictureBox1;
-        private System.Windows.Forms.NumericUpDown nupDay;
-        private System.Windows.Forms.NumericUpDown nupMonth;
-        private System.Windows.Forms.DateTimePicker dtpTime;
-        private System.Windows.Forms.GroupBox grpOnce;
-        private System.Windows.Forms.Label label14;
-    }
-}
\ No newline at end of file
diff --git a/scheduler/DeviceScheduler/frmSchedule.cs b/scheduler/DeviceScheduler/frmSchedule.cs
deleted file mode 100644
index 76139a72..00000000
--- a/scheduler/DeviceScheduler/frmSchedule.cs
+++ /dev/null
@@ -1,480 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.ComponentModel;
-using System.Data;
-using System.Drawing;
-using System.Text;
-using System.Windows.Forms;
-
-namespace DeviceScheduler
-{
-    public partial class frmSchedule : Form
-    {
-        public frmSchedule(DataStorage data, TaskScheduler.ScheduledTasks tasks, DataStorage.JobRow job, bool newJob)
-        {
-            Localization.ChangeLanguage();
-            InitializeComponent();
-            m_Data = data;
-            m_NewJob = newJob;
-            m_Job = job;
-            m_Tasks = tasks;
-        }
-
-        private DataStorage m_Data = null;
-        private DataStorage.JobRow m_Job = null;
-        private bool m_NewJob = false;
-        private TaskScheduler.ScheduledTasks m_Tasks = null;
-        private TaskScheduler.Task m_Task = null;
-
-        private void cboSchedule_SelectedIndexChanged(object sender, EventArgs e)
-        {
-            switch (cboSchedule.SelectedIndex)
-            {
-                case 0: //Day
-                    grpDay.Visible = true;
-                    grpDay.Location = new Point(13, 66);
-                    grpWeek.Visible = false;
-                    grpOnce.Visible = false;
-                    grpMonth.Visible = false;
-                    break;
-
-                case 1: //Week
-                    grpDay.Visible = false;
-                    grpWeek.Visible = true;
-                    grpWeek.Location = new Point(13, 66);
-                    grpOnce.Visible = false;
-                    grpMonth.Visible = false;
-                    break;
-
-                case 2: //Month
-                    grpDay.Visible = false;
-                    grpWeek.Visible = false;
-                    grpOnce.Visible = false;
-                    grpMonth.Visible = true;
-                    grpMonth.Location = new Point(13, 66);
-                    break;
-
-                case 3: //Once
-                    grpDay.Visible = false;
-                    grpWeek.Visible = false;
-                    grpMonth.Visible = false;
-                    grpOnce.Visible = true;
-                    grpOnce.Location = new Point(13, 66);
-                    break;
-                    
-            }
-        }
-
-        private void frmSchedule_Load(object sender, EventArgs e)
-        {
-            grpDay.Left = 13;
-            grpDay.Top = 66;
-            grpWeek.Left = 13;
-            grpWeek.Top = 66;
-            grpMonth.Left = 13;
-            grpMonth.Top = 66;
-
-            cboSchedule.SelectedIndex = 0;
-            txtName.Focus();
-            dtpDate.Format = DateTimePickerFormat.Custom; 
-            dtpDate.CustomFormat = System.Globalization.CultureInfo.CurrentUICulture.DateTimeFormat.LongDatePattern; 
-
-            ShowInformation();
-        }
-
-        private void ShowInformation()
-        {
-            if (m_NewJob) 
-            {
-                return; 
-            }
-
-            m_Task = m_Tasks.OpenTask(m_Job.Name);
-
-            txtName.Text = m_Task.Name;
-            txtDescription.Text = m_Task.Comment;
-
-            //txtTime.Text = m_Task.Triggers[0].BeginDate.Hour.ToString() + ":" + m_Task.Triggers[0].BeginDate.Minute.ToString();
-            
-            dtpTime.Value = DateTime.Parse(m_Job.StartTime);
-            dtpDate.Value = m_Task.Triggers[0].BeginDate;
-
-            if (m_Task.Triggers[0] is TaskScheduler.DailyTrigger)
-            {
-                cboSchedule.SelectedIndex = 0;
-
-                TaskScheduler.DailyTrigger dayTrigger = (TaskScheduler.DailyTrigger)m_Task.Triggers[0];
-                nupDay.Value = Convert.ToDecimal(dayTrigger.DaysInterval);
-
-            }
-            else if (m_Task.Triggers[0] is TaskScheduler.WeeklyTrigger)
-            {
-                cboSchedule.SelectedIndex = 1;
-
-                TaskScheduler.WeeklyTrigger weekTrigger = (TaskScheduler.WeeklyTrigger)m_Task.Triggers[0];
-                string days = weekTrigger.WeekDays.ToString();
-                
-                cboWeekMonday.Checked = (days.IndexOf("Monday") > -1);
-                cboWeekTuesday.Checked = (days.IndexOf("Tuesday") > -1);
-                cboWeekWednesday.Checked = (days.IndexOf("Wednesday") > -1);
-                cboWeekThursday.Checked = (days.IndexOf("Thursday") > -1);
-                cboWeekFriday.Checked = (days.IndexOf("Friday") > -1);
-                cboWeekSaturday.Checked = (days.IndexOf("Saturday") > -1);
-                cboWeekSunday.Checked = (days.IndexOf("Sunday") > -1);
-
-                nupWeek.Value = Convert.ToDecimal(weekTrigger.WeeksInterval);
-                
-
-            }
-            else if (m_Task.Triggers[0] is TaskScheduler.MonthlyTrigger)
-            {
-                cboSchedule.SelectedIndex = 2;
-
-                TaskScheduler.MonthlyTrigger monthTrigger = (TaskScheduler.MonthlyTrigger)m_Task.Triggers[0];
-                string months = monthTrigger.Months.ToString();
-
-                cboMonthJan.Checked = (months.IndexOf("January") > -1);
-                cboMonthFeb.Checked = (months.IndexOf("February") > -1);
-                cboMonthMar.Checked = (months.IndexOf("March") > -1);
-                cboMonthApr.Checked = (months.IndexOf("April") > -1);
-                cboMonthMay.Checked = (months.IndexOf("May") > -1);
-                cboMonthJune.Checked = (months.IndexOf("June") > -1);
-                cboMonthJuly.Checked = (months.IndexOf("July") > -1);
-                cboMonthAug.Checked = (months.IndexOf("August") > -1);
-                cboMontSept.Checked = (months.IndexOf("September") > -1);
-                cboMontOct.Checked = (months.IndexOf("October") > -1);
-                cboMonthNov.Checked = (months.IndexOf("November") > -1);
-                cboMontDec.Checked = (months.IndexOf("December") > -1);
-
-                nupMonth.Value = Convert.ToInt32(monthTrigger.Days[0]);
-            }
-            else if (m_Task.Triggers[0] is TaskScheduler.RunOnceTrigger)
-            {
-                cboSchedule.SelectedIndex = 3;
-            }
-
-            foreach (DataStorage.JobActionsRow action in m_Job.GetJobActionsRows())
-            {
-                
-                DeviceHandler.Device device= GetDevice(action.DeviceID);
-                ListViewItem item = lvwDevices.Items.Add(device.Name);
-                item.SubItems.Add(action.TurnOn ? Localization.GetString("uniton") : Localization.GetString("unitoff"));
-
-                item.Tag = device;
-            }
-
-        }
-
-        private DeviceHandler.Device GetDevice(int deviceID)
-        {
-            foreach (DeviceHandler.Device item in Program.DeviceHandler.Devices)
-            {
-                if (item.ID == deviceID)
-                    return item;
-            }
-
-            return null;
-        }
-
-        private bool SetInformation()
-        {
-            try
-            {
-
-                if (lvwDevices.Items.Count == 0)
-                {
-                    MessageBox.Show(Localization.GetString("FailedToSelectUnits"), Localization.GetString("telldusscheduler"), 
-                        MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
-                    return false;
-                }
-
-                if (txtName.Text.Length == 0)
-                {
-                    MessageBox.Show(Localization.GetString("FailedToNameSchedule"), Localization.GetString("telldusscheduler"), 
-                        MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
-                    return false;
-                }
-
-                if (m_NewJob)
-                {
-                    frmAskUsername frm = new frmAskUsername();
-                    DialogResult result=frm.ShowDialog(this);
-
-                    if (result == DialogResult.Cancel)
-                        return false;
-
-                    m_Job = m_Data.Job.NewJobRow();
-
-                    
-                    string encrypted = EncryptDecrypt.Encrypt(frm.Password, "ThisIsNotParadise");
-
-                    m_Job.Username = frm.Username;
-                    m_Job.Password = encrypted;
-
-                    frm.Close();
-                }
-
-                string password = EncryptDecrypt.Decrypt(m_Job.Password, "ThisIsNotParadise");
-
-                //Set general information.
-                m_Job.JobName = txtName.Text;
-                m_Job.Name = txtName.Text;
-                m_Job.Description = txtDescription.Text;
-
-                if (!m_NewJob) //Clear previous actions and add new ones.
-                {
-                    foreach (DataStorage.JobActionsRow action in m_Job.GetJobActionsRows())
-                    {
-                        action.Delete();
-                    }
-                }
-                m_Data.AcceptChanges();
-
-                //Add actions.
-                foreach (ListViewItem item in lvwDevices.Items)
-                {
-                    DataStorage.JobActionsRow action = m_Data.JobActions.NewJobActionsRow();
-                    DeviceHandler.Device device = (DeviceHandler.Device)item.Tag;
-
-                    action.DeviceID = device.ID;
-                    action.JobID = m_Job.ID;
-
-                    if (item.SubItems[1].Text == Localization.GetString("uniton"))
-                        action.TurnOn = true;
-                    else
-                        action.TurnOn = false;
-
-                    m_Data.JobActions.AddJobActionsRow(action);
-                }
-
-                TaskScheduler.Task task = null;
-
-                //Create a new schedule in windows.
-                if (m_Task != null)
-                {
-                    task = m_Task;
-                }
-                else
-                {
-
-                    task = m_Tasks.CreateTask(txtName.Text);
-                }
-
-                string path = System.IO.Path.GetDirectoryName(Application.ExecutablePath);
-                path = System.IO.Path.Combine(path, "DeviceSchedulerAgent.exe");
-
-                //Clear trigger.
-                if(task.Triggers!=null)
-                    task.Triggers.Clear();
-
-                //Set general information.
-                task.ApplicationName = path;
-                task.Parameters = m_Job.ID.ToString();
-                task.Comment = txtDescription.Text;
-
-                //Set user account information.
-                try
-                {
-                    if (password.Length == 0)
-                        task.SetAccountInformation(m_Job.Username, null);
-                    else
-                        task.SetAccountInformation(m_Job.Username, password);
-                }
-                catch
-                {
-                    MessageBox.Show(Localization.GetString("FailedToSetPassword"),
-                        Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
-                }
-                //Set Telldus as creator so we can recognize the task next time.
-                task.Creator = "Telldus";
-
-                m_Job.StartTime = dtpTime.Value.Hour.ToString() + ":" + dtpTime.Value.Minute.ToString();
-
-                dtpTime.Value= DateTime.Parse(dtpDate.Value.ToShortDateString() + " " + dtpTime.Value.ToShortTimeString());
-
-                DateTime time = dtpTime.Value;
-                short hour = short.Parse(dtpTime.Value.Hour.ToString());
-                short minute = short.Parse(dtpTime.Value.Minute.ToString());
-
-                short interval = 1;
-
-                switch (cboSchedule.SelectedIndex)
-                {
-                    case 0: //Dailytrigger
-                        interval = short.Parse(nupDay.Value.ToString());
-                        TaskScheduler.DailyTrigger dayTrigger = new TaskScheduler.DailyTrigger(hour, minute, interval);
-                        dayTrigger.BeginDate = dtpDate.Value;
-                        //trigger.BeginDate.AddHours(Convert.ToDouble(dtpTime.Value.Hour));
-                        //trigger.BeginDate.AddMinutes(Convert.ToDouble(dtpTime.Value.Minute));
-                        dayTrigger.Disabled = false;
-                        task.Triggers.Add(dayTrigger);
-                        break;
-
-                    case 1: //Weeklytrigger
-                        TaskScheduler.DaysOfTheWeek weekDays = 0;
-                        interval = short.Parse(nupWeek.Value.ToString());
-
-                        if (cboWeekMonday.Checked)
-                            weekDays = weekDays | TaskScheduler.DaysOfTheWeek.Monday;
-
-                        if (cboWeekTuesday.Checked)
-                            weekDays = weekDays | TaskScheduler.DaysOfTheWeek.Tuesday;
-
-                        if (cboWeekWednesday.Checked)
-                            weekDays = weekDays | TaskScheduler.DaysOfTheWeek.Wednesday;
-
-                        if (cboWeekThursday.Checked)
-                            weekDays = weekDays | TaskScheduler.DaysOfTheWeek.Thursday;
-
-                        if (cboWeekFriday.Checked)
-                            weekDays = weekDays | TaskScheduler.DaysOfTheWeek.Friday;
-
-                        if (cboWeekSaturday.Checked)
-                            weekDays = weekDays | TaskScheduler.DaysOfTheWeek.Saturday;
-
-                        if (cboWeekSunday.Checked)
-                            weekDays = weekDays | TaskScheduler.DaysOfTheWeek.Sunday;
-
-                        TaskScheduler.WeeklyTrigger weeklyTrigger = new TaskScheduler.WeeklyTrigger(hour, minute, weekDays, interval);
-                        time = DateTime.Parse(time.ToShortDateString()+ " " + dtpTime.Value.Hour+":"+dtpTime.Value.Minute+":00" );
-                        //weeklyTrigger.BeginDate = time;
-                        //weeklyTrigger.BeginDate=weeklyTrigger.BeginDate.AddHours(Convert.ToDouble(dtpTime.Value.Hour));
-                        //weeklyTrigger.BeginDate=weeklyTrigger.BeginDate.AddMinutes(Convert.ToDouble(dtpTime.Value.Minute));
-                       task.Triggers.Add(weeklyTrigger);
-                        break;
-
-                    case 2: //Monthlytrigger
-                        //interval = int.Parse(nupmo
-
-                        TaskScheduler.MonthsOfTheYear months = 0;
-
-                        if (cboMonthJan.Checked)
-                            months = months | TaskScheduler.MonthsOfTheYear.January;
-
-                        if (cboMonthFeb.Checked)
-                            months = months | TaskScheduler.MonthsOfTheYear.February;
-
-                        if (cboMonthMar.Checked)
-                            months = months | TaskScheduler.MonthsOfTheYear.March;
-
-                        if (cboMonthApr.Checked)
-                            months = months | TaskScheduler.MonthsOfTheYear.April;
-
-                        if (cboMonthMay.Checked)
-                            months = months | TaskScheduler.MonthsOfTheYear.May;
-
-                        if (cboMonthJune.Checked)
-                            months = months | TaskScheduler.MonthsOfTheYear.June;
-
-                        if (cboMonthJuly.Checked)
-                            months = months | TaskScheduler.MonthsOfTheYear.July;
-
-                        if (cboMonthAug.Checked)
-                            months = months | TaskScheduler.MonthsOfTheYear.August;
-
-                        if (cboMontSept.Checked)
-                            months = months | TaskScheduler.MonthsOfTheYear.September;
-
-                        if (cboMontOct.Checked)
-                            months = months | TaskScheduler.MonthsOfTheYear.October;
-
-                        if (cboMonthNov.Checked)
-                            months = months | TaskScheduler.MonthsOfTheYear.November;
-
-                        if (cboMontDec.Checked)
-                            months = months | TaskScheduler.MonthsOfTheYear.December;
-
-                        int[] days = new int[1] { int.Parse(nupMonth.Value.ToString()) };
-                        TaskScheduler.MonthlyTrigger  monthlyTrigger = new TaskScheduler.MonthlyTrigger(hour, minute, days, months);
-                        monthlyTrigger.BeginDate = dtpDate.Value;
-                        //trigger.BeginDate.AddMinutes(Convert.ToDouble(dtpTime.Value.Minute));
-                        task.Triggers.Add(monthlyTrigger);
-                        break;
-
-                    case 3:
-                        TaskScheduler.RunOnceTrigger onceTrigger = new TaskScheduler.RunOnceTrigger(dtpDate.Value);
-                        onceTrigger.StartHour = hour;
-                        onceTrigger.StartMinute = minute;
-                        task.Triggers.Add(onceTrigger);
-                        break;
-                }
-
-
-                task.Triggers[0].BeginDate = time;
-
-                task.Save();
-                task.Close();
-
-                if(m_NewJob)
-                    m_Data.Job.AddJobRow(m_Job);
-
-                m_Data.AcceptChanges();
-
-                return true;
-
-            }
-            catch (Exception ex)
-            {
-                //ett ohanterat fel har uppstått i programmet.
-                MessageBox.Show(Localization.GetString("msg1") + Environment.NewLine + ex.Message, 
-                    Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
-
-                return false;
-            }
-        }
-
-        private void cmdOK_Click(object sender, EventArgs e)
-        {
-            if (SetInformation())
-            {
-                this.DialogResult = DialogResult.OK;
-                this.Hide();
-            }
-        }
-
-        private void cmdCancel_Click(object sender, EventArgs e)
-        {
-            this.DialogResult = DialogResult.Cancel;
-            this.Hide();
-        }
-
-        private void cmdAdd_Click(object sender, EventArgs e)
-        {
-            frmScheduleAddDevice frm = new frmScheduleAddDevice();
-            DialogResult result = frm.ShowDialog(this);
-
-
-            if (result == DialogResult.OK)
-            {
-                
-                ListViewItem item = lvwDevices.Items.Add(frm.SelectedDevice.Name);
-                item.SubItems.Add(frm.SelectedDeviceAction == 0 ? Localization.GetString("uniton") : Localization.GetString("unitoff"));
-                item.Tag = frm.SelectedDevice;
-            }
-
-            frm.Close();
-        }
-
-        
-        private string GetActionName(int actionID)
-        {
-            return "";
-        }
-
-        private void cmdRemove_Click(object sender, EventArgs e)
-        {
-            if (lvwDevices.SelectedItems.Count == 0) { return; }
-
-            //Vill du ta bort markerad enhet?
-            DialogResult result = MessageBox.Show(Localization.GetString("msg3"),
-                Localization.GetString("telldusscheduler"), MessageBoxButtons.YesNo, MessageBoxIcon.Question);
-
-            if (result == DialogResult.Yes)
-            {
-                lvwDevices.Items.Remove(lvwDevices.SelectedItems[0]);
-            }
-        }
-
-
-    }
-}
\ No newline at end of file
diff --git a/scheduler/DeviceScheduler/frmSchedule.en.resx b/scheduler/DeviceScheduler/frmSchedule.en.resx
deleted file mode 100644
index 6d4b4d6b..00000000
--- a/scheduler/DeviceScheduler/frmSchedule.en.resx
+++ /dev/null
@@ -1,451 +0,0 @@
-
-
-  
-  
-    
-    
-      
-        
-          
-            
-              
-                
-              
-              
-              
-              
-              
-            
-          
-          
-            
-              
-              
-            
-          
-          
-            
-              
-                
-                
-              
-              
-              
-              
-              
-            
-          
-          
-            
-              
-                
-              
-              
-            
-          
-        
-      
-    
-  
-  
-    text/microsoft-resx
-  
-  
-    2.0
-  
-  
-    System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    Cancel
-  
-  
-  
-    38, 13
-  
-  
-    Name:
-  
-  
-    Unit
-  
-  
-    Action
-  
-  
-    63, 13
-  
-  
-    Description:
-  
-  
-    Add...
-  
-  
-    Remove...
-  
-  
-    56, 13
-  
-  
-    Start date:
-  
-  
-    Generall information
-  
-  
-    Unit(s)
-  
-  
-    48, 13
-  
-  
-    a month.
-  
-  
-    October
-  
-  
-    59, 17
-  
-  
-    August
-  
-  
-    44, 17
-  
-  
-    July
-  
-  
-    49, 17
-  
-  
-    June
-  
-  
-    46, 17
-  
-  
-    May
-  
-  
-    56, 17
-  
-  
-    March
-  
-  
-    67, 17
-  
-  
-    February
-  
-  
-    63, 17
-  
-  
-    January
-  
-  
-    Monday
-  
-  
-    Tuesday
-  
-  
-    Wednesday
-  
-  
-    Thursday
-  
-  
-    Friday
-  
-  
-    Saturday
-  
-  
-    Sunday
-  
-  
-    First
-  
-  
-    Second
-  
-  
-    Third
-  
-  
-    Fourth
-  
-  
-    Last
-  
-  
-    44, 17
-  
-  
-    The
-  
-  
-    44, 17
-  
-  
-    Day
-  
-  
-    48, 13
-  
-  
-    a month.
-  
-  
-    Schedule, month
-  
-  
-    176, 13
-  
-  
-    This schedule only runs at one time.
-  
-  
-    Schedule, once
-  
-  
-    30, 13
-  
-  
-     day.
-  
-  
-    34, 13
-  
-  
-    Every
-  
-  
-    Schedule, days
-  
-  
-    50, 13
-  
-  
-    :st week.
-  
-  
-    34, 13
-  
-  
-    Every
-  
-  
-    68, 17
-  
-  
-    Saturday
-  
-  
-    62, 17
-  
-  
-    Sunday
-  
-  
-    54, 17
-  
-  
-    Friday
-  
-  
-    70, 17
-  
-  
-    Thursday
-  
-  
-    83, 17
-  
-  
-    Wednesday
-  
-  
-    67, 17
-  
-  
-    Tuesday
-  
-  
-    64, 17
-  
-  
-    Monday
-  
-  
-    Schedule, week
-  
-  
-    Every day
-  
-  
-    Every week
-  
-  
-    Every month
-  
-  
-    Once
-  
-  
-    33, 13
-  
-  
-    Time:
-  
-  
-    55, 13
-  
-  
-    Schedule:
-  
-  
-    Scheduling details
-  
-  
-    General
-  
-  
-    Schedule
-  
-  
-    279, 13
-  
-  
-    Fill out the information below to schedule on or more units.
-  
-  
-    141, 13
-  
-  
-    Create a new schedule.
-  
-  
-    
-        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
-
-  
-  
-    Schedule unit(s)
-  
-
\ No newline at end of file
diff --git a/scheduler/DeviceScheduler/frmSchedule.resx b/scheduler/DeviceScheduler/frmSchedule.resx
deleted file mode 100644
index 35b1b15b..00000000
--- a/scheduler/DeviceScheduler/frmSchedule.resx
+++ /dev/null
@@ -1,1854 +0,0 @@
-
-
-  
-  
-    
-    
-      
-        
-          
-            
-              
-                
-              
-              
-              
-              
-              
-            
-          
-          
-            
-              
-              
-            
-          
-          
-            
-              
-                
-                
-              
-              
-              
-              
-              
-            
-          
-          
-            
-              
-                
-              
-              
-            
-          
-        
-      
-    
-  
-  
-    text/microsoft-resx
-  
-  
-    2.0
-  
-  
-    System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    Sista
-  
-  
-    2
-  
-  
-    Dag
-  
-  
-    System.Windows.Forms.DateTimePicker, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    Oktober
-  
-  
-  
-    306, 38
-  
-  
-  
-    0
-  
-  
-    cboMonthFeb
-  
-  
-    Var
-  
-  
-    label10
-  
-  
-    grpWeek
-  
-  
-    cboSchedule
-  
-  
-    System.Windows.Forms.NumericUpDown, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    System.Windows.Forms.GroupBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    grpMonth
-  
-  
-    Tredje
-  
-  
-    9
-  
-  
-    23, 13
-  
-  
-    0
-  
-  
-    1
-  
-  
-    45, 17
-  
-  
-    19
-  
-  
-    label11
-  
-  
-    groupBox1
-  
-  
-    groupBox3
-  
-  
-    True
-  
-  
-    System.Windows.Forms.ComboBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    grpOnce
-  
-  
-    1
-  
-  
-    6
-  
-  
-    15
-  
-  
-    True
-  
-  
-    3
-  
-  
-    Torsdag
-  
-  
-    grpWeek
-  
-  
-    7
-  
-  
-    label5
-  
-  
-    Ta bort...
-  
-  
-    8
-  
-  
-    61, 20
-  
-  
-    61, 147
-  
-  
-    13
-  
-  
-    1
-  
-  
-    grpWeek
-  
-  
-    2
-  
-  
-    22, 33
-  
-  
-    328, 418
-  
-  
-    cboWeekTuesday
-  
-  
-    groupBox3
-  
-  
-    29
-  
-  
-    22
-  
-  
-    0
-  
-  
-    System.Windows.Forms.CheckBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    496, 449
-  
-  
-    2
-  
-  
-    112, 30
-  
-  
-    13
-  
-  
-    System.Windows.Forms.CheckBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    Microsoft Sans Serif, 8.25pt, style=Bold
-  
-  
-    17
-  
-  
-    31
-  
-  
-    cboMonthAug
-  
-  
-    Mars
-  
-  
-    System.Windows.Forms.CheckBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    grpMonth
-  
-  
-    System.Windows.Forms.CheckBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    0
-  
-  
-    0
-  
-  
-    panel1
-  
-  
-    297, 98
-  
-  
-    grpMonth
-  
-  
-    30
-  
-  
-    cmdCancel
-  
-  
-    System.Windows.Forms.CheckBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    grpWeek
-  
-  
-    tabControl1
-  
-  
-    System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    System.Windows.Forms.CheckBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    14
-  
-  
-    MÃ¥ndag
-  
-  
-    61, 113
-  
-  
-    System.Windows.Forms.NumericUpDown, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    51, 20
-  
-  
-    grpWeek
-  
-  
-    Andra
-  
-  
-    grpDay
-  
-  
-    Söndag
-  
-  
-    cboWeekMonday
-  
-  
-    groupBox3
-  
-  
-    1
-  
-  
-    0
-  
-  
-    11
-  
-  
-    3
-  
-  
-    4, 22
-  
-  
-    3
-  
-  
-    14
-  
-  
-    System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    label12
-  
-  
-    64, 17
-  
-  
-    131, 129
-  
-  
-    18
-  
-  
-    19
-  
-  
-    System.Windows.Forms.TabPage, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    groupBox1
-  
-  
-    cboMonthMar
-  
-  
-    69, 13
-  
-  
-    grpMonth
-  
-  
-    12, 12
-  
-  
-    lvwDevices
-  
-  
-    173, 19
-  
-  
-    1
-  
-  
-    131, 165
-  
-  
-    False
-  
-  
-    label13
-  
-  
-    3
-  
-  
-    5
-  
-  
-    131, 113
-  
-  
-    System.Windows.Forms.Button, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    394, 190
-  
-  
-    label8
-  
-  
-    134
-  
-  
-    12
-  
-  
-    grpWeek
-  
-  
-    6
-  
-  
-    True
-  
-  
-    4
-  
-  
-    137
-  
-  
-    14
-  
-  
-    True
-  
-  
-    varje vecka
-  
-  
-    $this
-  
-  
-    grpMonth
-  
-  
-    groupBox2
-  
-  
-    65, 13
-  
-  
-    System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    59, 13
-  
-  
-    System.Windows.Forms.GroupBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    155, 20
-  
-  
-    7
-  
-  
-    77, 17
-  
-  
-    15, 19
-  
-  
-    55, 30
-  
-  
-    True
-  
-  
-    System.Windows.Forms.CheckBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    16
-  
-  
-    2
-  
-  
-    Onsdag
-  
-  
-    93, 21
-  
-  
-    grpMonth
-  
-  
-    173, 51
-  
-  
-    System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    173, 83
-  
-  
-    12
-  
-  
-    32
-  
-  
-    Tisdag
-  
-  
-    1
-  
-  
-    7
-  
-  
-    cboMontOct
-  
-  
-    59, 13
-  
-  
-    True
-  
-  
-    columnHeader1
-  
-  
-    59, 17
-  
-  
-    14
-  
-  
-    System.Windows.Forms.Button, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    True
-  
-  
-    18
-  
-  
-    314, 13
-  
-  
-    $this
-  
-  
-    23, 15
-  
-  
-    7
-  
-  
-  
-    3, 3, 3, 3
-  
-  
-    46, 17
-  
-  
-    System.Windows.Forms.PictureBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    December
-  
-  
-    5
-  
-  
-    8
-  
-  
-    nupMonth
-  
-  
-    grpMonth
-  
-  
-    txtName
-  
-  
-    0
-  
-  
-    4
-  
-  
-    True
-  
-  
-    90, 54
-  
-  
-    0, 0
-  
-  
-    4
-  
-  
-    0
-  
-  
-    318, 19
-  
-  
-    grpWeek
-  
-  
-    True
-  
-  
-    System.Windows.Forms.TabPage, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    System.Windows.Forms.CheckBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    True
-  
-  
-    514, 74
-  
-  
-    40, 13
-  
-  
-    9
-  
-  
-    panel1
-  
-  
-    nupWeek
-  
-  
-    15
-  
-  
-    Generellt
-  
-  
-    225, 20
-  
-  
-    21
-  
-  
-    Tisdag
-  
-  
-    75, 23
-  
-  
-    AutoSize
-  
-  
-    59, 27
-  
-  
-    cboWeekThursday
-  
-  
-    Lördag
-  
-  
-    159, 65
-  
-  
-    True
-  
-  
-    label6
-  
-  
-    cboMonthMay
-  
-  
-    75, 23
-  
-  
-    394, 190
-  
-  
-    label9
-  
-  
-    Maj
-  
-  
-    rdbMonthThe
-  
-  
-    Fjärde
-  
-  
-    18
-  
-  
-    Fredag
-  
-  
-    grpWeek
-  
-  
-    cboMonthJuly
-  
-  
-    201, 113
-  
-  
-    Vertical
-  
-  
-    cboWeekFriday
-  
-  
-    True
-  
-  
-    13
-  
-  
-    60, 65
-  
-  
-    grpDay
-  
-  
-    61, 21
-  
-  
-    tabControl1
-  
-  
-    8, 65
-  
-  
-    61, 17
-  
-  
-    Söndag
-  
-  
-    En gång
-  
-  
-    True
-  
-  
-    Fyll i uppgifterna nedan för att schemalägga en eller flera enheter.
-  
-  
-    131, 147
-  
-  
-    258, 69
-  
-  
-    8
-  
-  
-    System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    cboMonthJan
-  
-  
-    420, 270
-  
-  
-    19, 136
-  
-  
-    True
-  
-  
-    System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    System.Windows.Forms.Button, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    cboMontSept
-  
-  
-    System.Windows.Forms.ListView, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    grpWeek
-  
-  
-    5
-  
-  
-    True
-  
-  
-    1
-  
-  
-    24
-  
-  
-    Tid:
-  
-  
-    Generell information
-  
-  
-    Denna schemaläggning körs enbart vid valt tillfälle.
-  
-  
-    groupBox2
-  
-  
-    True
-  
-  
-    12, 80
-  
-  
-    451, 36
-  
-  
-    13
-  
-  
-    61, 129
-  
-  
-    0
-  
-  
-    Avbryt
-  
-  
-    cboOrder
-  
-  
-    0
-  
-  
-    System.Windows.Forms.GroupBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    System.Windows.Forms.DateTimePicker, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    System.Windows.Forms.CheckBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    Enhet(er)
-  
-  
-    49, 17
-  
-  
-    System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    Var
-  
-  
-    75, 17
-  
-  
-    3
-  
-  
-    System.Windows.Forms.GroupBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    45, 17
-  
-  
-    415, 110
-  
-  
-    True
-  
-  
-    Schemaläggning, en gång
-  
-  
-    True
-  
-  
-    True
-  
-  
-    cmdRemove
-  
-  
-    17
-  
-  
-    1
-  
-  
-    System.Windows.Forms.CheckBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    15, 60
-  
-  
-    201, 165
-  
-  
-    Skapa en ny schemaläggning.
-  
-  
-    75, 17
-  
-  
-    12
-  
-  
-    412, 134
-  
-  
-    3
-  
-  
-    2
-  
-  
-    label2
-  
-  
-    True
-  
-  
-    System.Windows.Forms.CheckBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    141, 20
-  
-  
-    $this
-  
-  
-    144, 36
-  
-  
-    65, 17
-  
-  
-    cmdOK
-  
-  
-    246, 13
-  
-  
-    cboMonthDays
-  
-  
-    16, 32
-  
-  
-    System.Windows.Forms.Form, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    16, 20
-  
-  
-    panel1
-  
-  
-    173, 66
-  
-  
-    groupBox3
-  
-  
-    90, 28
-  
-  
-    10
-  
-  
-    System.Windows.Forms.CheckBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    System.Windows.Forms.NumericUpDown, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    True
-  
-  
-    20
-  
-  
-    groupBox3
-  
-  
-    0
-  
-  
-    True
-  
-  
-    16, 23
-  
-  
-    58, 17
-  
-  
-    grpOnce
-  
-  
-    23, 13
-  
-  
-    13
-  
-  
-    True
-  
-  
-    System.Windows.Forms.RadioButton, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    Lägg till...
-  
-  
-    Schemalägg enhet(er)
-  
-  
-    tabControl1
-  
-  
-    System.Windows.Forms.GroupBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    September
-  
-  
-    Schemaläggning, vecka
-  
-  
-    14
-  
-  
-    groupBox3
-  
-  
-    18
-  
-  
-    True
-  
-  
-    1
-  
-  
-    label3
-  
-  
-    2
-  
-  
-    15
-  
-  
-    10, 20
-  
-  
-    System.Windows.Forms.CheckBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    2
-  
-  
-    nupDay
-  
-  
-    panel1
-  
-  
-    System.Windows.Forms.Panel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    75, 23
-  
-  
-    True
-  
-  
-    9
-  
-  
-    frmSchedule
-  
-  
-    109, 23
-  
-  
-    grpMonth
-  
-  
-    201, 129
-  
-  
-    Schemaläggning
-  
-  
-    dtpDate
-  
-  
-    4, 22
-  
-  
-    Onsdag
-  
-  
-    173, 35
-  
-  
-    244, 19
-  
-  
-    48, 20
-  
-  
-    113, 21
-  
-  
-    Åtgärd
-  
-  
-    244, 35
-  
-  
-    i månaden.
-  
-  
-    61, 165
-  
-  
-    cboMonthApr
-  
-  
-    grpMonth
-  
-  
-    3
-  
-  
-    3
-  
-  
-    System.Windows.Forms.RadioButton, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    System.Windows.Forms.GroupBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    tabPage1
-  
-  
-    tabPage2
-  
-  
-    tabPage1
-  
-  
-    System.Windows.Forms.CheckBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    15, 31
-  
-  
-    groupBox2
-  
-  
-    16, 36
-  
-  
-    27
-  
-  
-    dtpTime
-  
-  
-    16
-  
-  
-    201, 147
-  
-  
-    label1
-  
-  
-    43, 17
-  
-  
-    System.Windows.Forms.TextBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    cboMontDec
-  
-  
-    Benämning:
-  
-  
-    Schemaläggnings detaljer
-  
-  
-    109, 32
-  
-  
-    Första
-  
-  
-    13, 66
-  
-  
-    474, 330
-  
-  
-    True
-  
-  
-    True
-  
-  
-    grpMonth
-  
-  
-    System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    25
-  
-  
-    63, 13
-  
-  
-    System.Windows.Forms.ColumnHeader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    True
-  
-  
-    grpWeek
-  
-  
-    txtDescription
-  
-  
-    14, 281
-  
-  
-    groupBox1
-  
-  
-    451, 232
-  
-  
-    grpMonth
-  
-  
-    0
-  
-  
-    grpMonth
-  
-  
-    394, 190
-  
-  
-    93, 21
-  
-  
-    System.Windows.Forms.CheckBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    60, 17
-  
-  
-    Schemaläggning, månad
-  
-  
-    63, 17
-  
-  
-    System.Windows.Forms.Button, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    0
-  
-  
-    System.Windows.Forms.ColumnHeader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    Lördag
-  
-  
-    Startdatum:
-  
-  
-    9
-  
-  
-    True
-  
-  
-    466, 304
-  
-  
-    48, 48
-  
-  
-    System.Windows.Forms.GroupBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    True
-  
-  
-    grpMonth
-  
-  
-    System.Windows.Forms.CheckBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    HH:mm
-  
-  
-    8, 27
-  
-  
-    cboMonthNov
-  
-  
-    System.Windows.Forms.ComboBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    0
-  
-  
-    13, 36
-  
-  
-    65, 17
-  
-  
-    columnHeader2
-  
-  
-    grpMonth
-  
-  
-    1
-  
-  
-    grpDay
-  
-  
-    16
-  
-  
-    3, 3, 3, 3
-  
-  
-    groupBox3
-  
-  
-    11
-  
-  
-    grpMonth
-  
-  
-    Enhet
-  
-  
-    8
-  
-  
-    25, 13
-  
-  
-    groupBox1
-  
-  
-    0
-  
-  
-    Schemaläggning, dagar
-  
-  
-    Juli
-  
-  
-    MÃ¥ndag
-  
-  
-    393, 190
-  
-  
-    14
-  
-  
-    15
-  
-  
-    Schemalägg:
-  
-  
-    28
-  
-  
-    :e dag.
-  
-  
-    42, 20
-  
-  
-    409, 418
-  
-  
-    cboWeekSunday
-  
-  
-    grpMonth
-  
-  
-    System.Windows.Forms.TextBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    November
-  
-  
-    False
-  
-  
-    2
-  
-  
-    True
-  
-  
-    System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    cboMonthJune
-  
-  
-    Fredag
-  
-  
-    System.Windows.Forms.CheckBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    0
-  
-  
-    groupBox1
-  
-  
-    cboWeekWednesday
-  
-  
-    9
-  
-  
-    1
-  
-  
-    8
-  
-  
-    groupBox3
-  
-  
-    groupBox3
-  
-  
-    10
-  
-  
-    Den
-  
-  
-    4
-  
-  
-    System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    318, 48
-  
-  
-    75, 23
-  
-  
-    cboWeekSaturday
-  
-  
-    Augusti
-  
-  
-    466, 304
-  
-  
-    label4
-  
-  
-    177, 13
-  
-  
-    306, 20
-  
-  
-    Varje dag
-  
-  
-    6, 13
-  
-  
-    label14
-  
-  
-    1
-  
-  
-    417, 12
-  
-  
-    True
-  
-  
-    15
-  
-  
-    grpWeek
-  
-  
-    Beskrivning:
-  
-  
-    26
-  
-  
-    grpMonth
-  
-  
-    cmdAdd
-  
-  
-    varje månad
-  
-  
-    groupBox2
-  
-  
-    Februari
-  
-  
-    groupBox3
-  
-  
-    6
-  
-  
-    CenterParent
-  
-  
-    grpDay
-  
-  
-    4
-  
-  
-    Juni
-  
-  
-    Januari
-  
-  
-    64, 17
-  
-  
-    61, 13
-  
-  
-    $this
-  
-  
-    System.Windows.Forms.CheckBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    16
-  
-  
-    23
-  
-  
-    6
-  
-  
-    2
-  
-  
-    :e vecka.
-  
-  
-    tabPage2
-  
-  
-    i månaden.
-  
-  
-    grpMonth
-  
-  
-    1
-  
-  
-    Torsdag
-  
-  
-    1
-  
-  
-    System.Windows.Forms.TabControl, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    tabPage1
-  
-  
-    groupBox3
-  
-  
-    System.Windows.Forms.ComboBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    52, 13
-  
-  
-    0
-  
-  
-    System.Windows.Forms.CheckBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    grpMonth
-  
-  
-    
-        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
-
-  
-  
-    228, 36
-  
-  
-    17
-  
-  
-    grpMonth
-  
-  
-    2
-  
-  
-    April
-  
-  
-    63, 17
-  
-  
-    True
-  
-  
-    True
-  
-  
-    pictureBox1
-  
-  
-    45, 17
-  
-  
-    41, 17
-  
-  
-    True
-  
-  
-    59, 17
-  
-  
-    rdbMonthDay
-  
-  
-    False
-  
-  
-    OK
-  
-  
-    True
-  
-  
-    label7
-  
-  
-    True
-  
-  
-    English
-  
-
\ No newline at end of file
diff --git a/scheduler/DeviceScheduler/frmSchedule.sv.resx b/scheduler/DeviceScheduler/frmSchedule.sv.resx
deleted file mode 100644
index bc82abac..00000000
--- a/scheduler/DeviceScheduler/frmSchedule.sv.resx
+++ /dev/null
@@ -1,187 +0,0 @@
-
-
-  
-  
-    
-    
-      
-        
-          
-            
-              
-                
-              
-              
-              
-              
-              
-            
-          
-          
-            
-              
-              
-            
-          
-          
-            
-              
-                
-                
-              
-              
-              
-              
-              
-            
-          
-          
-            
-              
-                
-              
-              
-            
-          
-        
-      
-    
-  
-  
-    text/microsoft-resx
-  
-  
-    2.0
-  
-  
-    System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-  
-    59, 17
-  
-  
-    Lördag
-  
-  
-    63, 17
-  
-  
-    Söndag
-  
-  
-    
-        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
-
-  
-
\ No newline at end of file
diff --git a/scheduler/DeviceScheduler/frmScheduleAddDevice.Designer.cs b/scheduler/DeviceScheduler/frmScheduleAddDevice.Designer.cs
deleted file mode 100644
index bc1d0ec8..00000000
--- a/scheduler/DeviceScheduler/frmScheduleAddDevice.Designer.cs
+++ /dev/null
@@ -1,156 +0,0 @@
-namespace DeviceScheduler
-{
-    partial class frmScheduleAddDevice
-    {
-        /// 
-        /// Required designer variable.
-        /// 
-        private System.ComponentModel.IContainer components = null;
-
-        /// 
-        /// Clean up any resources being used.
-        /// 
-        /// true if managed resources should be disposed; otherwise, false.
-        protected override void Dispose(bool disposing)
-        {
-            if (disposing && (components != null))
-            {
-                components.Dispose();
-            }
-            base.Dispose(disposing);
-        }
-
-        #region Windows Form Designer generated code
-
-        /// 
-        /// Required method for Designer support - do not modify
-        /// the contents of this method with the code editor.
-        /// 
-        private void InitializeComponent()
-        {
-            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(frmScheduleAddDevice));
-            this.groupBox1 = new System.Windows.Forms.GroupBox();
-            this.label1 = new System.Windows.Forms.Label();
-            this.label2 = new System.Windows.Forms.Label();
-            this.cboDevices = new System.Windows.Forms.ComboBox();
-            this.cboAction = new System.Windows.Forms.ComboBox();
-            this.cmdOK = new System.Windows.Forms.Button();
-            this.cmdCancel = new System.Windows.Forms.Button();
-            this.groupBox1.SuspendLayout();
-            this.SuspendLayout();
-            // 
-            // groupBox1
-            // 
-            this.groupBox1.AccessibleDescription = null;
-            this.groupBox1.AccessibleName = null;
-            resources.ApplyResources(this.groupBox1, "groupBox1");
-            this.groupBox1.BackgroundImage = null;
-            this.groupBox1.Controls.Add(this.label1);
-            this.groupBox1.Controls.Add(this.label2);
-            this.groupBox1.Controls.Add(this.cboDevices);
-            this.groupBox1.Controls.Add(this.cboAction);
-            this.groupBox1.Font = null;
-            this.groupBox1.Name = "groupBox1";
-            this.groupBox1.TabStop = false;
-            // 
-            // label1
-            // 
-            this.label1.AccessibleDescription = null;
-            this.label1.AccessibleName = null;
-            resources.ApplyResources(this.label1, "label1");
-            this.label1.Font = null;
-            this.label1.Name = "label1";
-            // 
-            // label2
-            // 
-            this.label2.AccessibleDescription = null;
-            this.label2.AccessibleName = null;
-            resources.ApplyResources(this.label2, "label2");
-            this.label2.Font = null;
-            this.label2.Name = "label2";
-            this.label2.Click += new System.EventHandler(this.label2_Click);
-            // 
-            // cboDevices
-            // 
-            this.cboDevices.AccessibleDescription = null;
-            this.cboDevices.AccessibleName = null;
-            resources.ApplyResources(this.cboDevices, "cboDevices");
-            this.cboDevices.BackgroundImage = null;
-            this.cboDevices.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
-            this.cboDevices.Font = null;
-            this.cboDevices.FormattingEnabled = true;
-            this.cboDevices.Name = "cboDevices";
-            // 
-            // cboAction
-            // 
-            this.cboAction.AccessibleDescription = null;
-            this.cboAction.AccessibleName = null;
-            resources.ApplyResources(this.cboAction, "cboAction");
-            this.cboAction.BackgroundImage = null;
-            this.cboAction.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
-            this.cboAction.Font = null;
-            this.cboAction.FormattingEnabled = true;
-            this.cboAction.Items.AddRange(new object[] {
-            resources.GetString("cboAction.Items"),
-            resources.GetString("cboAction.Items1")});
-            this.cboAction.Name = "cboAction";
-            // 
-            // cmdOK
-            // 
-            this.cmdOK.AccessibleDescription = null;
-            this.cmdOK.AccessibleName = null;
-            resources.ApplyResources(this.cmdOK, "cmdOK");
-            this.cmdOK.BackgroundImage = null;
-            this.cmdOK.Font = null;
-            this.cmdOK.Name = "cmdOK";
-            this.cmdOK.UseVisualStyleBackColor = true;
-            this.cmdOK.Click += new System.EventHandler(this.cmdOK_Click);
-            // 
-            // cmdCancel
-            // 
-            this.cmdCancel.AccessibleDescription = null;
-            this.cmdCancel.AccessibleName = null;
-            resources.ApplyResources(this.cmdCancel, "cmdCancel");
-            this.cmdCancel.BackgroundImage = null;
-            this.cmdCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
-            this.cmdCancel.Font = null;
-            this.cmdCancel.Name = "cmdCancel";
-            this.cmdCancel.UseVisualStyleBackColor = true;
-            this.cmdCancel.Click += new System.EventHandler(this.cmdCancel_Click);
-            // 
-            // frmScheduleAddDevice
-            // 
-            this.AcceptButton = this.cmdOK;
-            this.AccessibleDescription = null;
-            this.AccessibleName = null;
-            resources.ApplyResources(this, "$this");
-            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
-            this.BackgroundImage = null;
-            this.CancelButton = this.cmdCancel;
-            this.Controls.Add(this.cmdCancel);
-            this.Controls.Add(this.cmdOK);
-            this.Controls.Add(this.groupBox1);
-            this.Font = null;
-            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
-            this.Icon = null;
-            this.MaximizeBox = false;
-            this.MinimizeBox = false;
-            this.Name = "frmScheduleAddDevice";
-            this.Load += new System.EventHandler(this.frmScheduleAddDevice_Load);
-            this.groupBox1.ResumeLayout(false);
-            this.groupBox1.PerformLayout();
-            this.ResumeLayout(false);
-
-        }
-
-        #endregion
-
-        private System.Windows.Forms.GroupBox groupBox1;
-        private System.Windows.Forms.Label label1;
-        private System.Windows.Forms.Label label2;
-        private System.Windows.Forms.ComboBox cboDevices;
-        private System.Windows.Forms.ComboBox cboAction;
-        private System.Windows.Forms.Button cmdOK;
-        private System.Windows.Forms.Button cmdCancel;
-    }
-}
\ No newline at end of file
diff --git a/scheduler/DeviceScheduler/frmScheduleAddDevice.cs b/scheduler/DeviceScheduler/frmScheduleAddDevice.cs
deleted file mode 100644
index d129edce..00000000
--- a/scheduler/DeviceScheduler/frmScheduleAddDevice.cs
+++ /dev/null
@@ -1,82 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.ComponentModel;
-using System.Data;
-using System.Drawing;
-using System.Text;
-using System.Windows.Forms;
-
-namespace DeviceScheduler
-{
-    public partial class frmScheduleAddDevice : Form
-    {
-        public frmScheduleAddDevice()
-        {
-            Localization.ChangeLanguage();
-            InitializeComponent();
-            
-        }
-        
-
-        private void frmScheduleAddDevice_Load(object sender, EventArgs e)
-        {
-            //Fill the combobox with Devices
-            FillCombo();
-
-            //Preselect device and action
-            if (cboDevices.Items.Count > 0)
-            {
-                cboDevices.SelectedIndex = 0;
-            }
-            else
-            {
-                //"Inga enheter finns. Lägg först till enheter genom att klicka på \"configure unit(s)\"."
-                MessageBox.Show(Localization.GetString("nounitsexists"), Localization.GetString("telldusscheduler"), MessageBoxButtons.OK, MessageBoxIcon.Error);
-                this.Close();
-            }
-            if (cboAction.Items.Count > 0)
-            {
-                cboAction.SelectedIndex = 0;
-            }
-        }
-
-        private void FillCombo()
-        {
-            Program.DeviceHandler.Load();
-
-            foreach (DeviceHandler.Device item in Program.DeviceHandler.Devices)
-            {
-                cboDevices.Items.Add(item);
-            }
-        }
-
-        private void cmdOK_Click(object sender, EventArgs e)
-        {
-            this.DialogResult = DialogResult.OK;
-            this.Hide();
-        }
-
-        private void cmdCancel_Click(object sender, EventArgs e)
-        {
-            this.DialogResult = DialogResult.Cancel;
-            this.Hide();
-        }
-
-        public DeviceHandler.Device SelectedDevice
-        {
-            get
-            { return (DeviceHandler.Device)cboDevices.SelectedItem;}
-        }
-
-        public int SelectedDeviceAction
-        {
-            get
-            { return cboAction.SelectedIndex;}
-        }
-
-        private void label2_Click(object sender, EventArgs e)
-        {
-
-        }
-    }
-}
\ No newline at end of file
diff --git a/scheduler/DeviceScheduler/frmScheduleAddDevice.en.resx b/scheduler/DeviceScheduler/frmScheduleAddDevice.en.resx
deleted file mode 100644
index 47aed2b1..00000000
--- a/scheduler/DeviceScheduler/frmScheduleAddDevice.en.resx
+++ /dev/null
@@ -1,148 +0,0 @@
-
-
-  
-  
-    
-    
-      
-        
-          
-            
-              
-                
-              
-              
-              
-              
-              
-            
-          
-          
-            
-              
-              
-            
-          
-          
-            
-              
-                
-                
-              
-              
-              
-              
-              
-            
-          
-          
-            
-              
-                
-              
-              
-            
-          
-        
-      
-    
-  
-  
-    text/microsoft-resx
-  
-  
-    2.0
-  
-  
-    System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-  
-    29, 13
-  
-  
-    Unit:
-  
-  
-    40, 13
-  
-  
-    Action:
-  
-  
-    On
-  
-  
-    Off
-  
-  
-    Choose a unit to add
-  
-  
-    Cancel
-  
-  
-    Add unit
-  
-
\ No newline at end of file
diff --git a/scheduler/DeviceScheduler/frmScheduleAddDevice.resx b/scheduler/DeviceScheduler/frmScheduleAddDevice.resx
deleted file mode 100644
index 8545a3a0..00000000
--- a/scheduler/DeviceScheduler/frmScheduleAddDevice.resx
+++ /dev/null
@@ -1,321 +0,0 @@
-
-
-  
-  
-    
-    
-      
-        
-          
-            
-              
-                
-              
-              
-              
-              
-              
-            
-          
-          
-            
-              
-              
-            
-          
-          
-            
-              
-                
-                
-              
-              
-              
-              
-              
-            
-          
-          
-            
-              
-                
-              
-              
-            
-          
-        
-      
-    
-  
-  
-    text/microsoft-resx
-  
-  
-    2.0
-  
-  
-    System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-  
-    72, 30
-  
-  
-    label2
-  
-  
-    Åtgärd:
-  
-  
-    System.Windows.Forms.ComboBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    Avbryt
-  
-  
-    cboAction
-  
-  
-    cmdCancel
-  
-  
-    0
-  
-  
-    System.Windows.Forms.ComboBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    75, 23
-  
-  
-    38, 13
-  
-  
-    groupBox1
-  
-  
-    12, 12
-  
-  
-    System.Windows.Forms.Button, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-  
-    True
-  
-  
-    2
-  
-  
-    System.Windows.Forms.GroupBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    Enhet:
-  
-  
-    72, 57
-  
-  
-    6
-  
-  
-    187, 21
-  
-  
-    2
-  
-  
-    290, 16
-  
-  
-    0
-  
-  
-    0
-  
-  
-    System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    1
-  
-  
-    groupBox1
-  
-  
-    groupBox1
-  
-  
-    $this
-  
-  
-    System.Windows.Forms.Form, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    True
-  
-  
-    16, 60
-  
-  
-    $this
-  
-  
-    PÃ¥
-  
-  
-    4
-  
-  
-    75, 23
-  
-  
-    373, 112
-  
-  
-    272, 90
-  
-  
-    $this
-  
-  
-    16, 33
-  
-  
-    label1
-  
-  
-    1
-  
-  
-    1
-  
-  
-    Av
-  
-  
-    5
-  
-  
-    Lägg till enhet
-  
-  
-    290, 45
-  
-  
-    groupBox1
-  
-  
-    3
-  
-  
-    System.Windows.Forms.Button, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    Välj den enhet som skall läggas till
-  
-  
-  
-    CenterParent
-  
-  
-    OK
-  
-  
-    groupBox1
-  
-  
-    6, 13
-  
-  
-    cboDevices
-  
-  
-    3
-  
-  
-    frmScheduleAddDevice
-  
-  
-    41, 13
-  
-  
-    cmdOK
-  
-  
-    2
-  
-  
-    187, 21
-  
-  
-    True
-  
-  
-    English
-  
-
\ No newline at end of file
diff --git a/scheduler/DeviceScheduler/frmSelectDevice.Designer.cs b/scheduler/DeviceScheduler/frmSelectDevice.Designer.cs
deleted file mode 100644
index f9f4c388..00000000
--- a/scheduler/DeviceScheduler/frmSelectDevice.Designer.cs
+++ /dev/null
@@ -1,100 +0,0 @@
-namespace DeviceScheduler
-{
-    partial class frmSelectDevice
-    {
-        /// 
-        /// Required designer variable.
-        /// 
-        private System.ComponentModel.IContainer components = null;
-
-        /// 
-        /// Clean up any resources being used.
-        /// 
-        /// true if managed resources should be disposed; otherwise, false.
-        protected override void Dispose(bool disposing)
-        {
-            if (disposing && (components != null))
-            {
-                components.Dispose();
-            }
-            base.Dispose(disposing);
-        }
-
-        #region Windows Form Designer generated code
-
-        /// 
-        /// Required method for Designer support - do not modify
-        /// the contents of this method with the code editor.
-        /// 
-        private void InitializeComponent()
-        {
-            this.listView1 = new System.Windows.Forms.ListView();
-            this.columnHeader1 = new System.Windows.Forms.ColumnHeader();
-            this.columnHeader2 = new System.Windows.Forms.ColumnHeader();
-            this.button1 = new System.Windows.Forms.Button();
-            this.button2 = new System.Windows.Forms.Button();
-            this.SuspendLayout();
-            // 
-            // listView1
-            // 
-            this.listView1.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
-            this.columnHeader1,
-            this.columnHeader2});
-            this.listView1.Location = new System.Drawing.Point(12, 12);
-            this.listView1.Name = "listView1";
-            this.listView1.Size = new System.Drawing.Size(333, 166);
-            this.listView1.TabIndex = 5;
-            this.listView1.UseCompatibleStateImageBehavior = false;
-            this.listView1.View = System.Windows.Forms.View.Details;
-            // 
-            // columnHeader1
-            // 
-            this.columnHeader1.Text = "Device";
-            this.columnHeader1.Width = 168;
-            // 
-            // columnHeader2
-            // 
-            this.columnHeader2.Text = "Action";
-            this.columnHeader2.Width = 135;
-            // 
-            // button1
-            // 
-            this.button1.Location = new System.Drawing.Point(351, 12);
-            this.button1.Name = "button1";
-            this.button1.Size = new System.Drawing.Size(75, 23);
-            this.button1.TabIndex = 6;
-            this.button1.Text = "OK";
-            this.button1.UseVisualStyleBackColor = true;
-            // 
-            // button2
-            // 
-            this.button2.Location = new System.Drawing.Point(351, 41);
-            this.button2.Name = "button2";
-            this.button2.Size = new System.Drawing.Size(75, 23);
-            this.button2.TabIndex = 7;
-            this.button2.Text = "Cancel";
-            this.button2.UseVisualStyleBackColor = true;
-            // 
-            // frmSelectDevice
-            // 
-            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
-            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
-            this.ClientSize = new System.Drawing.Size(435, 190);
-            this.Controls.Add(this.button2);
-            this.Controls.Add(this.button1);
-            this.Controls.Add(this.listView1);
-            this.Name = "frmSelectDevice";
-            this.Text = "frmSelectDevice";
-            this.ResumeLayout(false);
-
-        }
-
-        #endregion
-
-        private System.Windows.Forms.ListView listView1;
-        private System.Windows.Forms.ColumnHeader columnHeader1;
-        private System.Windows.Forms.ColumnHeader columnHeader2;
-        private System.Windows.Forms.Button button1;
-        private System.Windows.Forms.Button button2;
-    }
-}
\ No newline at end of file
diff --git a/scheduler/DeviceScheduler/frmSelectDevice.cs b/scheduler/DeviceScheduler/frmSelectDevice.cs
deleted file mode 100644
index 29a6b008..00000000
--- a/scheduler/DeviceScheduler/frmSelectDevice.cs
+++ /dev/null
@@ -1,18 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.ComponentModel;
-using System.Data;
-using System.Drawing;
-using System.Text;
-using System.Windows.Forms;
-
-namespace DeviceScheduler
-{
-    public partial class frmSelectDevice : Form
-    {
-        public frmSelectDevice()
-        {
-            InitializeComponent();
-        }
-    }
-}
\ No newline at end of file
diff --git a/scheduler/DeviceScheduler/frmSelectDevice.resx b/scheduler/DeviceScheduler/frmSelectDevice.resx
deleted file mode 100644
index ff31a6db..00000000
--- a/scheduler/DeviceScheduler/frmSelectDevice.resx
+++ /dev/null
@@ -1,120 +0,0 @@
-
-
-  
-  
-    
-    
-      
-        
-          
-            
-              
-                
-              
-              
-              
-              
-              
-            
-          
-          
-            
-              
-              
-            
-          
-          
-            
-              
-                
-                
-              
-              
-              
-              
-              
-            
-          
-          
-            
-              
-                
-              
-              
-            
-          
-        
-      
-    
-  
-  
-    text/microsoft-resx
-  
-  
-    2.0
-  
-  
-    System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-
\ No newline at end of file
diff --git a/scheduler/DeviceScheduler/frmSplash.Designer.cs b/scheduler/DeviceScheduler/frmSplash.Designer.cs
deleted file mode 100644
index 7978d5be..00000000
--- a/scheduler/DeviceScheduler/frmSplash.Designer.cs
+++ /dev/null
@@ -1,99 +0,0 @@
-namespace DeviceScheduler
-{
-    partial class frmSplash
-    {
-        /// 
-        /// Required designer variable.
-        /// 
-        private System.ComponentModel.IContainer components = null;
-
-        /// 
-        /// Clean up any resources being used.
-        /// 
-        /// true if managed resources should be disposed; otherwise, false.
-        protected override void Dispose(bool disposing)
-        {
-            if (disposing && (components != null))
-            {
-                components.Dispose();
-            }
-            base.Dispose(disposing);
-        }
-
-        #region Windows Form Designer generated code
-
-        /// 
-        /// Required method for Designer support - do not modify
-        /// the contents of this method with the code editor.
-        /// 
-        private void InitializeComponent()
-        {
-			this.components = new System.ComponentModel.Container();
-			System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(frmSplash));
-			this.label3 = new System.Windows.Forms.Label();
-			this.label1 = new System.Windows.Forms.Label();
-			this.timer1 = new System.Windows.Forms.Timer(this.components);
-			this.lblVersion = new System.Windows.Forms.Label();
-			this.SuspendLayout();
-			// 
-			// label3
-			// 
-			this.label3.AutoSize = true;
-			this.label3.BackColor = System.Drawing.Color.Transparent;
-			this.label3.Location = new System.Drawing.Point(114, 280);
-			this.label3.Name = "label3";
-			this.label3.Size = new System.Drawing.Size(341, 13);
-			this.label3.TabIndex = 6;
-			this.label3.Text = "© Copyright Telldus Technologies AB 2010. Alla rättigheter förbehålles.";
-			// 
-			// label1
-			// 
-			this.label1.AutoSize = true;
-			this.label1.BackColor = System.Drawing.Color.Transparent;
-			this.label1.Location = new System.Drawing.Point(242, 195);
-			this.label1.Name = "label1";
-			this.label1.Size = new System.Drawing.Size(45, 13);
-			this.label1.TabIndex = 7;
-			this.label1.Text = "Version:";
-			// 
-			// timer1
-			// 
-			this.timer1.Interval = 1500;
-			this.timer1.Tick += new System.EventHandler(this.timer1_Tick);
-			// 
-			// lblVersion
-			// 
-			this.lblVersion.AutoSize = true;
-			this.lblVersion.BackColor = System.Drawing.Color.Transparent;
-			this.lblVersion.Location = new System.Drawing.Point(293, 195);
-			this.lblVersion.Name = "lblVersion";
-			this.lblVersion.Size = new System.Drawing.Size(45, 13);
-			this.lblVersion.TabIndex = 8;
-			this.lblVersion.Text = "Version:";
-			// 
-			// frmSplash
-			// 
-			this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
-			this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
-			this.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("$this.BackgroundImage")));
-			this.ClientSize = new System.Drawing.Size(522, 300);
-			this.Controls.Add(this.lblVersion);
-			this.Controls.Add(this.label1);
-			this.Controls.Add(this.label3);
-			this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
-			this.Name = "frmSplash";
-			this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
-			this.Load += new System.EventHandler(this.frmSplash_Load);
-			this.ResumeLayout(false);
-			this.PerformLayout();
-
-        }
-
-        #endregion
-
-        private System.Windows.Forms.Label label3;
-        private System.Windows.Forms.Label label1;
-        private System.Windows.Forms.Timer timer1;
-        private System.Windows.Forms.Label lblVersion;
-    }
-}
\ No newline at end of file
diff --git a/scheduler/DeviceScheduler/frmSplash.cs b/scheduler/DeviceScheduler/frmSplash.cs
deleted file mode 100644
index 8e8b5cf8..00000000
--- a/scheduler/DeviceScheduler/frmSplash.cs
+++ /dev/null
@@ -1,43 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.ComponentModel;
-using System.Data;
-using System.Drawing;
-using System.Text;
-using System.Windows.Forms;
-using System.Reflection;
-
-namespace DeviceScheduler
-{
-    public partial class frmSplash : Form
-    {
-        public frmSplash()
-        {
-            InitializeComponent();
-        }
-
-        private void timer1_Tick(object sender, EventArgs e)
-        {
-            
-            timer1.Enabled = false;
-            Cursor = Cursors.Default;
-            this.Hide();
-
-        }
-
-        private void frmSplash_Load(object sender, EventArgs e)
-        {
-            Cursor = Cursors.WaitCursor;
-            lblVersion.Text = AssemblyVersion;
-            timer1.Enabled = true;
-        }
-        public string AssemblyVersion
-        {
-            get
-            {
-                return Assembly.GetExecutingAssembly().GetName().Version.ToString();
-            }
-        }
-
-    }
-}
\ No newline at end of file
diff --git a/scheduler/DeviceScheduler/frmSplash.resx b/scheduler/DeviceScheduler/frmSplash.resx
deleted file mode 100644
index 4e02b590..00000000
--- a/scheduler/DeviceScheduler/frmSplash.resx
+++ /dev/null
@@ -1,900 +0,0 @@
-
-
-  
-  
-    
-    
-      
-        
-          
-            
-              
-                
-              
-              
-              
-              
-              
-            
-          
-          
-            
-              
-              
-            
-          
-          
-            
-              
-                
-                
-              
-              
-              
-              
-              
-            
-          
-          
-            
-              
-                
-              
-              
-            
-          
-        
-      
-    
-  
-  
-    text/microsoft-resx
-  
-  
-    2.0
-  
-  
-    System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-  
-  
-    17, 17
-  
-  
-  
-    
-        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
-
-  
-
\ No newline at end of file
diff --git a/scheduler/DeviceSchedulerAgent/DataStorage.Designer.cs b/scheduler/DeviceSchedulerAgent/DataStorage.Designer.cs
deleted file mode 100644
index ac827e4e..00000000
--- a/scheduler/DeviceSchedulerAgent/DataStorage.Designer.cs
+++ /dev/null
@@ -1,1179 +0,0 @@
-//------------------------------------------------------------------------------
-// 
-//     This code was generated by a tool.
-//     Runtime Version:2.0.50727.3053
-//
-//     Changes to this file may cause incorrect behavior and will be lost if
-//     the code is regenerated.
-// 
-//------------------------------------------------------------------------------
-
-#pragma warning disable 1591
-
-namespace DeviceSchedulerAgent {
-    
-    
-    /// 
-    ///Represents a strongly typed in-memory cache of data.
-    ///
-    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "2.0.0.0")]
-    [global::System.Serializable()]
-    [global::System.ComponentModel.DesignerCategoryAttribute("code")]
-    [global::System.ComponentModel.ToolboxItem(true)]
-    [global::System.Xml.Serialization.XmlSchemaProviderAttribute("GetTypedDataSetSchema")]
-    [global::System.Xml.Serialization.XmlRootAttribute("DataStorage")]
-    [global::System.ComponentModel.Design.HelpKeywordAttribute("vs.data.DataSet")]
-    public partial class DataStorage : global::System.Data.DataSet {
-        
-        private JobDataTable tableJob;
-        
-        private JobActionsDataTable tableJobActions;
-        
-        private global::System.Data.DataRelation relationJob_JobActions;
-        
-        private global::System.Data.SchemaSerializationMode _schemaSerializationMode = global::System.Data.SchemaSerializationMode.IncludeSchema;
-        
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-        public DataStorage() {
-            this.BeginInit();
-            this.InitClass();
-            global::System.ComponentModel.CollectionChangeEventHandler schemaChangedHandler = new global::System.ComponentModel.CollectionChangeEventHandler(this.SchemaChanged);
-            base.Tables.CollectionChanged += schemaChangedHandler;
-            base.Relations.CollectionChanged += schemaChangedHandler;
-            this.EndInit();
-        }
-        
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-        protected DataStorage(global::System.Runtime.Serialization.SerializationInfo info, global::System.Runtime.Serialization.StreamingContext context) : 
-                base(info, context, false) {
-            if ((this.IsBinarySerialized(info, context) == true)) {
-                this.InitVars(false);
-                global::System.ComponentModel.CollectionChangeEventHandler schemaChangedHandler1 = new global::System.ComponentModel.CollectionChangeEventHandler(this.SchemaChanged);
-                this.Tables.CollectionChanged += schemaChangedHandler1;
-                this.Relations.CollectionChanged += schemaChangedHandler1;
-                return;
-            }
-            string strSchema = ((string)(info.GetValue("XmlSchema", typeof(string))));
-            if ((this.DetermineSchemaSerializationMode(info, context) == global::System.Data.SchemaSerializationMode.IncludeSchema)) {
-                global::System.Data.DataSet ds = new global::System.Data.DataSet();
-                ds.ReadXmlSchema(new global::System.Xml.XmlTextReader(new global::System.IO.StringReader(strSchema)));
-                if ((ds.Tables["Job"] != null)) {
-                    base.Tables.Add(new JobDataTable(ds.Tables["Job"]));
-                }
-                if ((ds.Tables["JobActions"] != null)) {
-                    base.Tables.Add(new JobActionsDataTable(ds.Tables["JobActions"]));
-                }
-                this.DataSetName = ds.DataSetName;
-                this.Prefix = ds.Prefix;
-                this.Namespace = ds.Namespace;
-                this.Locale = ds.Locale;
-                this.CaseSensitive = ds.CaseSensitive;
-                this.EnforceConstraints = ds.EnforceConstraints;
-                this.Merge(ds, false, global::System.Data.MissingSchemaAction.Add);
-                this.InitVars();
-            }
-            else {
-                this.ReadXmlSchema(new global::System.Xml.XmlTextReader(new global::System.IO.StringReader(strSchema)));
-            }
-            this.GetSerializationData(info, context);
-            global::System.ComponentModel.CollectionChangeEventHandler schemaChangedHandler = new global::System.ComponentModel.CollectionChangeEventHandler(this.SchemaChanged);
-            base.Tables.CollectionChanged += schemaChangedHandler;
-            this.Relations.CollectionChanged += schemaChangedHandler;
-        }
-        
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-        [global::System.ComponentModel.Browsable(false)]
-        [global::System.ComponentModel.DesignerSerializationVisibility(global::System.ComponentModel.DesignerSerializationVisibility.Content)]
-        public JobDataTable Job {
-            get {
-                return this.tableJob;
-            }
-        }
-        
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-        [global::System.ComponentModel.Browsable(false)]
-        [global::System.ComponentModel.DesignerSerializationVisibility(global::System.ComponentModel.DesignerSerializationVisibility.Content)]
-        public JobActionsDataTable JobActions {
-            get {
-                return this.tableJobActions;
-            }
-        }
-        
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-        [global::System.ComponentModel.BrowsableAttribute(true)]
-        [global::System.ComponentModel.DesignerSerializationVisibilityAttribute(global::System.ComponentModel.DesignerSerializationVisibility.Visible)]
-        public override global::System.Data.SchemaSerializationMode SchemaSerializationMode {
-            get {
-                return this._schemaSerializationMode;
-            }
-            set {
-                this._schemaSerializationMode = value;
-            }
-        }
-        
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-        [global::System.ComponentModel.DesignerSerializationVisibilityAttribute(global::System.ComponentModel.DesignerSerializationVisibility.Hidden)]
-        public new global::System.Data.DataTableCollection Tables {
-            get {
-                return base.Tables;
-            }
-        }
-        
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-        [global::System.ComponentModel.DesignerSerializationVisibilityAttribute(global::System.ComponentModel.DesignerSerializationVisibility.Hidden)]
-        public new global::System.Data.DataRelationCollection Relations {
-            get {
-                return base.Relations;
-            }
-        }
-        
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-        protected override void InitializeDerivedDataSet() {
-            this.BeginInit();
-            this.InitClass();
-            this.EndInit();
-        }
-        
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-        public override global::System.Data.DataSet Clone() {
-            DataStorage cln = ((DataStorage)(base.Clone()));
-            cln.InitVars();
-            cln.SchemaSerializationMode = this.SchemaSerializationMode;
-            return cln;
-        }
-        
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-        protected override bool ShouldSerializeTables() {
-            return false;
-        }
-        
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-        protected override bool ShouldSerializeRelations() {
-            return false;
-        }
-        
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-        protected override void ReadXmlSerializable(global::System.Xml.XmlReader reader) {
-            if ((this.DetermineSchemaSerializationMode(reader) == global::System.Data.SchemaSerializationMode.IncludeSchema)) {
-                this.Reset();
-                global::System.Data.DataSet ds = new global::System.Data.DataSet();
-                ds.ReadXml(reader);
-                if ((ds.Tables["Job"] != null)) {
-                    base.Tables.Add(new JobDataTable(ds.Tables["Job"]));
-                }
-                if ((ds.Tables["JobActions"] != null)) {
-                    base.Tables.Add(new JobActionsDataTable(ds.Tables["JobActions"]));
-                }
-                this.DataSetName = ds.DataSetName;
-                this.Prefix = ds.Prefix;
-                this.Namespace = ds.Namespace;
-                this.Locale = ds.Locale;
-                this.CaseSensitive = ds.CaseSensitive;
-                this.EnforceConstraints = ds.EnforceConstraints;
-                this.Merge(ds, false, global::System.Data.MissingSchemaAction.Add);
-                this.InitVars();
-            }
-            else {
-                this.ReadXml(reader);
-                this.InitVars();
-            }
-        }
-        
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-        protected override global::System.Xml.Schema.XmlSchema GetSchemaSerializable() {
-            global::System.IO.MemoryStream stream = new global::System.IO.MemoryStream();
-            this.WriteXmlSchema(new global::System.Xml.XmlTextWriter(stream, null));
-            stream.Position = 0;
-            return global::System.Xml.Schema.XmlSchema.Read(new global::System.Xml.XmlTextReader(stream), null);
-        }
-        
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-        internal void InitVars() {
-            this.InitVars(true);
-        }
-        
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-        internal void InitVars(bool initTable) {
-            this.tableJob = ((JobDataTable)(base.Tables["Job"]));
-            if ((initTable == true)) {
-                if ((this.tableJob != null)) {
-                    this.tableJob.InitVars();
-                }
-            }
-            this.tableJobActions = ((JobActionsDataTable)(base.Tables["JobActions"]));
-            if ((initTable == true)) {
-                if ((this.tableJobActions != null)) {
-                    this.tableJobActions.InitVars();
-                }
-            }
-            this.relationJob_JobActions = this.Relations["Job_JobActions"];
-        }
-        
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-        private void InitClass() {
-            this.DataSetName = "DataStorage";
-            this.Prefix = "";
-            this.Namespace = "http://tempuri.org/DataStorage.xsd";
-            this.EnforceConstraints = true;
-            this.SchemaSerializationMode = global::System.Data.SchemaSerializationMode.IncludeSchema;
-            this.tableJob = new JobDataTable();
-            base.Tables.Add(this.tableJob);
-            this.tableJobActions = new JobActionsDataTable();
-            base.Tables.Add(this.tableJobActions);
-            this.relationJob_JobActions = new global::System.Data.DataRelation("Job_JobActions", new global::System.Data.DataColumn[] {
-                        this.tableJob.IDColumn}, new global::System.Data.DataColumn[] {
-                        this.tableJobActions.JobIDColumn}, false);
-            this.Relations.Add(this.relationJob_JobActions);
-        }
-        
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-        private bool ShouldSerializeJob() {
-            return false;
-        }
-        
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-        private bool ShouldSerializeJobActions() {
-            return false;
-        }
-        
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-        private void SchemaChanged(object sender, global::System.ComponentModel.CollectionChangeEventArgs e) {
-            if ((e.Action == global::System.ComponentModel.CollectionChangeAction.Remove)) {
-                this.InitVars();
-            }
-        }
-        
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-        public static global::System.Xml.Schema.XmlSchemaComplexType GetTypedDataSetSchema(global::System.Xml.Schema.XmlSchemaSet xs) {
-            DataStorage ds = new DataStorage();
-            global::System.Xml.Schema.XmlSchemaComplexType type = new global::System.Xml.Schema.XmlSchemaComplexType();
-            global::System.Xml.Schema.XmlSchemaSequence sequence = new global::System.Xml.Schema.XmlSchemaSequence();
-            global::System.Xml.Schema.XmlSchemaAny any = new global::System.Xml.Schema.XmlSchemaAny();
-            any.Namespace = ds.Namespace;
-            sequence.Items.Add(any);
-            type.Particle = sequence;
-            global::System.Xml.Schema.XmlSchema dsSchema = ds.GetSchemaSerializable();
-            if (xs.Contains(dsSchema.TargetNamespace)) {
-                global::System.IO.MemoryStream s1 = new global::System.IO.MemoryStream();
-                global::System.IO.MemoryStream s2 = new global::System.IO.MemoryStream();
-                try {
-                    global::System.Xml.Schema.XmlSchema schema = null;
-                    dsSchema.Write(s1);
-                    for (global::System.Collections.IEnumerator schemas = xs.Schemas(dsSchema.TargetNamespace).GetEnumerator(); schemas.MoveNext(); ) {
-                        schema = ((global::System.Xml.Schema.XmlSchema)(schemas.Current));
-                        s2.SetLength(0);
-                        schema.Write(s2);
-                        if ((s1.Length == s2.Length)) {
-                            s1.Position = 0;
-                            s2.Position = 0;
-                            for (; ((s1.Position != s1.Length) 
-                                        && (s1.ReadByte() == s2.ReadByte())); ) {
-                                ;
-                            }
-                            if ((s1.Position == s1.Length)) {
-                                return type;
-                            }
-                        }
-                    }
-                }
-                finally {
-                    if ((s1 != null)) {
-                        s1.Close();
-                    }
-                    if ((s2 != null)) {
-                        s2.Close();
-                    }
-                }
-            }
-            xs.Add(dsSchema);
-            return type;
-        }
-        
-        public delegate void JobRowChangeEventHandler(object sender, JobRowChangeEvent e);
-        
-        public delegate void JobActionsRowChangeEventHandler(object sender, JobActionsRowChangeEvent e);
-        
-        /// 
-        ///Represents the strongly named DataTable class.
-        ///
-        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "2.0.0.0")]
-        [global::System.Serializable()]
-        [global::System.Xml.Serialization.XmlSchemaProviderAttribute("GetTypedTableSchema")]
-        public partial class JobDataTable : global::System.Data.DataTable, global::System.Collections.IEnumerable {
-            
-            private global::System.Data.DataColumn columnID;
-            
-            private global::System.Data.DataColumn columnName;
-            
-            private global::System.Data.DataColumn columnDescription;
-            
-            private global::System.Data.DataColumn columnJobName;
-            
-            private global::System.Data.DataColumn columnStartTime;
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public JobDataTable() {
-                this.TableName = "Job";
-                this.BeginInit();
-                this.InitClass();
-                this.EndInit();
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            internal JobDataTable(global::System.Data.DataTable table) {
-                this.TableName = table.TableName;
-                if ((table.CaseSensitive != table.DataSet.CaseSensitive)) {
-                    this.CaseSensitive = table.CaseSensitive;
-                }
-                if ((table.Locale.ToString() != table.DataSet.Locale.ToString())) {
-                    this.Locale = table.Locale;
-                }
-                if ((table.Namespace != table.DataSet.Namespace)) {
-                    this.Namespace = table.Namespace;
-                }
-                this.Prefix = table.Prefix;
-                this.MinimumCapacity = table.MinimumCapacity;
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            protected JobDataTable(global::System.Runtime.Serialization.SerializationInfo info, global::System.Runtime.Serialization.StreamingContext context) : 
-                    base(info, context) {
-                this.InitVars();
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public global::System.Data.DataColumn IDColumn {
-                get {
-                    return this.columnID;
-                }
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public global::System.Data.DataColumn NameColumn {
-                get {
-                    return this.columnName;
-                }
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public global::System.Data.DataColumn DescriptionColumn {
-                get {
-                    return this.columnDescription;
-                }
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public global::System.Data.DataColumn JobNameColumn {
-                get {
-                    return this.columnJobName;
-                }
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public global::System.Data.DataColumn StartTimeColumn {
-                get {
-                    return this.columnStartTime;
-                }
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            [global::System.ComponentModel.Browsable(false)]
-            public int Count {
-                get {
-                    return this.Rows.Count;
-                }
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public JobRow this[int index] {
-                get {
-                    return ((JobRow)(this.Rows[index]));
-                }
-            }
-            
-            public event JobRowChangeEventHandler JobRowChanging;
-            
-            public event JobRowChangeEventHandler JobRowChanged;
-            
-            public event JobRowChangeEventHandler JobRowDeleting;
-            
-            public event JobRowChangeEventHandler JobRowDeleted;
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public void AddJobRow(JobRow row) {
-                this.Rows.Add(row);
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public JobRow AddJobRow(string Name, string Description, string JobName, string StartTime) {
-                JobRow rowJobRow = ((JobRow)(this.NewRow()));
-                object[] columnValuesArray = new object[] {
-                        null,
-                        Name,
-                        Description,
-                        JobName,
-                        StartTime};
-                rowJobRow.ItemArray = columnValuesArray;
-                this.Rows.Add(rowJobRow);
-                return rowJobRow;
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public JobRow FindByID(int ID) {
-                return ((JobRow)(this.Rows.Find(new object[] {
-                            ID})));
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public virtual global::System.Collections.IEnumerator GetEnumerator() {
-                return this.Rows.GetEnumerator();
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public override global::System.Data.DataTable Clone() {
-                JobDataTable cln = ((JobDataTable)(base.Clone()));
-                cln.InitVars();
-                return cln;
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            protected override global::System.Data.DataTable CreateInstance() {
-                return new JobDataTable();
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            internal void InitVars() {
-                this.columnID = base.Columns["ID"];
-                this.columnName = base.Columns["Name"];
-                this.columnDescription = base.Columns["Description"];
-                this.columnJobName = base.Columns["JobName"];
-                this.columnStartTime = base.Columns["StartTime"];
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            private void InitClass() {
-                this.columnID = new global::System.Data.DataColumn("ID", typeof(int), null, global::System.Data.MappingType.Element);
-                base.Columns.Add(this.columnID);
-                this.columnName = new global::System.Data.DataColumn("Name", typeof(string), null, global::System.Data.MappingType.Element);
-                base.Columns.Add(this.columnName);
-                this.columnDescription = new global::System.Data.DataColumn("Description", typeof(string), null, global::System.Data.MappingType.Element);
-                base.Columns.Add(this.columnDescription);
-                this.columnJobName = new global::System.Data.DataColumn("JobName", typeof(string), null, global::System.Data.MappingType.Element);
-                base.Columns.Add(this.columnJobName);
-                this.columnStartTime = new global::System.Data.DataColumn("StartTime", typeof(string), null, global::System.Data.MappingType.Element);
-                base.Columns.Add(this.columnStartTime);
-                this.Constraints.Add(new global::System.Data.UniqueConstraint("JobKey1", new global::System.Data.DataColumn[] {
-                                this.columnID}, true));
-                this.columnID.AutoIncrement = true;
-                this.columnID.AutoIncrementSeed = 1;
-                this.columnID.AllowDBNull = false;
-                this.columnID.Unique = true;
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public JobRow NewJobRow() {
-                return ((JobRow)(this.NewRow()));
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            protected override global::System.Data.DataRow NewRowFromBuilder(global::System.Data.DataRowBuilder builder) {
-                return new JobRow(builder);
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            protected override global::System.Type GetRowType() {
-                return typeof(JobRow);
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            protected override void OnRowChanged(global::System.Data.DataRowChangeEventArgs e) {
-                base.OnRowChanged(e);
-                if ((this.JobRowChanged != null)) {
-                    this.JobRowChanged(this, new JobRowChangeEvent(((JobRow)(e.Row)), e.Action));
-                }
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            protected override void OnRowChanging(global::System.Data.DataRowChangeEventArgs e) {
-                base.OnRowChanging(e);
-                if ((this.JobRowChanging != null)) {
-                    this.JobRowChanging(this, new JobRowChangeEvent(((JobRow)(e.Row)), e.Action));
-                }
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            protected override void OnRowDeleted(global::System.Data.DataRowChangeEventArgs e) {
-                base.OnRowDeleted(e);
-                if ((this.JobRowDeleted != null)) {
-                    this.JobRowDeleted(this, new JobRowChangeEvent(((JobRow)(e.Row)), e.Action));
-                }
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            protected override void OnRowDeleting(global::System.Data.DataRowChangeEventArgs e) {
-                base.OnRowDeleting(e);
-                if ((this.JobRowDeleting != null)) {
-                    this.JobRowDeleting(this, new JobRowChangeEvent(((JobRow)(e.Row)), e.Action));
-                }
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public void RemoveJobRow(JobRow row) {
-                this.Rows.Remove(row);
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public static global::System.Xml.Schema.XmlSchemaComplexType GetTypedTableSchema(global::System.Xml.Schema.XmlSchemaSet xs) {
-                global::System.Xml.Schema.XmlSchemaComplexType type = new global::System.Xml.Schema.XmlSchemaComplexType();
-                global::System.Xml.Schema.XmlSchemaSequence sequence = new global::System.Xml.Schema.XmlSchemaSequence();
-                DataStorage ds = new DataStorage();
-                global::System.Xml.Schema.XmlSchemaAny any1 = new global::System.Xml.Schema.XmlSchemaAny();
-                any1.Namespace = "http://www.w3.org/2001/XMLSchema";
-                any1.MinOccurs = new decimal(0);
-                any1.MaxOccurs = decimal.MaxValue;
-                any1.ProcessContents = global::System.Xml.Schema.XmlSchemaContentProcessing.Lax;
-                sequence.Items.Add(any1);
-                global::System.Xml.Schema.XmlSchemaAny any2 = new global::System.Xml.Schema.XmlSchemaAny();
-                any2.Namespace = "urn:schemas-microsoft-com:xml-diffgram-v1";
-                any2.MinOccurs = new decimal(1);
-                any2.ProcessContents = global::System.Xml.Schema.XmlSchemaContentProcessing.Lax;
-                sequence.Items.Add(any2);
-                global::System.Xml.Schema.XmlSchemaAttribute attribute1 = new global::System.Xml.Schema.XmlSchemaAttribute();
-                attribute1.Name = "namespace";
-                attribute1.FixedValue = ds.Namespace;
-                type.Attributes.Add(attribute1);
-                global::System.Xml.Schema.XmlSchemaAttribute attribute2 = new global::System.Xml.Schema.XmlSchemaAttribute();
-                attribute2.Name = "tableTypeName";
-                attribute2.FixedValue = "JobDataTable";
-                type.Attributes.Add(attribute2);
-                type.Particle = sequence;
-                global::System.Xml.Schema.XmlSchema dsSchema = ds.GetSchemaSerializable();
-                if (xs.Contains(dsSchema.TargetNamespace)) {
-                    global::System.IO.MemoryStream s1 = new global::System.IO.MemoryStream();
-                    global::System.IO.MemoryStream s2 = new global::System.IO.MemoryStream();
-                    try {
-                        global::System.Xml.Schema.XmlSchema schema = null;
-                        dsSchema.Write(s1);
-                        for (global::System.Collections.IEnumerator schemas = xs.Schemas(dsSchema.TargetNamespace).GetEnumerator(); schemas.MoveNext(); ) {
-                            schema = ((global::System.Xml.Schema.XmlSchema)(schemas.Current));
-                            s2.SetLength(0);
-                            schema.Write(s2);
-                            if ((s1.Length == s2.Length)) {
-                                s1.Position = 0;
-                                s2.Position = 0;
-                                for (; ((s1.Position != s1.Length) 
-                                            && (s1.ReadByte() == s2.ReadByte())); ) {
-                                    ;
-                                }
-                                if ((s1.Position == s1.Length)) {
-                                    return type;
-                                }
-                            }
-                        }
-                    }
-                    finally {
-                        if ((s1 != null)) {
-                            s1.Close();
-                        }
-                        if ((s2 != null)) {
-                            s2.Close();
-                        }
-                    }
-                }
-                xs.Add(dsSchema);
-                return type;
-            }
-        }
-        
-        /// 
-        ///Represents the strongly named DataTable class.
-        ///
-        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "2.0.0.0")]
-        [global::System.Serializable()]
-        [global::System.Xml.Serialization.XmlSchemaProviderAttribute("GetTypedTableSchema")]
-        public partial class JobActionsDataTable : global::System.Data.DataTable, global::System.Collections.IEnumerable {
-            
-            private global::System.Data.DataColumn columnID;
-            
-            private global::System.Data.DataColumn columnJobID;
-            
-            private global::System.Data.DataColumn columnDeviceID;
-            
-            private global::System.Data.DataColumn columnTurnOn;
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public JobActionsDataTable() {
-                this.TableName = "JobActions";
-                this.BeginInit();
-                this.InitClass();
-                this.EndInit();
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            internal JobActionsDataTable(global::System.Data.DataTable table) {
-                this.TableName = table.TableName;
-                if ((table.CaseSensitive != table.DataSet.CaseSensitive)) {
-                    this.CaseSensitive = table.CaseSensitive;
-                }
-                if ((table.Locale.ToString() != table.DataSet.Locale.ToString())) {
-                    this.Locale = table.Locale;
-                }
-                if ((table.Namespace != table.DataSet.Namespace)) {
-                    this.Namespace = table.Namespace;
-                }
-                this.Prefix = table.Prefix;
-                this.MinimumCapacity = table.MinimumCapacity;
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            protected JobActionsDataTable(global::System.Runtime.Serialization.SerializationInfo info, global::System.Runtime.Serialization.StreamingContext context) : 
-                    base(info, context) {
-                this.InitVars();
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public global::System.Data.DataColumn IDColumn {
-                get {
-                    return this.columnID;
-                }
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public global::System.Data.DataColumn JobIDColumn {
-                get {
-                    return this.columnJobID;
-                }
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public global::System.Data.DataColumn DeviceIDColumn {
-                get {
-                    return this.columnDeviceID;
-                }
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public global::System.Data.DataColumn TurnOnColumn {
-                get {
-                    return this.columnTurnOn;
-                }
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            [global::System.ComponentModel.Browsable(false)]
-            public int Count {
-                get {
-                    return this.Rows.Count;
-                }
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public JobActionsRow this[int index] {
-                get {
-                    return ((JobActionsRow)(this.Rows[index]));
-                }
-            }
-            
-            public event JobActionsRowChangeEventHandler JobActionsRowChanging;
-            
-            public event JobActionsRowChangeEventHandler JobActionsRowChanged;
-            
-            public event JobActionsRowChangeEventHandler JobActionsRowDeleting;
-            
-            public event JobActionsRowChangeEventHandler JobActionsRowDeleted;
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public void AddJobActionsRow(JobActionsRow row) {
-                this.Rows.Add(row);
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public JobActionsRow AddJobActionsRow(JobRow parentJobRowByJob_JobActions, int DeviceID, bool TurnOn) {
-                JobActionsRow rowJobActionsRow = ((JobActionsRow)(this.NewRow()));
-                object[] columnValuesArray = new object[] {
-                        null,
-                        null,
-                        DeviceID,
-                        TurnOn};
-                if ((parentJobRowByJob_JobActions != null)) {
-                    columnValuesArray[1] = parentJobRowByJob_JobActions[0];
-                }
-                rowJobActionsRow.ItemArray = columnValuesArray;
-                this.Rows.Add(rowJobActionsRow);
-                return rowJobActionsRow;
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public JobActionsRow FindByID(int ID) {
-                return ((JobActionsRow)(this.Rows.Find(new object[] {
-                            ID})));
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public virtual global::System.Collections.IEnumerator GetEnumerator() {
-                return this.Rows.GetEnumerator();
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public override global::System.Data.DataTable Clone() {
-                JobActionsDataTable cln = ((JobActionsDataTable)(base.Clone()));
-                cln.InitVars();
-                return cln;
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            protected override global::System.Data.DataTable CreateInstance() {
-                return new JobActionsDataTable();
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            internal void InitVars() {
-                this.columnID = base.Columns["ID"];
-                this.columnJobID = base.Columns["JobID"];
-                this.columnDeviceID = base.Columns["DeviceID"];
-                this.columnTurnOn = base.Columns["TurnOn"];
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            private void InitClass() {
-                this.columnID = new global::System.Data.DataColumn("ID", typeof(int), null, global::System.Data.MappingType.Element);
-                base.Columns.Add(this.columnID);
-                this.columnJobID = new global::System.Data.DataColumn("JobID", typeof(int), null, global::System.Data.MappingType.Element);
-                base.Columns.Add(this.columnJobID);
-                this.columnDeviceID = new global::System.Data.DataColumn("DeviceID", typeof(int), null, global::System.Data.MappingType.Element);
-                base.Columns.Add(this.columnDeviceID);
-                this.columnTurnOn = new global::System.Data.DataColumn("TurnOn", typeof(bool), null, global::System.Data.MappingType.Element);
-                base.Columns.Add(this.columnTurnOn);
-                this.Constraints.Add(new global::System.Data.UniqueConstraint("JobActionsKey1", new global::System.Data.DataColumn[] {
-                                this.columnID}, true));
-                this.columnID.AutoIncrement = true;
-                this.columnID.AutoIncrementSeed = 1;
-                this.columnID.AllowDBNull = false;
-                this.columnID.Unique = true;
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public JobActionsRow NewJobActionsRow() {
-                return ((JobActionsRow)(this.NewRow()));
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            protected override global::System.Data.DataRow NewRowFromBuilder(global::System.Data.DataRowBuilder builder) {
-                return new JobActionsRow(builder);
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            protected override global::System.Type GetRowType() {
-                return typeof(JobActionsRow);
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            protected override void OnRowChanged(global::System.Data.DataRowChangeEventArgs e) {
-                base.OnRowChanged(e);
-                if ((this.JobActionsRowChanged != null)) {
-                    this.JobActionsRowChanged(this, new JobActionsRowChangeEvent(((JobActionsRow)(e.Row)), e.Action));
-                }
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            protected override void OnRowChanging(global::System.Data.DataRowChangeEventArgs e) {
-                base.OnRowChanging(e);
-                if ((this.JobActionsRowChanging != null)) {
-                    this.JobActionsRowChanging(this, new JobActionsRowChangeEvent(((JobActionsRow)(e.Row)), e.Action));
-                }
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            protected override void OnRowDeleted(global::System.Data.DataRowChangeEventArgs e) {
-                base.OnRowDeleted(e);
-                if ((this.JobActionsRowDeleted != null)) {
-                    this.JobActionsRowDeleted(this, new JobActionsRowChangeEvent(((JobActionsRow)(e.Row)), e.Action));
-                }
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            protected override void OnRowDeleting(global::System.Data.DataRowChangeEventArgs e) {
-                base.OnRowDeleting(e);
-                if ((this.JobActionsRowDeleting != null)) {
-                    this.JobActionsRowDeleting(this, new JobActionsRowChangeEvent(((JobActionsRow)(e.Row)), e.Action));
-                }
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public void RemoveJobActionsRow(JobActionsRow row) {
-                this.Rows.Remove(row);
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public static global::System.Xml.Schema.XmlSchemaComplexType GetTypedTableSchema(global::System.Xml.Schema.XmlSchemaSet xs) {
-                global::System.Xml.Schema.XmlSchemaComplexType type = new global::System.Xml.Schema.XmlSchemaComplexType();
-                global::System.Xml.Schema.XmlSchemaSequence sequence = new global::System.Xml.Schema.XmlSchemaSequence();
-                DataStorage ds = new DataStorage();
-                global::System.Xml.Schema.XmlSchemaAny any1 = new global::System.Xml.Schema.XmlSchemaAny();
-                any1.Namespace = "http://www.w3.org/2001/XMLSchema";
-                any1.MinOccurs = new decimal(0);
-                any1.MaxOccurs = decimal.MaxValue;
-                any1.ProcessContents = global::System.Xml.Schema.XmlSchemaContentProcessing.Lax;
-                sequence.Items.Add(any1);
-                global::System.Xml.Schema.XmlSchemaAny any2 = new global::System.Xml.Schema.XmlSchemaAny();
-                any2.Namespace = "urn:schemas-microsoft-com:xml-diffgram-v1";
-                any2.MinOccurs = new decimal(1);
-                any2.ProcessContents = global::System.Xml.Schema.XmlSchemaContentProcessing.Lax;
-                sequence.Items.Add(any2);
-                global::System.Xml.Schema.XmlSchemaAttribute attribute1 = new global::System.Xml.Schema.XmlSchemaAttribute();
-                attribute1.Name = "namespace";
-                attribute1.FixedValue = ds.Namespace;
-                type.Attributes.Add(attribute1);
-                global::System.Xml.Schema.XmlSchemaAttribute attribute2 = new global::System.Xml.Schema.XmlSchemaAttribute();
-                attribute2.Name = "tableTypeName";
-                attribute2.FixedValue = "JobActionsDataTable";
-                type.Attributes.Add(attribute2);
-                type.Particle = sequence;
-                global::System.Xml.Schema.XmlSchema dsSchema = ds.GetSchemaSerializable();
-                if (xs.Contains(dsSchema.TargetNamespace)) {
-                    global::System.IO.MemoryStream s1 = new global::System.IO.MemoryStream();
-                    global::System.IO.MemoryStream s2 = new global::System.IO.MemoryStream();
-                    try {
-                        global::System.Xml.Schema.XmlSchema schema = null;
-                        dsSchema.Write(s1);
-                        for (global::System.Collections.IEnumerator schemas = xs.Schemas(dsSchema.TargetNamespace).GetEnumerator(); schemas.MoveNext(); ) {
-                            schema = ((global::System.Xml.Schema.XmlSchema)(schemas.Current));
-                            s2.SetLength(0);
-                            schema.Write(s2);
-                            if ((s1.Length == s2.Length)) {
-                                s1.Position = 0;
-                                s2.Position = 0;
-                                for (; ((s1.Position != s1.Length) 
-                                            && (s1.ReadByte() == s2.ReadByte())); ) {
-                                    ;
-                                }
-                                if ((s1.Position == s1.Length)) {
-                                    return type;
-                                }
-                            }
-                        }
-                    }
-                    finally {
-                        if ((s1 != null)) {
-                            s1.Close();
-                        }
-                        if ((s2 != null)) {
-                            s2.Close();
-                        }
-                    }
-                }
-                xs.Add(dsSchema);
-                return type;
-            }
-        }
-        
-        /// 
-        ///Represents strongly named DataRow class.
-        ///
-        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "2.0.0.0")]
-        public partial class JobRow : global::System.Data.DataRow {
-            
-            private JobDataTable tableJob;
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            internal JobRow(global::System.Data.DataRowBuilder rb) : 
-                    base(rb) {
-                this.tableJob = ((JobDataTable)(this.Table));
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public int ID {
-                get {
-                    return ((int)(this[this.tableJob.IDColumn]));
-                }
-                set {
-                    this[this.tableJob.IDColumn] = value;
-                }
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public string Name {
-                get {
-                    try {
-                        return ((string)(this[this.tableJob.NameColumn]));
-                    }
-                    catch (global::System.InvalidCastException e) {
-                        throw new global::System.Data.StrongTypingException("The value for column \'Name\' in table \'Job\' is DBNull.", e);
-                    }
-                }
-                set {
-                    this[this.tableJob.NameColumn] = value;
-                }
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public string Description {
-                get {
-                    try {
-                        return ((string)(this[this.tableJob.DescriptionColumn]));
-                    }
-                    catch (global::System.InvalidCastException e) {
-                        throw new global::System.Data.StrongTypingException("The value for column \'Description\' in table \'Job\' is DBNull.", e);
-                    }
-                }
-                set {
-                    this[this.tableJob.DescriptionColumn] = value;
-                }
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public string JobName {
-                get {
-                    try {
-                        return ((string)(this[this.tableJob.JobNameColumn]));
-                    }
-                    catch (global::System.InvalidCastException e) {
-                        throw new global::System.Data.StrongTypingException("The value for column \'JobName\' in table \'Job\' is DBNull.", e);
-                    }
-                }
-                set {
-                    this[this.tableJob.JobNameColumn] = value;
-                }
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public string StartTime {
-                get {
-                    try {
-                        return ((string)(this[this.tableJob.StartTimeColumn]));
-                    }
-                    catch (global::System.InvalidCastException e) {
-                        throw new global::System.Data.StrongTypingException("The value for column \'StartTime\' in table \'Job\' is DBNull.", e);
-                    }
-                }
-                set {
-                    this[this.tableJob.StartTimeColumn] = value;
-                }
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public bool IsNameNull() {
-                return this.IsNull(this.tableJob.NameColumn);
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public void SetNameNull() {
-                this[this.tableJob.NameColumn] = global::System.Convert.DBNull;
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public bool IsDescriptionNull() {
-                return this.IsNull(this.tableJob.DescriptionColumn);
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public void SetDescriptionNull() {
-                this[this.tableJob.DescriptionColumn] = global::System.Convert.DBNull;
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public bool IsJobNameNull() {
-                return this.IsNull(this.tableJob.JobNameColumn);
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public void SetJobNameNull() {
-                this[this.tableJob.JobNameColumn] = global::System.Convert.DBNull;
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public bool IsStartTimeNull() {
-                return this.IsNull(this.tableJob.StartTimeColumn);
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public void SetStartTimeNull() {
-                this[this.tableJob.StartTimeColumn] = global::System.Convert.DBNull;
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public JobActionsRow[] GetJobActionsRows() {
-                if ((this.Table.ChildRelations["Job_JobActions"] == null)) {
-                    return new JobActionsRow[0];
-                }
-                else {
-                    return ((JobActionsRow[])(base.GetChildRows(this.Table.ChildRelations["Job_JobActions"])));
-                }
-            }
-        }
-        
-        /// 
-        ///Represents strongly named DataRow class.
-        ///
-        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "2.0.0.0")]
-        public partial class JobActionsRow : global::System.Data.DataRow {
-            
-            private JobActionsDataTable tableJobActions;
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            internal JobActionsRow(global::System.Data.DataRowBuilder rb) : 
-                    base(rb) {
-                this.tableJobActions = ((JobActionsDataTable)(this.Table));
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public int ID {
-                get {
-                    return ((int)(this[this.tableJobActions.IDColumn]));
-                }
-                set {
-                    this[this.tableJobActions.IDColumn] = value;
-                }
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public int JobID {
-                get {
-                    try {
-                        return ((int)(this[this.tableJobActions.JobIDColumn]));
-                    }
-                    catch (global::System.InvalidCastException e) {
-                        throw new global::System.Data.StrongTypingException("The value for column \'JobID\' in table \'JobActions\' is DBNull.", e);
-                    }
-                }
-                set {
-                    this[this.tableJobActions.JobIDColumn] = value;
-                }
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public int DeviceID {
-                get {
-                    try {
-                        return ((int)(this[this.tableJobActions.DeviceIDColumn]));
-                    }
-                    catch (global::System.InvalidCastException e) {
-                        throw new global::System.Data.StrongTypingException("The value for column \'DeviceID\' in table \'JobActions\' is DBNull.", e);
-                    }
-                }
-                set {
-                    this[this.tableJobActions.DeviceIDColumn] = value;
-                }
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public bool TurnOn {
-                get {
-                    try {
-                        return ((bool)(this[this.tableJobActions.TurnOnColumn]));
-                    }
-                    catch (global::System.InvalidCastException e) {
-                        throw new global::System.Data.StrongTypingException("The value for column \'TurnOn\' in table \'JobActions\' is DBNull.", e);
-                    }
-                }
-                set {
-                    this[this.tableJobActions.TurnOnColumn] = value;
-                }
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public JobRow JobRow {
-                get {
-                    return ((JobRow)(this.GetParentRow(this.Table.ParentRelations["Job_JobActions"])));
-                }
-                set {
-                    this.SetParentRow(value, this.Table.ParentRelations["Job_JobActions"]);
-                }
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public bool IsJobIDNull() {
-                return this.IsNull(this.tableJobActions.JobIDColumn);
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public void SetJobIDNull() {
-                this[this.tableJobActions.JobIDColumn] = global::System.Convert.DBNull;
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public bool IsDeviceIDNull() {
-                return this.IsNull(this.tableJobActions.DeviceIDColumn);
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public void SetDeviceIDNull() {
-                this[this.tableJobActions.DeviceIDColumn] = global::System.Convert.DBNull;
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public bool IsTurnOnNull() {
-                return this.IsNull(this.tableJobActions.TurnOnColumn);
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public void SetTurnOnNull() {
-                this[this.tableJobActions.TurnOnColumn] = global::System.Convert.DBNull;
-            }
-        }
-        
-        /// 
-        ///Row event argument class
-        ///
-        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "2.0.0.0")]
-        public class JobRowChangeEvent : global::System.EventArgs {
-            
-            private JobRow eventRow;
-            
-            private global::System.Data.DataRowAction eventAction;
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public JobRowChangeEvent(JobRow row, global::System.Data.DataRowAction action) {
-                this.eventRow = row;
-                this.eventAction = action;
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public JobRow Row {
-                get {
-                    return this.eventRow;
-                }
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public global::System.Data.DataRowAction Action {
-                get {
-                    return this.eventAction;
-                }
-            }
-        }
-        
-        /// 
-        ///Row event argument class
-        ///
-        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "2.0.0.0")]
-        public class JobActionsRowChangeEvent : global::System.EventArgs {
-            
-            private JobActionsRow eventRow;
-            
-            private global::System.Data.DataRowAction eventAction;
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public JobActionsRowChangeEvent(JobActionsRow row, global::System.Data.DataRowAction action) {
-                this.eventRow = row;
-                this.eventAction = action;
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public JobActionsRow Row {
-                get {
-                    return this.eventRow;
-                }
-            }
-            
-            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-            public global::System.Data.DataRowAction Action {
-                get {
-                    return this.eventAction;
-                }
-            }
-        }
-    }
-}
-
-#pragma warning restore 1591
\ No newline at end of file
diff --git a/scheduler/DeviceSchedulerAgent/DataStorage.xsc b/scheduler/DeviceSchedulerAgent/DataStorage.xsc
deleted file mode 100644
index 8b7f66df..00000000
--- a/scheduler/DeviceSchedulerAgent/DataStorage.xsc
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
-  
-  
-
\ No newline at end of file
diff --git a/scheduler/DeviceSchedulerAgent/DataStorage.xsd b/scheduler/DeviceSchedulerAgent/DataStorage.xsd
deleted file mode 100644
index 1bffb91b..00000000
--- a/scheduler/DeviceSchedulerAgent/DataStorage.xsd
+++ /dev/null
@@ -1,55 +0,0 @@
-
-
-  
-    
-      
-        
-        
-        
-        
-        
-        
-      
-    
-  
-  
-    
-      
-        
-          
-            
-              
-              
-              
-              
-              
-            
-          
-        
-        
-          
-            
-              
-              
-              
-              
-            
-          
-        
-      
-    
-    
-      
-      
-    
-    
-      
-      
-    
-  
-  
-    
-      
-    
-  
-
\ No newline at end of file
diff --git a/scheduler/DeviceSchedulerAgent/DataStorage.xss b/scheduler/DeviceSchedulerAgent/DataStorage.xss
deleted file mode 100644
index ec2113c8..00000000
--- a/scheduler/DeviceSchedulerAgent/DataStorage.xss
+++ /dev/null
@@ -1,26 +0,0 @@
-
-
-
-  
-    
-    
-  
-  
-    
-      
-        
-          304
-          129
-        
-        
-          390
-          129
-        
-      
-    
-  
-
\ No newline at end of file
diff --git a/scheduler/DeviceSchedulerAgent/DeviceSchedulerAgent.csproj b/scheduler/DeviceSchedulerAgent/DeviceSchedulerAgent.csproj
deleted file mode 100644
index f5503bee..00000000
--- a/scheduler/DeviceSchedulerAgent/DeviceSchedulerAgent.csproj
+++ /dev/null
@@ -1,89 +0,0 @@
-
-  
-    Debug
-    AnyCPU
-    9.0.30729
-    2.0
-    {C06932EC-7FF5-420B-A637-BE5802E8B896}
-    WinExe
-    Properties
-    DeviceSchedulerAgent
-    DeviceSchedulerAgent
-    
-    
-    
-    
-    
-    
-    
-    
-    2.0
-    v2.0
-    
-    
-  
-  
-    true
-    full
-    false
-    bin\Debug\
-    DEBUG;TRACE
-    prompt
-    4
-  
-  
-    pdbonly
-    true
-    bin\Release\
-    TRACE
-    prompt
-    4
-  
-  
-    
-    
-    
-    
-  
-  
-    
-      True
-      True
-      DataStorage.xsd
-    
-    
-    
-  
-  
-    
-      {292E034F-C3B8-4CED-87DD-479040094118}
-      DeviceHandler
-    
-  
-  
-    
-    
-      DataStorage.xsd
-    
-    
-      Designer
-      MSDataSetGenerator
-      DataStorage.Designer.cs
-    
-    
-      DataStorage.xsd
-    
-  
-  
-    
-    
-  
-  
-  
-
\ No newline at end of file
diff --git a/scheduler/DeviceSchedulerAgent/EncryptDecrypt.cs b/scheduler/DeviceSchedulerAgent/EncryptDecrypt.cs
deleted file mode 100644
index d1ada6c9..00000000
--- a/scheduler/DeviceSchedulerAgent/EncryptDecrypt.cs
+++ /dev/null
@@ -1,338 +0,0 @@
-using System;
-using System.IO;
-using System.Security.Cryptography;
-
-namespace DeviceSchedulerAgent
-{
-	/// 
-	/// Summary description for EncryptDecrypt.
-	/// 
-	public class EncryptDecrypt
-	{
-		public EncryptDecrypt()
-		{
-			//
-			// TODO: Add constructor logic here
-			//
-		}
-
-		// Encrypt a byte array into a byte array using a key and an IV 
-		public static byte[] Encrypt(byte[] clearData, byte[] Key, byte[] IV) 
-		{ 
-
-			// Create a MemoryStream that is going to accept the encrypted bytes 
-			MemoryStream ms = new MemoryStream(); 
-
-			// Create a symmetric algorithm. 
-			// We are going to use Rijndael because it is strong and available on all platforms. 
-			// You can use other algorithms, to do so substitute the next line with something like 
-			//                      TripleDES alg = TripleDES.Create(); 
-
-			Rijndael alg = Rijndael.Create(); 
-
-			// Now set the key and the IV. 
-			// We need the IV (Initialization Vector) because the algorithm is operating in its default 
-			// mode called CBC (Cipher Block Chaining). The IV is XORed with the first block (8 byte) 
-			// of the data before it is encrypted, and then each encrypted block is XORed with the 
-			// following block of plaintext. This is done to make encryption more secure. 
-			// There is also a mode called ECB which does not need an IV, but it is much less secure. 
-
-			alg.Key = Key; 
-			alg.IV = IV; 
-
-			// Create a CryptoStream through which we are going to be pumping our data. 
-			// CryptoStreamMode.Write means that we are going to be writing data to the stream 
-			// and the output will be written in the MemoryStream we have provided. 
-			CryptoStream cs = new CryptoStream(ms, alg.CreateEncryptor(), CryptoStreamMode.Write); 
-
-			// Write the data and make it do the encryption 
-			cs.Write(clearData, 0, clearData.Length); 
-
-			// Close the crypto stream (or do FlushFinalBlock). 
-			// This will tell it that we have done our encryption and there is no more data coming in, 
-			// and it is now a good time to apply the padding and finalize the encryption process. 
-			cs.Close(); 
-
-  
-			// Now get the encrypted data from the MemoryStream. 
-			// Some people make a mistake of using GetBuffer() here, which is not the right way. 
-			byte[] encryptedData = ms.ToArray(); 
-
-			return encryptedData; 
-
-		} 
-
-
-		// 
-		//    
-		/// 
-		/// Encrypt a string into a string using a password
-		/// Uses Encrypt(byte[], byte[], byte[])  
-		/// 
-		/// The text to encrypt.
-		/// The password to use.
-		/// An encrypted string.
-		public static string Encrypt(string clearText, string Password) 
-		{ 
-
-			// First we need to turn the input string into a byte array. 
-			byte[] clearBytes = System.Text.Encoding.Unicode.GetBytes(clearText); 
-
-			// Then, we need to turn the password into Key and IV 
-			// We are using salt to make it harder to guess our key using a dictionary attack - 
-			// trying to guess a password by enumerating all possible words. 
-
-			PasswordDeriveBytes pdb = new PasswordDeriveBytes(Password, 
-				new byte[] {0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d,  0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76}); 
-
-
-			// Now get the key/IV and do the encryption using the function that accepts byte arrays. 
-			// Using PasswordDeriveBytes object we are first getting 32 bytes for the Key 
-			// (the default Rijndael key length is 256bit = 32bytes) and then 16 bytes for the IV. 
-			// IV should always be the block size, which is by default 16 bytes (128 bit) for Rijndael. 
-			// If you are using DES/TripleDES/RC2 the block size is 8 bytes and so should be the IV size. 
-			// You can also read KeySize/BlockSize properties off the algorithm to find out the sizes. 
-			byte[] encryptedData = Encrypt(clearBytes, pdb.GetBytes(32), pdb.GetBytes(16)); 
-
-  
-			// Now we need to turn the resulting byte array into a string. 
-			// A common mistake would be to use an Encoding class for that. It does not work 
-			// because not all byte values can be represented by characters. 
-			// We are going to be using Base64 encoding that is designed exactly for what we are 
-			// trying to do. 
-			return Convert.ToBase64String(encryptedData); 
-
-		} 
-
-
-		// Encrypt bytes into bytes using a password 
-		//    Uses Encrypt(byte[], byte[], byte[]) 
-		public static byte[] Encrypt(byte[] clearData, string Password) 
-		{ 
-
-			// We need to turn the password into Key and IV. 
-			// We are using salt to make it harder to guess our key using a dictionary attack - 
-			// trying to guess a password by enumerating all possible words. 
-			PasswordDeriveBytes pdb = new PasswordDeriveBytes(Password, 
-				new byte[] {0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d,  0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76}); 
-
-			// Now get the key/IV and do the encryption using the function that accepts byte arrays. 
-			// Using PasswordDeriveBytes object we are first getting 32 bytes for the Key 
-			// (the default Rijndael key length is 256bit = 32bytes) and then 16 bytes for the IV. 
-			// IV should always be the block size, which is by default 16 bytes (128 bit) for Rijndael. 
-			// If you are using DES/TripleDES/RC2 the block size is 8 bytes and so should be the IV size. 
-			// You can also read KeySize/BlockSize properties off the algorithm to find out the sizes. 
-			return Encrypt(clearData, pdb.GetBytes(32), pdb.GetBytes(16)); 
-
-		} 
-
-  
-		// Encrypt a file into another file using a password 
-		public static void Encrypt(string fileIn, string fileOut, string Password) 
-		{ 
-
-			// First we are going to open the file streams 
-			FileStream fsIn = new FileStream(fileIn, FileMode.Open, FileAccess.Read); 
-			FileStream fsOut = new FileStream(fileOut, FileMode.OpenOrCreate, FileAccess.Write); 
-
-  
-			// Then we are going to derive a Key and an IV from the Password and create an algorithm 
-			PasswordDeriveBytes pdb = new PasswordDeriveBytes(Password, 
-				new byte[] {0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d,  0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76}); 
-
-			Rijndael alg = Rijndael.Create(); 
-
-			alg.Key = pdb.GetBytes(32); 
-			alg.IV = pdb.GetBytes(16); 
-
-			// Now create a crypto stream through which we are going to be pumping data. 
-			// Our fileOut is going to be receiving the encrypted bytes. 
-			CryptoStream cs = new CryptoStream(fsOut, alg.CreateEncryptor(), CryptoStreamMode.Write); 
-
-			// Now will will initialize a buffer and will be processing the input file in chunks. 
-			// This is done to avoid reading the whole file (which can be huge) into memory. 
-
-			int bufferLen = 4096; 
-			byte[] buffer = new byte[bufferLen]; 
-			int bytesRead; 
-
-			do 
-			{ 
-
-				// read a chunk of data from the input file 
-				bytesRead = fsIn.Read(buffer, 0, bufferLen); 
-
-				// encrypt it 
-				cs.Write(buffer, 0, bytesRead); 
-
-			} while(bytesRead != 0); 
-
-  
-			// close everything 
-			cs.Close(); // this will also close the unrelying fsOut stream 
-			fsIn.Close();     
-
-		} 
-
-  
-		// Decrypt a byte array into a byte array using a key and an IV 
-		public static byte[] Decrypt(byte[] cipherData, byte[] Key, byte[] IV) 
-		{ 
-
-			// Create a MemoryStream that is going to accept the decrypted bytes 
-			MemoryStream ms = new MemoryStream(); 
-
-			// Create a symmetric algorithm. 
-			// We are going to use Rijndael because it is strong and available on all platforms. 
-			// You can use other algorithms, to do so substitute the next line with something like 
-			//                      TripleDES alg = TripleDES.Create(); 
-
-			Rijndael alg = Rijndael.Create(); 
-
-			// Now set the key and the IV. 
-			// We need the IV (Initialization Vector) because the algorithm is operating in its default 
-			// mode called CBC (Cipher Block Chaining). The IV is XORed with the first block (8 byte) 
-			// of the data after it is decrypted, and then each decrypted block is XORed with the previous 
-			// cipher block. This is done to make encryption more secure. 
-			// There is also a mode called ECB which does not need an IV, but it is much less secure. 
-
-			alg.Key = Key; 
-			alg.IV = IV; 
-
- 
-			// Create a CryptoStream through which we are going to be pumping our data. 
-			// CryptoStreamMode.Write means that we are going to be writing data to the stream 
-			// and the output will be written in the MemoryStream we have provided. 
-			CryptoStream cs = new CryptoStream(ms, alg.CreateDecryptor(), CryptoStreamMode.Write); 
-
-  
-			// Write the data and make it do the decryption 
-			cs.Write(cipherData, 0, cipherData.Length); 
-
-			// Close the crypto stream (or do FlushFinalBlock). 
-			// This will tell it that we have done our decryption and there is no more data coming in, 
-			// and it is now a good time to remove the padding and finalize the decryption process. 
-			cs.Close(); 
-
-			// Now get the decrypted data from the MemoryStream. 
-			// Some people make a mistake of using GetBuffer() here, which is not the right way. 
-			byte[] decryptedData = ms.ToArray(); 
-
-  
-			return decryptedData; 
-
-		} 
-
-
-		/// 
-		/// Decrypt a string into a string using a password.
-		/// Uses Decrypt(byte[], byte[], byte[])  
-		/// 
-		/// The text to decrypt.
-		/// The password to use.
-		/// A decrypted string.
-		public static string Decrypt(string cipherText, string Password) 
-		{ 
-
-			// First we need to turn the input string into a byte array. 
-			// We presume that Base64 encoding was used 
-			byte[] cipherBytes = Convert.FromBase64String(cipherText); 
-  
-			// Then, we need to turn the password into Key and IV 
-			// We are using salt to make it harder to guess our key using a dictionary attack - 
-			// trying to guess a password by enumerating all possible words. 
-			PasswordDeriveBytes pdb = new PasswordDeriveBytes(Password, 
-				new byte[] {0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d,  0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76}); 
-
-  
-			// Now get the key/IV and do the decryption using the function that accepts byte arrays. 
-			// Using PasswordDeriveBytes object we are first getting 32 bytes for the Key 
-			// (the default Rijndael key length is 256bit = 32bytes) and then 16 bytes for the IV. 
-			// IV should always be the block size, which is by default 16 bytes (128 bit) for Rijndael. 
-			// If you are using DES/TripleDES/RC2 the block size is 8 bytes and so should be the IV size. 
-			// You can also read KeySize/BlockSize properties off the algorithm to find out the sizes. 
-			byte[] decryptedData = Decrypt(cipherBytes, pdb.GetBytes(32), pdb.GetBytes(16)); 
-
-			// Now we need to turn the resulting byte array into a string. 
-			// A common mistake would be to use an Encoding class for that. It does not work 
-			// because not all byte values can be represented by characters. 
-			// We are going to be using Base64 encoding that is designed exactly for what we are 
-			// trying to do. 
-			return System.Text.Encoding.Unicode.GetString(decryptedData); 
-            
-		} 
-
-  
-		// Decrypt bytes into bytes using a password 
-		//    Uses Decrypt(byte[], byte[], byte[]) 
-		public static byte[] Decrypt(byte[] cipherData, string Password) 
-		{ 
-
-			// We need to turn the password into Key and IV. 
-			// We are using salt to make it harder to guess our key using a dictionary attack - 
-			// trying to guess a password by enumerating all possible words. 
-			PasswordDeriveBytes pdb = new PasswordDeriveBytes(Password, 
-				new byte[] {0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d,  0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76}); 
-  
-			// Now get the key/IV and do the Decryption using the function that accepts byte arrays. 
-			// Using PasswordDeriveBytes object we are first getting 32 bytes for the Key 
-			// (the default Rijndael key length is 256bit = 32bytes) and then 16 bytes for the IV. 
-			// IV should always be the block size, which is by default 16 bytes (128 bit) for Rijndael. 
-			// If you are using DES/TripleDES/RC2 the block size is 8 bytes and so should be the IV size. 
-			// You can also read KeySize/BlockSize properties off the algorithm to find out the sizes. 
-
-			return Decrypt(cipherData, pdb.GetBytes(32), pdb.GetBytes(16)); 
-
-		} 
-
-
-		// Decrypt a file into another file using a password 
-		public static void Decrypt(string fileIn, string fileOut, string Password) 
-		{ 
-			// First we are going to open the file streams 
-			FileStream fsIn = new FileStream(fileIn, FileMode.Open, FileAccess.Read); 
-			FileStream fsOut = new FileStream(fileOut, FileMode.OpenOrCreate, FileAccess.Write); 
-
-			// Then we are going to derive a Key and an IV from the Password and create an algorithm 
-			PasswordDeriveBytes pdb = new PasswordDeriveBytes(Password, 
-				new byte[] {0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d,  0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76}); 
- 
-			Rijndael alg = Rijndael.Create(); 
- 
-			alg.Key = pdb.GetBytes(32); 
-			alg.IV = pdb.GetBytes(16); 
-  
-
-			// Now create a crypto stream through which we are going to be pumping data. 
-			// Our fileOut is going to be receiving the Decrypted bytes. 
-
-			CryptoStream cs = new CryptoStream(fsOut, alg.CreateDecryptor(), CryptoStreamMode.Write); 
-
-			// Now will will initialize a buffer and will be processing the input file in chunks. 
-			// This is done to avoid reading the whole file (which can be huge) into memory. 
-
-			int bufferLen = 4096; 
-			byte[] buffer = new byte[bufferLen]; 
-			int bytesRead; 
-
-            
-			do 
-			{ 
-
-				// read a chunk of data from the input file 
-				bytesRead = fsIn.Read(buffer, 0, bufferLen); 
-  
-				// Decrypt it 
-				cs.Write(buffer, 0, bytesRead); 
-        
-			} while(bytesRead != 0); 
-
-			// close everything 
-			cs.Close(); // this will also close the unrelying fsOut stream 
-			fsIn.Close();     
-
-		} 
-
-
-	}
-}
diff --git a/scheduler/DeviceSchedulerAgent/Program.cs b/scheduler/DeviceSchedulerAgent/Program.cs
deleted file mode 100644
index 52590a3c..00000000
--- a/scheduler/DeviceSchedulerAgent/Program.cs
+++ /dev/null
@@ -1,88 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Text;
-using DeviceHandler;
-using System.Data;
-using System.Windows.Forms;
-
-namespace DeviceSchedulerAgent
-{
-    class Program
-    {
-
-        static void Main(string[] args)
-        {
-            //If no arguments are supplied then exit.
-            if (args.Length == 0) 
-            {
-                MessageBox.Show("Inga argument har angivits!");
-                return; 
-            }
-
-            try
-            {
-
-                //Makesure that we have all data loaded. 
-                DataStorage data = LoadData();
-
-                //Get the JobID.
-                int jobID = Convert.ToInt32(args[0]);
-
-                DataStorage.JobRow job = data.Job.FindByID(jobID);
-
-                if (job != null)
-                {
-                    DeviceHandler.Handler handler = new Handler();
-
-                    //Load devices.
-                    handler.Load();
-
-                    //Go through each action and execute it.
-                    foreach (DataStorage.JobActionsRow action in job.GetJobActionsRows())
-                    {
-                        Device item = handler.Find(action.DeviceID);
-
-						if (item != null)
-						{
-							if (action.TurnOn)
-								handler.TurnOnWithDelay(item);
-							else
-								handler.TurnOffWithDelay(item);
-						}
-						else
-						{
-							MessageBox.Show("Device could not be found. Please make sure that TelldusService is running and no device scheduled for turn on/off has been removed.", "Telldus scheduler");
-						}
-                    }
-
-                }
-                else
-                {
-					MessageBox.Show("No scheduled jobs could be found.", "Telldus scheduler");
-                }
-            }
-            catch (Exception ex)
-            {
-                MessageBox.Show(ex.Message);
-            }
-
-
-        }
-
-        private static DataStorage LoadData()
-        {
-
-            string path = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
-            path = System.IO.Path.Combine(path, "Jobs.dat");
-
-            DataStorage data = new DataStorage();
-
-            if (System.IO.File.Exists(path))
-            {
-                data.ReadXml(path, XmlReadMode.ReadSchema);
-            }
-
-            return data;
-        }
-    }
-}
diff --git a/scheduler/DeviceSchedulerAgent/Properties/AssemblyInfo.cs b/scheduler/DeviceSchedulerAgent/Properties/AssemblyInfo.cs
deleted file mode 100644
index 4eecb077..00000000
--- a/scheduler/DeviceSchedulerAgent/Properties/AssemblyInfo.cs
+++ /dev/null
@@ -1,33 +0,0 @@
-using System.Reflection;
-using System.Runtime.CompilerServices;
-using System.Runtime.InteropServices;
-
-// General Information about an assembly is controlled through the following 
-// set of attributes. Change these attribute values to modify the information
-// associated with an assembly.
-[assembly: AssemblyTitle("DeviceSchedulerAgent")]
-[assembly: AssemblyDescription("Executer of scheduled devices.")]
-[assembly: AssemblyConfiguration("")]
-[assembly: AssemblyCompany("Telldus Technologies")]
-[assembly: AssemblyProduct("DeviceSchedulerAgent")]
-[assembly: AssemblyCopyright("Copyright © Telldus Technologies 2010")]
-[assembly: AssemblyTrademark("")]
-[assembly: AssemblyCulture("")]
-
-// Setting ComVisible to false makes the types in this assembly not visible 
-// to COM components.  If you need to access a type in this assembly from 
-// COM, set the ComVisible attribute to true on that type.
-[assembly: ComVisible(false)]
-
-// The following GUID is for the ID of the typelib if this project is exposed to COM
-[assembly: Guid("7ec95bd9-249b-45f4-8426-a89da7155be2")]
-
-// Version information for an assembly consists of the following four values:
-//
-//      Major Version
-//      Minor Version 
-//      Build Number
-//      Revision
-//
-[assembly: AssemblyVersion("2010.10.0.0")]
-[assembly: AssemblyFileVersion("2010.10.0.0")]
diff --git a/scheduler/DeviceSchedulerAgent/clock_run.ico b/scheduler/DeviceSchedulerAgent/clock_run.ico
deleted file mode 100644
index 1b092289..00000000
Binary files a/scheduler/DeviceSchedulerAgent/clock_run.ico and /dev/null differ
diff --git a/scheduler/DeviceSchedulerAgent/security_agent.ico b/scheduler/DeviceSchedulerAgent/security_agent.ico
deleted file mode 100644
index 39575290..00000000
Binary files a/scheduler/DeviceSchedulerAgent/security_agent.ico and /dev/null differ
diff --git a/telldus-core/tdtool/CMakeLists.txt b/tdtool/CMakeLists.txt
similarity index 65%
rename from telldus-core/tdtool/CMakeLists.txt
rename to tdtool/CMakeLists.txt
index eacc2dac..b35b2144 100644
--- a/telldus-core/tdtool/CMakeLists.txt
+++ b/tdtool/CMakeLists.txt
@@ -1,57 +1,52 @@
-PROJECT(tdtool)
-
-cmake_policy(SET CMP0005 NEW)
-
-SET (tdtool_DESCRIPTION
-	"a command line utility to send commands to a Telldus TellStick"
-)
-
-SET(tdtool_SRCS
-	main.cpp
-)
-
-ADD_EXECUTABLE(tdtool
-	${tdtool_SRCS}
-)
-ADD_DEPENDENCIES(tdtool ${telldus-core_TARGET})
-SIGN(tdtool)
-
-INCLUDE_DIRECTORIES(
-	${CMAKE_CURRENT_BINARY_DIR}
-	${CMAKE_SOURCE_DIR}/driver
-)
-
-ADD_DEFINITIONS( -DVERSION="${DISPLAYED_VERSION}" )
-
-IF (WIN32)
-	TARGET_LINK_LIBRARIES(tdtool
-		TelldusCore
-		openbsd-getopt
-	)
-	INCLUDE_DIRECTORIES(
-		${CMAKE_SOURCE_DIR}/3rdparty/openbsd-getopt
-	)
-ELSEIF (APPLE)
-	TARGET_LINK_LIBRARIES(tdtool
-		TelldusCore
-	)
-ELSE (WIN32)
-	TARGET_LINK_LIBRARIES(tdtool
-		${CMAKE_BINARY_DIR}/client/libtelldus-core.so
-	)
-ENDIF (WIN32)
-
-IF (UNIX)
-	IF (GENERATE_MAN)
-		ADD_CUSTOM_COMMAND(
-			TARGET tdtool
-			POST_BUILD
-			COMMAND help2man -n ${tdtool_DESCRIPTION} ./tdtool > tdtool.1
-			WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
-			COMMENT "Generating man file tdtool.1"
-		)
-		INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/tdtool.1 DESTINATION share/man/man1)
-	ENDIF (GENERATE_MAN)
-ENDIF (UNIX)
-
-INSTALL(TARGETS tdtool RUNTIME DESTINATION bin)
+PROJECT(tdtool)
+
+cmake_policy(SET CMP0005 NEW)
+
+SET (tdtool_DESCRIPTION
+	"a command line utility to control a Telldus TellStick"
+)
+
+SET(tdtool_SRCS
+  main.cpp
+)
+
+ADD_EXECUTABLE(tdtool
+  ${tdtool_SRCS}
+)
+
+INCLUDE_DIRECTORIES(
+  ${CMAKE_CURRENT_BINARY_DIR}
+  ${CMAKE_SOURCE_DIR}/driver
+)
+
+ADD_DEFINITIONS( -DVERSION="${DISPLAYED_VERSION}" )
+
+IF (WIN32)
+	FIND_LIBRARY(TELLDUSCORE_LIBRARY TelldusCore)
+	TARGET_LINK_LIBRARIES(tdtool
+		${TELLDUSCORE_LIBRARY}
+	)
+ELSEIF (APPLE)	
+	TARGET_LINK_LIBRARIES(tdtool
+		TelldusCore
+	)
+ELSE (WIN32)	
+	TARGET_LINK_LIBRARIES(tdtool
+		telldus-core
+	)
+ENDIF (WIN32)
+
+IF (UNIX)
+	IF (GENERATE_MAN)
+		ADD_CUSTOM_COMMAND(
+			TARGET tdtool
+			POST_BUILD
+			COMMAND help2man -n ${tdtool_DESCRIPTION} ./tdtool > tdtool.1
+			WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
+			COMMENT "Generating man file tdtool.1"
+		)
+		INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/tdtool.1 DESTINATION share/man/man1)
+	ENDIF (GENERATE_MAN)
+ENDIF (UNIX)
+
+INSTALL(TARGETS tdtool RUNTIME DESTINATION bin)
diff --git a/tdtool/main.cpp b/tdtool/main.cpp
new file mode 100644
index 00000000..4e103fe9
--- /dev/null
+++ b/tdtool/main.cpp
@@ -0,0 +1,294 @@
+#include 
+#include 
+#include 
+#include 
+#include "../driver/libtelldus-core/telldus-core.h"
+
+const int SUPPORTED_METHODS =
+	TELLSTICK_TURNON |
+	TELLSTICK_TURNOFF |
+	TELLSTICK_BELL |
+	TELLSTICK_DIM;
+
+void print_usage( char *name ) {
+	printf("Usage: %s [ options ]\n", name);
+	printf("\n");
+	printf("Options:\n");
+	printf("         -[bdefhlnrv] [ --list ] [ --help ]\n");
+	printf("                      [ --on device ] [ --off device ] [ --bell device ]\n");
+	printf("                      [ --learn device ]\n");
+	printf("                      [ --dimlevel level --dim device ]\n");
+	printf("                      [ --raw input ]\n");
+	printf("\n");
+	printf("       --list (-l short option)\n");
+	printf("             List currently configured devices.\n");
+	printf("\n");
+	printf("       --help (-h short option)\n");
+	printf("             Shows this screen.\n");
+	printf("\n");
+	printf("       --on device (-n short option)\n");
+	printf("             Turns on device. 'device' could either be an integer of the\n");
+	printf("             device-id, or the name of the device.\n");
+	printf("             Both device-id and name is outputed with the --list option\n");
+	printf("\n");
+	printf("       --off device (-f short option)\n");
+	printf("             Turns off device. 'device' could either be an integer of the\n");
+	printf("             device-id, or the name of the device.\n");
+	printf("             Both device-id and name is outputed with the --list option\n");
+	printf("\n");
+	printf("       --dim device (-d short option)\n");
+	printf("             Dims device. 'device' could either be an integer of the device-id,\n");
+	printf("             or the name of the device.\n");
+	printf("             Both device-id and name is outputed with the --list option\n");
+	printf("             Note: The dimlevel parameter must be set before using this option.\n");
+	printf("\n");
+	printf("       --dimlevel level (-v short option)\n");
+	printf("             Set dim level. 'level' should an integer, 0-255.\n");
+	printf("             Note: This parameter must be set before using dim.\n");
+	printf("\n");
+	printf("       --bell device (-b short option)\n");
+	printf("             Sends bell command to devices supporting this. 'device' could\n");
+	printf("             either be an integer of the device-id, or the name of the device.\n");
+	printf("             Both device-id and name is outputed with the --list option\n");
+	printf("\n");
+	printf("       --learn device (-e short option)\n");
+	printf("             Sends a special learn command to devices supporting this. This is normaly\n");
+	printf("             devices of 'selflearning' type. 'device' could either be an integer\n");
+	printf("             of the device-id, or the name of the device.\n");
+	printf("             Both device-id and name is outputed with the --list option\n");
+	printf("\n");
+	printf("       --raw input (-r short option)\n");
+	printf("             This command sends a raw command to TellStick.\n");
+	printf("             input can be either - or a filename. If input is - the data is\n");
+	printf("             taken from stdin, otherwise the data is taken from the supplied filename.\n");
+	printf("\n");
+	printf("             Example to turn on an ArcTech codeswitch A1:\n");
+	printf("             echo 'S$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$kk$$kk$$kk$$}+' | tdtool --raw -\n");
+	printf("\n");
+	printf("Report bugs to \n");
+}
+
+void print_version() {
+	printf("tdtool " VERSION "\n");
+	printf("\n");
+	printf("Copyright (C) 2009 Telldus Technologies AB\n");
+	printf("\n");
+	printf("Written by Micke Prag \n");
+}
+
+void print_device( int index ) {
+	int intId = tdGetDeviceId(index);
+	char *name = tdGetName(intId);
+	printf("%i\t%s\t", intId, name);
+	tdReleaseString(name);
+	int lastSentCommand = tdLastSentCommand(intId, SUPPORTED_METHODS);
+	char *level = 0;
+	switch(lastSentCommand) {
+		case TELLSTICK_TURNON:
+			printf("ON");
+			break;
+		case TELLSTICK_TURNOFF:
+			printf("OFF");
+			break;
+		case TELLSTICK_DIM:
+			level = tdLastSentValue(intId);
+			printf("DIMMED:%s", level);
+			tdReleaseString(level);
+			break;
+		default:
+			printf("Unknown state");
+	}
+	printf("\n");
+}
+
+void list_devices() {
+	int intNum = tdGetNumberOfDevices();
+	printf("Number of devices: %i\n", intNum);
+	int i = 0;
+	while (i < intNum) {
+		print_device( i );
+		i++;
+	}
+}
+
+int find_device( char *device ) {
+	int deviceId = atoi(device);
+	if (deviceId == 0) { //Try to find the id from the name
+		int intNum = tdGetNumberOfDevices();
+		int index = 0;
+		while (index < intNum) {
+			int id = tdGetDeviceId(index);
+			char *name = tdGetName( id );
+			if (strcasecmp(name, device) == 0) {
+				deviceId = id;
+ 				tdReleaseString(name);
+				break;
+			}
+			tdReleaseString(name);
+			index++;
+		}
+	}
+	return deviceId;
+}
+
+void switch_device( bool turnOn, char *device ) {
+	int deviceId = find_device( device );
+	if (deviceId == 0) {
+		printf("Device '%s', not found!\n", device);
+		return;
+	}
+
+	char *name = tdGetName( deviceId );
+	int deviceType = tdGetDeviceType( deviceId );
+	printf("Turning %s %s %i, %s",
+					(turnOn ? "on" : "off"),
+					(deviceType == TELLSTICK_TYPE_DEVICE ? "device" : "group"),
+					deviceId,
+					name);
+	tdReleaseString(name);
+
+	int retval = (turnOn ? tdTurnOn( deviceId ) : tdTurnOff( deviceId ));
+	char *errorString = tdGetErrorString(retval);
+	
+	printf(" - %s\n", errorString);
+	tdReleaseString(errorString);
+}
+
+void dim_device( char *device, int level ) {
+	int deviceId = find_device( device );
+	if (deviceId == 0) {
+		printf("Device '%s', not found!\n", device);
+		return;
+	}
+	if (level < 0 || level > 255) {
+		printf("Level %i out of range!\n", level);
+		return;
+	}
+
+	char *name = tdGetName( deviceId );
+	int retval = tdDim( deviceId, (unsigned char)level );
+	char *errorString = tdGetErrorString(retval);
+	printf("Dimming device: %i %s to %i - %s\n", deviceId, name, level, errorString);
+	tdReleaseString(name);
+	tdReleaseString(errorString);
+}
+
+void bell_device( char *device ) {
+	int deviceId = find_device( device );
+	if (deviceId == 0) {
+		printf("Device '%s', not found!\n", device);
+		return;
+	}
+
+	char *name = tdGetName( deviceId );
+	int retval = tdBell( deviceId );
+	char *errorString = tdGetErrorString(retval);
+	printf("Sending bell to: %i %s - %s\n", deviceId, name, errorString);
+	tdReleaseString(name);
+	tdReleaseString(errorString);
+}
+
+void learn_device( char *device ) {
+	int deviceId = find_device( device );
+	if (deviceId == 0) {
+		printf("Device '%s', not found!\n", device);
+		return;
+	}
+
+	char *name = tdGetName( deviceId );
+	int retval = tdLearn( deviceId );
+	char *errorString = tdGetErrorString(retval);
+	printf("Learning device: %i %s - %s\n", deviceId, name, errorString);
+	tdReleaseString(name);
+	tdReleaseString(errorString);
+}
+
+void send_raw_command( char *command ) {
+	const int MAX_LENGTH = 100;
+	char msg[MAX_LENGTH];
+	
+	if (strcmp(command, "-") == 0) {
+		fgets(msg, MAX_LENGTH, stdin);
+	} else {
+		FILE *fd;
+		
+		fd = fopen(command, "r");
+		if (fd == NULL) {
+			printf("Error opening file %s\n", command);
+			return;
+		}
+		fgets(msg, MAX_LENGTH, fd);
+	}
+	
+	int retval = tdSendRawCommand( msg, 0 );	
+	char *errorString = tdGetErrorString(retval);
+	printf("Sending raw command: %s\n", errorString);
+	tdReleaseString(errorString);
+}
+
+int main(int argc, char **argv)
+{
+	int optch, longindex;
+	static char optstring[] = "ln:f:d:b:v:e:r:hi";
+	static struct option long_opts[] = {
+		{ "list", 0, 0, 'l' },
+		{ "on", 1, 0, 'n' },
+		{ "off", 1, 0, 'f' },
+		{ "dim", 1, 0, 'd' },
+		{ "bell", 1, 0, 'b' },
+		{ "dimlevel", 1, 0, 'v' },
+		{ "learn", 1, 0, 'e' },
+		{ "raw", 1, 0, 'r' },
+		{ "help", 0, 0, 'h' },
+		{ "version", 0, 0, 'i'},
+		{ 0, 0, 0, 0}
+	};
+	int level = -1;
+
+	if (argc < 2) {
+		print_usage( argv[0] );
+		return -1;
+	}
+
+	while ( (optch = getopt_long(argc,argv,optstring,long_opts,&longindex)) != -1 )
+		switch (optch) {
+			case 'b' :
+				bell_device( &optarg[0] );
+				break;
+			case 'd' :
+				if (level >= 0) {
+					dim_device( &optarg[0], level );
+				}
+				break;
+			case 'f' :
+				switch_device(false, &optarg[0]);
+				break;
+			case 'h' :
+				print_usage( argv[0] );
+				break;
+			case 'i' :
+				print_version( );
+				break;
+			case 'l' :
+				list_devices();
+				break;
+			case 'n' :
+				switch_device(true, &optarg[0]);
+				break;
+			case 'e' :
+				learn_device(&optarg[0]);
+				break;
+			case 'r' :
+				send_raw_command(&optarg[0]);
+				break;
+			case 'v' :
+				level = atoi( &optarg[0] );
+				break;
+			default :
+				print_usage( argv[0] );
+				return -1;
+		}
+
+	tdClose(); //Cleaning up
+	return 0;
+}
diff --git a/telldus-core/3rdparty/openbsd-getopt/CMakeLists.txt b/telldus-core/3rdparty/openbsd-getopt/CMakeLists.txt
deleted file mode 100644
index 89080c41..00000000
--- a/telldus-core/3rdparty/openbsd-getopt/CMakeLists.txt
+++ /dev/null
@@ -1,14 +0,0 @@
-SET( SRCS
-	getopt_long.c
-)
-
-SET( HDRS
-	getopt.h
-)
-
-INCLUDE_DIRECTORIES( ${CMAKE_CURRENT_SOURCE_DIR} )
-
-ADD_LIBRARY(openbsd-getopt STATIC
-	${SRCS}
-	${HDRS}
-)
diff --git a/telldus-core/3rdparty/openbsd-getopt/err.h b/telldus-core/3rdparty/openbsd-getopt/err.h
deleted file mode 100644
index b7d57bb2..00000000
--- a/telldus-core/3rdparty/openbsd-getopt/err.h
+++ /dev/null
@@ -1,9 +0,0 @@
-#include 
-#include 
-
-__inline void warnx(const char *fmt, ...) {
-	va_list ap;
-	va_start(ap, fmt);
-	vfprintf(stderr, fmt, ap);
-	va_end(ap);
-}
diff --git a/telldus-core/3rdparty/openbsd-getopt/getopt.h b/telldus-core/3rdparty/openbsd-getopt/getopt.h
deleted file mode 100644
index 0311b078..00000000
--- a/telldus-core/3rdparty/openbsd-getopt/getopt.h
+++ /dev/null
@@ -1,78 +0,0 @@
-/*	$OpenBSD: getopt.h,v 1.2 2008/06/26 05:42:04 ray Exp $	*/
-/*	$NetBSD: getopt.h,v 1.4 2000/07/07 10:43:54 ad Exp $	*/
-
-/*-
- * Copyright (c) 2000 The NetBSD Foundation, Inc.
- * All rights reserved.
- *
- * This code is derived from software contributed to The NetBSD Foundation
- * by Dieter Baron and Thomas Klausner.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
- * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
- * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef _GETOPT_H_
-#define _GETOPT_H_
-
-#include 
-
-/*
- * GNU-like getopt_long() and 4.4BSD getsubopt()/optreset extensions
- */
-#define no_argument        0
-#define required_argument  1
-#define optional_argument  2
-
-struct option {
-	/* name of long option */
-	const char *name;
-	/*
-	 * one of no_argument, required_argument, and optional_argument:
-	 * whether option takes an argument
-	 */
-	int has_arg;
-	/* if not NULL, set *flag to val when option found */
-	int *flag;
-	/* if flag not NULL, value to set *flag to; else return value */
-	int val;
-};
-
-__BEGIN_DECLS
-int	 getopt_long(int, char * const *, const char *,
-	    const struct option *, int *);
-int	 getopt_long_only(int, char * const *, const char *,
-	    const struct option *, int *);
-#ifndef _GETOPT_DEFINED_
-#define _GETOPT_DEFINED_
-int	 getopt(int, char * const *, const char *);
-int	 getsubopt(char **, char * const *, char **);
-
-extern   char *optarg;                  /* getopt(3) external variables */
-extern   int opterr;
-extern   int optind;
-extern   int optopt;
-extern   int optreset;
-extern   char *suboptarg;               /* getsubopt(3) external variable */
-#endif
-__END_DECLS
- 
-#endif /* !_GETOPT_H_ */
diff --git a/telldus-core/3rdparty/openbsd-getopt/getopt_long.c b/telldus-core/3rdparty/openbsd-getopt/getopt_long.c
deleted file mode 100644
index e149fe0a..00000000
--- a/telldus-core/3rdparty/openbsd-getopt/getopt_long.c
+++ /dev/null
@@ -1,511 +0,0 @@
-/*	$OpenBSD: getopt_long.c,v 1.25 2011/03/05 22:10:11 guenther Exp $	*/
-/*	$NetBSD: getopt_long.c,v 1.15 2002/01/31 22:43:40 tv Exp $	*/
-
-/*
- * Copyright (c) 2002 Todd C. Miller 
- *
- * Permission to use, copy, modify, and distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- *
- * Sponsored in part by the Defense Advanced Research Projects
- * Agency (DARPA) and Air Force Research Laboratory, Air Force
- * Materiel Command, USAF, under agreement number F39502-99-1-0512.
- */
-/*-
- * Copyright (c) 2000 The NetBSD Foundation, Inc.
- * All rights reserved.
- *
- * This code is derived from software contributed to The NetBSD Foundation
- * by Dieter Baron and Thomas Klausner.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
- * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
- * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include 
-#include 
-#include 
-#include 
-#include 
-
-int	opterr = 1;		/* if error message should be printed */
-int	optind = 1;		/* index into parent argv vector */
-int	optopt = '?';		/* character checked for validity */
-int	optreset;		/* reset getopt */
-char    *optarg;		/* argument associated with option */
-
-#define PRINT_ERROR	((opterr) && (*options != ':'))
-
-#define FLAG_PERMUTE	0x01	/* permute non-options to the end of argv */
-#define FLAG_ALLARGS	0x02	/* treat non-options as args to option "-1" */
-#define FLAG_LONGONLY	0x04	/* operate as getopt_long_only */
-
-/* return values */
-#define	BADCH		(int)'?'
-#define	BADARG		((*options == ':') ? (int)':' : (int)'?')
-#define	INORDER 	(int)1
-
-#define	EMSG		""
-
-static int getopt_internal(int, char * const *, const char *,
-			   const struct option *, int *, int);
-static int parse_long_options(char * const *, const char *,
-			      const struct option *, int *, int);
-static int gcd(int, int);
-static void permute_args(int, int, int, char * const *);
-
-static char *place = EMSG; /* option letter processing */
-
-/* XXX: set optreset to 1 rather than these two */
-static int nonopt_start = -1; /* first non option argument (for permute) */
-static int nonopt_end = -1;   /* first option after non options (for permute) */
-
-/* Error messages */
-static const char recargchar[] = "option requires an argument -- %c";
-static const char recargstring[] = "option requires an argument -- %s";
-static const char ambig[] = "ambiguous option -- %.*s";
-static const char noarg[] = "option doesn't take an argument -- %.*s";
-static const char illoptchar[] = "unknown option -- %c";
-static const char illoptstring[] = "unknown option -- %s";
-
-/*
- * Compute the greatest common divisor of a and b.
- */
-static int
-gcd(int a, int b)
-{
-	int c;
-
-	c = a % b;
-	while (c != 0) {
-		a = b;
-		b = c;
-		c = a % b;
-	}
-
-	return (b);
-}
-
-/*
- * Exchange the block from nonopt_start to nonopt_end with the block
- * from nonopt_end to opt_end (keeping the same order of arguments
- * in each block).
- */
-static void
-permute_args(int panonopt_start, int panonopt_end, int opt_end,
-	char * const *nargv)
-{
-	int cstart, cyclelen, i, j, ncycle, nnonopts, nopts, pos;
-	char *swap;
-
-	/*
-	 * compute lengths of blocks and number and size of cycles
-	 */
-	nnonopts = panonopt_end - panonopt_start;
-	nopts = opt_end - panonopt_end;
-	ncycle = gcd(nnonopts, nopts);
-	cyclelen = (opt_end - panonopt_start) / ncycle;
-
-	for (i = 0; i < ncycle; i++) {
-		cstart = panonopt_end+i;
-		pos = cstart;
-		for (j = 0; j < cyclelen; j++) {
-			if (pos >= panonopt_end)
-				pos -= nnonopts;
-			else
-				pos += nopts;
-			swap = nargv[pos];
-			/* LINTED const cast */
-			((char **) nargv)[pos] = nargv[cstart];
-			/* LINTED const cast */
-			((char **)nargv)[cstart] = swap;
-		}
-	}
-}
-
-/*
- * parse_long_options --
- *	Parse long options in argc/argv argument vector.
- * Returns -1 if short_too is set and the option does not match long_options.
- */
-static int
-parse_long_options(char * const *nargv, const char *options,
-	const struct option *long_options, int *idx, int short_too)
-{
-	char *current_argv, *has_equal;
-	size_t current_argv_len;
-	int i, match;
-
-	current_argv = place;
-	match = -1;
-
-	optind++;
-
-	if ((has_equal = strchr(current_argv, '=')) != NULL) {
-		/* argument found (--option=arg) */
-		current_argv_len = has_equal - current_argv;
-		has_equal++;
-	} else
-		current_argv_len = strlen(current_argv);
-
-	for (i = 0; long_options[i].name; i++) {
-		/* find matching long option */
-		if (strncmp(current_argv, long_options[i].name,
-		    current_argv_len))
-			continue;
-
-		if (strlen(long_options[i].name) == current_argv_len) {
-			/* exact match */
-			match = i;
-			break;
-		}
-		/*
-		 * If this is a known short option, don't allow
-		 * a partial match of a single character.
-		 */
-		if (short_too && current_argv_len == 1)
-			continue;
-
-		if (match == -1)	/* partial match */
-			match = i;
-		else {
-			/* ambiguous abbreviation */
-			if (PRINT_ERROR)
-				warnx(ambig, (int)current_argv_len,
-				     current_argv);
-			optopt = 0;
-			return (BADCH);
-		}
-	}
-	if (match != -1) {		/* option found */
-		if (long_options[match].has_arg == no_argument
-		    && has_equal) {
-			if (PRINT_ERROR)
-				warnx(noarg, (int)current_argv_len,
-				     current_argv);
-			/*
-			 * XXX: GNU sets optopt to val regardless of flag
-			 */
-			if (long_options[match].flag == NULL)
-				optopt = long_options[match].val;
-			else
-				optopt = 0;
-			return (BADARG);
-		}
-		if (long_options[match].has_arg == required_argument ||
-		    long_options[match].has_arg == optional_argument) {
-			if (has_equal)
-				optarg = has_equal;
-			else if (long_options[match].has_arg ==
-			    required_argument) {
-				/*
-				 * optional argument doesn't use next nargv
-				 */
-				optarg = nargv[optind++];
-			}
-		}
-		if ((long_options[match].has_arg == required_argument)
-		    && (optarg == NULL)) {
-			/*
-			 * Missing argument; leading ':' indicates no error
-			 * should be generated.
-			 */
-			if (PRINT_ERROR)
-				warnx(recargstring,
-				    current_argv);
-			/*
-			 * XXX: GNU sets optopt to val regardless of flag
-			 */
-			if (long_options[match].flag == NULL)
-				optopt = long_options[match].val;
-			else
-				optopt = 0;
-			--optind;
-			return (BADARG);
-		}
-	} else {			/* unknown option */
-		if (short_too) {
-			--optind;
-			return (-1);
-		}
-		if (PRINT_ERROR)
-			warnx(illoptstring, current_argv);
-		optopt = 0;
-		return (BADCH);
-	}
-	if (idx)
-		*idx = match;
-	if (long_options[match].flag) {
-		*long_options[match].flag = long_options[match].val;
-		return (0);
-	} else
-		return (long_options[match].val);
-}
-
-/*
- * getopt_internal --
- *	Parse argc/argv argument vector.  Called by user level routines.
- */
-static int
-getopt_internal(int nargc, char * const *nargv, const char *options,
-	const struct option *long_options, int *idx, int flags)
-{
-	char *oli;				/* option letter list index */
-	int optchar, short_too;
-	static int posixly_correct = -1;
-
-	if (options == NULL)
-		return (-1);
-
-	/*
-	 * XXX Some GNU programs (like cvs) set optind to 0 instead of
-	 * XXX using optreset.  Work around this braindamage.
-	 */
-	if (optind == 0)
-		optind = optreset = 1;
-
-	/*
-	 * Disable GNU extensions if POSIXLY_CORRECT is set or options
-	 * string begins with a '+'.
-	 */
-	if (posixly_correct == -1 || optreset)
-		posixly_correct = (getenv("POSIXLY_CORRECT") != NULL);
-	if (*options == '-')
-		flags |= FLAG_ALLARGS;
-	else if (posixly_correct || *options == '+')
-		flags &= ~FLAG_PERMUTE;
-	if (*options == '+' || *options == '-')
-		options++;
-
-	optarg = NULL;
-	if (optreset)
-		nonopt_start = nonopt_end = -1;
-start:
-	if (optreset || !*place) {		/* update scanning pointer */
-		optreset = 0;
-		if (optind >= nargc) {          /* end of argument vector */
-			place = EMSG;
-			if (nonopt_end != -1) {
-				/* do permutation, if we have to */
-				permute_args(nonopt_start, nonopt_end,
-				    optind, nargv);
-				optind -= nonopt_end - nonopt_start;
-			}
-			else if (nonopt_start != -1) {
-				/*
-				 * If we skipped non-options, set optind
-				 * to the first of them.
-				 */
-				optind = nonopt_start;
-			}
-			nonopt_start = nonopt_end = -1;
-			return (-1);
-		}
-		if (*(place = nargv[optind]) != '-' ||
-		    (place[1] == '\0' && strchr(options, '-') == NULL)) {
-			place = EMSG;		/* found non-option */
-			if (flags & FLAG_ALLARGS) {
-				/*
-				 * GNU extension:
-				 * return non-option as argument to option 1
-				 */
-				optarg = nargv[optind++];
-				return (INORDER);
-			}
-			if (!(flags & FLAG_PERMUTE)) {
-				/*
-				 * If no permutation wanted, stop parsing
-				 * at first non-option.
-				 */
-				return (-1);
-			}
-			/* do permutation */
-			if (nonopt_start == -1)
-				nonopt_start = optind;
-			else if (nonopt_end != -1) {
-				permute_args(nonopt_start, nonopt_end,
-				    optind, nargv);
-				nonopt_start = optind -
-				    (nonopt_end - nonopt_start);
-				nonopt_end = -1;
-			}
-			optind++;
-			/* process next argument */
-			goto start;
-		}
-		if (nonopt_start != -1 && nonopt_end == -1)
-			nonopt_end = optind;
-
-		/*
-		 * If we have "-" do nothing, if "--" we are done.
-		 */
-		if (place[1] != '\0' && *++place == '-' && place[1] == '\0') {
-			optind++;
-			place = EMSG;
-			/*
-			 * We found an option (--), so if we skipped
-			 * non-options, we have to permute.
-			 */
-			if (nonopt_end != -1) {
-				permute_args(nonopt_start, nonopt_end,
-				    optind, nargv);
-				optind -= nonopt_end - nonopt_start;
-			}
-			nonopt_start = nonopt_end = -1;
-			return (-1);
-		}
-	}
-
-	/*
-	 * Check long options if:
-	 *  1) we were passed some
-	 *  2) the arg is not just "-"
-	 *  3) either the arg starts with -- we are getopt_long_only()
-	 */
-	if (long_options != NULL && place != nargv[optind] &&
-	    (*place == '-' || (flags & FLAG_LONGONLY))) {
-		short_too = 0;
-		if (*place == '-')
-			place++;		/* --foo long option */
-		else if (*place != ':' && strchr(options, *place) != NULL)
-			short_too = 1;		/* could be short option too */
-
-		optchar = parse_long_options(nargv, options, long_options,
-		    idx, short_too);
-		if (optchar != -1) {
-			place = EMSG;
-			return (optchar);
-		}
-	}
-
-	if ((optchar = (int)*place++) == (int)':' ||
-	    (optchar == (int)'-' && *place != '\0') ||
-	    (oli = strchr(options, optchar)) == NULL) {
-		/*
-		 * If the user specified "-" and  '-' isn't listed in
-		 * options, return -1 (non-option) as per POSIX.
-		 * Otherwise, it is an unknown option character (or ':').
-		 */
-		if (optchar == (int)'-' && *place == '\0')
-			return (-1);
-		if (!*place)
-			++optind;
-		if (PRINT_ERROR)
-			warnx(illoptchar, optchar);
-		optopt = optchar;
-		return (BADCH);
-	}
-	if (long_options != NULL && optchar == 'W' && oli[1] == ';') {
-		/* -W long-option */
-		if (*place)			/* no space */
-			/* NOTHING */;
-		else if (++optind >= nargc) {	/* no arg */
-			place = EMSG;
-			if (PRINT_ERROR)
-				warnx(recargchar, optchar);
-			optopt = optchar;
-			return (BADARG);
-		} else				/* white space */
-			place = nargv[optind];
-		optchar = parse_long_options(nargv, options, long_options,
-		    idx, 0);
-		place = EMSG;
-		return (optchar);
-	}
-	if (*++oli != ':') {			/* doesn't take argument */
-		if (!*place)
-			++optind;
-	} else {				/* takes (optional) argument */
-		optarg = NULL;
-		if (*place)			/* no white space */
-			optarg = place;
-		else if (oli[1] != ':') {	/* arg not optional */
-			if (++optind >= nargc) {	/* no arg */
-				place = EMSG;
-				if (PRINT_ERROR)
-					warnx(recargchar, optchar);
-				optopt = optchar;
-				return (BADARG);
-			} else
-				optarg = nargv[optind];
-		}
-		place = EMSG;
-		++optind;
-	}
-	/* dump back option letter */
-	return (optchar);
-}
-
-/*
- * getopt --
- *	Parse argc/argv argument vector.
- *
- * [eventually this will replace the BSD getopt]
- */
-int
-getopt(int nargc, char * const *nargv, const char *options)
-{
-
-	/*
-	 * We don't pass FLAG_PERMUTE to getopt_internal() since
-	 * the BSD getopt(3) (unlike GNU) has never done this.
-	 *
-	 * Furthermore, since many privileged programs call getopt()
-	 * before dropping privileges it makes sense to keep things
-	 * as simple (and bug-free) as possible.
-	 */
-	return (getopt_internal(nargc, nargv, options, NULL, NULL, 0));
-}
-
-/*
- * getopt_long --
- *	Parse argc/argv argument vector.
- */
-int
-getopt_long(int nargc, char * const *nargv, const char *options,
-    const struct option *long_options, int *idx)
-{
-
-	return (getopt_internal(nargc, nargv, options, long_options, idx,
-	    FLAG_PERMUTE));
-}
-
-/*
- * getopt_long_only --
- *	Parse argc/argv argument vector.
- */
-int
-getopt_long_only(int nargc, char * const *nargv, const char *options,
-    const struct option *long_options, int *idx)
-{
-
-	return (getopt_internal(nargc, nargv, options, long_options, idx,
-	    FLAG_PERMUTE|FLAG_LONGONLY));
-}
diff --git a/telldus-core/3rdparty/openbsd-getopt/machine/_types.h b/telldus-core/3rdparty/openbsd-getopt/machine/_types.h
deleted file mode 100644
index 3799f02b..00000000
--- a/telldus-core/3rdparty/openbsd-getopt/machine/_types.h
+++ /dev/null
@@ -1,10 +0,0 @@
-#include 
-
-typedef __int8 __int8_t;
-typedef unsigned __int8 __uint8_t;
-typedef __int16 __int16_t;
-typedef unsigned __int16 __uint16_t;
-typedef __int32 __int32_t;
-typedef unsigned __int32 __uint32_t;
-typedef __int64 __int64_t;
-typedef unsigned __int64 __uint64_t;
diff --git a/telldus-core/3rdparty/openbsd-getopt/machine/cdefs.h b/telldus-core/3rdparty/openbsd-getopt/machine/cdefs.h
deleted file mode 100644
index 72946254..00000000
--- a/telldus-core/3rdparty/openbsd-getopt/machine/cdefs.h
+++ /dev/null
@@ -1,12 +0,0 @@
-#include 
-
-#define _ANSI_SOURCE 1
-#define NO_ANSI_KEYWORDS 1
-
-#define _CLOCK_T_DEFINED_
-#define _CLOCKID_T_DEFINED_
-#define _SIZE_T_DEFINED_
-#define _SSIZE_T_DEFINED_
-#define _TIME_T_DEFINED_
-#define _TIMER_T_DEFINED_
-#define _OFF_T_DEFINED_
diff --git a/telldus-core/3rdparty/openbsd-getopt/machine/endian.h b/telldus-core/3rdparty/openbsd-getopt/machine/endian.h
deleted file mode 100644
index e69de29b..00000000
diff --git a/telldus-core/3rdparty/openbsd-getopt/sys/_types.h b/telldus-core/3rdparty/openbsd-getopt/sys/_types.h
deleted file mode 100644
index f31ae95e..00000000
--- a/telldus-core/3rdparty/openbsd-getopt/sys/_types.h
+++ /dev/null
@@ -1,71 +0,0 @@
-/*	$OpenBSD: _types.h,v 1.2 2008/03/16 19:42:57 otto Exp $	*/
-
-/*-
- * Copyright (c) 1990, 1993
- *	The Regents of the University of California.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the University nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *	@(#)types.h	8.3 (Berkeley) 1/5/94
- */
-
-#ifndef _SYS__TYPES_H_
-#define	_SYS__TYPES_H_
-
-#include 
-
-typedef	unsigned long	__cpuid_t;	/* CPU id */
-typedef	__int32_t	__dev_t;	/* device number */
-typedef	__uint32_t	__fixpt_t;	/* fixed point number */
-typedef	__uint32_t	__gid_t;	/* group id */
-typedef	__uint32_t	__id_t;		/* may contain pid, uid or gid */
-typedef __uint32_t	__in_addr_t;	/* base type for internet address */
-typedef __uint16_t	__in_port_t;	/* IP port type */
-typedef	__uint32_t	__ino_t;	/* inode number */
-typedef	long		__key_t;	/* IPC key (for Sys V IPC) */
-typedef	__uint32_t	__mode_t;	/* permissions */
-typedef	__uint32_t	__nlink_t;	/* link count */
-typedef	__int32_t	__pid_t;	/* process id */
-typedef __uint64_t	__rlim_t;	/* resource limit */
-typedef __uint8_t	__sa_family_t;	/* sockaddr address family type */
-typedef	__int32_t	__segsz_t;	/* segment size */
-typedef __uint32_t	__socklen_t;	/* length type for network syscalls */
-typedef	__int32_t	__swblk_t;	/* swap offset */
-typedef	__uint32_t	__uid_t;	/* user id */
-typedef	__uint32_t	__useconds_t;	/* microseconds */
-typedef	__int32_t	__suseconds_t;	/* microseconds (signed) */
-typedef __uint64_t	__fsblkcnt_t;	/* file system block count */
-typedef __uint64_t	__fsfilcnt_t;	/* file system file count */
-
-/*
- * mbstate_t is an opaque object to keep conversion state, during multibyte
- * stream conversions. The content must not be referenced by user programs.
- */
-typedef union {
-	char __mbstate8[128];
-	__int64_t __mbstateL;			/* for alignment */
-} __mbstate_t;
-
-#endif /* !_SYS__TYPES_H_ */
diff --git a/telldus-core/3rdparty/openbsd-getopt/sys/cdefs.h b/telldus-core/3rdparty/openbsd-getopt/sys/cdefs.h
deleted file mode 100644
index 65c06d8e..00000000
--- a/telldus-core/3rdparty/openbsd-getopt/sys/cdefs.h
+++ /dev/null
@@ -1,388 +0,0 @@
-/*	$OpenBSD: cdefs.h,v 1.32 2012/01/03 16:56:58 kettenis Exp $	*/
-/*	$NetBSD: cdefs.h,v 1.16 1996/04/03 20:46:39 christos Exp $	*/
-
-/*
- * Copyright (c) 1991, 1993
- *	The Regents of the University of California.  All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Berkeley Software Design, Inc.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the University nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *	@(#)cdefs.h	8.7 (Berkeley) 1/21/94
- */
-
-#ifndef	_SYS_CDEFS_H_
-#define	_SYS_CDEFS_H_
-
-#include 
-
-#if defined(__cplusplus)
-#define	__BEGIN_DECLS	extern "C" {
-#define	__END_DECLS	}
-#else
-#define	__BEGIN_DECLS
-#define	__END_DECLS
-#endif
-
-/*
- * Macro to test if we're using a specific version of gcc or later.
- */
-#ifdef __GNUC__
-#define __GNUC_PREREQ__(ma, mi) \
-	((__GNUC__ > (ma)) || (__GNUC__ == (ma) && __GNUC_MINOR__ >= (mi)))
-#else
-#define __GNUC_PREREQ__(ma, mi) 0
-#endif
-
-/*
- * The __CONCAT macro is used to concatenate parts of symbol names, e.g.
- * with "#define OLD(foo) __CONCAT(old,foo)", OLD(foo) produces oldfoo.
- * The __CONCAT macro is a bit tricky -- make sure you don't put spaces
- * in between its arguments.  __CONCAT can also concatenate double-quoted
- * strings produced by the __STRING macro, but this only works with ANSI C.
- */
-#if defined(__STDC__) || defined(__cplusplus)
-#define	__P(protos)	protos		/* full-blown ANSI C */
-#define	__CONCAT(x,y)	x ## y
-#define	__STRING(x)	#x
-
-#define	__const		const		/* define reserved names to standard */
-#define	__signed	signed
-#define	__volatile	volatile
-#if defined(__cplusplus) || defined(__PCC__)
-#define	__inline	inline		/* convert to C++ keyword */
-#else
-#if !defined(__GNUC__) && !defined(lint)
-#define	__inline			/* delete GCC keyword */
-#endif /* !__GNUC__ && !lint */
-#endif /* !__cplusplus */
-
-#else	/* !(__STDC__ || __cplusplus) */
-#define	__P(protos)	()		/* traditional C preprocessor */
-#define	__CONCAT(x,y)	x/**/y
-#define	__STRING(x)	"x"
-
-#if defined(_MSC_VER)
-#include 
-#elif !defined(__GNUC__) && !defined(lint)
-#define	__const				/* delete pseudo-ANSI C keywords */
-#define	__inline
-#define	__signed
-#define	__volatile
-#endif	/* !__GNUC__ && !lint */
-
-/*
- * In non-ANSI C environments, new programs will want ANSI-only C keywords
- * deleted from the program and old programs will want them left alone.
- * Programs using the ANSI C keywords const, inline etc. as normal
- * identifiers should define -DNO_ANSI_KEYWORDS.
- */
-#ifndef	NO_ANSI_KEYWORDS
-#define	const		__const		/* convert ANSI C keywords */
-#define	inline		__inline
-#define	signed		__signed
-#define	volatile	__volatile
-#endif /* !NO_ANSI_KEYWORDS */
-#endif	/* !(__STDC__ || __cplusplus) */
-
-/*
- * GCC1 and some versions of GCC2 declare dead (non-returning) and
- * pure (no side effects) functions using "volatile" and "const";
- * unfortunately, these then cause warnings under "-ansi -pedantic".
- * GCC >= 2.5 uses the __attribute__((attrs)) style.  All of these
- * work for GNU C++ (modulo a slight glitch in the C++ grammar in
- * the distribution version of 2.5.5).
- */
-
-#if !__GNUC_PREREQ__(2, 5) && !defined(__PCC__)
-#define	__attribute__(x)	/* delete __attribute__ if non-gcc or gcc1 */
-#if defined(__GNUC__) && !defined(__STRICT_ANSI__)
-#define	__dead		__volatile
-#define	__pure		__const
-#elif defined(lint)
-#define __dead		/* NORETURN */
-#endif
-#elif !defined(__STRICT_ANSI__)
-#define __dead		__attribute__((__noreturn__))
-#define __pure		__attribute__((__const__))
-#endif
-
-#if __GNUC_PREREQ__(2, 7)
-#define	__unused	__attribute__((__unused__))
-#else
-#define	__unused	/* delete */
-#endif
-
-#if __GNUC_PREREQ__(3, 1)
-#define	__used		__attribute__((__used__))
-#else
-#define	__used		__unused	/* suppress -Wunused warnings */
-#endif
-
-/*
- * __returns_twice makes the compiler not assume the function
- * only returns once.  This affects registerisation of variables:
- * even local variables need to be in memory across such a call.
- * Example: setjmp()
- */
-#if __GNUC_PREREQ__(4, 1)
-#define __returns_twice	__attribute__((returns_twice))
-#else
-#define __returns_twice
-#endif
-
-/*
- * __only_inline makes the compiler only use this function definition
- * for inlining; references that can't be inlined will be left as
- * external references instead of generating a local copy.  The
- * matching library should include a simple extern definition for
- * the function to handle those references.  c.f. ctype.h
- */
-#ifdef __GNUC__
-#  if __GNUC_PREREQ__(4, 2)
-#define __only_inline	extern __inline __attribute__((__gnu_inline__))
-#  else
-#define __only_inline	extern __inline
-#  endif
-#else
-#define __only_inline	static __inline
-#endif
-
-/*
- * GNU C version 2.96 adds explicit branch prediction so that
- * the CPU back-end can hint the processor and also so that
- * code blocks can be reordered such that the predicted path
- * sees a more linear flow, thus improving cache behavior, etc.
- *
- * The following two macros provide us with a way to utilize this
- * compiler feature.  Use __predict_true() if you expect the expression
- * to evaluate to true, and __predict_false() if you expect the
- * expression to evaluate to false.
- *
- * A few notes about usage:
- *
- *	* Generally, __predict_false() error condition checks (unless
- *	  you have some _strong_ reason to do otherwise, in which case
- *	  document it), and/or __predict_true() `no-error' condition
- *	  checks, assuming you want to optimize for the no-error case.
- *
- *	* Other than that, if you don't know the likelihood of a test
- *	  succeeding from empirical or other `hard' evidence, don't
- *	  make predictions.
- *
- *	* These are meant to be used in places that are run `a lot'.
- *	  It is wasteful to make predictions in code that is run
- *	  seldomly (e.g. at subsystem initialization time) as the
- *	  basic block reordering that this affects can often generate
- *	  larger code.
- */
-#if __GNUC_PREREQ__(2, 96)
-#define __predict_true(exp)	__builtin_expect(((exp) != 0), 1)
-#define __predict_false(exp)	__builtin_expect(((exp) != 0), 0)
-#else
-#define __predict_true(exp)	((exp) != 0)
-#define __predict_false(exp)	((exp) != 0)
-#endif
-
-/* Delete pseudo-keywords wherever they are not available or needed. */
-#ifndef __dead
-#define	__dead
-#define	__pure
-#endif
-
-#if __GNUC_PREREQ__(2, 7) || defined(__PCC__)
-#define	__packed	__attribute__((__packed__))
-#elif defined(lint)
-#define	__packed
-#endif
-
-#if !__GNUC_PREREQ__(2, 8)
-#define	__extension__
-#endif
-
-#if __GNUC_PREREQ__(2, 8) || defined(__PCC__)
-#define __statement(x)	__extension__(x)
-#elif defined(lint)
-#define __statement(x)	(0)
-#else
-#define __statement(x)	(x)
-#endif
-
-#if __GNUC_PREREQ__(3, 0)
-#define	__malloc	__attribute__((__malloc__))
-#else
-#define	__malloc
-#endif
-
-/*
- * "The nice thing about standards is that there are so many to choose from."
- * There are a number of "feature test macros" specified by (different)
- * standards that determine which interfaces and types the header files
- * should expose.
- *
- * Because of inconsistencies in these macros, we define our own
- * set in the private name space that end in _VISIBLE.  These are
- * always defined and so headers can test their values easily.
- * Things can get tricky when multiple feature macros are defined.
- * We try to take the union of all the features requested.
- *
- * The following macros are guaranteed to have a value after cdefs.h
- * has been included:
- *	__POSIX_VISIBLE
- *	__XPG_VISIBLE
- *	__ISO_C_VISIBLE
- *	__BSD_VISIBLE
- */
-
-/*
- * X/Open Portability Guides and Single Unix Specifications.
- * _XOPEN_SOURCE				XPG3
- * _XOPEN_SOURCE && _XOPEN_VERSION = 4		XPG4
- * _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED = 1	XPG4v2
- * _XOPEN_SOURCE == 500				XPG5
- * _XOPEN_SOURCE == 520				XPG5v2
- * _XOPEN_SOURCE == 600				POSIX 1003.1-2001 with XSI
- * _XOPEN_SOURCE == 700				POSIX 1003.1-2008 with XSI
- *
- * The XPG spec implies a specific value for _POSIX_C_SOURCE.
- */
-#ifdef _XOPEN_SOURCE
-# if (_XOPEN_SOURCE - 0 >= 700)
-#  define __XPG_VISIBLE		700
-#  undef _POSIX_C_SOURCE
-#  define _POSIX_C_SOURCE	200809L
-# elif (_XOPEN_SOURCE - 0 >= 600)
-#  define __XPG_VISIBLE		600
-#  undef _POSIX_C_SOURCE
-#  define _POSIX_C_SOURCE	200112L
-# elif (_XOPEN_SOURCE - 0 >= 520)
-#  define __XPG_VISIBLE		520
-#  undef _POSIX_C_SOURCE
-#  define _POSIX_C_SOURCE	199506L
-# elif (_XOPEN_SOURCE - 0 >= 500)
-#  define __XPG_VISIBLE		500
-#  undef _POSIX_C_SOURCE
-#  define _POSIX_C_SOURCE	199506L
-# elif (_XOPEN_SOURCE_EXTENDED - 0 == 1)
-#  define __XPG_VISIBLE		420
-# elif (_XOPEN_VERSION - 0 >= 4)
-#  define __XPG_VISIBLE		400
-# else
-#  define __XPG_VISIBLE		300
-# endif
-#endif
-
-/*
- * POSIX macros, these checks must follow the XOPEN ones above.
- *
- * _POSIX_SOURCE == 1		1003.1-1988 (superseded by _POSIX_C_SOURCE)
- * _POSIX_C_SOURCE == 1		1003.1-1990
- * _POSIX_C_SOURCE == 2		1003.2-1992
- * _POSIX_C_SOURCE == 199309L	1003.1b-1993
- * _POSIX_C_SOURCE == 199506L   1003.1c-1995, 1003.1i-1995,
- *				and the omnibus ISO/IEC 9945-1:1996
- * _POSIX_C_SOURCE == 200112L   1003.1-2001
- * _POSIX_C_SOURCE == 200809L   1003.1-2008
- *
- * The POSIX spec implies a specific value for __ISO_C_VISIBLE, though
- * this may be overridden by the _ISOC99_SOURCE macro later.
- */
-#ifdef _POSIX_C_SOURCE
-# if (_POSIX_C_SOURCE - 0 >= 200809)
-#  define __POSIX_VISIBLE	200809
-#  define __ISO_C_VISIBLE	1999
-# elif (_POSIX_C_SOURCE - 0 >= 200112)
-#  define __POSIX_VISIBLE	200112
-#  define __ISO_C_VISIBLE	1999
-# elif (_POSIX_C_SOURCE - 0 >= 199506)
-#  define __POSIX_VISIBLE	199506
-#  define __ISO_C_VISIBLE	1990
-# elif (_POSIX_C_SOURCE - 0 >= 199309)
-#  define __POSIX_VISIBLE	199309
-#  define __ISO_C_VISIBLE	1990
-# elif (_POSIX_C_SOURCE - 0 >= 2)
-#  define __POSIX_VISIBLE	199209
-#  define __ISO_C_VISIBLE	1990
-# else
-#  define __POSIX_VISIBLE	199009
-#  define __ISO_C_VISIBLE	1990
-# endif
-#elif defined(_POSIX_SOURCE)
-# define __POSIX_VISIBLE	198808
-#  define __ISO_C_VISIBLE	0
-#endif
-
-/*
- * _ANSI_SOURCE means to expose ANSI C89 interfaces only.
- * If the user defines it in addition to one of the POSIX or XOPEN
- * macros, assume the POSIX/XOPEN macro(s) should take precedence.
- */
-#if defined(_ANSI_SOURCE) && !defined(__POSIX_VISIBLE) && \
-    !defined(__XPG_VISIBLE)
-# define __POSIX_VISIBLE	0
-# define __XPG_VISIBLE		0
-# define __ISO_C_VISIBLE	1990
-#endif
-
-/*
- * _ISOC99_SOURCE and __STDC_VERSION__ override any of the other macros since
- * they are non-exclusive.
- */
-#if defined(_ISOC99_SOURCE) || \
-    (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901) || \
-    (defined(__cplusplus) && __cplusplus >= 201103)
-# undef __ISO_C_VISIBLE
-# define __ISO_C_VISIBLE	1999
-#endif
-
-/*
- * Finally deal with BSD-specific interfaces that are not covered
- * by any standards.  We expose these when none of the POSIX or XPG
- * macros is defined or if the user explicitly asks for them.
- */
-#if !defined(_BSD_SOURCE) && \
-   (defined(_ANSI_SOURCE) || defined(__XPG_VISIBLE) || defined(__POSIX_VISIBLE))
-# define __BSD_VISIBLE		0
-#endif
-
-/*
- * Default values.
- */
-#ifndef __XPG_VISIBLE
-# define __XPG_VISIBLE		700
-#endif
-#ifndef __POSIX_VISIBLE
-# define __POSIX_VISIBLE	200809
-#endif
-#ifndef __ISO_C_VISIBLE
-# define __ISO_C_VISIBLE	1999
-#endif
-#ifndef __BSD_VISIBLE
-# define __BSD_VISIBLE		1
-#endif
-
-#endif /* !_SYS_CDEFS_H_ */
diff --git a/telldus-core/3rdparty/openbsd-getopt/sys/types.h b/telldus-core/3rdparty/openbsd-getopt/sys/types.h
deleted file mode 100644
index c2ebbb10..00000000
--- a/telldus-core/3rdparty/openbsd-getopt/sys/types.h
+++ /dev/null
@@ -1,243 +0,0 @@
-/*	$OpenBSD: types.h,v 1.32 2011/03/19 18:26:06 deraadt Exp $	*/
-/*	$NetBSD: types.h,v 1.29 1996/11/15 22:48:25 jtc Exp $	*/
-
-/*-
- * Copyright (c) 1982, 1986, 1991, 1993
- *	The Regents of the University of California.  All rights reserved.
- * (c) UNIX System Laboratories, Inc.
- * All or some portions of this file are derived from material licensed
- * to the University of California by American Telephone and Telegraph
- * Co. or Unix System Laboratories, Inc. and are reproduced herein with
- * the permission of UNIX System Laboratories, Inc.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the University nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *	@(#)types.h	8.4 (Berkeley) 1/21/94
- */
-
-#ifndef _SYS_TYPES_H_
-#define	_SYS_TYPES_H_
-
-#include 
-#include 
-#include 
-
-#if __BSD_VISIBLE
-typedef	unsigned char	u_char;
-typedef	unsigned short	u_short;
-typedef	unsigned int	u_int;
-typedef	unsigned long	u_long;
-
-typedef unsigned char	unchar;		/* Sys V compatibility */
-typedef	unsigned short	ushort;		/* Sys V compatibility */
-typedef	unsigned int	uint;		/* Sys V compatibility */
-typedef unsigned long	ulong;		/* Sys V compatibility */
-
-typedef	__cpuid_t	cpuid_t;	/* CPU id */
-typedef	__register_t	register_t;	/* register-sized type */
-#endif /* __BSD_VISIBLE */
-
-/*
- * XXX The exact-width bit types should only be exposed if __BSD_VISIBLE
- *     but the rest of the includes are not ready for that yet.
- */
-#ifndef	__BIT_TYPES_DEFINED__
-#define	__BIT_TYPES_DEFINED__
-#endif
-
-#ifndef	_INT8_T_DEFINED_
-#define	_INT8_T_DEFINED_
-typedef	__int8_t		int8_t;
-#endif
-
-#ifndef	_UINT8_T_DEFINED_
-#define	_UINT8_T_DEFINED_
-typedef	__uint8_t		uint8_t;
-#endif
-
-#ifndef	_INT16_T_DEFINED_
-#define	_INT16_T_DEFINED_
-typedef	__int16_t		int16_t;
-#endif
-
-#ifndef	_UINT16_T_DEFINED_
-#define	_UINT16_T_DEFINED_
-typedef	__uint16_t		uint16_t;
-#endif
-
-#ifndef	_INT32_T_DEFINED_
-#define	_INT32_T_DEFINED_
-typedef	__int32_t		int32_t;
-#endif
-
-#ifndef	_UINT32_T_DEFINED_
-#define	_UINT32_T_DEFINED_
-typedef	__uint32_t		uint32_t;
-#endif
-
-#ifndef	_INT64_T_DEFINED_
-#define	_INT64_T_DEFINED_
-typedef	__int64_t		int64_t;
-#endif
-
-#ifndef	_UINT64_T_DEFINED_
-#define	_UINT64_T_DEFINED_
-typedef	__uint64_t		uint64_t;
-#endif
-
-/* BSD-style unsigned bits types */
-typedef	__uint8_t	u_int8_t;
-typedef	__uint16_t	u_int16_t;
-typedef	__uint32_t	u_int32_t;
-typedef	__uint64_t	u_int64_t;
-
-/* quads, deprecated in favor of 64 bit int types */
-typedef	__int64_t	quad_t;
-typedef	__uint64_t	u_quad_t;
-typedef	quad_t *	qaddr_t;
-
-#if __BSD_VISIBLE
-/* VM system types */
-typedef __vaddr_t	vaddr_t;
-typedef __paddr_t	paddr_t;
-typedef __vsize_t	vsize_t;
-typedef __psize_t	psize_t;
-#endif /* __BSD_VISIBLE */
-
-/* Standard system types */
-typedef	char *		caddr_t;	/* core address */
-typedef	__int32_t	daddr32_t;	/* 32-bit disk address */
-typedef	__int64_t	daddr_t;	/* 64-bit disk address */
-typedef	__int64_t	daddr64_t;	/* 64-bit disk address */
-typedef	__dev_t		dev_t;		/* device number */
-typedef	__fixpt_t	fixpt_t;	/* fixed point number */
-typedef	__gid_t		gid_t;		/* group id */
-typedef	__id_t		id_t;		/* may contain pid, uid or gid */
-typedef	__ino_t		ino_t;		/* inode number */
-typedef	__key_t		key_t;		/* IPC key (for Sys V IPC) */
-typedef	__mode_t	mode_t;		/* permissions */
-typedef	__nlink_t	nlink_t;	/* link count */
-typedef	__pid_t		pid_t;		/* process id */
-typedef __rlim_t	rlim_t;		/* resource limit */
-typedef	__segsz_t	segsz_t;	/* segment size */
-typedef	__swblk_t	swblk_t;	/* swap offset */
-typedef	__uid_t		uid_t;		/* user id */
-typedef	__useconds_t	useconds_t;	/* microseconds */
-typedef	__suseconds_t	suseconds_t;	/* microseconds (signed) */
-typedef	__fsblkcnt_t	fsblkcnt_t;	/* file system block count */
-typedef	__fsfilcnt_t	fsfilcnt_t;	/* file system file count */
-
-/*
- * XPG4.2 states that inclusion of  must pull these
- * in and that inclusion of  must pull in sa_family_t.
- * We put these here because there are other headers that require
- * these types and  and  will indirectly
- * include .
- * XXX - now that we have protected versions these should move.
- */
-typedef __in_addr_t	in_addr_t;	/* base type for internet address */
-typedef __in_port_t	in_port_t;	/* IP port type */
-typedef __sa_family_t	sa_family_t;	/* sockaddr address family type */
-typedef __socklen_t	socklen_t;	/* length type for network syscalls */
-
-/*
- * The following types may be defined in multiple header files.
- */
-#ifndef	_CLOCK_T_DEFINED_
-#define	_CLOCK_T_DEFINED_
-typedef	__clock_t	clock_t;
-#endif
-
-#ifndef	_CLOCKID_T_DEFINED_
-#define	_CLOCKID_T_DEFINED_
-typedef	__clockid_t	clockid_t;
-#endif
-
-#ifndef	_SIZE_T_DEFINED_
-#define	_SIZE_T_DEFINED_
-typedef	__size_t	size_t;
-#endif
-
-#ifndef	_SSIZE_T_DEFINED_
-#define	_SSIZE_T_DEFINED_
-typedef	__ssize_t	ssize_t;
-#endif
-
-#ifndef	_TIME_T_DEFINED_
-#define	_TIME_T_DEFINED_
-typedef	__time_t	time_t;
-#endif
-
-#ifndef	_TIMER_T_DEFINED_
-#define	_TIMER_T_DEFINED_
-typedef	__timer_t	timer_t;
-#endif
-
-#ifndef	_OFF_T_DEFINED_
-#define	_OFF_T_DEFINED_
-typedef	__off_t		off_t;
-#endif
-
-/*
- * These belong in unistd.h, but are placed here too to ensure that
- * long arguments will be promoted to off_t if the program fails to
- * include that header or explicitly cast them to off_t.
- */
-#if __BSD_VISIBLE && !defined(_KERNEL)
-__BEGIN_DECLS
-off_t	 lseek(int, off_t, int);
-int	 ftruncate(int, off_t);
-int	 truncate(const char *, off_t);
-__END_DECLS
-#endif /* __BSD_VISIBLE && !_KERNEL */
-
-#if __BSD_VISIBLE
-/* Major, minor numbers, dev_t's. */
-#define	major(x)	((int32_t)(((u_int32_t)(x) >> 8) & 0xff))
-#define	minor(x)	((int32_t)((x) & 0xff) | (((x) & 0xffff0000) >> 8))
-#define	makedev(x,y)	((dev_t)((((x) & 0xff) << 8) | ((y) & 0xff) | (((y) & 0xffff00) << 8)))
-#endif
-
-#if __BSD_VISIBLE
-#include 	/* must be after type declarations */
-#endif
-
-#if defined(__STDC__) && defined(_KERNEL)
-/*
- * Forward structure declarations for function prototypes.  We include the
- * common structures that cross subsystem boundaries here; others are mostly
- * used in the same place that the structure is defined.
- */
-struct	proc;
-struct	pgrp;
-struct	ucred;
-struct	rusage;
-struct	file;
-struct	buf;
-struct	tty;
-struct	uio;
-#endif
-
-#endif /* !_SYS_TYPES_H_ */
diff --git a/telldus-core/3rdparty/openbsd-getopt/sys/unistd.h b/telldus-core/3rdparty/openbsd-getopt/sys/unistd.h
deleted file mode 100644
index 52b8545c..00000000
--- a/telldus-core/3rdparty/openbsd-getopt/sys/unistd.h
+++ /dev/null
@@ -1,159 +0,0 @@
-/*	$OpenBSD: unistd.h,v 1.19 2011/10/15 23:35:29 guenther Exp $	*/
-/*	$NetBSD: unistd.h,v 1.10 1994/06/29 06:46:06 cgd Exp $	*/
-
-/*
- * Copyright (c) 1989, 1993
- *	The Regents of the University of California.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the University nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *	@(#)unistd.h	8.2 (Berkeley) 1/7/94
- */
-
-#ifndef _SYS_UNISTD_H_
-#define	_SYS_UNISTD_H_
-
-#include 
-
-/* compile-time symbolic constants */
-				/* implementation supports job control */
-#define	_POSIX_JOB_CONTROL	1
-				/* saved set-user-ID and set-group-ID */
-#define	_POSIX_SAVED_IDS	1
-
-#define	_POSIX_VERSION		199009L
-#define	_POSIX2_VERSION		199212L
-
-/* execution-time symbolic constants */
-				/* chown requires appropriate privileges */
-#define	_POSIX_CHOWN_RESTRICTED	1
-				/* too-long path components generate errors */
-#define	_POSIX_NO_TRUNC		1
-				/* may disable terminal special characters */
-#define	_POSIX_VDISABLE		(0377)
-				/* file synchronization is available */
-#define	_POSIX_FSYNC		1
-
-/* access function */
-#define	F_OK		0	/* test for existence of file */
-#define	X_OK		0x01	/* test for execute or search permission */
-#define	W_OK		0x02	/* test for write permission */
-#define	R_OK		0x04	/* test for read permission */
-
-/* whence values for lseek(2) */
-#define	SEEK_SET	0	/* set file offset to offset */
-#define	SEEK_CUR	1	/* set file offset to current plus offset */
-#define	SEEK_END	2	/* set file offset to EOF plus offset */
-
-#if __BSD_VISIBLE
-/* old BSD whence values for lseek(2); renamed by POSIX 1003.1 */
-#define	L_SET		SEEK_SET
-#define	L_INCR		SEEK_CUR
-#define	L_XTND		SEEK_END
-
-/* the parameters argument passed to the __tfork() syscall */
-struct __tfork {
-	void	*tf_tcb;
-	pid_t	*tf_tid;
-	int	tf_flags;
-};
-#endif
-
-/* configurable pathname variables */
-#define	_PC_LINK_MAX		 1
-#define	_PC_MAX_CANON		 2
-#define	_PC_MAX_INPUT		 3
-#define	_PC_NAME_MAX		 4
-#define	_PC_PATH_MAX		 5
-#define	_PC_PIPE_BUF		 6
-#define	_PC_CHOWN_RESTRICTED	 7
-#define	_PC_NO_TRUNC		 8
-#define	_PC_VDISABLE		 9
-
-/* configurable system variables */
-#define	_SC_ARG_MAX		 1
-#define	_SC_CHILD_MAX		 2
-#define	_SC_CLK_TCK		 3
-#define	_SC_NGROUPS_MAX		 4
-#define	_SC_OPEN_MAX		 5
-#define	_SC_JOB_CONTROL		 6
-#define	_SC_SAVED_IDS		 7
-#define	_SC_VERSION		 8
-#define	_SC_BC_BASE_MAX		 9
-#define	_SC_BC_DIM_MAX		10
-#define	_SC_BC_SCALE_MAX	11
-#define	_SC_BC_STRING_MAX	12
-#define	_SC_COLL_WEIGHTS_MAX	13
-#define	_SC_EXPR_NEST_MAX	14
-#define	_SC_LINE_MAX		15
-#define	_SC_RE_DUP_MAX		16
-#define	_SC_2_VERSION		17
-#define	_SC_2_C_BIND		18
-#define	_SC_2_C_DEV		19
-#define	_SC_2_CHAR_TERM		20
-#define	_SC_2_FORT_DEV		21
-#define	_SC_2_FORT_RUN		22
-#define	_SC_2_LOCALEDEF		23
-#define	_SC_2_SW_DEV		24
-#define	_SC_2_UPE		25
-#define	_SC_STREAM_MAX		26
-#define	_SC_TZNAME_MAX		27
-#define	_SC_PAGESIZE		28
-#define	_SC_PAGE_SIZE		_SC_PAGESIZE	/* 1170 compatibility */
-#define	_SC_FSYNC		29
-#define	_SC_XOPEN_SHM		30
-#define	_SC_SEM_NSEMS_MAX	31
-#define	_SC_SEM_VALUE_MAX	32
-#define	_SC_HOST_NAME_MAX	33
-
-/* P1003.1c */
-#define _SC_GETGR_R_SIZE_MAX	100
-#define _SC_GETPW_R_SIZE_MAX	101
-#define _SC_LOGIN_NAME_MAX	102
-#define _SC_THREAD_SAFE_FUNCTIONS 103
-#ifdef notyet
-#define _SC_THREAD_DESTRUCTOR_ITERATIONS
-#define _SC_THREAD_KEYS_MAX
-#define _SC_THREAD_STACK_MIN
-#define _SC_THREAD_THREADS_MAX
-#define _SC_TTY_NAME_MAX
-#define _SC_THREADS
-#define _SC_THREAD_ATTR_STACKADDR
-#define _SC_THREAD_ATTR_STACKSIZE
-#define _SC_THREAD_PRIORITY_SCHEDULING
-#define _SC_THREAD_PRIO_INHERIT
-#define _SC_THREAD_PRIO_PROTECT
-#define _SC_THREAD_PROCESS_SHARED
-#endif
-
-#define	_SC_PHYS_PAGES		500
-#define	_SC_AVPHYS_PAGES	501
-#define	_SC_NPROCESSORS_CONF	502
-#define	_SC_NPROCESSORS_ONLN	503
-
-/* configurable system strings */
-#define	_CS_PATH		 1
-
-#endif /* !_SYS_UNISTD_H_ */
diff --git a/telldus-core/3rdparty/openbsd-getopt/unistd.h b/telldus-core/3rdparty/openbsd-getopt/unistd.h
deleted file mode 100644
index b013d3ec..00000000
--- a/telldus-core/3rdparty/openbsd-getopt/unistd.h
+++ /dev/null
@@ -1,274 +0,0 @@
-/*	$OpenBSD: unistd.h,v 1.67 2012/01/13 13:16:44 nigel Exp $ */
-/*	$NetBSD: unistd.h,v 1.26.4.1 1996/05/28 02:31:51 mrg Exp $	*/
-
-/*-
- * Copyright (c) 1991 The Regents of the University of California.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the University nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *	@(#)unistd.h	5.13 (Berkeley) 6/17/91
- */
-
-#ifndef _UNISTD_H_
-#define	_UNISTD_H_
-
-#include 
-#include 
-#include 
-
-#define	STDIN_FILENO	0	/* standard input file descriptor */
-#define	STDOUT_FILENO	1	/* standard output file descriptor */
-#define	STDERR_FILENO	2	/* standard error file descriptor */
-
-#if __XPG_VISIBLE || __POSIX_VISIBLE >= 200112
-#define F_ULOCK         0	/* unlock locked section */
-#define F_LOCK          1	/* lock a section for exclusive use */
-#define F_TLOCK         2	/* test and lock a section for exclusive use */
-#define F_TEST          3	/* test a section for locks by other procs */
-#endif
-
-#if __POSIX_VISIBLE
-#define _POSIX_REENTRANT_FUNCTIONS	1
-#define _POSIX_THREAD_SAFE_FUNCTIONS	200112L
-#endif
-
-#ifndef NULL
-#ifdef 	__GNUG__
-#define	NULL	__null
-#elif defined(__cplusplus)
-#define	NULL	0L
-#else
-#define	NULL	((void *)0)
-#endif
-#endif
-
-__BEGIN_DECLS
-//__dead void	 _exit(int);
-//int	 access(const char *, int);
-unsigned int alarm(unsigned int);
-//int	 chdir(const char *);
-//int	 chown(const char *, uid_t, gid_t);
-int	 close(int);
-int	 dup(int);
-int	 dup2(int, int);
-//int	 execl(const char *, const char *, ...)
-//	    __attribute__((sentinel));
-//int	 execle(const char *, const char *, ...);
-//int	 execlp(const char *, const char *, ...)
-//	    __attribute__((sentinel));
-//int	 execv(const char *, char * const *);
-//int	 execve(const char *, char * const *, char * const *);
-//int	 execvp(const char *, char * const *);
-pid_t	 fork(void);
-long	 fpathconf(int, int);
-char	*getcwd(char *, size_t)
-		__attribute__((__bounded__(__string__,1,2)));
-gid_t	 getegid(void);
-uid_t	 geteuid(void);
-gid_t	 getgid(void);
-int	 getgroups(int, gid_t *);
-char	*getlogin(void);
-pid_t	 getpgrp(void);
-pid_t	 getpid(void);
-pid_t	 getppid(void);
-uid_t	 getuid(void);
-int	 isatty(int);
-//int	 link(const char *, const char *);
-//off_t	 lseek(int, off_t, int);
-//long	 pathconf(const char *, int);
-int	 pause(void);
-int	 pipe(int *);
-//ssize_t	 read(int, void *, size_t)
-//		__attribute__((__bounded__(__buffer__,2,3)));
-//int	 rmdir(const char *);
-int	 setgid(gid_t);
-int	 setuid(uid_t);
-unsigned int sleep(unsigned int);
-long	 sysconf(int);
-pid_t	 tcgetpgrp(int);
-int	 tcsetpgrp(int, pid_t);
-char	*ttyname(int);
-//int	 unlink(const char *);
-//ssize_t	 write(int, const void *, size_t)
-//		__attribute__((__bounded__(__buffer__,2,3)));
-
-#if __POSIX_VISIBLE || __XPG_VISIBLE >= 300
-pid_t	 setsid(void);
-int	 setpgid(pid_t, pid_t);
-#endif
-
-#if __POSIX_VISIBLE >= 199209 || __XPG_VISIBLE
-size_t	 confstr(int, char *, size_t)
-		__attribute__((__bounded__(__string__,2,3)));
-#ifndef _GETOPT_DEFINED_
-#define _GETOPT_DEFINED_
-int	 getopt(int, char * const *, const char *);
-extern	 char *optarg;			/* getopt(3) external variables */
-extern	 int opterr, optind, optopt, optreset;
-/* XXX - getsubopt does not belong here */
-int	 getsubopt(char **, char * const *, char **);
-extern	 char *suboptarg;		/* getsubopt(3) external variable */
-#endif /* _GETOPT_DEFINED_ */
-#endif
-
-#if __POSIX_VISIBLE >= 199506 || __XPG_VISIBLE
-int	 fsync(int);
-int	 ftruncate(int, off_t);
-int	 getlogin_r(char *, size_t)
-		__attribute__((__bounded__(__string__,1,2)));
-#endif
-
-#if __XPG_VISIBLE || __BSD_VISIBLE
-char	*crypt(const char *, const char *);
-int	 encrypt(char *, int);
-int	 fchdir(int);
-int	 fchown(int, uid_t, gid_t);
-long	 gethostid(void);
-char	*getwd(char *)
-		__attribute__ ((__bounded__(__minbytes__,1,1024)));
-int	 lchown(const char *, uid_t, gid_t);
-int	 mkstemp(char *);
-char	*mktemp(char *);
-int	 nice(int);
-int	 readlink(const char *, char *, size_t)
-		__attribute__ ((__bounded__(__string__,2,3)));
-int	 setkey(const char *);
-int	 setpgrp(pid_t pid, pid_t pgrp);	/* obsoleted by setpgid() */
-int	 setregid(gid_t, gid_t);
-int	 setreuid(uid_t, uid_t);
-void	 swab(const void *, void *, size_t);
-void	 sync(void);
-int	 truncate(const char *, off_t);
-unsigned int	 ualarm(unsigned int, unsigned int);
-int	 usleep(useconds_t);
-pid_t	 vfork(void);
-#endif
-
-#if __XPG_VISIBLE >= 420
-pid_t	 getpgid(pid_t);
-pid_t	 getsid(pid_t);
-#endif
-
-#if __XPG_VISIBLE >= 500
-ssize_t  pread(int, void *, size_t, off_t);
-ssize_t  pwrite(int, const void *, size_t, off_t);
-int	 ttyname_r(int, char *, size_t)
-	    __attribute__((__bounded__(__string__,2,3)));
-#endif
-
-#if __BSD_VISIBLE ||  __XPG_VISIBLE <= 500
-/* Interfaces withdrawn by X/Open Issue 5 Version 0 */
-int	 brk(void *);
-//int	 chroot(const char *);
-int	 getdtablesize(void);
-int	 getpagesize(void);
-//char	*getpass(const char *);
-void	*sbrk(int);
-#endif
-
-#if __POSIX_VISIBLE >= 200112 || __XPG_VISIBLE >= 420
-int     lockf(int, int, off_t);
-#endif
-
-#if __POSIX_VISIBLE >= 200112 || __XPG_VISIBLE >= 420 || __BSD_VISIBLE
-int	 symlink(const char *, const char *);
-int	 gethostname(char *, size_t)
-		__attribute__ ((__bounded__(__string__,1,2)));
-int	 setegid(gid_t);
-int	 seteuid(uid_t);
-#endif
-
-#if __POSIX_VISIBLE >= 200809
-int	faccessat(int, const char *, int, int);
-int	fchownat(int, const char *, uid_t, gid_t, int);
-int	linkat(int, const char *, int, const char *, int);
-ssize_t	readlinkat(int, const char *, char *, size_t);
-int	symlinkat(const char *, int, const char *);
-int	unlinkat(int, const char *, int);
-#endif
-
-#if __BSD_VISIBLE
-int	 acct(const char *);
-int	 closefrom(int);
-int	 des_cipher(const char *, char *, int32_t, int);
-int	 des_setkey(const char *);
-void	 endusershell(void);
-int	 exect(const char *, char * const *, char * const *);
-char	*fflagstostr(u_int32_t);
-int	 getdomainname(char *, size_t)
-		__attribute__ ((__bounded__(__string__,1,2)));
-int	 getgrouplist(const char *, gid_t, gid_t *, int *);
-mode_t	 getmode(const void *, mode_t);
-int	 getresgid(gid_t *, gid_t *, gid_t *);
-int	 getresuid(uid_t *, uid_t *, uid_t *);
-char	*getusershell(void);
-int	 initgroups(const char *, gid_t);
-int	 iruserok(u_int32_t, int, const char *, const char *);
-int	 iruserok_sa(const void *, int, int, const char *, const char *);
-int	 issetugid(void);
-char	*mkdtemp(char *);
-int	 mkstemps(char *, int);
-int	 nfssvc(int, void *);
-int	 profil(char *, size_t, unsigned long, unsigned int)
-		__attribute__ ((__bounded__(__string__,1,2)));
-int	 quotactl(const char *, int, int, char *);
-int	 rcmd(char **, int, const char *,
-	    const char *, const char *, int *);
-int	 rcmd_af(char **, int, const char *,
-	    const char *, const char *, int *, int);
-int	 rcmdsh(char **, int, const char *,
-	    const char *, const char *, char *);
-char	*re_comp(const char *);
-int	 re_exec(const char *);
-int	 reboot(int);
-int	 revoke(const char *);
-int	 rfork(int opts);
-int	 rresvport(int *);
-int	 rresvport_af(int *, int);
-int	 ruserok(const char *, int, const char *, const char *);
-#ifndef _SELECT_DEFINED_
-#define _SELECT_DEFINED_
-struct timeval;
-int	 select(int, fd_set *, fd_set *, fd_set *, struct timeval *);
-#endif
-int	 setdomainname(const char *, size_t);
-int	 setgroups(int, const gid_t *);
-int	 sethostid(long);
-int	 sethostname(const char *, size_t);
-int	 setlogin(const char *);
-void	*setmode(const char *);
-int	 setresgid(gid_t, gid_t, gid_t);
-int	 setresuid(uid_t, uid_t, uid_t);
-int	 setrgid(gid_t);
-int	 setruid(uid_t);
-void	 setusershell(void);
-int	 strtofflags(char **, u_int32_t *, u_int32_t *);
-int	 swapctl(int cmd, const void *arg, int misc);
-int	 syscall(int, ...);
-#endif /* __BSD_VISIBLE */
-__END_DECLS
-
-#endif /* !_UNISTD_H_ */
diff --git a/telldus-core/CMakeLists.txt b/telldus-core/CMakeLists.txt
deleted file mode 100644
index 01cde2b9..00000000
--- a/telldus-core/CMakeLists.txt
+++ /dev/null
@@ -1,80 +0,0 @@
-PROJECT( telldus-core )
-
-CMAKE_MINIMUM_REQUIRED( VERSION 2.6.0 )
-
-CMAKE_POLICY(SET CMP0003 NEW)
-
-OPTION(FORCE_COMPILE_FROM_TRUNK FALSE "Accept compiling source from trunk. This is unsupported and highly unrecommended")
-IF(NOT FORCE_COMPILE_FROM_TRUNK)
-	MESSAGE(FATAL_ERROR "You are compiling sources from trunk. Don't do that!")
-ENDIF(NOT FORCE_COMPILE_FROM_TRUNK)
-
-SET(PACKAGE_MAJOR_VERSION 2)
-SET(PACKAGE_MINOR_VERSION 1)
-SET(PACKAGE_PATCH_VERSION 3)
-SET(PACKAGE_VERSION "${PACKAGE_MAJOR_VERSION}.${PACKAGE_MINOR_VERSION}.${PACKAGE_PATCH_VERSION}")
-SET(PACKAGE_SUBVERSION "beta1")
-SET(PACKAGE_SOVERSION 2)
-
-SET(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake")
-
-IF (PACKAGE_SUBVERSION)
-	SET(DISPLAYED_VERSION "${PACKAGE_VERSION}_${PACKAGE_SUBVERSION}")
-ELSE (PACKAGE_SUBVERSION)
-	SET(DISPLAYED_VERSION ${PACKAGE_VERSION})
-ENDIF(PACKAGE_SUBVERSION)
-
-SET(BUILD_LIBTELLDUS-CORE	TRUE	CACHE BOOL "Build libtelldus-core")
-
-IF (WIN32)
-	SET(TDADMIN_DEFAULT FALSE)
-ELSEIF(APPLE)
-	SET(TDADMIN_DEFAULT FALSE)
-ELSE (WIN32)
-	SET(TDADMIN_DEFAULT TRUE)
-ENDIF (WIN32)
-
-IF (CMAKE_SYSTEM_NAME MATCHES "FreeBSD")
-	INCLUDE_DIRECTORIES(/usr/local/include)
-	LINK_DIRECTORIES(/usr/local/lib)
-ENDIF (CMAKE_SYSTEM_NAME MATCHES "FreeBSD")
-
-SET(BUILD_TDTOOL	TRUE				CACHE BOOL "Build tdtool")
-SET(BUILD_TDADMIN	${TDADMIN_DEFAULT}	CACHE BOOL "Build tdadmin")
-
-SET(GENERATE_MAN	FALSE	CACHE	BOOL "Enable generation of man-files")
-
-ADD_SUBDIRECTORY(common)
-ADD_SUBDIRECTORY(service)
-ADD_SUBDIRECTORY(client)
-
-IF(BUILD_TDTOOL)
-	IF(WIN32)
-		ADD_SUBDIRECTORY(3rdparty/openbsd-getopt)
-	ENDIF()
-	ADD_SUBDIRECTORY(tdtool)
-ENDIF(BUILD_TDTOOL)
-IF(BUILD_TDADMIN)
-	ADD_SUBDIRECTORY(tdadmin)
-ENDIF(BUILD_TDADMIN)
-
-ENABLE_TESTING()
-ADD_SUBDIRECTORY(tests)
-
-FIND_PACKAGE(Doxygen)
-
-IF(DOXYGEN_FOUND)
-	SET(DOXY_CONFIG ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile)
-
-	CONFIGURE_FILE(
-		"${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile.in"
-		${DOXY_CONFIG} @ONLY
-	)
-
-	ADD_CUSTOM_TARGET(docs
-		${DOXYGEN_EXECUTABLE} ${DOXY_CONFIG}
-		DEPENDS ${DOXY_CONFIG}
-		WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
-		COMMENT "Generating doxygen documentation" VERBATIM
-	)
-ENDIF()
diff --git a/telldus-core/Doxyfile.in b/telldus-core/Doxyfile.in
deleted file mode 100644
index 199a4cbc..00000000
--- a/telldus-core/Doxyfile.in
+++ /dev/null
@@ -1,1712 +0,0 @@
-# Doxyfile 1.7.4
-
-# This file describes the settings to be used by the documentation system
-# doxygen (www.doxygen.org) for a project
-#
-# All text after a hash (#) is considered a comment and will be ignored
-# The format is:
-#       TAG = value [value, ...]
-# For lists items can also be appended using:
-#       TAG += value [value, ...]
-# Values that contain spaces should be placed between quotes (" ")
-
-#---------------------------------------------------------------------------
-# Project related configuration options
-#---------------------------------------------------------------------------
-
-# This tag specifies the encoding used for all characters in the config file 
-# that follow. The default is UTF-8 which is also the encoding used for all 
-# text before the first occurrence of this tag. Doxygen uses libiconv (or the 
-# iconv built into libc) for the transcoding. See 
-# http://www.gnu.org/software/libiconv for the list of possible encodings.
-
-DOXYFILE_ENCODING      = UTF-8
-
-# The PROJECT_NAME tag is a single word (or a sequence of words surrounded 
-# by quotes) that should identify the project.
-
-PROJECT_NAME           = "Telldus Core API"
-
-# The PROJECT_NUMBER tag can be used to enter a project or revision number. 
-# This could be handy for archiving the generated documentation or 
-# if some version control system is used.
-
-PROJECT_NUMBER         = @DISPLAYED_VERSION@
-
-# Using the PROJECT_BRIEF tag one can provide an optional one line description 
-# for a project that appears at the top of each page and should give viewer 
-# a quick idea about the purpose of the project. Keep the description short.
-
-PROJECT_BRIEF          = 
-
-# With the PROJECT_LOGO tag one can specify an logo or icon that is 
-# included in the documentation. The maximum height of the logo should not 
-# exceed 55 pixels and the maximum width should not exceed 200 pixels. 
-# Doxygen will copy the logo to the output directory.
-
-PROJECT_LOGO           = 
-
-# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) 
-# base path where the generated documentation will be put. 
-# If a relative path is entered, it will be relative to the location 
-# where doxygen was started. If left blank the current directory will be used.
-
-OUTPUT_DIRECTORY       = @PROJECT_BINARY_DIR@/docs
-
-# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create 
-# 4096 sub-directories (in 2 levels) under the output directory of each output 
-# format and will distribute the generated files over these directories. 
-# Enabling this option can be useful when feeding doxygen a huge amount of 
-# source files, where putting all generated files in the same directory would 
-# otherwise cause performance problems for the file system.
-
-CREATE_SUBDIRS         = NO
-
-# The OUTPUT_LANGUAGE tag is used to specify the language in which all 
-# documentation generated by doxygen is written. Doxygen will use this 
-# information to generate all constant output in the proper language. 
-# The default language is English, other supported languages are: 
-# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, 
-# Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German, 
-# Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English 
-# messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, 
-# Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak, 
-# Slovene, Spanish, Swedish, Ukrainian, and Vietnamese.
-
-OUTPUT_LANGUAGE        = English
-
-# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will 
-# include brief member descriptions after the members that are listed in 
-# the file and class documentation (similar to JavaDoc). 
-# Set to NO to disable this.
-
-BRIEF_MEMBER_DESC      = YES
-
-# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend 
-# the brief description of a member or function before the detailed description. 
-# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the 
-# brief descriptions will be completely suppressed.
-
-REPEAT_BRIEF           = YES
-
-# This tag implements a quasi-intelligent brief description abbreviator 
-# that is used to form the text in various listings. Each string 
-# in this list, if found as the leading text of the brief description, will be 
-# stripped from the text and the result after processing the whole list, is 
-# used as the annotated text. Otherwise, the brief description is used as-is. 
-# If left blank, the following values are used ("$name" is automatically 
-# replaced with the name of the entity): "The $name class" "The $name widget" 
-# "The $name file" "is" "provides" "specifies" "contains" 
-# "represents" "a" "an" "the"
-
-ABBREVIATE_BRIEF       = 
-
-# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then 
-# Doxygen will generate a detailed section even if there is only a brief 
-# description.
-
-ALWAYS_DETAILED_SEC    = NO
-
-# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all 
-# inherited members of a class in the documentation of that class as if those 
-# members were ordinary class members. Constructors, destructors and assignment 
-# operators of the base classes will not be shown.
-
-INLINE_INHERITED_MEMB  = NO
-
-# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full 
-# path before files name in the file list and in the header files. If set 
-# to NO the shortest path that makes the file name unique will be used.
-
-FULL_PATH_NAMES        = NO
-
-# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag 
-# can be used to strip a user-defined part of the path. Stripping is 
-# only done if one of the specified strings matches the left-hand part of 
-# the path. The tag can be used to show relative paths in the file list. 
-# If left blank the directory from which doxygen is run is used as the 
-# path to strip.
-
-STRIP_FROM_PATH        = 
-
-# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of 
-# the path mentioned in the documentation of a class, which tells 
-# the reader which header file to include in order to use a class. 
-# If left blank only the name of the header file containing the class 
-# definition is used. Otherwise one should specify the include paths that 
-# are normally passed to the compiler using the -I flag.
-
-STRIP_FROM_INC_PATH    = 
-
-# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter 
-# (but less readable) file names. This can be useful if your file system 
-# doesn't support long names like on DOS, Mac, or CD-ROM.
-
-SHORT_NAMES            = NO
-
-# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen 
-# will interpret the first line (until the first dot) of a JavaDoc-style 
-# comment as the brief description. If set to NO, the JavaDoc 
-# comments will behave just like regular Qt-style comments 
-# (thus requiring an explicit @brief command for a brief description.)
-
-JAVADOC_AUTOBRIEF      = NO
-
-# If the QT_AUTOBRIEF tag is set to YES then Doxygen will 
-# interpret the first line (until the first dot) of a Qt-style 
-# comment as the brief description. If set to NO, the comments 
-# will behave just like regular Qt-style comments (thus requiring 
-# an explicit \brief command for a brief description.)
-
-QT_AUTOBRIEF           = NO
-
-# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen 
-# treat a multi-line C++ special comment block (i.e. a block of //! or /// 
-# comments) as a brief description. This used to be the default behaviour. 
-# The new default is to treat a multi-line C++ comment block as a detailed 
-# description. Set this tag to YES if you prefer the old behaviour instead.
-
-MULTILINE_CPP_IS_BRIEF = NO
-
-# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented 
-# member inherits the documentation from any documented member that it 
-# re-implements.
-
-INHERIT_DOCS           = YES
-
-# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce 
-# a new page for each member. If set to NO, the documentation of a member will 
-# be part of the file/class/namespace that contains it.
-
-SEPARATE_MEMBER_PAGES  = NO
-
-# The TAB_SIZE tag can be used to set the number of spaces in a tab. 
-# Doxygen uses this value to replace tabs by spaces in code fragments.
-
-TAB_SIZE               = 8
-
-# This tag can be used to specify a number of aliases that acts 
-# as commands in the documentation. An alias has the form "name=value". 
-# For example adding "sideeffect=\par Side Effects:\n" will allow you to 
-# put the command \sideeffect (or @sideeffect) in the documentation, which 
-# will result in a user-defined paragraph with heading "Side Effects:". 
-# You can put \n's in the value part of an alias to insert newlines.
-
-ALIASES                = 
-
-# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C 
-# sources only. Doxygen will then generate output that is more tailored for C. 
-# For instance, some of the names that are used will be different. The list 
-# of all members will be omitted, etc.
-
-OPTIMIZE_OUTPUT_FOR_C  = YES
-
-# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java 
-# sources only. Doxygen will then generate output that is more tailored for 
-# Java. For instance, namespaces will be presented as packages, qualified 
-# scopes will look different, etc.
-
-OPTIMIZE_OUTPUT_JAVA   = NO
-
-# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran 
-# sources only. Doxygen will then generate output that is more tailored for 
-# Fortran.
-
-OPTIMIZE_FOR_FORTRAN   = NO
-
-# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL 
-# sources. Doxygen will then generate output that is tailored for 
-# VHDL.
-
-OPTIMIZE_OUTPUT_VHDL   = NO
-
-# Doxygen selects the parser to use depending on the extension of the files it 
-# parses. With this tag you can assign which parser to use for a given extension. 
-# Doxygen has a built-in mapping, but you can override or extend it using this 
-# tag. The format is ext=language, where ext is a file extension, and language 
-# is one of the parsers supported by doxygen: IDL, Java, Javascript, CSharp, C, 
-# C++, D, PHP, Objective-C, Python, Fortran, VHDL, C, C++. For instance to make 
-# doxygen treat .inc files as Fortran files (default is PHP), and .f files as C 
-# (default is Fortran), use: inc=Fortran f=C. Note that for custom extensions 
-# you also need to set FILE_PATTERNS otherwise the files are not read by doxygen.
-
-EXTENSION_MAPPING      = 
-
-# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want 
-# to include (a tag file for) the STL sources as input, then you should 
-# set this tag to YES in order to let doxygen match functions declarations and 
-# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. 
-# func(std::string) {}). This also makes the inheritance and collaboration 
-# diagrams that involve STL classes more complete and accurate.
-
-BUILTIN_STL_SUPPORT    = NO
-
-# If you use Microsoft's C++/CLI language, you should set this option to YES to 
-# enable parsing support.
-
-CPP_CLI_SUPPORT        = NO
-
-# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. 
-# Doxygen will parse them like normal C++ but will assume all classes use public 
-# instead of private inheritance when no explicit protection keyword is present.
-
-SIP_SUPPORT            = NO
-
-# For Microsoft's IDL there are propget and propput attributes to indicate getter 
-# and setter methods for a property. Setting this option to YES (the default) 
-# will make doxygen replace the get and set methods by a property in the 
-# documentation. This will only work if the methods are indeed getting or 
-# setting a simple type. If this is not the case, or you want to show the 
-# methods anyway, you should set this option to NO.
-
-IDL_PROPERTY_SUPPORT   = YES
-
-# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC 
-# tag is set to YES, then doxygen will reuse the documentation of the first 
-# member in the group (if any) for the other members of the group. By default 
-# all members of a group must be documented explicitly.
-
-DISTRIBUTE_GROUP_DOC   = NO
-
-# Set the SUBGROUPING tag to YES (the default) to allow class member groups of 
-# the same type (for instance a group of public functions) to be put as a 
-# subgroup of that type (e.g. under the Public Functions section). Set it to 
-# NO to prevent subgrouping. Alternatively, this can be done per class using 
-# the \nosubgrouping command.
-
-SUBGROUPING            = YES
-
-# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and 
-# unions are shown inside the group in which they are included (e.g. using 
-# @ingroup) instead of on a separate page (for HTML and Man pages) or 
-# section (for LaTeX and RTF).
-
-INLINE_GROUPED_CLASSES = NO
-
-# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum 
-# is documented as struct, union, or enum with the name of the typedef. So 
-# typedef struct TypeS {} TypeT, will appear in the documentation as a struct 
-# with name TypeT. When disabled the typedef will appear as a member of a file, 
-# namespace, or class. And the struct will be named TypeS. This can typically 
-# be useful for C code in case the coding convention dictates that all compound 
-# types are typedef'ed and only the typedef is referenced, never the tag name.
-
-TYPEDEF_HIDES_STRUCT   = NO
-
-# The SYMBOL_CACHE_SIZE determines the size of the internal cache use to 
-# determine which symbols to keep in memory and which to flush to disk. 
-# When the cache is full, less often used symbols will be written to disk. 
-# For small to medium size projects (<1000 input files) the default value is 
-# probably good enough. For larger projects a too small cache size can cause 
-# doxygen to be busy swapping symbols to and from disk most of the time 
-# causing a significant performance penalty. 
-# If the system has enough physical memory increasing the cache will improve the 
-# performance by keeping more symbols in memory. Note that the value works on 
-# a logarithmic scale so increasing the size by one will roughly double the 
-# memory usage. The cache size is given by this formula: 
-# 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, 
-# corresponding to a cache size of 2^16 = 65536 symbols
-
-SYMBOL_CACHE_SIZE      = 0
-
-#---------------------------------------------------------------------------
-# Build related configuration options
-#---------------------------------------------------------------------------
-
-# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in 
-# documentation are documented, even if no documentation was available. 
-# Private class members and static file members will be hidden unless 
-# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
-
-EXTRACT_ALL            = NO
-
-# If the EXTRACT_PRIVATE tag is set to YES all private members of a class 
-# will be included in the documentation.
-
-EXTRACT_PRIVATE        = NO
-
-# If the EXTRACT_STATIC tag is set to YES all static members of a file 
-# will be included in the documentation.
-
-EXTRACT_STATIC         = NO
-
-# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) 
-# defined locally in source files will be included in the documentation. 
-# If set to NO only classes defined in header files are included.
-
-EXTRACT_LOCAL_CLASSES  = NO
-
-# This flag is only useful for Objective-C code. When set to YES local 
-# methods, which are defined in the implementation section but not in 
-# the interface are included in the documentation. 
-# If set to NO (the default) only methods in the interface are included.
-
-EXTRACT_LOCAL_METHODS  = NO
-
-# If this flag is set to YES, the members of anonymous namespaces will be 
-# extracted and appear in the documentation as a namespace called 
-# 'anonymous_namespace{file}', where file will be replaced with the base 
-# name of the file that contains the anonymous namespace. By default 
-# anonymous namespaces are hidden.
-
-EXTRACT_ANON_NSPACES   = NO
-
-# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all 
-# undocumented members of documented classes, files or namespaces. 
-# If set to NO (the default) these members will be included in the 
-# various overviews, but no documentation section is generated. 
-# This option has no effect if EXTRACT_ALL is enabled.
-
-HIDE_UNDOC_MEMBERS     = NO
-
-# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all 
-# undocumented classes that are normally visible in the class hierarchy. 
-# If set to NO (the default) these classes will be included in the various 
-# overviews. This option has no effect if EXTRACT_ALL is enabled.
-
-HIDE_UNDOC_CLASSES     = NO
-
-# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all 
-# friend (class|struct|union) declarations. 
-# If set to NO (the default) these declarations will be included in the 
-# documentation.
-
-HIDE_FRIEND_COMPOUNDS  = NO
-
-# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any 
-# documentation blocks found inside the body of a function. 
-# If set to NO (the default) these blocks will be appended to the 
-# function's detailed documentation block.
-
-HIDE_IN_BODY_DOCS      = NO
-
-# The INTERNAL_DOCS tag determines if documentation 
-# that is typed after a \internal command is included. If the tag is set 
-# to NO (the default) then the documentation will be excluded. 
-# Set it to YES to include the internal documentation.
-
-INTERNAL_DOCS          = NO
-
-# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate 
-# file names in lower-case letters. If set to YES upper-case letters are also 
-# allowed. This is useful if you have classes or files whose names only differ 
-# in case and if your file system supports case sensitive file names. Windows 
-# and Mac users are advised to set this option to NO.
-
-CASE_SENSE_NAMES       = YES
-
-# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen 
-# will show members with their full class and namespace scopes in the 
-# documentation. If set to YES the scope will be hidden.
-
-HIDE_SCOPE_NAMES       = YES
-
-# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen 
-# will put a list of the files that are included by a file in the documentation 
-# of that file.
-
-SHOW_INCLUDE_FILES     = YES
-
-# If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen 
-# will list include files with double quotes in the documentation 
-# rather than with sharp brackets.
-
-FORCE_LOCAL_INCLUDES   = NO
-
-# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] 
-# is inserted in the documentation for inline members.
-
-INLINE_INFO            = YES
-
-# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen 
-# will sort the (detailed) documentation of file and class members 
-# alphabetically by member name. If set to NO the members will appear in 
-# declaration order.
-
-SORT_MEMBER_DOCS       = YES
-
-# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the 
-# brief documentation of file, namespace and class members alphabetically 
-# by member name. If set to NO (the default) the members will appear in 
-# declaration order.
-
-SORT_BRIEF_DOCS        = NO
-
-# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen 
-# will sort the (brief and detailed) documentation of class members so that 
-# constructors and destructors are listed first. If set to NO (the default) 
-# the constructors will appear in the respective orders defined by 
-# SORT_MEMBER_DOCS and SORT_BRIEF_DOCS. 
-# This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO 
-# and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO.
-
-SORT_MEMBERS_CTORS_1ST = NO
-
-# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the 
-# hierarchy of group names into alphabetical order. If set to NO (the default) 
-# the group names will appear in their defined order.
-
-SORT_GROUP_NAMES       = NO
-
-# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be 
-# sorted by fully-qualified names, including namespaces. If set to 
-# NO (the default), the class list will be sorted only by class name, 
-# not including the namespace part. 
-# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. 
-# Note: This option applies only to the class list, not to the 
-# alphabetical list.
-
-SORT_BY_SCOPE_NAME     = NO
-
-# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to 
-# do proper type resolution of all parameters of a function it will reject a 
-# match between the prototype and the implementation of a member function even 
-# if there is only one candidate or it is obvious which candidate to choose 
-# by doing a simple string match. By disabling STRICT_PROTO_MATCHING doxygen 
-# will still accept a match between prototype and implementation in such cases.
-
-STRICT_PROTO_MATCHING  = NO
-
-# The GENERATE_TODOLIST tag can be used to enable (YES) or 
-# disable (NO) the todo list. This list is created by putting \todo 
-# commands in the documentation.
-
-GENERATE_TODOLIST      = YES
-
-# The GENERATE_TESTLIST tag can be used to enable (YES) or 
-# disable (NO) the test list. This list is created by putting \test 
-# commands in the documentation.
-
-GENERATE_TESTLIST      = YES
-
-# The GENERATE_BUGLIST tag can be used to enable (YES) or 
-# disable (NO) the bug list. This list is created by putting \bug 
-# commands in the documentation.
-
-GENERATE_BUGLIST       = YES
-
-# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or 
-# disable (NO) the deprecated list. This list is created by putting 
-# \deprecated commands in the documentation.
-
-GENERATE_DEPRECATEDLIST= YES
-
-# The ENABLED_SECTIONS tag can be used to enable conditional 
-# documentation sections, marked by \if sectionname ... \endif.
-
-ENABLED_SECTIONS       = 
-
-# The MAX_INITIALIZER_LINES tag determines the maximum number of lines 
-# the initial value of a variable or macro consists of for it to appear in 
-# the documentation. If the initializer consists of more lines than specified 
-# here it will be hidden. Use a value of 0 to hide initializers completely. 
-# The appearance of the initializer of individual variables and macros in the 
-# documentation can be controlled using \showinitializer or \hideinitializer 
-# command in the documentation regardless of this setting.
-
-MAX_INITIALIZER_LINES  = 30
-
-# Set the SHOW_USED_FILES tag to NO to disable the list of files generated 
-# at the bottom of the documentation of classes and structs. If set to YES the 
-# list will mention the files that were used to generate the documentation.
-
-SHOW_USED_FILES        = YES
-
-# If the sources in your project are distributed over multiple directories 
-# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy 
-# in the documentation. The default is NO.
-
-SHOW_DIRECTORIES       = NO
-
-# Set the SHOW_FILES tag to NO to disable the generation of the Files page. 
-# This will remove the Files entry from the Quick Index and from the 
-# Folder Tree View (if specified). The default is YES.
-
-SHOW_FILES             = YES
-
-# Set the SHOW_NAMESPACES tag to NO to disable the generation of the 
-# Namespaces page.  This will remove the Namespaces entry from the Quick Index 
-# and from the Folder Tree View (if specified). The default is YES.
-
-SHOW_NAMESPACES        = YES
-
-# The FILE_VERSION_FILTER tag can be used to specify a program or script that 
-# doxygen should invoke to get the current version for each file (typically from 
-# the version control system). Doxygen will invoke the program by executing (via 
-# popen()) the command  , where  is the value of 
-# the FILE_VERSION_FILTER tag, and  is the name of an input file 
-# provided by doxygen. Whatever the program writes to standard output 
-# is used as the file version. See the manual for examples.
-
-FILE_VERSION_FILTER    = 
-
-# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed 
-# by doxygen. The layout file controls the global structure of the generated 
-# output files in an output format independent way. The create the layout file 
-# that represents doxygen's defaults, run doxygen with the -l option. 
-# You can optionally specify a file name after the option, if omitted 
-# DoxygenLayout.xml will be used as the name of the layout file.
-
-LAYOUT_FILE            = 
-
-#---------------------------------------------------------------------------
-# configuration options related to warning and progress messages
-#---------------------------------------------------------------------------
-
-# The QUIET tag can be used to turn on/off the messages that are generated 
-# by doxygen. Possible values are YES and NO. If left blank NO is used.
-
-QUIET                  = NO
-
-# The WARNINGS tag can be used to turn on/off the warning messages that are 
-# generated by doxygen. Possible values are YES and NO. If left blank 
-# NO is used.
-
-WARNINGS               = YES
-
-# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings 
-# for undocumented members. If EXTRACT_ALL is set to YES then this flag will 
-# automatically be disabled.
-
-WARN_IF_UNDOCUMENTED   = YES
-
-# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for 
-# potential errors in the documentation, such as not documenting some 
-# parameters in a documented function, or documenting parameters that 
-# don't exist or using markup commands wrongly.
-
-WARN_IF_DOC_ERROR      = YES
-
-# The WARN_NO_PARAMDOC option can be enabled to get warnings for 
-# functions that are documented, but have no documentation for their parameters 
-# or return value. If set to NO (the default) doxygen will only warn about 
-# wrong or incomplete parameter documentation, but not about the absence of 
-# documentation.
-
-WARN_NO_PARAMDOC       = YES
-
-# The WARN_FORMAT tag determines the format of the warning messages that 
-# doxygen can produce. The string should contain the $file, $line, and $text 
-# tags, which will be replaced by the file and line number from which the 
-# warning originated and the warning text. Optionally the format may contain 
-# $version, which will be replaced by the version of the file (if it could 
-# be obtained via FILE_VERSION_FILTER)
-
-WARN_FORMAT            = "$file:$line: $text"
-
-# The WARN_LOGFILE tag can be used to specify a file to which warning 
-# and error messages should be written. If left blank the output is written 
-# to stderr.
-
-WARN_LOGFILE           = 
-
-#---------------------------------------------------------------------------
-# configuration options related to the input files
-#---------------------------------------------------------------------------
-
-# The INPUT tag can be used to specify the files and/or directories that contain 
-# documented source files. You may enter file names like "myfile.cpp" or 
-# directories like "/usr/src/myproject". Separate the files or directories 
-# with spaces.
-
-INPUT                  = client/telldus-core.h \
-                         client/telldus-core.cpp \
-                         ../docs/01-telldus-core.dox \
-                         ../docs/02-tellstick-protocol.dox \
-                         ../docs/03-tellstick-net-protocol.dox
-
-# This tag can be used to specify the character encoding of the source files 
-# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is 
-# also the default input encoding. Doxygen uses libiconv (or the iconv built 
-# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for 
-# the list of possible encodings.
-
-INPUT_ENCODING         = UTF-8
-
-# If the value of the INPUT tag contains directories, you can use the 
-# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp 
-# and *.h) to filter out the source-files in the directories. If left 
-# blank the following patterns are tested: 
-# *.c *.cc *.cxx *.cpp *.c++ *.d *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh 
-# *.hxx *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.dox *.py 
-# *.f90 *.f *.for *.vhd *.vhdl
-
-FILE_PATTERNS          = 
-
-# The RECURSIVE tag can be used to turn specify whether or not subdirectories 
-# should be searched for input files as well. Possible values are YES and NO. 
-# If left blank NO is used.
-
-RECURSIVE              = NO
-
-# The EXCLUDE tag can be used to specify files and/or directories that should 
-# excluded from the INPUT source files. This way you can easily exclude a 
-# subdirectory from a directory tree whose root is specified with the INPUT tag.
-
-EXCLUDE                = 
-
-# The EXCLUDE_SYMLINKS tag can be used select whether or not files or 
-# directories that are symbolic links (a Unix file system feature) are excluded 
-# from the input.
-
-EXCLUDE_SYMLINKS       = NO
-
-# If the value of the INPUT tag contains directories, you can use the 
-# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude 
-# certain files from those directories. Note that the wildcards are matched 
-# against the file with absolute path, so to exclude all test directories 
-# for example use the pattern */test/*
-
-EXCLUDE_PATTERNS       = 
-
-# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names 
-# (namespaces, classes, functions, etc.) that should be excluded from the 
-# output. The symbol name can be a fully qualified name, a word, or if the 
-# wildcard * is used, a substring. Examples: ANamespace, AClass, 
-# AClass::ANamespace, ANamespace::*Test
-
-EXCLUDE_SYMBOLS        = 
-
-# The EXAMPLE_PATH tag can be used to specify one or more files or 
-# directories that contain example code fragments that are included (see 
-# the \include command).
-
-EXAMPLE_PATH           = 
-
-# If the value of the EXAMPLE_PATH tag contains directories, you can use the 
-# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp 
-# and *.h) to filter out the source-files in the directories. If left 
-# blank all files are included.
-
-EXAMPLE_PATTERNS       = 
-
-# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be 
-# searched for input files to be used with the \include or \dontinclude 
-# commands irrespective of the value of the RECURSIVE tag. 
-# Possible values are YES and NO. If left blank NO is used.
-
-EXAMPLE_RECURSIVE      = NO
-
-# The IMAGE_PATH tag can be used to specify one or more files or 
-# directories that contain image that are included in the documentation (see 
-# the \image command).
-
-IMAGE_PATH             = 
-
-# The INPUT_FILTER tag can be used to specify a program that doxygen should 
-# invoke to filter for each input file. Doxygen will invoke the filter program 
-# by executing (via popen()) the command  , where  
-# is the value of the INPUT_FILTER tag, and  is the name of an 
-# input file. Doxygen will then use the output that the filter program writes 
-# to standard output.  If FILTER_PATTERNS is specified, this tag will be 
-# ignored.
-
-INPUT_FILTER           = 
-
-# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern 
-# basis.  Doxygen will compare the file name with each pattern and apply the 
-# filter if there is a match.  The filters are a list of the form: 
-# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further 
-# info on how filters are used. If FILTER_PATTERNS is empty or if 
-# non of the patterns match the file name, INPUT_FILTER is applied.
-
-FILTER_PATTERNS        = 
-
-# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using 
-# INPUT_FILTER) will be used to filter the input files when producing source 
-# files to browse (i.e. when SOURCE_BROWSER is set to YES).
-
-FILTER_SOURCE_FILES    = NO
-
-# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file 
-# pattern. A pattern will override the setting for FILTER_PATTERN (if any) 
-# and it is also possible to disable source filtering for a specific pattern 
-# using *.ext= (so without naming a filter). This option only has effect when 
-# FILTER_SOURCE_FILES is enabled.
-
-FILTER_SOURCE_PATTERNS = 
-
-#---------------------------------------------------------------------------
-# configuration options related to source browsing
-#---------------------------------------------------------------------------
-
-# If the SOURCE_BROWSER tag is set to YES then a list of source files will 
-# be generated. Documented entities will be cross-referenced with these sources. 
-# Note: To get rid of all source code in the generated output, make sure also 
-# VERBATIM_HEADERS is set to NO.
-
-SOURCE_BROWSER         = NO
-
-# Setting the INLINE_SOURCES tag to YES will include the body 
-# of functions and classes directly in the documentation.
-
-INLINE_SOURCES         = NO
-
-# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct 
-# doxygen to hide any special comment blocks from generated source code 
-# fragments. Normal C and C++ comments will always remain visible.
-
-STRIP_CODE_COMMENTS    = YES
-
-# If the REFERENCED_BY_RELATION tag is set to YES 
-# then for each documented function all documented 
-# functions referencing it will be listed.
-
-REFERENCED_BY_RELATION = NO
-
-# If the REFERENCES_RELATION tag is set to YES 
-# then for each documented function all documented entities 
-# called/used by that function will be listed.
-
-REFERENCES_RELATION    = NO
-
-# If the REFERENCES_LINK_SOURCE tag is set to YES (the default) 
-# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from 
-# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will 
-# link to the source code.  Otherwise they will link to the documentation.
-
-REFERENCES_LINK_SOURCE = YES
-
-# If the USE_HTAGS tag is set to YES then the references to source code 
-# will point to the HTML generated by the htags(1) tool instead of doxygen 
-# built-in source browser. The htags tool is part of GNU's global source 
-# tagging system (see http://www.gnu.org/software/global/global.html). You 
-# will need version 4.8.6 or higher.
-
-USE_HTAGS              = NO
-
-# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen 
-# will generate a verbatim copy of the header file for each class for 
-# which an include is specified. Set to NO to disable this.
-
-VERBATIM_HEADERS       = YES
-
-#---------------------------------------------------------------------------
-# configuration options related to the alphabetical class index
-#---------------------------------------------------------------------------
-
-# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index 
-# of all compounds will be generated. Enable this if the project 
-# contains a lot of classes, structs, unions or interfaces.
-
-ALPHABETICAL_INDEX     = YES
-
-# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then 
-# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns 
-# in which this list will be split (can be a number in the range [1..20])
-
-COLS_IN_ALPHA_INDEX    = 5
-
-# In case all classes in a project start with a common prefix, all 
-# classes will be put under the same header in the alphabetical index. 
-# The IGNORE_PREFIX tag can be used to specify one or more prefixes that 
-# should be ignored while generating the index headers.
-
-IGNORE_PREFIX          = 
-
-#---------------------------------------------------------------------------
-# configuration options related to the HTML output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_HTML tag is set to YES (the default) Doxygen will 
-# generate HTML output.
-
-GENERATE_HTML          = YES
-
-# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. 
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
-# put in front of it. If left blank `html' will be used as the default path.
-
-HTML_OUTPUT            = html
-
-# The HTML_FILE_EXTENSION tag can be used to specify the file extension for 
-# each generated HTML page (for example: .htm,.php,.asp). If it is left blank 
-# doxygen will generate files with .html extension.
-
-HTML_FILE_EXTENSION    = .html
-
-# The HTML_HEADER tag can be used to specify a personal HTML header for 
-# each generated HTML page. If it is left blank doxygen will generate a 
-# standard header. Note that when using a custom header you are responsible 
-# for the proper inclusion of any scripts and style sheets that doxygen 
-# needs, which is dependent on the configuration options used. 
-# It is adviced to generate a default header using "doxygen -w html 
-# header.html footer.html stylesheet.css YourConfigFile" and then modify 
-# that header. Note that the header is subject to change so you typically 
-# have to redo this when upgrading to a newer version of doxygen or when
-# changing the value of configuration settings such as GENERATE_TREEVIEW!
-
-HTML_HEADER            = 
-
-# The HTML_FOOTER tag can be used to specify a personal HTML footer for 
-# each generated HTML page. If it is left blank doxygen will generate a 
-# standard footer.
-
-HTML_FOOTER            = 
-
-# The HTML_STYLESHEET tag can be used to specify a user-defined cascading 
-# style sheet that is used by each HTML page. It can be used to 
-# fine-tune the look of the HTML output. If the tag is left blank doxygen 
-# will generate a default style sheet. Note that doxygen will try to copy 
-# the style sheet file to the HTML output directory, so don't put your own 
-# stylesheet in the HTML output directory as well, or it will be erased!
-
-HTML_STYLESHEET        = 
-
-# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or 
-# other source files which should be copied to the HTML output directory. Note 
-# that these files will be copied to the base HTML output directory. Use the 
-# $relpath$ marker in the HTML_HEADER and/or HTML_FOOTER files to load these 
-# files. In the HTML_STYLESHEET file, use the file name only. Also note that 
-# the files will be copied as-is; there are no commands or markers available.
-
-HTML_EXTRA_FILES       = 
-
-# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. 
-# Doxygen will adjust the colors in the stylesheet and background images 
-# according to this color. Hue is specified as an angle on a colorwheel, 
-# see http://en.wikipedia.org/wiki/Hue for more information. 
-# For instance the value 0 represents red, 60 is yellow, 120 is green, 
-# 180 is cyan, 240 is blue, 300 purple, and 360 is red again. 
-# The allowed range is 0 to 359.
-
-HTML_COLORSTYLE_HUE    = 220
-
-# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of 
-# the colors in the HTML output. For a value of 0 the output will use 
-# grayscales only. A value of 255 will produce the most vivid colors.
-
-HTML_COLORSTYLE_SAT    = 100
-
-# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to 
-# the luminance component of the colors in the HTML output. Values below 
-# 100 gradually make the output lighter, whereas values above 100 make 
-# the output darker. The value divided by 100 is the actual gamma applied, 
-# so 80 represents a gamma of 0.8, The value 220 represents a gamma of 2.2, 
-# and 100 does not change the gamma.
-
-HTML_COLORSTYLE_GAMMA  = 80
-
-# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML 
-# page will contain the date and time when the page was generated. Setting 
-# this to NO can help when comparing the output of multiple runs.
-
-HTML_TIMESTAMP         = YES
-
-# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, 
-# files or namespaces will be aligned in HTML using tables. If set to 
-# NO a bullet list will be used.
-
-HTML_ALIGN_MEMBERS     = YES
-
-# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML 
-# documentation will contain sections that can be hidden and shown after the 
-# page has loaded. For this to work a browser that supports 
-# JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox 
-# Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari).
-
-HTML_DYNAMIC_SECTIONS  = NO
-
-# If the GENERATE_DOCSET tag is set to YES, additional index files 
-# will be generated that can be used as input for Apple's Xcode 3 
-# integrated development environment, introduced with OSX 10.5 (Leopard). 
-# To create a documentation set, doxygen will generate a Makefile in the 
-# HTML output directory. Running make will produce the docset in that 
-# directory and running "make install" will install the docset in 
-# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find 
-# it at startup. 
-# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html 
-# for more information.
-
-GENERATE_DOCSET        = NO
-
-# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the 
-# feed. A documentation feed provides an umbrella under which multiple 
-# documentation sets from a single provider (such as a company or product suite) 
-# can be grouped.
-
-DOCSET_FEEDNAME        = "Doxygen generated docs"
-
-# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that 
-# should uniquely identify the documentation set bundle. This should be a 
-# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen 
-# will append .docset to the name.
-
-DOCSET_BUNDLE_ID       = org.doxygen.Project
-
-# When GENERATE_PUBLISHER_ID tag specifies a string that should uniquely identify 
-# the documentation publisher. This should be a reverse domain-name style 
-# string, e.g. com.mycompany.MyDocSet.documentation.
-
-DOCSET_PUBLISHER_ID    = org.doxygen.Publisher
-
-# The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher.
-
-DOCSET_PUBLISHER_NAME  = Publisher
-
-# If the GENERATE_HTMLHELP tag is set to YES, additional index files 
-# will be generated that can be used as input for tools like the 
-# Microsoft HTML help workshop to generate a compiled HTML help file (.chm) 
-# of the generated HTML documentation.
-
-GENERATE_HTMLHELP      = NO
-
-# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can 
-# be used to specify the file name of the resulting .chm file. You 
-# can add a path in front of the file if the result should not be 
-# written to the html output directory.
-
-CHM_FILE               = 
-
-# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can 
-# be used to specify the location (absolute path including file name) of 
-# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run 
-# the HTML help compiler on the generated index.hhp.
-
-HHC_LOCATION           = 
-
-# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag 
-# controls if a separate .chi index file is generated (YES) or that 
-# it should be included in the master .chm file (NO).
-
-GENERATE_CHI           = NO
-
-# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING 
-# is used to encode HtmlHelp index (hhk), content (hhc) and project file 
-# content.
-
-CHM_INDEX_ENCODING     = 
-
-# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag 
-# controls whether a binary table of contents is generated (YES) or a 
-# normal table of contents (NO) in the .chm file.
-
-BINARY_TOC             = NO
-
-# The TOC_EXPAND flag can be set to YES to add extra items for group members 
-# to the contents of the HTML help documentation and to the tree view.
-
-TOC_EXPAND             = NO
-
-# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and 
-# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated 
-# that can be used as input for Qt's qhelpgenerator to generate a 
-# Qt Compressed Help (.qch) of the generated HTML documentation.
-
-GENERATE_QHP           = NO
-
-# If the QHG_LOCATION tag is specified, the QCH_FILE tag can 
-# be used to specify the file name of the resulting .qch file. 
-# The path specified is relative to the HTML output folder.
-
-QCH_FILE               = 
-
-# The QHP_NAMESPACE tag specifies the namespace to use when generating 
-# Qt Help Project output. For more information please see 
-# http://doc.trolltech.com/qthelpproject.html#namespace
-
-QHP_NAMESPACE          = org.doxygen.Project
-
-# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating 
-# Qt Help Project output. For more information please see 
-# http://doc.trolltech.com/qthelpproject.html#virtual-folders
-
-QHP_VIRTUAL_FOLDER     = doc
-
-# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to 
-# add. For more information please see 
-# http://doc.trolltech.com/qthelpproject.html#custom-filters
-
-QHP_CUST_FILTER_NAME   = 
-
-# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the 
-# custom filter to add. For more information please see 
-#  
-# Qt Help Project / Custom Filters.
-
-QHP_CUST_FILTER_ATTRS  = 
-
-# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this 
-# project's 
-# filter section matches. 
-#  
-# Qt Help Project / Filter Attributes.
-
-QHP_SECT_FILTER_ATTRS  = 
-
-# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can 
-# be used to specify the location of Qt's qhelpgenerator. 
-# If non-empty doxygen will try to run qhelpgenerator on the generated 
-# .qhp file.
-
-QHG_LOCATION           = 
-
-# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files  
-# will be generated, which together with the HTML files, form an Eclipse help 
-# plugin. To install this plugin and make it available under the help contents 
-# menu in Eclipse, the contents of the directory containing the HTML and XML 
-# files needs to be copied into the plugins directory of eclipse. The name of 
-# the directory within the plugins directory should be the same as 
-# the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before 
-# the help appears.
-
-GENERATE_ECLIPSEHELP   = NO
-
-# A unique identifier for the eclipse help plugin. When installing the plugin 
-# the directory name containing the HTML and XML files should also have 
-# this name.
-
-ECLIPSE_DOC_ID         = org.doxygen.Project
-
-# The DISABLE_INDEX tag can be used to turn on/off the condensed index at 
-# top of each HTML page. The value NO (the default) enables the index and 
-# the value YES disables it.
-
-DISABLE_INDEX          = NO
-
-# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values 
-# (range [0,1..20]) that doxygen will group on one line in the generated HTML 
-# documentation. Note that a value of 0 will completely suppress the enum 
-# values from appearing in the overview section.
-
-ENUM_VALUES_PER_LINE   = 4
-
-# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index 
-# structure should be generated to display hierarchical information. 
-# If the tag value is set to YES, a side panel will be generated 
-# containing a tree-like index structure (just like the one that 
-# is generated for HTML Help). For this to work a browser that supports 
-# JavaScript, DHTML, CSS and frames is required (i.e. any modern browser). 
-# Windows users are probably better off using the HTML help feature.
-
-GENERATE_TREEVIEW      = NO
-
-# By enabling USE_INLINE_TREES, doxygen will generate the Groups, Directories, 
-# and Class Hierarchy pages using a tree view instead of an ordered list.
-
-USE_INLINE_TREES       = NO
-
-# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be 
-# used to set the initial width (in pixels) of the frame in which the tree 
-# is shown.
-
-TREEVIEW_WIDTH         = 250
-
-# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open 
-# links to external symbols imported via tag files in a separate window.
-
-EXT_LINKS_IN_WINDOW    = NO
-
-# Use this tag to change the font size of Latex formulas included 
-# as images in the HTML documentation. The default is 10. Note that 
-# when you change the font size after a successful doxygen run you need 
-# to manually remove any form_*.png images from the HTML output directory 
-# to force them to be regenerated.
-
-FORMULA_FONTSIZE       = 10
-
-# Use the FORMULA_TRANPARENT tag to determine whether or not the images 
-# generated for formulas are transparent PNGs. Transparent PNGs are 
-# not supported properly for IE 6.0, but are supported on all modern browsers. 
-# Note that when changing this option you need to delete any form_*.png files 
-# in the HTML output before the changes have effect.
-
-FORMULA_TRANSPARENT    = YES
-
-# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax 
-# (see http://www.mathjax.org) which uses client side Javascript for the 
-# rendering instead of using prerendered bitmaps. Use this if you do not 
-# have LaTeX installed or if you want to formulas look prettier in the HTML 
-# output. When enabled you also need to install MathJax separately and 
-# configure the path to it using the MATHJAX_RELPATH option.
-
-USE_MATHJAX            = NO
-
-# When MathJax is enabled you need to specify the location relative to the 
-# HTML output directory using the MATHJAX_RELPATH option. The destination 
-# directory should contain the MathJax.js script. For instance, if the mathjax 
-# directory is located at the same level as the HTML output directory, then 
-# MATHJAX_RELPATH should be ../mathjax. The default value points to the 
-# mathjax.org site, so you can quickly see the result without installing 
-# MathJax, but it is strongly recommended to install a local copy of MathJax 
-# before deployment.
-
-MATHJAX_RELPATH        = http://www.mathjax.org/mathjax
-
-# When the SEARCHENGINE tag is enabled doxygen will generate a search box 
-# for the HTML output. The underlying search engine uses javascript 
-# and DHTML and should work on any modern browser. Note that when using 
-# HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets 
-# (GENERATE_DOCSET) there is already a search function so this one should 
-# typically be disabled. For large projects the javascript based search engine 
-# can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution.
-
-SEARCHENGINE           = YES
-
-# When the SERVER_BASED_SEARCH tag is enabled the search engine will be 
-# implemented using a PHP enabled web server instead of at the web client 
-# using Javascript. Doxygen will generate the search PHP script and index 
-# file to put on the web server. The advantage of the server 
-# based approach is that it scales better to large projects and allows 
-# full text search. The disadvantages are that it is more difficult to setup 
-# and does not have live searching capabilities.
-
-SERVER_BASED_SEARCH    = NO
-
-#---------------------------------------------------------------------------
-# configuration options related to the LaTeX output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will 
-# generate Latex output.
-
-GENERATE_LATEX         = NO
-
-# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. 
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
-# put in front of it. If left blank `latex' will be used as the default path.
-
-LATEX_OUTPUT           = latex
-
-# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be 
-# invoked. If left blank `latex' will be used as the default command name. 
-# Note that when enabling USE_PDFLATEX this option is only used for 
-# generating bitmaps for formulas in the HTML output, but not in the 
-# Makefile that is written to the output directory.
-
-LATEX_CMD_NAME         = latex
-
-# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to 
-# generate index for LaTeX. If left blank `makeindex' will be used as the 
-# default command name.
-
-MAKEINDEX_CMD_NAME     = makeindex
-
-# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact 
-# LaTeX documents. This may be useful for small projects and may help to 
-# save some trees in general.
-
-COMPACT_LATEX          = NO
-
-# The PAPER_TYPE tag can be used to set the paper type that is used 
-# by the printer. Possible values are: a4, letter, legal and 
-# executive. If left blank a4wide will be used.
-
-PAPER_TYPE             = a4
-
-# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX 
-# packages that should be included in the LaTeX output.
-
-EXTRA_PACKAGES         = 
-
-# The LATEX_HEADER tag can be used to specify a personal LaTeX header for 
-# the generated latex document. The header should contain everything until 
-# the first chapter. If it is left blank doxygen will generate a 
-# standard header. Notice: only use this tag if you know what you are doing!
-
-LATEX_HEADER           = 
-
-# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for 
-# the generated latex document. The footer should contain everything after 
-# the last chapter. If it is left blank doxygen will generate a 
-# standard footer. Notice: only use this tag if you know what you are doing!
-
-LATEX_FOOTER           = 
-
-# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated 
-# is prepared for conversion to pdf (using ps2pdf). The pdf file will 
-# contain links (just like the HTML output) instead of page references 
-# This makes the output suitable for online browsing using a pdf viewer.
-
-PDF_HYPERLINKS         = YES
-
-# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of 
-# plain latex in the generated Makefile. Set this option to YES to get a 
-# higher quality PDF documentation.
-
-USE_PDFLATEX           = YES
-
-# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. 
-# command to the generated LaTeX files. This will instruct LaTeX to keep 
-# running if errors occur, instead of asking the user for help. 
-# This option is also used when generating formulas in HTML.
-
-LATEX_BATCHMODE        = NO
-
-# If LATEX_HIDE_INDICES is set to YES then doxygen will not 
-# include the index chapters (such as File Index, Compound Index, etc.) 
-# in the output.
-
-LATEX_HIDE_INDICES     = NO
-
-# If LATEX_SOURCE_CODE is set to YES then doxygen will include 
-# source code with syntax highlighting in the LaTeX output. 
-# Note that which sources are shown also depends on other settings 
-# such as SOURCE_BROWSER.
-
-LATEX_SOURCE_CODE      = NO
-
-#---------------------------------------------------------------------------
-# configuration options related to the RTF output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output 
-# The RTF output is optimized for Word 97 and may not look very pretty with 
-# other RTF readers or editors.
-
-GENERATE_RTF           = NO
-
-# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. 
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
-# put in front of it. If left blank `rtf' will be used as the default path.
-
-RTF_OUTPUT             = rtf
-
-# If the COMPACT_RTF tag is set to YES Doxygen generates more compact 
-# RTF documents. This may be useful for small projects and may help to 
-# save some trees in general.
-
-COMPACT_RTF            = NO
-
-# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated 
-# will contain hyperlink fields. The RTF file will 
-# contain links (just like the HTML output) instead of page references. 
-# This makes the output suitable for online browsing using WORD or other 
-# programs which support those fields. 
-# Note: wordpad (write) and others do not support links.
-
-RTF_HYPERLINKS         = NO
-
-# Load stylesheet definitions from file. Syntax is similar to doxygen's 
-# config file, i.e. a series of assignments. You only have to provide 
-# replacements, missing definitions are set to their default value.
-
-RTF_STYLESHEET_FILE    = 
-
-# Set optional variables used in the generation of an rtf document. 
-# Syntax is similar to doxygen's config file.
-
-RTF_EXTENSIONS_FILE    = 
-
-#---------------------------------------------------------------------------
-# configuration options related to the man page output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_MAN tag is set to YES (the default) Doxygen will 
-# generate man pages
-
-GENERATE_MAN           = NO
-
-# The MAN_OUTPUT tag is used to specify where the man pages will be put. 
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
-# put in front of it. If left blank `man' will be used as the default path.
-
-MAN_OUTPUT             = man
-
-# The MAN_EXTENSION tag determines the extension that is added to 
-# the generated man pages (default is the subroutine's section .3)
-
-MAN_EXTENSION          = .3
-
-# If the MAN_LINKS tag is set to YES and Doxygen generates man output, 
-# then it will generate one additional man file for each entity 
-# documented in the real man page(s). These additional files 
-# only source the real man page, but without them the man command 
-# would be unable to find the correct page. The default is NO.
-
-MAN_LINKS              = NO
-
-#---------------------------------------------------------------------------
-# configuration options related to the XML output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_XML tag is set to YES Doxygen will 
-# generate an XML file that captures the structure of 
-# the code including all documentation.
-
-GENERATE_XML           = NO
-
-# The XML_OUTPUT tag is used to specify where the XML pages will be put. 
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
-# put in front of it. If left blank `xml' will be used as the default path.
-
-XML_OUTPUT             = xml
-
-# The XML_SCHEMA tag can be used to specify an XML schema, 
-# which can be used by a validating XML parser to check the 
-# syntax of the XML files.
-
-XML_SCHEMA             = 
-
-# The XML_DTD tag can be used to specify an XML DTD, 
-# which can be used by a validating XML parser to check the 
-# syntax of the XML files.
-
-XML_DTD                = 
-
-# If the XML_PROGRAMLISTING tag is set to YES Doxygen will 
-# dump the program listings (including syntax highlighting 
-# and cross-referencing information) to the XML output. Note that 
-# enabling this will significantly increase the size of the XML output.
-
-XML_PROGRAMLISTING     = YES
-
-#---------------------------------------------------------------------------
-# configuration options for the AutoGen Definitions output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will 
-# generate an AutoGen Definitions (see autogen.sf.net) file 
-# that captures the structure of the code including all 
-# documentation. Note that this feature is still experimental 
-# and incomplete at the moment.
-
-GENERATE_AUTOGEN_DEF   = NO
-
-#---------------------------------------------------------------------------
-# configuration options related to the Perl module output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_PERLMOD tag is set to YES Doxygen will 
-# generate a Perl module file that captures the structure of 
-# the code including all documentation. Note that this 
-# feature is still experimental and incomplete at the 
-# moment.
-
-GENERATE_PERLMOD       = NO
-
-# If the PERLMOD_LATEX tag is set to YES Doxygen will generate 
-# the necessary Makefile rules, Perl scripts and LaTeX code to be able 
-# to generate PDF and DVI output from the Perl module output.
-
-PERLMOD_LATEX          = NO
-
-# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be 
-# nicely formatted so it can be parsed by a human reader.  This is useful 
-# if you want to understand what is going on.  On the other hand, if this 
-# tag is set to NO the size of the Perl module output will be much smaller 
-# and Perl will parse it just the same.
-
-PERLMOD_PRETTY         = YES
-
-# The names of the make variables in the generated doxyrules.make file 
-# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. 
-# This is useful so different doxyrules.make files included by the same 
-# Makefile don't overwrite each other's variables.
-
-PERLMOD_MAKEVAR_PREFIX = 
-
-#---------------------------------------------------------------------------
-# Configuration options related to the preprocessor
-#---------------------------------------------------------------------------
-
-# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will 
-# evaluate all C-preprocessor directives found in the sources and include 
-# files.
-
-ENABLE_PREPROCESSING   = YES
-
-# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro 
-# names in the source code. If set to NO (the default) only conditional 
-# compilation will be performed. Macro expansion can be done in a controlled 
-# way by setting EXPAND_ONLY_PREDEF to YES.
-
-MACRO_EXPANSION        = YES
-
-# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES 
-# then the macro expansion is limited to the macros specified with the 
-# PREDEFINED and EXPAND_AS_DEFINED tags.
-
-EXPAND_ONLY_PREDEF     = YES
-
-# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files 
-# pointed to by INCLUDE_PATH will be searched when a #include is found.
-
-SEARCH_INCLUDES        = YES
-
-# The INCLUDE_PATH tag can be used to specify one or more directories that 
-# contain include files that are not input files but should be processed by 
-# the preprocessor.
-
-INCLUDE_PATH           = 
-
-# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard 
-# patterns (like *.h and *.hpp) to filter out the header-files in the 
-# directories. If left blank, the patterns specified with FILE_PATTERNS will 
-# be used.
-
-INCLUDE_FILE_PATTERNS  = 
-
-# The PREDEFINED tag can be used to specify one or more macro names that 
-# are defined before the preprocessor is started (similar to the -D option of 
-# gcc). The argument of the tag is a list of macros of the form: name 
-# or name=definition (no spaces). If the definition and the = are 
-# omitted =1 is assumed. To prevent a macro definition from being 
-# undefined via #undef or recursively expanded use the := operator 
-# instead of the = operator.
-
-PREDEFINED             = WINAPI=
-
-# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then 
-# this tag can be used to specify a list of macro names that should be expanded. 
-# The macro definition that is found in the sources will be used. 
-# Use the PREDEFINED tag if you want to use a different macro definition that 
-# overrules the definition found in the source code.
-
-EXPAND_AS_DEFINED      = 
-
-# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then 
-# doxygen's preprocessor will remove all references to function-like macros 
-# that are alone on a line, have an all uppercase name, and do not end with a 
-# semicolon, because these will confuse the parser if not removed.
-
-SKIP_FUNCTION_MACROS   = YES
-
-#---------------------------------------------------------------------------
-# Configuration::additions related to external references
-#---------------------------------------------------------------------------
-
-# The TAGFILES option can be used to specify one or more tagfiles. 
-# Optionally an initial location of the external documentation 
-# can be added for each tagfile. The format of a tag file without 
-# this location is as follows: 
-#   TAGFILES = file1 file2 ... 
-# Adding location for the tag files is done as follows: 
-#   TAGFILES = file1=loc1 "file2 = loc2" ... 
-# where "loc1" and "loc2" can be relative or absolute paths or 
-# URLs. If a location is present for each tag, the installdox tool 
-# does not have to be run to correct the links. 
-# Note that each tag file must have a unique name 
-# (where the name does NOT include the path) 
-# If a tag file is not located in the directory in which doxygen 
-# is run, you must also specify the path to the tagfile here.
-
-TAGFILES               = 
-
-# When a file name is specified after GENERATE_TAGFILE, doxygen will create 
-# a tag file that is based on the input files it reads.
-
-GENERATE_TAGFILE       = 
-
-# If the ALLEXTERNALS tag is set to YES all external classes will be listed 
-# in the class index. If set to NO only the inherited external classes 
-# will be listed.
-
-ALLEXTERNALS           = NO
-
-# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed 
-# in the modules index. If set to NO, only the current project's groups will 
-# be listed.
-
-EXTERNAL_GROUPS        = YES
-
-# The PERL_PATH should be the absolute path and name of the perl script 
-# interpreter (i.e. the result of `which perl').
-
-PERL_PATH              = /usr/bin/perl
-
-#---------------------------------------------------------------------------
-# Configuration options related to the dot tool
-#---------------------------------------------------------------------------
-
-# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will 
-# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base 
-# or super classes. Setting the tag to NO turns the diagrams off. Note that 
-# this option also works with HAVE_DOT disabled, but it is recommended to 
-# install and use dot, since it yields more powerful graphs.
-
-CLASS_DIAGRAMS         = YES
-
-# You can define message sequence charts within doxygen comments using the \msc 
-# command. Doxygen will then run the mscgen tool (see 
-# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the 
-# documentation. The MSCGEN_PATH tag allows you to specify the directory where 
-# the mscgen tool resides. If left empty the tool is assumed to be found in the 
-# default search path.
-
-MSCGEN_PATH            = 
-
-# If set to YES, the inheritance and collaboration graphs will hide 
-# inheritance and usage relations if the target is undocumented 
-# or is not a class.
-
-HIDE_UNDOC_RELATIONS   = YES
-
-# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is 
-# available from the path. This tool is part of Graphviz, a graph visualization 
-# toolkit from AT&T and Lucent Bell Labs. The other options in this section 
-# have no effect if this option is set to NO (the default)
-
-HAVE_DOT               = NO
-
-# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is 
-# allowed to run in parallel. When set to 0 (the default) doxygen will 
-# base this on the number of processors available in the system. You can set it 
-# explicitly to a value larger than 0 to get control over the balance 
-# between CPU load and processing speed.
-
-DOT_NUM_THREADS        = 0
-
-# By default doxygen will write a font called Helvetica to the output 
-# directory and reference it in all dot files that doxygen generates. 
-# When you want a differently looking font you can specify the font name 
-# using DOT_FONTNAME. You need to make sure dot is able to find the font, 
-# which can be done by putting it in a standard location or by setting the 
-# DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory 
-# containing the font.
-
-DOT_FONTNAME           = Helvetica
-
-# The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. 
-# The default size is 10pt.
-
-DOT_FONTSIZE           = 10
-
-# By default doxygen will tell dot to use the output directory to look for the 
-# FreeSans.ttf font (which doxygen will put there itself). If you specify a 
-# different font using DOT_FONTNAME you can set the path where dot 
-# can find it using this tag.
-
-DOT_FONTPATH           = 
-
-# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen 
-# will generate a graph for each documented class showing the direct and 
-# indirect inheritance relations. Setting this tag to YES will force the 
-# the CLASS_DIAGRAMS tag to NO.
-
-CLASS_GRAPH            = YES
-
-# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen 
-# will generate a graph for each documented class showing the direct and 
-# indirect implementation dependencies (inheritance, containment, and 
-# class references variables) of the class with other documented classes.
-
-COLLABORATION_GRAPH    = YES
-
-# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen 
-# will generate a graph for groups, showing the direct groups dependencies
-
-GROUP_GRAPHS           = YES
-
-# If the UML_LOOK tag is set to YES doxygen will generate inheritance and 
-# collaboration diagrams in a style similar to the OMG's Unified Modeling 
-# Language.
-
-UML_LOOK               = NO
-
-# If set to YES, the inheritance and collaboration graphs will show the 
-# relations between templates and their instances.
-
-TEMPLATE_RELATIONS     = NO
-
-# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT 
-# tags are set to YES then doxygen will generate a graph for each documented 
-# file showing the direct and indirect include dependencies of the file with 
-# other documented files.
-
-INCLUDE_GRAPH          = YES
-
-# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and 
-# HAVE_DOT tags are set to YES then doxygen will generate a graph for each 
-# documented header file showing the documented files that directly or 
-# indirectly include this file.
-
-INCLUDED_BY_GRAPH      = YES
-
-# If the CALL_GRAPH and HAVE_DOT options are set to YES then 
-# doxygen will generate a call dependency graph for every global function 
-# or class method. Note that enabling this option will significantly increase 
-# the time of a run. So in most cases it will be better to enable call graphs 
-# for selected functions only using the \callgraph command.
-
-CALL_GRAPH             = NO
-
-# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then 
-# doxygen will generate a caller dependency graph for every global function 
-# or class method. Note that enabling this option will significantly increase 
-# the time of a run. So in most cases it will be better to enable caller 
-# graphs for selected functions only using the \callergraph command.
-
-CALLER_GRAPH           = NO
-
-# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen 
-# will generate a graphical hierarchy of all classes instead of a textual one.
-
-GRAPHICAL_HIERARCHY    = YES
-
-# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES 
-# then doxygen will show the dependencies a directory has on other directories 
-# in a graphical way. The dependency relations are determined by the #include 
-# relations between the files in the directories.
-
-DIRECTORY_GRAPH        = YES
-
-# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images 
-# generated by dot. Possible values are svg, png, jpg, or gif. 
-# If left blank png will be used.
-
-DOT_IMAGE_FORMAT       = png
-
-# The tag DOT_PATH can be used to specify the path where the dot tool can be 
-# found. If left blank, it is assumed the dot tool can be found in the path.
-
-DOT_PATH               = 
-
-# The DOTFILE_DIRS tag can be used to specify one or more directories that 
-# contain dot files that are included in the documentation (see the 
-# \dotfile command).
-
-DOTFILE_DIRS           = 
-
-# The MSCFILE_DIRS tag can be used to specify one or more directories that 
-# contain msc files that are included in the documentation (see the 
-# \mscfile command).
-
-MSCFILE_DIRS           = 
-
-# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of 
-# nodes that will be shown in the graph. If the number of nodes in a graph 
-# becomes larger than this value, doxygen will truncate the graph, which is 
-# visualized by representing a node as a red box. Note that doxygen if the 
-# number of direct children of the root node in a graph is already larger than 
-# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note 
-# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
-
-DOT_GRAPH_MAX_NODES    = 50
-
-# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the 
-# graphs generated by dot. A depth value of 3 means that only nodes reachable 
-# from the root by following a path via at most 3 edges will be shown. Nodes 
-# that lay further from the root node will be omitted. Note that setting this 
-# option to 1 or 2 may greatly reduce the computation time needed for large 
-# code bases. Also note that the size of a graph can be further restricted by 
-# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.
-
-MAX_DOT_GRAPH_DEPTH    = 0
-
-# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent 
-# background. This is disabled by default, because dot on Windows does not 
-# seem to support this out of the box. Warning: Depending on the platform used, 
-# enabling this option may lead to badly anti-aliased labels on the edges of 
-# a graph (i.e. they become hard to read).
-
-DOT_TRANSPARENT        = NO
-
-# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output 
-# files in one run (i.e. multiple -o and -T options on the command line). This 
-# makes dot run faster, but since only newer versions of dot (>1.8.10) 
-# support this, this feature is disabled by default.
-
-DOT_MULTI_TARGETS      = YES
-
-# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will 
-# generate a legend page explaining the meaning of the various boxes and 
-# arrows in the dot generated graphs.
-
-GENERATE_LEGEND        = YES
-
-# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will 
-# remove the intermediate dot files that are used to generate 
-# the various graphs.
-
-DOT_CLEANUP            = YES
diff --git a/telldus-core/LICENSE b/telldus-core/LICENSE
deleted file mode 100644
index 4362b491..00000000
--- a/telldus-core/LICENSE
+++ /dev/null
@@ -1,502 +0,0 @@
-                  GNU LESSER GENERAL PUBLIC LICENSE
-                       Version 2.1, February 1999
-
- Copyright (C) 1991, 1999 Free Software Foundation, Inc.
- 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-[This is the first released version of the Lesser GPL.  It also counts
- as the successor of the GNU Library Public License, version 2, hence
- the version number 2.1.]
-
-                            Preamble
-
-  The licenses for most software are designed to take away your
-freedom to share and change it.  By contrast, the GNU General Public
-Licenses are intended to guarantee your freedom to share and change
-free software--to make sure the software is free for all its users.
-
-  This license, the Lesser General Public License, applies to some
-specially designated software packages--typically libraries--of the
-Free Software Foundation and other authors who decide to use it.  You
-can use it too, but we suggest you first think carefully about whether
-this license or the ordinary General Public License is the better
-strategy to use in any particular case, based on the explanations below.
-
-  When we speak of free software, we are referring to freedom of use,
-not price.  Our General Public Licenses are designed to make sure that
-you have the freedom to distribute copies of free software (and charge
-for this service if you wish); that you receive source code or can get
-it if you want it; that you can change the software and use pieces of
-it in new free programs; and that you are informed that you can do
-these things.
-
-  To protect your rights, we need to make restrictions that forbid
-distributors to deny you these rights or to ask you to surrender these
-rights.  These restrictions translate to certain responsibilities for
-you if you distribute copies of the library or if you modify it.
-
-  For example, if you distribute copies of the library, whether gratis
-or for a fee, you must give the recipients all the rights that we gave
-you.  You must make sure that they, too, receive or can get the source
-code.  If you link other code with the library, you must provide
-complete object files to the recipients, so that they can relink them
-with the library after making changes to the library and recompiling
-it.  And you must show them these terms so they know their rights.
-
-  We protect your rights with a two-step method: (1) we copyright the
-library, and (2) we offer you this license, which gives you legal
-permission to copy, distribute and/or modify the library.
-
-  To protect each distributor, we want to make it very clear that
-there is no warranty for the free library.  Also, if the library is
-modified by someone else and passed on, the recipients should know
-that what they have is not the original version, so that the original
-author's reputation will not be affected by problems that might be
-introduced by others.
-
-  Finally, software patents pose a constant threat to the existence of
-any free program.  We wish to make sure that a company cannot
-effectively restrict the users of a free program by obtaining a
-restrictive license from a patent holder.  Therefore, we insist that
-any patent license obtained for a version of the library must be
-consistent with the full freedom of use specified in this license.
-
-  Most GNU software, including some libraries, is covered by the
-ordinary GNU General Public License.  This license, the GNU Lesser
-General Public License, applies to certain designated libraries, and
-is quite different from the ordinary General Public License.  We use
-this license for certain libraries in order to permit linking those
-libraries into non-free programs.
-
-  When a program is linked with a library, whether statically or using
-a shared library, the combination of the two is legally speaking a
-combined work, a derivative of the original library.  The ordinary
-General Public License therefore permits such linking only if the
-entire combination fits its criteria of freedom.  The Lesser General
-Public License permits more lax criteria for linking other code with
-the library.
-
-  We call this license the "Lesser" General Public License because it
-does Less to protect the user's freedom than the ordinary General
-Public License.  It also provides other free software developers Less
-of an advantage over competing non-free programs.  These disadvantages
-are the reason we use the ordinary General Public License for many
-libraries.  However, the Lesser license provides advantages in certain
-special circumstances.
-
-  For example, on rare occasions, there may be a special need to
-encourage the widest possible use of a certain library, so that it becomes
-a de-facto standard.  To achieve this, non-free programs must be
-allowed to use the library.  A more frequent case is that a free
-library does the same job as widely used non-free libraries.  In this
-case, there is little to gain by limiting the free library to free
-software only, so we use the Lesser General Public License.
-
-  In other cases, permission to use a particular library in non-free
-programs enables a greater number of people to use a large body of
-free software.  For example, permission to use the GNU C Library in
-non-free programs enables many more people to use the whole GNU
-operating system, as well as its variant, the GNU/Linux operating
-system.
-
-  Although the Lesser General Public License is Less protective of the
-users' freedom, it does ensure that the user of a program that is
-linked with the Library has the freedom and the wherewithal to run
-that program using a modified version of the Library.
-
-  The precise terms and conditions for copying, distribution and
-modification follow.  Pay close attention to the difference between a
-"work based on the library" and a "work that uses the library".  The
-former contains code derived from the library, whereas the latter must
-be combined with the library in order to run.
-
-                  GNU LESSER GENERAL PUBLIC LICENSE
-   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
-  0. This License Agreement applies to any software library or other
-program which contains a notice placed by the copyright holder or
-other authorized party saying it may be distributed under the terms of
-this Lesser General Public License (also called "this License").
-Each licensee is addressed as "you".
-
-  A "library" means a collection of software functions and/or data
-prepared so as to be conveniently linked with application programs
-(which use some of those functions and data) to form executables.
-
-  The "Library", below, refers to any such software library or work
-which has been distributed under these terms.  A "work based on the
-Library" means either the Library or any derivative work under
-copyright law: that is to say, a work containing the Library or a
-portion of it, either verbatim or with modifications and/or translated
-straightforwardly into another language.  (Hereinafter, translation is
-included without limitation in the term "modification".)
-
-  "Source code" for a work means the preferred form of the work for
-making modifications to it.  For a library, complete source code means
-all the source code for all modules it contains, plus any associated
-interface definition files, plus the scripts used to control compilation
-and installation of the library.
-
-  Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope.  The act of
-running a program using the Library is not restricted, and output from
-such a program is covered only if its contents constitute a work based
-on the Library (independent of the use of the Library in a tool for
-writing it).  Whether that is true depends on what the Library does
-and what the program that uses the Library does.
-
-  1. You may copy and distribute verbatim copies of the Library's
-complete source code as you receive it, in any medium, provided that
-you conspicuously and appropriately publish on each copy an
-appropriate copyright notice and disclaimer of warranty; keep intact
-all the notices that refer to this License and to the absence of any
-warranty; and distribute a copy of this License along with the
-Library.
-
-  You may charge a fee for the physical act of transferring a copy,
-and you may at your option offer warranty protection in exchange for a
-fee.
-
-  2. You may modify your copy or copies of the Library or any portion
-of it, thus forming a work based on the Library, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
-    a) The modified work must itself be a software library.
-
-    b) You must cause the files modified to carry prominent notices
-    stating that you changed the files and the date of any change.
-
-    c) You must cause the whole of the work to be licensed at no
-    charge to all third parties under the terms of this License.
-
-    d) If a facility in the modified Library refers to a function or a
-    table of data to be supplied by an application program that uses
-    the facility, other than as an argument passed when the facility
-    is invoked, then you must make a good faith effort to ensure that,
-    in the event an application does not supply such function or
-    table, the facility still operates, and performs whatever part of
-    its purpose remains meaningful.
-
-    (For example, a function in a library to compute square roots has
-    a purpose that is entirely well-defined independent of the
-    application.  Therefore, Subsection 2d requires that any
-    application-supplied function or table used by this function must
-    be optional: if the application does not supply it, the square
-    root function must still compute square roots.)
-
-These requirements apply to the modified work as a whole.  If
-identifiable sections of that work are not derived from the Library,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works.  But when you
-distribute the same sections as part of a whole which is a work based
-on the Library, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote
-it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Library.
-
-In addition, mere aggregation of another work not based on the Library
-with the Library (or with a work based on the Library) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
-  3. You may opt to apply the terms of the ordinary GNU General Public
-License instead of this License to a given copy of the Library.  To do
-this, you must alter all the notices that refer to this License, so
-that they refer to the ordinary GNU General Public License, version 2,
-instead of to this License.  (If a newer version than version 2 of the
-ordinary GNU General Public License has appeared, then you can specify
-that version instead if you wish.)  Do not make any other change in
-these notices.
-
-  Once this change is made in a given copy, it is irreversible for
-that copy, so the ordinary GNU General Public License applies to all
-subsequent copies and derivative works made from that copy.
-
-  This option is useful when you wish to copy part of the code of
-the Library into a program that is not a library.
-
-  4. You may copy and distribute the Library (or a portion or
-derivative of it, under Section 2) in object code or executable form
-under the terms of Sections 1 and 2 above provided that you accompany
-it with the complete corresponding machine-readable source code, which
-must be distributed under the terms of Sections 1 and 2 above on a
-medium customarily used for software interchange.
-
-  If distribution of object code is made by offering access to copy
-from a designated place, then offering equivalent access to copy the
-source code from the same place satisfies the requirement to
-distribute the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
-  5. A program that contains no derivative of any portion of the
-Library, but is designed to work with the Library by being compiled or
-linked with it, is called a "work that uses the Library".  Such a
-work, in isolation, is not a derivative work of the Library, and
-therefore falls outside the scope of this License.
-
-  However, linking a "work that uses the Library" with the Library
-creates an executable that is a derivative of the Library (because it
-contains portions of the Library), rather than a "work that uses the
-library".  The executable is therefore covered by this License.
-Section 6 states terms for distribution of such executables.
-
-  When a "work that uses the Library" uses material from a header file
-that is part of the Library, the object code for the work may be a
-derivative work of the Library even though the source code is not.
-Whether this is true is especially significant if the work can be
-linked without the Library, or if the work is itself a library.  The
-threshold for this to be true is not precisely defined by law.
-
-  If such an object file uses only numerical parameters, data
-structure layouts and accessors, and small macros and small inline
-functions (ten lines or less in length), then the use of the object
-file is unrestricted, regardless of whether it is legally a derivative
-work.  (Executables containing this object code plus portions of the
-Library will still fall under Section 6.)
-
-  Otherwise, if the work is a derivative of the Library, you may
-distribute the object code for the work under the terms of Section 6.
-Any executables containing that work also fall under Section 6,
-whether or not they are linked directly with the Library itself.
-
-  6. As an exception to the Sections above, you may also combine or
-link a "work that uses the Library" with the Library to produce a
-work containing portions of the Library, and distribute that work
-under terms of your choice, provided that the terms permit
-modification of the work for the customer's own use and reverse
-engineering for debugging such modifications.
-
-  You must give prominent notice with each copy of the work that the
-Library is used in it and that the Library and its use are covered by
-this License.  You must supply a copy of this License.  If the work
-during execution displays copyright notices, you must include the
-copyright notice for the Library among them, as well as a reference
-directing the user to the copy of this License.  Also, you must do one
-of these things:
-
-    a) Accompany the work with the complete corresponding
-    machine-readable source code for the Library including whatever
-    changes were used in the work (which must be distributed under
-    Sections 1 and 2 above); and, if the work is an executable linked
-    with the Library, with the complete machine-readable "work that
-    uses the Library", as object code and/or source code, so that the
-    user can modify the Library and then relink to produce a modified
-    executable containing the modified Library.  (It is understood
-    that the user who changes the contents of definitions files in the
-    Library will not necessarily be able to recompile the application
-    to use the modified definitions.)
-
-    b) Use a suitable shared library mechanism for linking with the
-    Library.  A suitable mechanism is one that (1) uses at run time a
-    copy of the library already present on the user's computer system,
-    rather than copying library functions into the executable, and (2)
-    will operate properly with a modified version of the library, if
-    the user installs one, as long as the modified version is
-    interface-compatible with the version that the work was made with.
-
-    c) Accompany the work with a written offer, valid for at
-    least three years, to give the same user the materials
-    specified in Subsection 6a, above, for a charge no more
-    than the cost of performing this distribution.
-
-    d) If distribution of the work is made by offering access to copy
-    from a designated place, offer equivalent access to copy the above
-    specified materials from the same place.
-
-    e) Verify that the user has already received a copy of these
-    materials or that you have already sent this user a copy.
-
-  For an executable, the required form of the "work that uses the
-Library" must include any data and utility programs needed for
-reproducing the executable from it.  However, as a special exception,
-the materials to be distributed need not include anything that is
-normally distributed (in either source or binary form) with the major
-components (compiler, kernel, and so on) of the operating system on
-which the executable runs, unless that component itself accompanies
-the executable.
-
-  It may happen that this requirement contradicts the license
-restrictions of other proprietary libraries that do not normally
-accompany the operating system.  Such a contradiction means you cannot
-use both them and the Library together in an executable that you
-distribute.
-
-  7. You may place library facilities that are a work based on the
-Library side-by-side in a single library together with other library
-facilities not covered by this License, and distribute such a combined
-library, provided that the separate distribution of the work based on
-the Library and of the other library facilities is otherwise
-permitted, and provided that you do these two things:
-
-    a) Accompany the combined library with a copy of the same work
-    based on the Library, uncombined with any other library
-    facilities.  This must be distributed under the terms of the
-    Sections above.
-
-    b) Give prominent notice with the combined library of the fact
-    that part of it is a work based on the Library, and explaining
-    where to find the accompanying uncombined form of the same work.
-
-  8. You may not copy, modify, sublicense, link with, or distribute
-the Library except as expressly provided under this License.  Any
-attempt otherwise to copy, modify, sublicense, link with, or
-distribute the Library is void, and will automatically terminate your
-rights under this License.  However, parties who have received copies,
-or rights, from you under this License will not have their licenses
-terminated so long as such parties remain in full compliance.
-
-  9. You are not required to accept this License, since you have not
-signed it.  However, nothing else grants you permission to modify or
-distribute the Library or its derivative works.  These actions are
-prohibited by law if you do not accept this License.  Therefore, by
-modifying or distributing the Library (or any work based on the
-Library), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Library or works based on it.
-
-  10. Each time you redistribute the Library (or any work based on the
-Library), the recipient automatically receives a license from the
-original licensor to copy, distribute, link with or modify the Library
-subject to these terms and conditions.  You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties with
-this License.
-
-  11. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License.  If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Library at all.  For example, if a patent
-license would not permit royalty-free redistribution of the Library by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Library.
-
-If any portion of this section is held invalid or unenforceable under any
-particular circumstance, the balance of the section is intended to apply,
-and the section as a whole is intended to apply in other circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system which is
-implemented by public license practices.  Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
-  12. If the distribution and/or use of the Library is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Library under this License may add
-an explicit geographical distribution limitation excluding those countries,
-so that distribution is permitted only in or among countries not thus
-excluded.  In such case, this License incorporates the limitation as if
-written in the body of this License.
-
-  13. The Free Software Foundation may publish revised and/or new
-versions of the Lesser General Public License from time to time.
-Such new versions will be similar in spirit to the present version,
-but may differ in detail to address new problems or concerns.
-
-Each version is given a distinguishing version number.  If the Library
-specifies a version number of this License which applies to it and
-"any later version", you have the option of following the terms and
-conditions either of that version or of any later version published by
-the Free Software Foundation.  If the Library does not specify a
-license version number, you may choose any version ever published by
-the Free Software Foundation.
-
-  14. If you wish to incorporate parts of the Library into other free
-programs whose distribution conditions are incompatible with these,
-write to the author to ask for permission.  For software which is
-copyrighted by the Free Software Foundation, write to the Free
-Software Foundation; we sometimes make exceptions for this.  Our
-decision will be guided by the two goals of preserving the free status
-of all derivatives of our free software and of promoting the sharing
-and reuse of software generally.
-
-                            NO WARRANTY
-
-  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
-WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
-EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
-OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
-KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
-LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
-THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-
-  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
-WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
-AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
-FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
-CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
-LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
-RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
-FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
-SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
-DAMAGES.
-
-                     END OF TERMS AND CONDITIONS
-
-           How to Apply These Terms to Your New Libraries
-
-  If you develop a new library, and you want it to be of the greatest
-possible use to the public, we recommend making it free software that
-everyone can redistribute and change.  You can do so by permitting
-redistribution under these terms (or, alternatively, under the terms of the
-ordinary General Public License).
-
-  To apply these terms, attach the following notices to the library.  It is
-safest to attach them to the start of each source file to most effectively
-convey the exclusion of warranty; and each file should have at least the
-"copyright" line and a pointer to where the full notice is found.
-
-    
-    Copyright (C)   
-
-    This library is free software; you can redistribute it and/or
-    modify it under the terms of the GNU Lesser General Public
-    License as published by the Free Software Foundation; either
-    version 2.1 of the License, or (at your option) any later version.
-
-    This library is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-    Lesser General Public License for more details.
-
-    You should have received a copy of the GNU Lesser General Public
-    License along with this library; if not, write to the Free Software
-    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
-
-Also add information on how to contact you by electronic and paper mail.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the library, if
-necessary.  Here is a sample; alter the names:
-
-  Yoyodyne, Inc., hereby disclaims all copyright interest in the
-  library `Frob' (a library for tweaking knobs) written by James Random Hacker.
-
-  , 1 April 1990
-  Ty Coon, President of Vice
-
-That's all there is to it!
diff --git a/telldus-core/client/CMakeLists.txt b/telldus-core/client/CMakeLists.txt
deleted file mode 100644
index 3336d298..00000000
--- a/telldus-core/client/CMakeLists.txt
+++ /dev/null
@@ -1,131 +0,0 @@
-IF(COMMAND cmake_policy)
-	cmake_policy(SET CMP0003 NEW)
-ENDIF(COMMAND cmake_policy)
-
-FIND_PACKAGE( SignTool REQUIRED )
-
-######## Non configurable options  ########
-SET( telldus-core_SRCS
-	CallbackDispatcher.cpp
-	CallbackMainDispatcher.cpp
-	Client.cpp
-	telldus-core.cpp
-)
-
-SET( telldus-core_HDRS
-	CallbackDispatcher.h
-	CallbackMainDispatcher.cpp
-	Client.h
-)
-SET( telldus-core_PUB_HDRS
-	telldus-core.h
-)
-
-FIND_PACKAGE(Threads)
-LIST(APPEND telldus-core_LIBRARIES ${CMAKE_THREAD_LIBS_INIT})
-
-INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR})
-
-######## Configurable options for the platform  ########
-
-
-
-######## Platforms-specific, non configurable  ########
-
-IF (APPLE)
-	#### Mac OS X ####
-	SET( telldus-core_TARGET	TelldusCore )
-	ADD_DEFINITIONS(
-		-D_MACOSX
-	)
-	LIST(APPEND telldus-core_LIBRARIES
-		TelldusCommon
-	)
-ELSEIF (WIN32)
-	#### Windows ####
-	ADD_DEFINITIONS( -DUNICODE )
-	ADD_DEFINITIONS( /Zc:wchar_t- ) # Treat wchar_t as Built-in Type' = No
-	SET( telldus-core_TARGET	TelldusCore )
-	LIST(APPEND telldus-core_LIBRARIES
-		TelldusCommon
-	)
-	CONFIGURE_FILE(
-		${CMAKE_CURRENT_SOURCE_DIR}/telldus-core.rc.in
-		${CMAKE_CURRENT_BINARY_DIR}/telldus-core.rc
-	)
-	LIST(APPEND telldus-core_SRCS
-			libtelldus-core.def
-			${CMAKE_CURRENT_SOURCE_DIR}/telldus-core.rc.in
-			${CMAKE_CURRENT_BINARY_DIR}/telldus-core.rc
-	)
-	ADD_DEFINITIONS(
-		-D_WINDOWS
-		-DTELLDUSCORE_EXPORTS
-	)
-	IF (CMAKE_CL_64)
-		ADD_DEFINITIONS(-D_CL64)
-	ENDIF(CMAKE_CL_64)
-ELSE (APPLE)
-	#### Linux ####
-	SET( telldus-core_TARGET	telldus-core )
-	LIST(APPEND telldus-core_LIBRARIES
-		TelldusCommon
-	)
-
-	ADD_DEFINITIONS(
-		-D_LINUX
-	)
-ENDIF (APPLE)
-
-
-
-######## Configuring  ########
-
-ADD_LIBRARY(${telldus-core_TARGET} SHARED
-	${telldus-core_SRCS}
-	${telldus-core_HDRS}
-	${telldus-core_PUB_HDRS}
-)
-
-#Copy public headers files on windows
-IF (WIN32)
-	FOREACH(_FILE ${telldus-core_PUB_HDRS})
-		ADD_CUSTOM_COMMAND( TARGET ${telldus-core_TARGET}
-			POST_BUILD
-			COMMAND ${CMAKE_COMMAND} -E copy \"${CMAKE_CURRENT_SOURCE_DIR}/${_FILE}\" \"${LIBRARY_OUTPUT_PATH}/${CMAKE_CFG_INTDIR}\"
-			COMMENT "Copy ${_FILE}"
-		)
-	ENDFOREACH(_FILE)
-ENDIF ()
-
-ADD_DEPENDENCIES(${telldus-core_TARGET} TelldusCommon)
-
-IF (UNIX)
-	SET_TARGET_PROPERTIES( ${telldus-core_TARGET} PROPERTIES COMPILE_FLAGS "-fPIC -fvisibility=hidden")
-ENDIF (UNIX)
-
-TARGET_LINK_LIBRARIES( ${telldus-core_TARGET}	${telldus-core_LIBRARIES} )
-
-SET(telldus-core_TARGET ${telldus-core_TARGET} PARENT_SCOPE)
-SET_TARGET_PROPERTIES(${telldus-core_TARGET} PROPERTIES
-	FRAMEWORK TRUE
-	INSTALL_NAME_DIR "/Library/Frameworks"
-	PUBLIC_HEADER ${telldus-core_PUB_HDRS}
-	VERSION ${PACKAGE_VERSION}
-	SOVERSION ${PACKAGE_SOVERSION}
-)
-SIGN(${telldus-core_TARGET})
-
-IF (NOT LIB_INSTALL_DIR)
-	SET(LIB_INSTALL_DIR "lib")
-ENDIF (NOT LIB_INSTALL_DIR)
-
-IF (UNIX)
-	INSTALL(TARGETS ${telldus-core_TARGET}
-		LIBRARY         DESTINATION   ${LIB_INSTALL_DIR}
-		ARCHIVE         DESTINATION   ${LIB_INSTALL_DIR}
-		FRAMEWORK       DESTINATION   "/Library/Frameworks"
-		PUBLIC_HEADER   DESTINATION   include
-	)
-ENDIF (UNIX)
-
diff --git a/telldus-core/client/CallbackDispatcher.cpp b/telldus-core/client/CallbackDispatcher.cpp
deleted file mode 100644
index a1f72263..00000000
--- a/telldus-core/client/CallbackDispatcher.cpp
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
- *  CallbackDispatcher.cpp
- *  telldus-core
- *
- *  Created by Micke Prag on 2010-11-02.
- *  Copyright 2010 Telldus Technologies AB. All rights reserved.
- *
- */
-
-#include "client/CallbackDispatcher.h"
-#include "common/Event.h"
-#include "common/EventHandler.h"
-
-namespace TelldusCore {
-
-class TDEventDispatcher::PrivateData {
-public:
-	EventHandler eventHandler;
-	EventRef stopEvent, callbackEvent;
-	int id;
-	void *func, *context;
-};
-
-TDEventDispatcher::TDEventDispatcher(int id, void *func, void *context)
-	:Thread() {
-	d = new PrivateData;
-	d->stopEvent = d->eventHandler.addEvent();
-	d->callbackEvent = d->eventHandler.addEvent();
-	d->id = id;
-	d->func = func;
-	d->context = context;
-	this->start();
-}
-
-TDEventDispatcher::~TDEventDispatcher() {
-	d->stopEvent->signal();
-	this->wait();
-	delete d;
-}
-
-int TDEventDispatcher::id() const {
-	return d->id;
-}
-
-void TDEventDispatcher::queue(EventDataRef eventData) {
-	d->callbackEvent->signal(eventData);
-}
-
-void TDEventDispatcher::run() {
-	while (!d->stopEvent->isSignaled()) {
-		d->eventHandler.waitForAny();
-		if (d->callbackEvent->isSignaled()) {
-			TelldusCore::EventDataRef eventData = d->callbackEvent->takeSignal();
-			this->execute(eventData);
-		}
-	}
-}
-
-TDDeviceEventDispatcher::TDDeviceEventDispatcher(int id, void *func, void *context)
-	:TDEventDispatcher(id, func, context)
-{}
-
-void TDDeviceEventDispatcher::execute(EventDataRef eventData) {
-	DeviceEventCallbackData *data = dynamic_cast(eventData.get());
-	if (!data) {
-		return;
-	}
-	((TDDeviceEvent)d->func)(data->deviceId, data->deviceState, data->deviceStateValue.c_str(), d->id, d->context);
-}
-
-CallbackStruct::CallbackType TDDeviceEventDispatcher::type() {
-	return CallbackStruct::DeviceEvent;
-}
-
-TDDeviceChangeEventDispatcher::TDDeviceChangeEventDispatcher(int id, void *func, void *context)
-	:TDEventDispatcher(id, func, context)
-{}
-
-void TDDeviceChangeEventDispatcher::execute(EventDataRef eventData) {
-	DeviceChangeEventCallbackData *data = dynamic_cast(eventData.get());
-	if (!data) {
-		return;
-	}
-	((TDDeviceChangeEvent)d->func)(data->deviceId, data->changeEvent, data->changeType, d->id, d->context);
-}
-
-CallbackStruct::CallbackType TDDeviceChangeEventDispatcher::type() {
-	return CallbackStruct::DeviceChangeEvent;
-}
-
-TDRawDeviceEventDispatcher::TDRawDeviceEventDispatcher(int id, void *func, void *context)
-	:TDEventDispatcher(id, func, context)
-{}
-
-void TDRawDeviceEventDispatcher::execute(EventDataRef eventData) {
-	RawDeviceEventCallbackData *data = dynamic_cast(eventData.get());
-	if (!data) {
-		return;
-	}
-	((TDRawDeviceEvent)d->func)(data->data.c_str(), data->controllerId, d->id, d->context);
-}
-
-CallbackStruct::CallbackType TDRawDeviceEventDispatcher::type() {
-	return CallbackStruct::RawDeviceEvent;
-}
-
-TDSensorEventDispatcher::TDSensorEventDispatcher(int id, void *func, void *context)
-	:TDEventDispatcher(id, func, context)
-{}
-
-void TDSensorEventDispatcher::execute(EventDataRef eventData) {
-	SensorEventCallbackData *data = dynamic_cast(eventData.get());
-	if (!data) {
-		return;
-	}
-	((TDSensorEvent)d->func)(data->protocol.c_str(), data->model.c_str(), data->id, data->dataType, data->value.c_str(), data->timestamp, d->id, d->context);
-}
-
-CallbackStruct::CallbackType TDSensorEventDispatcher::type() {
-	return CallbackStruct::SensorEvent;
-}
-
-TDControllerEventDispatcher::TDControllerEventDispatcher(int id, void *func, void *context)
-	:TDEventDispatcher(id, func, context)
-{}
-
-void TDControllerEventDispatcher::execute(EventDataRef eventData) {
-	ControllerEventCallbackData *data = dynamic_cast(eventData.get());
-	if (!data) {
-		return;
-	}
-	((TDControllerEvent)d->func)(data->controllerId, data->changeEvent, data->changeType, data->newValue.c_str(), d->id, d->context);
-}
-
-CallbackStruct::CallbackType TDControllerEventDispatcher::type() {
-	return CallbackStruct::ControllerEvent;
-}
-
-}  // namespace TelldusCore
diff --git a/telldus-core/client/CallbackDispatcher.h b/telldus-core/client/CallbackDispatcher.h
deleted file mode 100644
index 4b387906..00000000
--- a/telldus-core/client/CallbackDispatcher.h
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- *  CallbackDispatcher.h
- *  telldus-core
- *
- *  Created by Micke Prag on 2010-11-02.
- *  Copyright 2010 Telldus Technologies AB. All rights reserved.
- *
- */
-
-#ifndef TELLDUS_CORE_CLIENT_CALLBACKDISPATCHER_H_
-#define TELLDUS_CORE_CLIENT_CALLBACKDISPATCHER_H_
-
-#include 
-#include "common/common.h"
-#include "common/Event.h"
-#include "common/Thread.h"
-#include "common/Mutex.h"
-#include "client/telldus-core.h"
-
-namespace TelldusCore {
-
-	struct CallbackStruct {
-		enum CallbackType { DeviceEvent, DeviceChangeEvent, RawDeviceEvent, SensorEvent, ControllerEvent };
-		CallbackType type;
-		void *event;
-		int id;
-		void *context;
-		TelldusCore::Mutex mutex;
-	};
-
-	class CallbackData: public EventDataBase {
-	public:
-		explicit CallbackData(CallbackStruct::CallbackType t) : EventDataBase(), type(t) {}
-		CallbackStruct::CallbackType type;
-	};
-
-	class DeviceEventCallbackData : public CallbackData {
-	public:
-		DeviceEventCallbackData() : CallbackData(CallbackStruct::DeviceEvent) {}
-		int deviceId;
-		int deviceState;
-		std::string deviceStateValue;
-	};
-	class DeviceChangeEventCallbackData : public CallbackData {
-	public:
-		DeviceChangeEventCallbackData() : CallbackData(CallbackStruct::DeviceChangeEvent) {}
-		int deviceId;
-		int changeEvent;
-		int changeType;
-	};
-
-	class RawDeviceEventCallbackData : public CallbackData {
-	public:
-		RawDeviceEventCallbackData() : CallbackData(CallbackStruct::RawDeviceEvent) {}
-		std::string data;
-		int controllerId;
-	};
-
-	class SensorEventCallbackData : public CallbackData {
-	public:
-		SensorEventCallbackData() : CallbackData(CallbackStruct::SensorEvent) {}
-		std::string protocol;
-		std::string model;
-		int id;
-		int dataType;
-		std::string value;
-		int timestamp;
-	};
-	class ControllerEventCallbackData : public CallbackData {
-	public:
-		ControllerEventCallbackData() : CallbackData(CallbackStruct::ControllerEvent) {}
-		int controllerId;
-		int changeEvent;
-		int changeType;
-		std::string newValue;
-	};
-
-	class TDEventDispatcher : public Thread {
-	public:
-		TDEventDispatcher(int id, void *func, void *context);
-		virtual ~TDEventDispatcher();
-		int id() const;
-		void queue(EventDataRef eventData);
-		virtual CallbackStruct::CallbackType type() = 0;
-	protected:
-		class PrivateData;
-		PrivateData *d;
-
-		virtual void run();
-		virtual void execute(EventDataRef eventData) = 0;
-	};
-	class TDDeviceEventDispatcher : public TDEventDispatcher {
-	public:
-		TDDeviceEventDispatcher(int id, void *func, void *context);
-		virtual CallbackStruct::CallbackType type();
-	protected:
-		virtual void execute(EventDataRef eventData);
-	};
-	class TDDeviceChangeEventDispatcher : public TDEventDispatcher {
-	public:
-		TDDeviceChangeEventDispatcher(int id, void *func, void *context);
-		virtual CallbackStruct::CallbackType type();
-	protected:
-		virtual void execute(EventDataRef eventData);
-	};
-	class TDRawDeviceEventDispatcher : public TDEventDispatcher {
-	public:
-		TDRawDeviceEventDispatcher(int id, void *func, void *context);
-		virtual CallbackStruct::CallbackType type();
-	protected:
-		virtual void execute(EventDataRef eventData);
-	};
-	class TDSensorEventDispatcher : public TDEventDispatcher {
-	public:
-		TDSensorEventDispatcher(int id, void *func, void *context);
-		virtual CallbackStruct::CallbackType type();
-	protected:
-		virtual void execute(EventDataRef eventData);
-	};
-	class TDControllerEventDispatcher : public TDEventDispatcher {
-	public:
-		TDControllerEventDispatcher(int id, void *func, void *context);
-		virtual CallbackStruct::CallbackType type();
-	protected:
-		virtual void execute(EventDataRef eventData);
-	};
-}
-
-#endif  // TELLDUS_CORE_CLIENT_CALLBACKDISPATCHER_H_
diff --git a/telldus-core/client/CallbackMainDispatcher.cpp b/telldus-core/client/CallbackMainDispatcher.cpp
deleted file mode 100644
index 5b495449..00000000
--- a/telldus-core/client/CallbackMainDispatcher.cpp
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- *  CallbackMainDispatcher.cpp
- *  telldus-core
- *
- *  Created by Stefan Persson on 2012-02-23.
- *  Copyright 2012 Telldus Technologies AB. All rights reserved.
- *
- */
-
-#include "client/CallbackMainDispatcher.h"
-
-#include 
-
-namespace TelldusCore {
-
-typedef std::list CallbackList;
-
-class CallbackMainDispatcher::PrivateData {
-public:
-	Mutex mutex;
-	CallbackList callbackList;
-	int lastCallbackId;
-};
-
-CallbackMainDispatcher::CallbackMainDispatcher() {
-	d = new PrivateData;
-	d->lastCallbackId = 0;
-}
-
-CallbackMainDispatcher::~CallbackMainDispatcher(void) {
-	{
-		TelldusCore::MutexLocker locker(&d->mutex);
-		for(CallbackList::iterator it = d->callbackList.begin(); it != d->callbackList.end(); ++it) {
-			delete (*it);
-		}
-	}
-	delete d;
-}
-
-void CallbackMainDispatcher::execute(CallbackStruct::CallbackType type, EventData *eventData) {
-	{
-		TelldusCore::MutexLocker locker(&d->mutex);
-		EventDataRef eventDataRef(eventData);
-		for(CallbackList::iterator callback_it = d->callbackList.begin(); callback_it != d->callbackList.end(); ++callback_it) {
-			if ( (*callback_it)->type() != type ) {
-				continue;
-			}
-			(*callback_it)->queue(eventDataRef);
-		}
-	}
-}
-
-int CallbackMainDispatcher::registerCallback(CallbackStruct::CallbackType type, void *eventFunction, void *context) {
-	TelldusCore::MutexLocker locker(&d->mutex);
-	int id = ++d->lastCallbackId;
-	TelldusCore::TDEventDispatcher *callback;
-	if (type == CallbackStruct::DeviceEvent) {
-		callback = new TelldusCore::TDDeviceEventDispatcher(id, eventFunction, context);
-	} else if (type == CallbackStruct::DeviceChangeEvent) {
-		callback = new TelldusCore::TDDeviceChangeEventDispatcher(id, eventFunction, context);
-	} else if (type == CallbackStruct::RawDeviceEvent) {
-		callback = new TelldusCore::TDRawDeviceEventDispatcher(id, eventFunction, context);
-	} else if (type == CallbackStruct::SensorEvent) {
-		callback = new TelldusCore::TDSensorEventDispatcher(id, eventFunction, context);
-	} else if (type == CallbackStruct::ControllerEvent) {
-		callback = new TelldusCore::TDControllerEventDispatcher(id, eventFunction, context);
-	} else {
-		return -1;
-	}
-	d->callbackList.push_back(callback);
-	return id;
-}
-
-int CallbackMainDispatcher::unregisterCallback(int callbackId) {
-	CallbackList newEventList;
-	{
-		TelldusCore::MutexLocker locker(&d->mutex);
-		for(CallbackList::iterator callback_it = d->callbackList.begin(); callback_it != d->callbackList.end(); ++callback_it) {
-			if ( (*callback_it)->id() != callbackId ) {
-				continue;
-			}
-			newEventList.splice(newEventList.begin(), d->callbackList, callback_it);
-			break;
-		}
-	}
-	if (newEventList.size()) {
-		CallbackList::iterator it = newEventList.begin();
-		delete (*it);
-		newEventList.erase(it);
-		return TELLSTICK_SUCCESS;
-	}
-	return TELLSTICK_ERROR_NOT_FOUND;
-}
-
-}  // namespace TelldusCore
diff --git a/telldus-core/client/CallbackMainDispatcher.h b/telldus-core/client/CallbackMainDispatcher.h
deleted file mode 100644
index 911d21a4..00000000
--- a/telldus-core/client/CallbackMainDispatcher.h
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- *  CallbackMainDispatcher.h
- *  telldus-core
- *
- *  Created by Stefan Persson on 2012-02-23.
- *  Copyright 2012 Telldus Technologies AB. All rights reserved.
- *
- */
-
-#ifndef CALLBACKMAINDISPATCHER_H
-#define CALLBACKMAINDISPATCHER_H
-
-#include "client/CallbackDispatcher.h"
-#include "common/Thread.h"
-
-namespace TelldusCore {
-
-	class CallbackMainDispatcher
-	{
-	public:
-		CallbackMainDispatcher(void);
-		~CallbackMainDispatcher(void);
-
-		void execute(TelldusCore::CallbackStruct::CallbackType type, EventData *eventData);
-
-		int registerCallback( TelldusCore::CallbackStruct::CallbackType type, void *eventFunction, void *context );
-		int unregisterCallback( int callbackId );
-
-	private:
-		class PrivateData;
-		PrivateData *d;
-	};
-}
-
-#endif //CALLBACKMAINDISPATCHER_H
diff --git a/telldus-core/client/Client.cpp b/telldus-core/client/Client.cpp
deleted file mode 100644
index 3cd095ce..00000000
--- a/telldus-core/client/Client.cpp
+++ /dev/null
@@ -1,269 +0,0 @@
-//
-// Copyright (C) 2012 Telldus Technologies AB. All rights reserved.
-//
-// Copyright: See COPYING file that comes with this distribution
-//
-//
-#include "client/Client.h"
-
-#include 
-
-#include "client/CallbackDispatcher.h"
-#include "client/CallbackMainDispatcher.h"
-#include "common/Socket.h"
-#include "common/Strings.h"
-#include "common/Mutex.h"
-
-namespace TelldusCore {
-
-class Client::PrivateData {
-public:
-	Socket eventSocket;
-	bool running, sensorCached, controllerCached;
-	std::wstring sensorCache, controllerCache;
-	TelldusCore::Mutex mutex;
-	CallbackMainDispatcher callbackMainDispatcher;
-};
-
-Client *Client::instance = 0;
-
-Client::Client()
-	: Thread() {
-	d = new PrivateData;
-	d->running = true;
-	d->sensorCached = false;
-	d->controllerCached = false;
-	start();
-}
-
-Client::~Client(void) {
-	stopThread();
-	wait();
-	{
-		TelldusCore::MutexLocker locker(&d->mutex);
-	}
-	delete d;
-}
-
-void Client::close() {
-	if (Client::instance != 0) {
-		delete Client::instance;
-		Client::instance = 0;
-	}
-}
-
-Client *Client::getInstance() {
-	if (Client::instance == 0) {
-		Client::instance = new Client();
-	}
-	return Client::instance;
-}
-
-bool Client::getBoolFromService(const Message &msg) {
-	return getIntegerFromService(msg) == TELLSTICK_SUCCESS;
-}
-
-int Client::getIntegerFromService(const Message &msg) {
-	std::wstring response = sendToService(msg);
-	if (response.compare(L"") == 0) {
-		return TELLSTICK_ERROR_COMMUNICATING_SERVICE;
-	}
-	return Message::takeInt(&response);
-}
-
-std::wstring Client::getWStringFromService(const Message &msg) {
-	std::wstring response = sendToService(msg);
-	return Message::takeString(&response);
-}
-
-int Client::registerEvent( CallbackStruct::CallbackType type, void *eventFunction, void *context ) {
-	return d->callbackMainDispatcher.registerCallback(type, eventFunction, context );
-}
-
-void Client::run() {
-	// listen here
-	d->eventSocket.connect(L"TelldusEvents");
-
-	while(d->running) {
-		if(!d->eventSocket.isConnected()) {
-			d->eventSocket.connect(L"TelldusEvents");  // try to reconnect to service
-			if(!d->eventSocket.isConnected()) {
-				// reconnect didn't succeed, wait a while and try again
-				msleep(2000);
-				continue;
-			}
-		}
-
-		std::wstring clientMessage = d->eventSocket.read(1000);  // testing 5 second timeout
-
-		while(clientMessage != L"") {
-			// a message arrived
-			std::wstring type = Message::takeString(&clientMessage);
-			if(type == L"TDDeviceChangeEvent") {
-				DeviceChangeEventCallbackData *data = new DeviceChangeEventCallbackData();
-				data->deviceId = Message::takeInt(&clientMessage);
-				data->changeEvent = Message::takeInt(&clientMessage);
-				data->changeType = Message::takeInt(&clientMessage);
-				d->callbackMainDispatcher.execute(CallbackStruct::DeviceChangeEvent, data);
-
-			} else if(type == L"TDDeviceEvent") {
-				DeviceEventCallbackData *data = new DeviceEventCallbackData();
-				data->deviceId = Message::takeInt(&clientMessage);
-				data->deviceState = Message::takeInt(&clientMessage);
-				data->deviceStateValue = TelldusCore::wideToString(Message::takeString(&clientMessage));
-				d->callbackMainDispatcher.execute(CallbackStruct::DeviceEvent, data);
-
-			} else if(type == L"TDRawDeviceEvent") {
-				RawDeviceEventCallbackData *data = new RawDeviceEventCallbackData();
-				data->data = TelldusCore::wideToString(Message::takeString(&clientMessage));
-				data->controllerId = Message::takeInt(&clientMessage);
-				d->callbackMainDispatcher.execute(CallbackStruct::RawDeviceEvent, data);
-
-			} else if(type == L"TDSensorEvent") {
-				SensorEventCallbackData *data = new SensorEventCallbackData();
-				data->protocol = TelldusCore::wideToString(Message::takeString(&clientMessage));
-				data->model = TelldusCore::wideToString(Message::takeString(&clientMessage));
-				data->id = Message::takeInt(&clientMessage);
-				data->dataType = Message::takeInt(&clientMessage);
-				data->value = TelldusCore::wideToString(Message::takeString(&clientMessage));
-				data->timestamp = Message::takeInt(&clientMessage);
-				d->callbackMainDispatcher.execute(CallbackStruct::SensorEvent, data);
-
-			} else if(type == L"TDControllerEvent") {
-				ControllerEventCallbackData *data = new ControllerEventCallbackData();
-				data->controllerId = Message::takeInt(&clientMessage);
-				data->changeEvent = Message::takeInt(&clientMessage);
-				data->changeType = Message::takeInt(&clientMessage);
-				data->newValue = TelldusCore::wideToString(Message::takeString(&clientMessage));
-				d->callbackMainDispatcher.execute(CallbackStruct::ControllerEvent, data);
-
-			} else {
-				clientMessage = L"";  // cleanup, if message contained garbage/unhandled data
-			}
-		}
-	}
-}
-
-std::wstring Client::sendToService(const Message &msg) {
-	int tries = 0;
-	std::wstring readData;
-	while(tries < 20) {
-		tries++;
-		if(tries == 20) {
-			TelldusCore::Message msg;
-			msg.addArgument(TELLSTICK_ERROR_CONNECTING_SERVICE);
-			return msg;
-		}
-		Socket s;
-		s.connect(L"TelldusClient");
-		if (!s.isConnected()) {  // sConnection failed
-			msleep(500);
-			continue;  // retry
-		}
-		s.write(msg.data());
-		if (!s.isConnected()) {  // Connection failed sometime during operation... (better check here, instead of 5 seconds timeout later)
-			msleep(500);
-			continue;  // retry
-		}
-		readData = s.read(1000);
-		if(readData == L"") {
-			msleep(500);
-			continue;
-		}
-
-		if (!s.isConnected()) {  // Connection failed sometime during operation...
-			msleep(500);
-			continue;  // retry
-		}
-		break;
-	}
-
-	return readData;
-}
-
-void Client::stopThread() {
-	d->running = false;
-	d->eventSocket.stopReadWait();
-}
-
-int Client::unregisterCallback( int callbackId ) {
-	return d->callbackMainDispatcher.unregisterCallback(callbackId);
-}
-
-int Client::getSensor(char *protocol, int protocolLen, char *model, int modelLen, int *sensorId, int *dataTypes) {
-	if (!d->sensorCached) {
-		Message msg(L"tdSensor");
-		std::wstring response = Client::getWStringFromService(msg);
-		int count = Message::takeInt(&response);
-		d->sensorCached = true;
-		d->sensorCache = L"";
-		if (count > 0) {
-			d->sensorCache = response;
-		}
-	}
-
-	if (d->sensorCache == L"") {
-		d->sensorCached = false;
-		return TELLSTICK_ERROR_DEVICE_NOT_FOUND;
-	}
-
-	std::wstring p = Message::takeString(&d->sensorCache);
-	std::wstring m = Message::takeString(&d->sensorCache);
-	int id = Message::takeInt(&d->sensorCache);
-	int dt = Message::takeInt(&d->sensorCache);
-
-	if (protocol && protocolLen) {
-		strncpy(protocol, TelldusCore::wideToString(p).c_str(), protocolLen);
-	}
-	if (model && modelLen) {
-		strncpy(model, TelldusCore::wideToString(m).c_str(), modelLen);
-	}
-	if (sensorId) {
-		(*sensorId) = id;
-	}
-	if (dataTypes) {
-		(*dataTypes) = dt;
-	}
-
-	return TELLSTICK_SUCCESS;
-}
-
-int Client::getController(int *controllerId, int *controllerType, char *name, int nameLen, int *available) {
-	if (!d->controllerCached) {
-		Message msg(L"tdController");
-		std::wstring response = Client::getWStringFromService(msg);
-		int count = Message::takeInt(&response);
-		d->controllerCached = true;
-		d->controllerCache = L"";
-		if (count > 0) {
-			d->controllerCache = response;
-		}
-	}
-
-	if (d->controllerCache == L"") {
-		d->controllerCached = false;
-		return TELLSTICK_ERROR_NOT_FOUND;
-	}
-
-	int id = Message::takeInt(&d->controllerCache);
-	int type = Message::takeInt(&d->controllerCache);
-	std::wstring n = Message::takeString(&d->controllerCache);
-	int a = Message::takeInt(&d->controllerCache);
-
-	if (controllerId) {
-		(*controllerId) = id;
-	}
-	if (controllerType) {
-		(*controllerType) = type;
-	}
-	if (name && nameLen) {
-		strncpy(name, TelldusCore::wideToString(n).c_str(), nameLen);
-	}
-	if (available) {
-		(*available) = a;
-	}
-
-	return TELLSTICK_SUCCESS;
-}
-
-}  // namespace TelldusCore
diff --git a/telldus-core/client/Client.h b/telldus-core/client/Client.h
deleted file mode 100644
index ce47a543..00000000
--- a/telldus-core/client/Client.h
+++ /dev/null
@@ -1,47 +0,0 @@
-//
-// Copyright (C) 2012 Telldus Technologies AB. All rights reserved.
-//
-// Copyright: See COPYING file that comes with this distribution
-//
-//
-#ifndef TELLDUS_CORE_CLIENT_CLIENT_H_
-#define TELLDUS_CORE_CLIENT_CLIENT_H_
-
-#include "client/telldus-core.h"
-#include "client/CallbackDispatcher.h"
-#include "common/Message.h"
-#include "common/Thread.h"
-
-namespace TelldusCore {
-	class Client : public Thread {
-	public:
-		~Client(void);
-
-		static Client *getInstance();
-		static void close();
-
-		int registerEvent(CallbackStruct::CallbackType type, void *eventFunction, void *context );
-		void stopThread(void);
-		int unregisterCallback( int callbackId );
-
-		int getSensor(char *protocol, int protocolLen, char *model, int modelLen, int *id, int *dataTypes);
-		int getController(int *controllerId, int *controllerType, char *name, int nameLen, int *available);
-
-		static bool getBoolFromService(const Message &msg);
-		static int getIntegerFromService(const Message &msg);
-		static std::wstring getWStringFromService(const Message &msg);
-
-	protected:
-			void run(void);
-
-	private:
-		Client();
-		static std::wstring sendToService(const Message &msg);
-
-		class PrivateData;
-		PrivateData *d;
-		static Client *instance;
-	};
-}
-
-#endif  // TELLDUS_CORE_CLIENT_CLIENT_H_
diff --git a/telldus-core/client/telldus-core.cpp b/telldus-core/client/telldus-core.cpp
deleted file mode 100644
index c9a977b6..00000000
--- a/telldus-core/client/telldus-core.cpp
+++ /dev/null
@@ -1,1296 +0,0 @@
-//
-// Copyright (C) 2012 Telldus Technologies AB. All rights reserved.
-//
-// Copyright: See COPYING file that comes with this distribution
-//
-//
-/**
- * @defgroup core telldus-core
- *   Telldus Core is the base module used to interface a Telldus TellStick.
- * @{
- */
-
-#include 
-#include 
-#include "client/telldus-core.h"
-#include "client/Client.h"
-#include "common/common.h"
-#include "common/Message.h"
-#include "common/Socket.h"
-
-/**
- * @name Device method flags
- *   Flags for the different methods/commands a device can support. Can be used
- *   as bit flags in e.g. tdMethods().
- * @{
- *
- * @def TELLSTICK_TURNON
- *   Device-flag for devices supporting the tdTurnOn() call.
- * @def TELLSTICK_TURNOFF
- *   Device-flag for devices supporting the tdTurnOff() call.
- * @def TELLSTICK_BELL
- *   Device-flag for devices supporting the tdBell() call.
- * @def TELLSTICK_TOGGLE
- *   This method is currently unimplemented.
- * @def TELLSTICK_DIM
- *   Device-flag for devices supporting the tdDim() call.
- * @def TELLSTICK_LEARN
- *   Device-flag for devices supporting the tdLearn() call.
- * @def TELLSTICK_EXECUTE
- *   Device-flag for devices (scenes) supporting the tdExecute() call.
- * @def TELLSTICK_UP
- *   Device-flag for devices supporting the tdUp() call.
- * @def TELLSTICK_DOWN
- *   Device-flag for devices supporting the tdDown() call.
- * @def TELLSTICK_STOP
- *   Device-flag for devices supporting the tdStop() call.
- *
- **//* @} */
-
-/**
- * @name Device types
- *   The device type as returned from tdGetDeviceType().
- * @{
- *
- * @def TELLSTICK_TYPE_DEVICE
- *   Device type of a single device.
- * @def TELLSTICK_TYPE_GROUP
- *   Device type of a device which contains other devices.
- * @def TELLSTICK_TYPE_SCENE
- *   Device type of a device which contains other devices that are sent
- *   different commands when executed (i.e. one device turns on, another turns
- *   off).
- *
- **//* @} */
-
-/**
- * @name Sensor value types
- *   The supported sensor value types are returned from tdSensor() and used
- *   when querying a sensor for a specific value in tdSensorValue().
- * @{
- *
- * @def TELLSTICK_TEMPERATURE
- *   The sensor can report the temperature.
- * @def TELLSTICK_HUMIDITY
- *   The sensor can report the humidity.
- * @def TELLSTICK_RAINRATE
- *   The sensor can report rain fall rate.
- * @def TELLSTICK_RAINTOTAL
- *   The sensor can report total rain fall.
- * @def TELLSTICK_WINDDIRECTION
- *   The sensor can report wind direction.
- * @def TELLSTICK_WINDAVERAGE
- *   The sensor can report average wind speed.
- * @def TELLSTICK_WINDGUST
- *   The sensor can report gust wind speed.
- *
- **//* @} */
-
-/**
- * @name Controller type
- *   The controller type as returned from tdController().
- * @{
- *
- * @def TELLSTICK_CONTROLLER_TELLSTICK
- *   The controller is a TellStick.
- * @def TELLSTICK_CONTROLLER_TELLSTICK_DUO
- *   The controller is a TellStick Duo.
- * @def TELLSTICK_CONTROLLER_TELLSTICK_NET
- *   The controller is a TellStick Net.
- *
- **//* @} */
-
-/**
- * @name Device changes
- *   Flags used in event callbacks.
- * @{
- *
- * @def TELLSTICK_DEVICE_ADDED
- *   A new device was added.
- * @def TELLSTICK_DEVICE_CHANGED
- *   A device was changed.
- * @def TELLSTICK_DEVICE_REMOVED
- *   A device was removed.
- * @def TELLSTICK_DEVICE_STATE_CHANGED
- *   The state changed for a device.
- *
- **//* @} */
-
-/**
- * @name Change types
- *   Flags used in event callbacks.
- * @{
- *
- * @def TELLSTICK_CHANGE_NAME
- *   The name has changed.
- * @def TELLSTICK_CHANGE_PROTOCOL
- *   The protocol has changed.
- * @def TELLSTICK_CHANGE_MODEL
- *   The model has changed.
- * @def TELLSTICK_CHANGE_METHOD
- *   The method has changed.
- * @def TELLSTICK_CHANGE_AVAILABLE
- *   The controller is now available or unavailable.
- * @def TELLSTICK_CHANGE_FIRMWARE
- *   The firmware has changed.
- *
- **//* @} */
-
-/**
- * @name Error codes
- *   The error codes returned from some API functions.
- * @{
- *
- * @def TELLSTICK_SUCCESS
- *   Error code. Returned when the command succeeded.
- * @def TELLSTICK_ERROR_NOT_FOUND
- *   Error code. Returned if a TellStick was not found on the system.
- * @def TELLSTICK_ERROR_PERMISSION_DENIED
- *   Error code. Returned if the user doesn't have privileges to open the
- *   TellStick device.
- * @def TELLSTICK_ERROR_DEVICE_NOT_FOUND
- *   Error code. The supplied device id was not found.
- * @def TELLSTICK_ERROR_METHOD_NOT_SUPPORTED
- *   Error code. The requested method is not supported by the device. This
- *   should be avoided by a call to tdMethods().
- * @def TELLSTICK_ERROR_COMMUNICATION
- *   Error code. An error occurred when communicating with TellStick.
- * @def TELLSTICK_ERROR_CONNECTING_SERVICE
- *   Error code. The client library could not connect to the service. Maybe it
- *   is not running?
- * @def TELLSTICK_ERROR_UNKNOWN_RESPONSE
- *   Error code. The client library received a response from the service it did
- *   not understand.
- * @def TELLSTICK_ERROR_SYNTAX
- *   Error code. Input/command could not be parsed or didn't follow input
- *   rules.
- * @def TELLSTICK_ERROR_BROKEN_PIPE
- *   Error code. Pipe broken during communication.
- * @def TELLSTICK_ERROR_COMMUNICATING_SERVICE
- *   Error code. Timeout waiting for response from the Telldus Service.
- * @def TELLSTICK_ERROR_UNKNOWN
- *   Error code. An unknown error has occurred.
- *
- **//* @} */
-
-/**
- * @name Callback typedefs
- * @{
- *
- * @typedef TDDeviceEvent
- *   The callback type for device events.
- *
- * @attention
- *   The callback will be called by another thread than the thread used by the
- *   application and some measures must be taken to synchronize it with the
- *   main thread.
- *
- * @param deviceId
- *   The id of the device that changed.
- * @param method
- *   The new device state. Can be @ref TELLSTICK_TURNON, @ref
- *   TELLSTICK_TURNOFF, etc.
- * @param data
- *   If @a method is @ref TELLSTICK_DIM this holds the current value as a human
- *   readable string, example "128" for 50%.
- * @param callbackId
- *   The id of the callback.
- * @param context
- *   The pointer passed when registering for the event.
- *
- * @sa tdRegisterDeviceEvent
- *
- ******************************************************************************
- *
- * @typedef TDDeviceChangeEvent
- *   The callback type for device change events.
- *
- * @attention
- *   The callback will be called by another thread than the thread used by the
- *   application and some measures must be taken to synchronize it with the
- *   main thread.
- *
- * @param deviceId
- *   The id of the device that was added, changed or removed.
- * @param changeEvent
- *   One of the constants @ref TELLSTICK_DEVICE_ADDED, @ref
- *   TELLSTICK_DEVICE_CHANGED or @ref TELLSTICK_DEVICE_REMOVED.
- * @param changeType
- *   If @a changeEvent is @ref TELLSTICK_DEVICE_CHANGED, this parameter
- *   indicates what has changed (e.g @ref TELLSTICK_CHANGE_NAME, @ref
- *   TELLSTICK_CHANGE_PROTOCOL, @ref TELLSTICK_CHANGE_MODEL or @ref
- *   TELLSTICK_CHANGE_METHOD).
- * @param callbackId
- *   The id of the callback.
- * @param context
- *   The pointer passed when registering for the event.
- *
- * @sa tdRegisterDeviceChangeEvent
- *
- ******************************************************************************
- *
- * @typedef TDRawDeviceEvent
- *   The callback type for raw events.
- *
- * @attention
- *   The callback will be called by another thread than the thread used by the
- *   application and some measures must be taken to synchronize it with the
- *   main thread.
- *
- * @param data
- *   Raw device data.
- * @param controllerId
- *   Id of receiving controller.
- * @param callbackId
- *   The id of the callback.
- * @param context
- *   The pointer passed when registering for the event.
- *
- * @sa tdRegisterRawDeviceEvent
- *
- ******************************************************************************
- *
- * @typedef TDSensorEvent
- *   The callback type for sensor events.
- *
- * @attention
- *   The callback will be called by another thread than the thread used by the
- *   application and some measures must be taken to synchronize it with the
- *   main thread.
- *
- * @param protocol
- *   The sensor's protocol.
- * @param model
- *   The model of the sensor.
- * @param id
- *   The unique id for the sensor.
- * @param dataType
- *   The type that @a value is. Can be one of @ref TELLSTICK_TEMPERATURE,
- *   @ref TELLSTICK_HUMIDITY, @ref TELLSTICK_RAINTOTAL,
- *   @ref TELLSTICK_RAINRATE, @ref TELLSTICK_WINDDIRECTION,
- *   @ref TELLSTICK_WINDAVERAGE or @ref TELLSTICK_WINDGUST.
- * @param value
- *   A human readable string of the data.
- * @param timestamp
- *   The time (as returned by the time() system call) when the value was
- *   received.
- * @param callbackId
- *   The id of the callback.
- * @param context
- *   The pointer passed when registering for the event.
- *
- * @sa tdRegisterSensorEvent
- *
- ******************************************************************************
- *
- * @typedef TDControllerEvent
- *   The callback type for controller events.
- *
- * @attention
- *   The callback will be called by another thread than the thread used by the
- *   application and some measures must be taken to synchronize it with the
- *   main thread.
- *
- * @param controllerId
- *   The id of the controller that was added, changed or removed.
- * @param changeEvent
- *   One of the constants @ref TELLSTICK_DEVICE_ADDED, @ref
- *   TELLSTICK_DEVICE_CHANGED, @ref TELLSTICK_DEVICE_STATE_CHANGED or @ref
- *   TELLSTICK_DEVICE_REMOVED.
-
- * @param changeType
- *   If @a changeEvent is:
- *     @arg @ref TELLSTICK_DEVICE_ADDED this is the controller's type
- *     (e.g. @ref TELLSTICK_CONTROLLER_TELLSTICK or @ref
- *     TELLSTICK_CONTROLLER_TELLSTICK_DUO),
- *     @arg @ref TELLSTICK_DEVICE_CHANGED this indicates what has changed
- *     (e.g. @ref TELLSTICK_CHANGE_NAME or @ref TELLSTICK_CHANGE_FIRMWARE),
- *     @arg @ref TELLSTICK_DEVICE_STATE_CHANGED this indicates which state that
- *     has changed (e.g. @ref TELLSTICK_CHANGE_AVAILABLE),
- *     @arg @ref TELLSTICK_DEVICE_REMOVED this is unused.
- * @param newValue
- *   If @a changeEvent is:
- *     @arg @ref TELLSTICK_DEVICE_CHANGED this is the property's new value,
- *     @arg @ref TELLSTICK_DEVICE_STATE_CHANGED this is the new state. For @ref
- *     TELLSTICK_CHANGE_AVAILABLE this is either @c "0" or @c "1".
- * @param callbackId
- *   The id of the callback.
- * @param context
- *   The pointer passed when registering for the event.
- *
- * @sa tdRegisterControllerEvent
- *
- **//* @} */
-
-/**
- * This function initiates the library. Call this function before any other
- * call to a function in telldus-core.
- *
- * @since Version 2.0.0
- **/
-void WINAPI tdInit(void) {
-	TelldusCore::Client::getInstance();  // Create the manager-object
-}
-
-/**
- * Register a callback that will receive device events.
- *
- * @param eventFunction
- *   Callback function.
- * @param context
- *   Pointer that will be passed back in the callback.
- *
- * @returns
- *   An id identifying the callback. Pass this id to tdUnregisterCallback() to
- *   stop receiving callbacks.
- *
- * @sa @ref sec_events_registering
- * @since Version 2.0.0
- **/
-int WINAPI tdRegisterDeviceEvent( TDDeviceEvent eventFunction, void *context ) {
-	TelldusCore::Client *client = TelldusCore::Client::getInstance();
-	return client->registerEvent( TelldusCore::CallbackStruct::DeviceEvent, reinterpret_cast(eventFunction), context );
-}
-
-/**
- * Register a callback that will receive raw (i.e. all) events.
- *
- * @param eventFunction
- *   Callback function.
- * @param context
- *   Pointer that will be passed back in the callback.
- *
- * @returns
- *   An id identifying the callback. Pass this id to tdUnregisterCallback() to
- *   stop receiving callbacks.
- *
- * @sa @ref sec_events_registering
- * @since Version 2.0.0
- **/
-int WINAPI tdRegisterRawDeviceEvent( TDRawDeviceEvent eventFunction, void *context ) {
-	TelldusCore::Client *client = TelldusCore::Client::getInstance();
-	return client->registerEvent( TelldusCore::CallbackStruct::RawDeviceEvent, reinterpret_cast(eventFunction), context );
-}
-
-/**
- * Register a callback that will receive device change events. This includes
- * addition of new devices, changes of device properties (e.g. name) and
- * removal of existing devices.
- *
- * @param eventFunction
- *   Callback function.
- * @param context
- *   Pointer that will be passed back in the callback.
- *
- * @returns
- *   An id identifying the callback. Pass this id to tdUnregisterCallback() to
- *   stop receiving callbacks.
- *
- * @sa @ref sec_events_registering
- * @since Version 2.1.0
- **/
-int WINAPI tdRegisterDeviceChangeEvent( TDDeviceChangeEvent eventFunction, void *context) {
-	TelldusCore::Client *client = TelldusCore::Client::getInstance();
-	return client->registerEvent( TelldusCore::CallbackStruct::DeviceChangeEvent, reinterpret_cast(eventFunction), context );
-}
-
-/**
- * Register a callback that will receive sensor events.
- *
- * @param eventFunction
- *   Callback function.
- * @param context
- *   Pointer that will be passed back in the callback.
- *
- * @returns
- *   An id identifying the callback. Pass this id to tdUnregisterCallback() to
- *   stop receiving callbacks.
- *
- * @sa @ref sec_events_registering
- * @since Version 2.1.0
- **/
-int WINAPI tdRegisterSensorEvent( TDSensorEvent eventFunction, void *context) {
-	TelldusCore::Client *client = TelldusCore::Client::getInstance();
-	return client->registerEvent( TelldusCore::CallbackStruct::SensorEvent, reinterpret_cast(eventFunction), context );
-}
-
-/**
- * Register a callback that will receive controller events.
- *
- * @param eventFunction
- *   Callback function.
- * @param context
- *   Pointer that will be passed back in the callback.
- *
- * @returns
- *   An id identifying the callback. Pass this id to tdUnregisterCallback() to
- *   stop receiving callbacks.
- *
- * @sa @ref sec_events_registering
- * @since Version 2.1.2
- **/
-int WINAPI tdRegisterControllerEvent( TDControllerEvent eventFunction, void *context) {
-	TelldusCore::Client *client = TelldusCore::Client::getInstance();
-	return client->registerEvent( TelldusCore::CallbackStruct::ControllerEvent, reinterpret_cast(eventFunction), context );
-}
-
-/**
- * Unregister a callback.
- *
- * @param callbackId
- *   The returned id from one of the tdRegister* functions.
- *
- * @returns
- *   @ref TELLSTICK_SUCCESS on success or appropriate error code on failure.
- *
- * @sa @ref sec_events_registering
- * @since Version 2.1.0
- **/
-int WINAPI tdUnregisterCallback( int callbackId ) {
-	TelldusCore::Client *client = TelldusCore::Client::getInstance();
-	return client->unregisterCallback( callbackId );
-}
-
-/**
- * Close the library and clean up the cache it uses. This should be called
- * when the library is not supposed to be used anymore.
- *
- * @since Version 2.0.0
- **/
-void WINAPI tdClose(void) {
-	TelldusCore::Client::close();
-}
-
-/**
- * This method releases resources allocated by telldus-core.  It should be
- * called on the returned value from all functions returning char *.
- *
- * @param thestring
- *   A string returned from a td* function.
- *
- * @since Version 2.0.1
- **/
-void WINAPI tdReleaseString(char *thestring) {
-#ifdef _WINDOWS
-	SysFreeString((BSTR)thestring);
-#else
-	free(thestring);
-#endif
-}
-
-/**
- * Turns a device on. Make sure the device supports this by calling
- * tdMethods() before any call to this function.
- *
- * @param intDeviceId
- *   The device id to turn on.
- *
- * @returns
- *   @ref TELLSTICK_SUCCESS on success or appropriate error code on failure.
- *
- * @since Version 2.0.0
- **/
-int WINAPI tdTurnOn(int intDeviceId) {
-	TelldusCore::Message msg(L"tdTurnOn");
-	msg.addArgument(intDeviceId);
-	return TelldusCore::Client::getIntegerFromService(msg);
-}
-
-/**
- * Turns a device off. Make sure the device supports this by calling
- * tdMethods() before any call to this function.
- *
- * @param intDeviceId
- *   The device id to turn off.
- *
- * @returns
- *   @ref TELLSTICK_SUCCESS on success or appropriate error code on failure.
- *
- * @since Version 2.0.0
- **/
-int WINAPI tdTurnOff(int intDeviceId) {
-	TelldusCore::Message msg(L"tdTurnOff");
-	msg.addArgument(intDeviceId);
-	return TelldusCore::Client::getIntegerFromService(msg);
-}
-
-/**
- * Sends bell command to devices supporting this. Make sure the device
- * supports this by calling tdMethods() before any call to this function.
- *
- * @param intDeviceId
- *   The device id to send bell to.
- *
- * @returns
- *   @ref TELLSTICK_SUCCESS on success or appropriate error code on failure.
- *
- * @since Version 2.0.0
- **/
-int WINAPI tdBell(int intDeviceId) {
-	TelldusCore::Message msg(L"tdBell");
-	msg.addArgument(intDeviceId);
-	return TelldusCore::Client::getIntegerFromService(msg);
-}
-
-/**
- * Dims a device. Make sure the device supports this by calling tdMethods()
- * before any call to this function.
- *
- * @param intDeviceId
- *   The device id to dim.
- * @param level
- *   The level the device should dim to. This value should be 0 - 255.
- *
- * @returns
- *   @ref TELLSTICK_SUCCESS on success or appropriate error code on failure.
- *
- * @since Version 2.0.0
- **/
-int WINAPI tdDim(int intDeviceId, unsigned char level) {
-	TelldusCore::Message msg(L"tdDim");
-	msg.addArgument(intDeviceId);
-	msg.addArgument(level);
-	return TelldusCore::Client::getIntegerFromService(msg);
-}
-
-/**
- * Execute a scene action. Make sure the device supports this by calling
- * tdMethods() before any call to this function.
- *
- * @param intDeviceId
- *   The id to execute.
- *
- * @returns
- *   @ref TELLSTICK_SUCCESS on success or appropriate error code on failure.
- *
- * @since Version 2.1.0
- **/
-int WINAPI tdExecute(int intDeviceId) {
-	TelldusCore::Message msg(L"tdExecute");
-	msg.addArgument(intDeviceId);
-	return TelldusCore::Client::getIntegerFromService(msg);
-}
-
-/**
- * Send "up" command to device. Make sure the device supports this by calling
- * tdMethods() before any call to this function.
- *
- * @param intDeviceId
- *   The device id to send the command to.
- *
- * @returns
- *   @ref TELLSTICK_SUCCESS on success or appropriate error code on failure.
- *
- * @since Version 2.1.0
- **/
-int WINAPI tdUp(int intDeviceId) {
-	TelldusCore::Message msg(L"tdUp");
-	msg.addArgument(intDeviceId);
-	return TelldusCore::Client::getIntegerFromService(msg);
-}
-
-/**
- * Send "down" command to device. Make sure the device supports this by
- * calling tdMethods() before any call to this function.
- *
- * @param intDeviceId
- *   The device id to send the command to.
- *
- * @returns
- *   @ref TELLSTICK_SUCCESS on success or appropriate error code on failure.
- *
- * @since Version 2.1.0
- **/
-int WINAPI tdDown(int intDeviceId) {
-	TelldusCore::Message msg(L"tdDown");
-	msg.addArgument(intDeviceId);
-	return TelldusCore::Client::getIntegerFromService(msg);
-}
-
-/**
- * Send "stop" command to device. Make sure the device supports this by
- * calling tdMethods() before any call to this function.
- *
- * @param intDeviceId
- *   The device id to stop.
- *
- * @returns
- *   @ref TELLSTICK_SUCCESS on success or appropriate error code on failure.
- *
- * @since Version 2.1.0
- */
-int WINAPI tdStop(int intDeviceId) {
-	TelldusCore::Message msg(L"tdStop");
-	msg.addArgument(intDeviceId);
-	return TelldusCore::Client::getIntegerFromService(msg);
-}
-
-/**
- * Sends a special learn command to some devices that need a special
- * learn-command to be used from TellStick. Make sure the device supports this
- * by calling tdMethods() before any call to this function.
- *
- * @param intDeviceId
- *   The device id to learn.
- *
- * @returns
- *   @ref TELLSTICK_SUCCESS on success or appropriate error code on failure.
- *
- * @since Version 2.0.0
- **/
-int WINAPI tdLearn(int intDeviceId) {
-	TelldusCore::Message msg(L"tdLearn");
-	msg.addArgument(intDeviceId);
-	return TelldusCore::Client::getIntegerFromService(msg);
-}
-
-/**
- * Returns the last sent command to a specific device
- *
- * @param intDeviceId
- *   The device id to query.
- * @param methodsSupported
- *   The methods supported by the client. See tdMethods() for more information.
- *
- * @returns
- *   The last sent command as integer, example @ref TELLSTICK_TURNON or @ref
- *   TELLSTICK_TURNOFF
- *
- * @since Version 2.0.0
- **/
-int WINAPI tdLastSentCommand(int intDeviceId, int methodsSupported ) {
-	TelldusCore::Message msg(L"tdLastSentCommand");
-	msg.addArgument(intDeviceId);
-	msg.addArgument(methodsSupported);
-	return TelldusCore::Client::getIntegerFromService(msg);
-}
-
-/**
- * If the last sent command it @ref TELLSTICK_DIM this returns the dimmed
- * value.
- *
- * @param intDeviceId
- *   The device id to query.
- *
- * @returns
- *   The the value as a human readable string, example "128" for 50%. The
- *   returned string must be freed by calling tdReleaseString().
- *
- * @since Version 2.0.0
- **/
-char * WINAPI tdLastSentValue( int intDeviceId ) {
-	TelldusCore::Message msg(L"tdLastSentValue");
-	msg.addArgument(intDeviceId);
-	std::wstring strReturn = TelldusCore::Client::getWStringFromService(msg);
-	return wrapStdWstring(strReturn);
-}
-
-/**
- * This function returns the number of devices configured.
- *
- * @returns
- *   An integer of the total number of devices configured.
- *
- * @since Version 2.0.0
- **/
-int WINAPI tdGetNumberOfDevices(void) {
-	return TelldusCore::Client::getIntegerFromService(TelldusCore::Message(L"tdGetNumberOfDevices"));
-}
-
-/**
- * This function returns the unique id of a device with a specific index.
- *
- * To get all the id numbers you should loop over all the devices:
- * @code
- * int intNumberOfDevices = tdGetNumberOfDevices();
- * for (int i = 0; i < intNumberOfDevices; i++) {
- *   int id = tdGetDeviceId( i );
- *   // id now contains the id number of the device with index of i
- * }
- * @endcode
- *
- * @param intDeviceIndex
- *   The device index to query. The index starts from 0.
- *
- * @returns
- *   The unique id for the device or @c -1 if the device is not found.
- *
- * @since Version 2.0.0
- **/
-int WINAPI tdGetDeviceId(int intDeviceIndex) {
-	TelldusCore::Message msg(L"tdGetDeviceId");
-	msg.addArgument(intDeviceIndex);
-	return TelldusCore::Client::getIntegerFromService(msg);
-}
-
-/**
- * Get the device type.
- *
- * @param intDeviceId
- *   The unique id of the device to query.
- *
- * @returns
- *   Which type the device is. The device could be either @ref
- *   TELLSTICK_TYPE_DEVICE, @ref TELLSTICK_TYPE_GROUP or @ref
- *   TELLSTICK_TYPE_SCENE
- *
- * @since Version 2.0.0
- **/
-int WINAPI tdGetDeviceType(int intDeviceId) {
-	TelldusCore::Message msg(L"tdGetDeviceType");
-	msg.addArgument(intDeviceId);
-	return TelldusCore::Client::getIntegerFromService(msg);
-}
-
-/**
- * Query a device for it's name.
- *
- * @param intDeviceId
- *   The unique id of the device to query.
- *
- * @returns
- *   The name of the device or an empty string if the device is not found. The
- *   returned string must be freed by calling tdReleaseString().
- *
- * @since Version 2.0.0
- **/
-char * WINAPI tdGetName(int intDeviceId) {
-	TelldusCore::Message msg(L"tdGetName");
-	msg.addArgument(intDeviceId);
-	std::wstring strReturn =  TelldusCore::Client::getWStringFromService(msg);
-	return wrapStdWstring(strReturn);
-}
-
-/**
- * Sets a new name for a device. The devices are global for all application,
- * changing this will change the name for other applications as well.
- *
- * @param intDeviceId
- *   The device id to change the name for.
- * @param strNewName
- *   The new name for the devices.
- *
- * @returns
- *   @c true on success, @c false otherwise.
- *
- * @since Version 2.0.0
- **/
-bool WINAPI tdSetName(int intDeviceId, const char* strNewName) {
-	TelldusCore::Message msg(L"tdSetName");
-	msg.addArgument(intDeviceId);
-	msg.addArgument(strNewName);
-	return TelldusCore::Client::getBoolFromService(msg);
-}
-
-/**
- * Get the device protocol.
- *
- * @param intDeviceId
- *   The device id to query.
- *
- * @returns
- *   The protocol used by a specific device. The returned string must be freed
- *   by calling tdReleaseString().
- *
- * @since Version 2.0.0
- **/
-char* WINAPI tdGetProtocol(int intDeviceId) {
-	TelldusCore::Message msg(L"tdGetProtocol");
-	msg.addArgument(intDeviceId);
-	std::wstring strReturn =  TelldusCore::Client::getWStringFromService(msg);
-	return wrapStdWstring(strReturn);
-}
-
-/**
- * This changes the current protocol used by a device. After changing the
- * protocol, setting new parameters is required.
- *
- * @param intDeviceId
- *   The device to change.
- * @param strProtocol
- *   The new protocol to use.
- *
- * @returns
- *   @c true on success, @c false otherwise.
- *
- * @sa tdSetModel()
- * @sa tdSetDeviceParameter()
- *
- * @since Version 2.0.0
- **/
-bool WINAPI tdSetProtocol(int intDeviceId, const char* strProtocol) {
-	TelldusCore::Message msg(L"tdSetProtocol");
-	msg.addArgument(intDeviceId);
-	msg.addArgument(strProtocol);
-	return TelldusCore::Client::getBoolFromService(msg);
-}
-
-/**
- * Get the device model.
- *
- * @param intDeviceId
- *   The device to query.
- *
- * @returns
- *   The model for a device. Not all protocols uses this. The returned string
- *   must be freed by calling tdReleaseString().
- *
- * @since Version 2.0.0
- **/
-char* WINAPI tdGetModel(int intDeviceId) {
-	TelldusCore::Message msg(L"tdGetModel");
-	msg.addArgument(intDeviceId);
-	std::wstring strReturn = TelldusCore::Client::getWStringFromService(msg);
-	return wrapStdWstring(strReturn);
-}
-
-/**
- * Sets a new model for a device. Which model to set depends on the
- * current protocol.
- *
- * @param intDeviceId
- *   The device to change.
- * @param strModel
- *   The new model.
- *
- * @returns
- *   @c true on success, @c false otherwise.
- *
- * @since Version 2.0.0
- **/
-bool WINAPI tdSetModel(int intDeviceId, const char *strModel) {
-	TelldusCore::Message msg(L"tdSetModel");
-	msg.addArgument(intDeviceId);
-	msg.addArgument(strModel);
-	return TelldusCore::Client::getBoolFromService(msg);
-}
-
-/**
- * Sets a new protocol specific parameter. Please see the documentation of the
- * protocols before setting any parameter.
- *
- * @param intDeviceId
- *   The device to change.
- * @param strName
- *   The parameter to change.
- * @param strValue
- *   The new value for the parameter.
- *
- * @returns
- *   @c true on success, @c false otherwise.
- *
- * @since Version 2.0.0
- **/
-bool WINAPI tdSetDeviceParameter(int intDeviceId, const char *strName, const char *strValue) {
-	TelldusCore::Message msg(L"tdSetDeviceParameter");
-	msg.addArgument(intDeviceId);
-	msg.addArgument(strName);
-	msg.addArgument(strValue);
-	return TelldusCore::Client::getBoolFromService(msg);
-}
-
-/**
- * Get a protocol specific parameter for a device.
- *
- * @param intDeviceId
- *   The device to query.
- * @param strName
- *   The name of the parameter to query.
- * @param defaultValue
- *   A default value to return if the current parameter hasn't previously been
- *   set.
- *
- * @returns
- *   The protocol specific parameter specified by @a strName. The returned
- *   string must be freed by calling tdReleaseString().
- *
- * @since Version 2.0.0
- **/
-char * WINAPI tdGetDeviceParameter(int intDeviceId, const char *strName, const char *defaultValue) {
-	TelldusCore::Message msg(L"tdGetDeviceParameter");
-	msg.addArgument(intDeviceId);
-	msg.addArgument(strName);
-	msg.addArgument(defaultValue);
-	std::wstring strReturn = TelldusCore::Client::getWStringFromService(msg);
-	return wrapStdWstring(strReturn);
-}
-
-/**
- * Add a new device to the global database of devices. This function must be
- * called first before any call to tdSetName(), tdSetProtocol() and similar
- * functions.
- *
- * @returns
- *   The new device id for the newly created device. If the creation fails it
- *   returns an error (i.e. negative) value.
- *
- * @since Version 2.0.0
- **/
-int WINAPI tdAddDevice() {
-	TelldusCore::Message msg(L"tdAddDevice");
-	return TelldusCore::Client::getIntegerFromService(msg);
-}
-
-/**
- * Removes a device.
- *
- * @param intDeviceId
- *   The device to query.
- *
- * @returns
- *   @c true on success, @c false otherwise.
- *
- * @since Version 2.0.0
- **/
-bool WINAPI tdRemoveDevice(int intDeviceId) {
-	TelldusCore::Message msg(L"tdRemoveDevice");
-	msg.addArgument(intDeviceId);
-	return TelldusCore::Client::getBoolFromService(msg);
-}
-
-/**
- * Query a device for which methods it supports. By supplying the methods you
- * support the library could remap the methods a device support for better fit
- * the application.
- *
- * Example of querying a device supporting TELLSTICK_BELL:
- * @code
- * int methods = tdMethods(
- *   id, TELLSTICK_TURNON | TELLSTICK_TURNOFF | TELLSTICK_BELL);
- * // methods is now TELLSTICK_BELL
- * int methods = tdMethods(id, TELLSTICK_TURNON | TELLSTICK_TURNOFF);
- * // methods is now TELLSTICK_TURNON because the client application doesn't
- * // support TELLSTICK_BELL
- * @endcode
- *
- * @param id
- *   The device id to query.
- * @param methodsSupported
- *   The methods the client application supports.
- *
- * @returns
- *   The method-flags OR'ed into an integer.
- *
- * @sa TELLSTICK_TURNON
- * @sa TELLSTICK_TURNOFF
- * @sa TELLSTICK_BELL
- * @sa TELLSTICK_TOGGLE
- * @sa TELLSTICK_DIM
- * @sa TELLSTICK_EXECUTE
- * @sa TELLSTICK_UP
- * @sa TELLSTICK_DOWN
- * @sa TELLSTICK_STOP
- *
- * @since Version 2.0.0
- **/
-int WINAPI tdMethods(int id, int methodsSupported) {
-	TelldusCore::Message msg(L"tdMethods");
-	msg.addArgument(id);
-	msg.addArgument(methodsSupported);
-	return TelldusCore::Client::getIntegerFromService(msg);
-}
-
-/**
- * Get a human readable string from an error code returned from a function in
- * telldus-core.
- *
- * @param intErrorNo
- *   The error code to translate.
- *
- * @returns
- *   A string ready to show to the user. The returned string must be freed by
- *   calling tdReleaseString().
- *
- * @sa TELLSTICK_SUCCESS
- * @sa TELLSTICK_ERROR_NOT_FOUND
- * @sa TELLSTICK_ERROR_PERMISSION_DENIED
- * @sa TELLSTICK_ERROR_DEVICE_NOT_FOUND
- * @sa TELLSTICK_ERROR_METHOD_NOT_SUPPORTED
- * @sa TELLSTICK_ERROR_COMMUNICATION
- * @sa TELLSTICK_ERROR_CONNECTING_SERVICE
- * @sa TELLSTICK_ERROR_UNKNOWN_RESPONSE
- * @sa TELLSTICK_ERROR_SYNTAX
- * @sa TELLSTICK_ERROR_BROKEN_PIPE
- * @sa TELLSTICK_ERROR_COMMUNICATING_SERVICE
- * @sa TELLSTICK_ERROR_UNKNOWN
- *
- * @since Version 2.0.0
- **/
-char * WINAPI tdGetErrorString(int intErrorNo) {
-	const int numResponses = 12;
-	const char *responses[numResponses] = {
-		"Success",
-		"TellStick not found",
-		"Permission denied",
-		"Device not found",
-		"The method you tried to use is not supported by the device",
-		"An error occurred while communicating with TellStick",
-		"Could not connect to the Telldus Service",
-		"Received an unknown response",
-		"Syntax error",
-		"Broken pipe",
-		"An error occurred while communicating with the Telldus Service",
-		"Syntax error in the configuration file"
-	};
-	std::string strReturn;
-	intErrorNo = abs(intErrorNo);  // We don't use negative values here.
-	if (intErrorNo >= numResponses) {
-		strReturn = "Unknown error";
-	} else {
-		// Copy the error string to strReturn
-		strReturn = responses[intErrorNo];
-	}
-	return wrapStdString(strReturn);
-}
-
-/**
- * Send a raw command to TellStick. Please read the TellStick protocol
- * definition on how the command should be constructed.
- *
- * @param command
- *   The command for TellStick in its native format.
- * @param reserved
- *   Reserved for future use.
- *
- * @returns
- *   @ref TELLSTICK_SUCCESS on success or one of the error codes on failure
- *
- * @since Version 2.0.0
- **/
-int WINAPI tdSendRawCommand(const char *command, int reserved) {
-	std::wstring wcommand;
-	for(int i = 0; i < strlen(command); ++i) {
-		wcommand.append(1, (unsigned char)command[i]);
-	}
-	TelldusCore::Message msg(L"tdSendRawCommand");
-	msg.addArgument(wcommand);
-	msg.addArgument(reserved);
-	return TelldusCore::Client::getIntegerFromService(msg);
-}
-
-/**
- * Connect a TellStick controller.
- *
- * @param vid
- *   The vendor id.
- * @param pid
- *   The product id.
- * @param serial
- *   The serial.
- *
- * @since Version 2.1.0
- **/
-void WINAPI tdConnectTellStickController(int vid, int pid, const char *serial) {
-	TelldusCore::Message msg(L"tdConnectTellStickController");
-	msg.addArgument(vid);
-	msg.addArgument(pid);
-	msg.addArgument(serial);
-	TelldusCore::Client::getWStringFromService(msg);
-}
-
-/**
- * Disconnect a TellStick controller.
- *
- * @param vid
- *   The vendor id.
- * @param pid
- *   The product id.
- * @param serial
- *   The serial.
- *
- * @since Version 2.1.0
- **/
-void WINAPI tdDisconnectTellStickController(int vid, int pid, const char *serial) {
-	TelldusCore::Message msg(L"tdDisconnectTellStickController");
-	msg.addArgument(vid);
-	msg.addArgument(pid);
-	msg.addArgument(serial);
-	TelldusCore::Client::getWStringFromService(msg);
-}
-
-/**
- * Use this function to iterate over all sensors. Iterate until @ref
- * TELLSTICK_SUCCESS is not returned.
- *
- * @param[out] protocol
- *   A by ref string where the protocol of the sensor will be placed.
- * @param[in] protocolLen
- *   The length of the @a protocol parameter.
- * @param[out] model
- *   A by ref string where the model of the sensor will be placed.
- * @param[in] modelLen
- *   The length of the @a model parameter.
- * @param[out] id
- *   A by ref int where the id of the sensor will be placed.
- * @param[out] dataTypes
- *   A by ref int with flags for the supported sensor values.
- *
- * @returns
- *   @ref TELLSTICK_SUCCESS if there is more sensors to be fetched.
- *
- * @since Version 2.1.0
- */
-int WINAPI tdSensor(char *protocol, int protocolLen, char *model, int modelLen, int *id, int *dataTypes) {
-	TelldusCore::Client *client = TelldusCore::Client::getInstance();
-	return client->getSensor(protocol, protocolLen, model, modelLen, id, dataTypes);
-}
-
-/**
- * Get one of the supported sensor values from a sensor. Make sure it support
- * the value type first by calling tdSensor(). The triplet @a protocol, @a
- * model and @a id together identifies a sensor.
- *
- * @param[in] protocol
- *   The protocol for the sensor.
- * @param[in] model
- *   The model for the sensor.
- * @param[in] id
- *   The id of the sensor.
- * @param[in] dataType
- *   Which sensor value to retrive (one of @ref TELLSTICK_TEMPERATURE,
- *   @ref TELLSTICK_HUMIDITY, @ref TELLSTICK_RAINTOTAL,
- *   @ref TELLSTICK_RAINRATE, @ref TELLSTICK_WINDDIRECTION,
- *   @ref TELLSTICK_WINDAVERAGE or @ref TELLSTICK_WINDGUST.
- * @param[out] value
- *   A by ref string where the value will be placed.
- * @param[in] len
- *   The length of the @a value parameter.
- * @param[out] timestamp
- *   A by ref int where the timestamp of the value will be placed.
- *
- * @returns
- *   @ref TELLSTICK_SUCCESS if the value could be fetched or one of the error
- *   codes on failure.
- *
- * @since Version 2.1.0
- */
-int WINAPI tdSensorValue(const char *protocol, const char *model, int id, int dataType, char *value, int len, int *timestamp) {
-	TelldusCore::Message msg(L"tdSensorValue");
-	msg.addArgument(protocol);
-	msg.addArgument(model);
-	msg.addArgument(id);
-	msg.addArgument(dataType);
-	std::wstring retval = TelldusCore::Client::getWStringFromService(msg);
-	if (retval.length() == 0) {
-		return TELLSTICK_ERROR_METHOD_NOT_SUPPORTED;
-	}
-
-	std::wstring v = TelldusCore::Message::takeString(&retval);
-	int t = TelldusCore::Message::takeInt(&retval);
-	if (value && len) {
-		strncpy(value, TelldusCore::wideToString(v).c_str(), len);
-	}
-	if (timestamp) {
-		(*timestamp) = t;
-	}
-	return TELLSTICK_SUCCESS;
-}
-
-/**
- * Use this function to iterate over all controllers. Iterate until
- * @ref TELLSTICK_SUCCESS is not returned
- *
- * @param[out] controllerId
- *   A by ref int where the id of the controller will be placed.
- * @param[out] controllerType
- *   A by ref int where the type of the controller will be placed.
- * @param[out] name
- *   A by ref string where the name of the controller will be placed.
- * @param[in] nameLen
- *   The length of the @a name parameter.
- * @param[out] available
- *   A by ref int if the controller is currently available or maybe
- *   disconnected.
- *
- * @returns
- *   @ref TELLSTICK_SUCCESS if there is more sensors to be fetched.
- *
- * @sa TELLSTICK_CONTROLLER_TELLSTICK
- * @sa TELLSTICK_CONTROLLER_TELLSTICK_DUO
- * @sa TELLSTICK_CONTROLLER_TELLSTICK_NET
- *
- * @since Version 2.1.2
- **/
-int WINAPI tdController(int *controllerId, int *controllerType, char *name, int nameLen, int *available) {
-	TelldusCore::Client *client = TelldusCore::Client::getInstance();
-	return client->getController(controllerId, controllerType, name, nameLen, available);
-}
-
-/**
- * This function gets a parameter on a controller.
- * Valid parameters are: \c serial, \c name, \c available and \c firmware
- *
- * @param[in] controllerId
- *   The controller to change.
- * @param[in] name
- *   The parameter to get.
- * @param[out] value
- *   A by ref string where the value of the parameter will be placed.
- * @param[in] valueLen
- *   The length of the @a value parameter.
- *
- * @returns
- *   @ref TELLSTICK_SUCCESS on success, or an error code on failure.
- *
- * @since Version 2.1.2
- **/
-int WINAPI tdControllerValue(int controllerId, const char *name, char *value, int valueLen) {
-	TelldusCore::Message msg(L"tdControllerValue");
-	msg.addArgument(controllerId);
-	msg.addArgument(name);
-	std::wstring retval = TelldusCore::Client::getWStringFromService(msg);
-	if (retval.length() == 0) {
-		return TELLSTICK_ERROR_METHOD_NOT_SUPPORTED;
-	}
-
-	if (value && valueLen) {
-		strncpy(value, TelldusCore::wideToString(retval).c_str(), valueLen);
-	}
-	return TELLSTICK_SUCCESS;
-}
-
-/**
- * This function sets a parameter on a controller. Valid parameters are: @c
- * name.
- *
- * @param controllerId
- *   The controller to change.
- * @param name
- *   The parameter to change.
- * @param value
- *   The new value for the parameter.
- *
- * @returns
- *   @ref TELLSTICK_SUCCESS on success, or an error code on failure.
- *
- * @since Version 2.1.2
- **/
-int WINAPI tdSetControllerValue(int controllerId, const char *name, const char *value) {
-	TelldusCore::Message msg(L"tdSetControllerValue");
-	msg.addArgument(controllerId);
-	msg.addArgument(name);
-	msg.addArgument(value);
-	return TelldusCore::Client::getIntegerFromService(msg);
-}
-
-/**
- * This function removes a controller from the list of controllers. The
- * controller must not be available (disconnected) for this to work.
- *
- * @param controllerId
- *   The controller to remove.
- *
- * @returns
- *   @ref TELLSTICK_SUCCESS if the controller was removed, @ref
- *   TELLSTICK_ERROR_NOT_FOUND if the controller was not found, and @ref
- *   TELLSTICK_ERROR_PERMISSION_DENIED if the controller is still connected.
- *
- * @since Version 2.1.2
- **/
-int WINAPI tdRemoveController(int controllerId) {
-	TelldusCore::Message msg(L"tdRemoveController");
-	msg.addArgument(controllerId);
-	return TelldusCore::Client::getIntegerFromService(msg);
-}
-
-/* @} */
diff --git a/telldus-core/client/telldus-core.h b/telldus-core/client/telldus-core.h
deleted file mode 100644
index 21a9bf9a..00000000
--- a/telldus-core/client/telldus-core.h
+++ /dev/null
@@ -1,166 +0,0 @@
-//
-// Copyright (C) 2012 Telldus Technologies AB. All rights reserved.
-//
-// Copyright: See COPYING file that comes with this distribution
-//
-//
-#ifndef TELLDUS_CORE_CLIENT_TELLDUS_CORE_H_
-#define TELLDUS_CORE_CLIENT_TELLDUS_CORE_H_
-
-// The following ifdef block is the standard way of creating macros
-// which make exporting from a DLL simpler.  All files within this DLL
-// are compiled with the TELLDUSCORE_EXPORTS symbol defined on the command line.
-// This symbol should not be defined on any project that uses this DLL.
-// This way any other project whose source files include this file see
-// TELLSTICK_API functions as being imported from a DLL, whereas this DLL
-// sees symbols defined with this macro as being exported.
-
-#ifdef _WINDOWS
-	#if defined(TELLDUSCORE_EXPORTS)
-		#if defined(_CL64)
-			#define TELLSTICK_API
-		#else
-			#define TELLSTICK_API __declspec(dllexport)
-		#endif
-	#else
-		#define TELLSTICK_API __declspec(dllimport)
-	#endif
-	#define WINAPI __stdcall
-#else
-	#define WINAPI
-	#define TELLSTICK_API __attribute__ ((visibility("default")))
-#endif
-
-typedef void (WINAPI *TDDeviceEvent)(int deviceId, int method, const char *data, int callbackId, void *context);
-typedef void (WINAPI *TDDeviceChangeEvent)(int deviceId, int changeEvent, int changeType, int callbackId, void *context);
-typedef void (WINAPI *TDRawDeviceEvent)(const char *data, int controllerId, int callbackId, void *context);
-typedef void (WINAPI *TDSensorEvent)(const char *protocol, const char *model, int id, int dataType, const char *value, int timestamp, int callbackId, void *context);
-typedef void (WINAPI *TDControllerEvent)(int controllerId, int changeEvent, int changeType, const char *newValue, int callbackId, void *context);
-
-#ifndef __cplusplus
-	#define bool char
-#endif
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-	TELLSTICK_API void WINAPI tdInit(void);
-	TELLSTICK_API int WINAPI tdRegisterDeviceEvent( TDDeviceEvent eventFunction, void *context );
-	TELLSTICK_API int WINAPI tdRegisterDeviceChangeEvent( TDDeviceChangeEvent eventFunction, void *context);
-	TELLSTICK_API int WINAPI tdRegisterRawDeviceEvent( TDRawDeviceEvent eventFunction, void *context );
-	TELLSTICK_API int WINAPI tdRegisterSensorEvent( TDSensorEvent eventFunction, void *context );
-	TELLSTICK_API int WINAPI tdRegisterControllerEvent( TDControllerEvent eventFunction, void *context);
-	TELLSTICK_API int WINAPI tdUnregisterCallback( int callbackId );
-	TELLSTICK_API void WINAPI tdClose(void);
-	TELLSTICK_API void WINAPI tdReleaseString(char *thestring);
-
-	TELLSTICK_API int WINAPI tdTurnOn(int intDeviceId);
-	TELLSTICK_API int WINAPI tdTurnOff(int intDeviceId);
-	TELLSTICK_API int WINAPI tdBell(int intDeviceId);
-	TELLSTICK_API int WINAPI tdDim(int intDeviceId, unsigned char level);
-	TELLSTICK_API int WINAPI tdExecute(int intDeviceId);
-	TELLSTICK_API int WINAPI tdUp(int intDeviceId);
-	TELLSTICK_API int WINAPI tdDown(int intDeviceId);
-	TELLSTICK_API int WINAPI tdStop(int intDeviceId);
-	TELLSTICK_API int WINAPI tdLearn(int intDeviceId);
-	TELLSTICK_API int WINAPI tdMethods(int id, int methodsSupported);
-	TELLSTICK_API int WINAPI tdLastSentCommand( int intDeviceId, int methodsSupported );
-	TELLSTICK_API char *WINAPI tdLastSentValue( int intDeviceId );
-
-	TELLSTICK_API int WINAPI tdGetNumberOfDevices();
-	TELLSTICK_API int WINAPI tdGetDeviceId(int intDeviceIndex);
-	TELLSTICK_API int WINAPI tdGetDeviceType(int intDeviceId);
-
-	TELLSTICK_API char * WINAPI tdGetErrorString(int intErrorNo);
-
-	TELLSTICK_API char * WINAPI tdGetName(int intDeviceId);
-	TELLSTICK_API bool WINAPI tdSetName(int intDeviceId, const char* chNewName);
-	TELLSTICK_API char * WINAPI tdGetProtocol(int intDeviceId);
-	TELLSTICK_API bool WINAPI tdSetProtocol(int intDeviceId, const char* strProtocol);
-	TELLSTICK_API char * WINAPI tdGetModel(int intDeviceId);
-	TELLSTICK_API bool WINAPI tdSetModel(int intDeviceId, const char *intModel);
-
-	TELLSTICK_API char * WINAPI tdGetDeviceParameter(int intDeviceId, const char *strName, const char *defaultValue);
-	TELLSTICK_API bool WINAPI tdSetDeviceParameter(int intDeviceId, const char *strName, const char* strValue);
-
-	TELLSTICK_API int WINAPI tdAddDevice();
-	TELLSTICK_API bool WINAPI tdRemoveDevice(int intDeviceId);
-
-	TELLSTICK_API int WINAPI tdSendRawCommand(const char *command, int reserved);
-
-	TELLSTICK_API void WINAPI tdConnectTellStickController(int vid, int pid, const char *serial);
-	TELLSTICK_API void WINAPI tdDisconnectTellStickController(int vid, int pid, const char *serial);
-
-	TELLSTICK_API int WINAPI tdSensor(char *protocol, int protocolLen, char *model, int modelLen, int *id, int *dataTypes);
-	TELLSTICK_API int WINAPI tdSensorValue(const char *protocol, const char *model, int id, int dataType, char *value, int len, int *timestamp);
-
-	TELLSTICK_API int WINAPI tdController(int *controllerId, int *controllerType, char *name, int nameLen, int *available);
-	TELLSTICK_API int WINAPI tdControllerValue(int controllerId, const char *name, char *value, int valueLen);
-	TELLSTICK_API int WINAPI tdSetControllerValue(int controllerId, const char *name, const char *value);
-	TELLSTICK_API int WINAPI tdRemoveController(int controllerId);
-
-#ifdef __cplusplus
-}
-#endif
-
-// Device methods
-#define TELLSTICK_TURNON	1
-#define TELLSTICK_TURNOFF	2
-#define TELLSTICK_BELL		4
-#define TELLSTICK_TOGGLE	8
-#define TELLSTICK_DIM		16
-#define TELLSTICK_LEARN		32
-#define TELLSTICK_EXECUTE	64
-#define TELLSTICK_UP		128
-#define TELLSTICK_DOWN		256
-#define TELLSTICK_STOP		512
-
-// Sensor value types
-#define TELLSTICK_TEMPERATURE	1
-#define TELLSTICK_HUMIDITY		2
-#define TELLSTICK_RAINRATE		4
-#define TELLSTICK_RAINTOTAL		8
-#define TELLSTICK_WINDDIRECTION	16
-#define TELLSTICK_WINDAVERAGE	32
-#define TELLSTICK_WINDGUST		64
-
-// Error codes
-#define TELLSTICK_SUCCESS 0
-#define TELLSTICK_ERROR_NOT_FOUND -1
-#define TELLSTICK_ERROR_PERMISSION_DENIED -2
-#define TELLSTICK_ERROR_DEVICE_NOT_FOUND -3
-#define TELLSTICK_ERROR_METHOD_NOT_SUPPORTED -4
-#define TELLSTICK_ERROR_COMMUNICATION -5
-#define TELLSTICK_ERROR_CONNECTING_SERVICE -6
-#define TELLSTICK_ERROR_UNKNOWN_RESPONSE -7
-#define TELLSTICK_ERROR_SYNTAX -8
-#define TELLSTICK_ERROR_BROKEN_PIPE -9
-#define TELLSTICK_ERROR_COMMUNICATING_SERVICE -10
-#define TELLSTICK_ERROR_CONFIG_SYNTAX -11
-#define TELLSTICK_ERROR_UNKNOWN -99
-
-// Device typedef
-#define TELLSTICK_TYPE_DEVICE	1
-#define TELLSTICK_TYPE_GROUP	2
-#define TELLSTICK_TYPE_SCENE	3
-
-// Controller typedef
-#define TELLSTICK_CONTROLLER_TELLSTICK      1
-#define TELLSTICK_CONTROLLER_TELLSTICK_DUO  2
-#define TELLSTICK_CONTROLLER_TELLSTICK_NET  3
-
-// Device changes
-#define TELLSTICK_DEVICE_ADDED			1
-#define TELLSTICK_DEVICE_CHANGED		2
-#define TELLSTICK_DEVICE_REMOVED		3
-#define TELLSTICK_DEVICE_STATE_CHANGED	4
-
-// Change types
-#define TELLSTICK_CHANGE_NAME			1
-#define TELLSTICK_CHANGE_PROTOCOL		2
-#define TELLSTICK_CHANGE_MODEL			3
-#define TELLSTICK_CHANGE_METHOD			4
-#define TELLSTICK_CHANGE_AVAILABLE		5
-#define TELLSTICK_CHANGE_FIRMWARE		6
-
-#endif  // TELLDUS_CORE_CLIENT_TELLDUS_CORE_H_
diff --git a/telldus-core/client/telldus-core.rc.in b/telldus-core/client/telldus-core.rc.in
deleted file mode 100644
index 23b37639..00000000
--- a/telldus-core/client/telldus-core.rc.in
+++ /dev/null
@@ -1,18 +0,0 @@
-#include 
-
-VS_VERSION_INFO VERSIONINFO
-  FILEVERSION ${PACKAGE_MAJOR_VERSION},${PACKAGE_MINOR_VERSION},${PACKAGE_PATCH_VERSION},0
-BEGIN
-  BLOCK "StringFileInfo"
-  BEGIN
-    BLOCK "04090000"
-    BEGIN
-      VALUE "FileDescription", "Utilities and driver to control wireless receivers through a TellStick"
-      VALUE "FileVersion", "${PACKAGE_VERSION}"
-      VALUE "LegalCopyright", "Copyright (C) 2010 Telldus Technologies AB"
-      VALUE "OriginalFilename", "TelldusCore.dll"
-      VALUE "ProductName", "TelldusCore"
-      VALUE "ProductVersion", "${PACKAGE_MAJOR_VERSION}.${PACKAGE_MINOR_VERSION}"
-    END
-  END
-END
\ No newline at end of file
diff --git a/telldus-core/cmake/FindSignTool.cmake b/telldus-core/cmake/FindSignTool.cmake
deleted file mode 100644
index ff7dfc08..00000000
--- a/telldus-core/cmake/FindSignTool.cmake
+++ /dev/null
@@ -1,19 +0,0 @@
-
-IF(WIN32)
-	SET(SIGN_FILES FALSE CACHE BOOL "Sign the generated files. This requires a certificate to be installed on the computer!")
-ENDIF()
-
-FUNCTION(SIGN TARGET)
-	IF (NOT WIN32)
-		RETURN()
-	ENDIF()
-	IF (NOT SIGN_FILES)
-		RETURN()
-	ENDIF()
-	GET_TARGET_PROPERTY(file ${TARGET} LOCATION)
-	GET_FILENAME_COMPONENT(filename ${file} NAME)
-	ADD_CUSTOM_COMMAND( TARGET ${TARGET} POST_BUILD
-		COMMAND signtool.exe sign /a /t http://timestamp.verisign.com/scripts/timstamp.dll ${file}
-		COMMENT "Signing file ${filename}"
-	)
-ENDFUNCTION()
diff --git a/telldus-core/common/CMakeLists.txt b/telldus-core/common/CMakeLists.txt
deleted file mode 100644
index 13aafa87..00000000
--- a/telldus-core/common/CMakeLists.txt
+++ /dev/null
@@ -1,89 +0,0 @@
-IF(COMMAND cmake_policy)
-	CMAKE_POLICY(SET CMP0003 NEW)
-ENDIF(COMMAND cmake_policy)
-
-######## Non configurable options  ########
-SET( telldus-common_SRCS
-	Event.cpp
-	Message.cpp
-	Mutex.cpp
-	Strings.cpp
-	Thread.cpp
-)
-
-SET( telldus-common_HDRS
-	common.h
-	Event.h
-	EventHandler.h
-	Message.h
-	Mutex.h
-	Socket.h
-	Strings.h
-	Thread.h
-)
-
-INCLUDE_DIRECTORIES( ${CMAKE_SOURCE_DIR} )
-
-######## Configurable options for the platform  ########
-
-
-######## Platforms-specific, non configurable  ########
-
-IF (APPLE)
-	#### Mac OS X ####
-	FIND_LIBRARY(ICONV_LIBRARY iconv)
-	ADD_DEFINITIONS( -D_MACOSX )
-	LIST(APPEND  telldus-common_SRCS
-		Event_unix.cpp
-		EventHandler_unix.cpp
-		Socket_unix.cpp
-		stdlibc_workaround.cpp #Remove this when we drop support for 10.5
-	)
-	LIST(APPEND telldus-common_LIBRARIES
-		${ICONV_LIBRARY}
-	)
-ELSEIF (WIN32)
-	#### Windows ####
-	ADD_DEFINITIONS( -DUNICODE )
-	ADD_DEFINITIONS( /Zc:wchar_t- ) # Treat wchar_t as Built-in Type' = No
-	ADD_DEFINITIONS( -D_WINDOWS )
-	LIST(APPEND  telldus-common_SRCS
-		Event_win.cpp
-		EventHandler_win.cpp
-		Socket_win.cpp
-	)
-ELSEIF (CMAKE_SYSTEM_NAME MATCHES "FreeBSD")
-	#### FreeBSD ####
-	FIND_LIBRARY(ICONV_LIBRARY iconv)
-	ADD_DEFINITIONS( -D_FREEBSD )
-	LIST(APPEND  telldus-common_SRCS
-		Event_unix.cpp
-		EventHandler_unix.cpp
-		Socket_unix.cpp
-	)
-	LIST(APPEND telldus-common_LIBRARIES
-		${ICONV_LIBRARY}
-	)
-ELSE (APPLE)
-	#### Linux ####
-	ADD_DEFINITIONS( -D_LINUX )
-	LIST(APPEND  telldus-common_SRCS
-		Event_unix.cpp
-		EventHandler_unix.cpp
-		Socket_unix.cpp
-	)
-ENDIF (APPLE)
-
-
-######## Configuring  ########
-
-ADD_LIBRARY(TelldusCommon STATIC
-	${telldus-common_SRCS}
-	${telldus-common_HDRS}
-)
-
-IF (UNIX)
-	SET_TARGET_PROPERTIES( TelldusCommon PROPERTIES COMPILE_FLAGS "-fPIC -fvisibility=hidden")
-ENDIF (UNIX)
-
-TARGET_LINK_LIBRARIES( TelldusCommon	${telldus-common_LIBRARIES} )
diff --git a/telldus-core/common/Event.cpp b/telldus-core/common/Event.cpp
deleted file mode 100644
index 7cb30558..00000000
--- a/telldus-core/common/Event.cpp
+++ /dev/null
@@ -1,88 +0,0 @@
-//
-// Copyright (C) 2012 Telldus Technologies AB. All rights reserved.
-//
-// Copyright: See COPYING file that comes with this distribution
-//
-//
-#include "common/Event.h"
-#include 
-#include "common/EventHandler.h"
-#include "common/Mutex.h"
-
-namespace TelldusCore {
-
-EventData::~EventData() {
-}
-
-bool EventData::isValid() const {
-	return false;
-};
-
-bool EventDataBase::isValid() const {
-	return true;
-};
-
-class EventBase::PrivateData {
-public:
-	TelldusCore::Mutex mutex;
-	EventHandler *handler;
-	std::list eventDataList;
-};
-
-EventBase::EventBase(TelldusCore::EventHandler *handler) {
-	d = new PrivateData;
-	d->handler = handler;
-}
-
-EventBase::~EventBase(void) {
-	delete d;
-}
-
-void EventBase::clearHandler() {
-	TelldusCore::MutexLocker locker(&d->mutex);
-	d->handler = 0;
-}
-
-void EventBase::popSignal() {
-	this->takeSignal();
-}
-
-EventHandler *EventBase::handler() const {
-	return d->handler;
-}
-
-bool EventBase::isSignaled() {
-	TelldusCore::MutexLocker locker(&d->mutex);
-	return (d->eventDataList.size() > 0);
-}
-
-void EventBase::signal() {
-	signal(new EventData());
-}
-
-void EventBase::signal(EventData *eventData) {
-	this->signal(EventDataRef(eventData));
-}
-
-void EventBase::signal(EventDataRef eventData) {
-	{
-		TelldusCore::MutexLocker locker(&d->mutex);
-		d->eventDataList.push_back(eventData);
-	}
-	sendSignal();
-}
-
-EventDataRef EventBase::takeSignal() {
-	TelldusCore::MutexLocker locker(&d->mutex);
-	if (d->eventDataList.size() == 0) {
-		return EventDataRef(new EventData());
-	}
-	EventDataRef data = d->eventDataList.front();
-	d->eventDataList.pop_front();
-	if (d->eventDataList.size() == 0) {
-		this->clearSignal();
-	}
-	return data;
-}
-
-}  // namespace TelldusCore
diff --git a/telldus-core/common/Event.h b/telldus-core/common/Event.h
deleted file mode 100644
index 8612d72a..00000000
--- a/telldus-core/common/Event.h
+++ /dev/null
@@ -1,80 +0,0 @@
-//
-// Copyright (C) 2012 Telldus Technologies AB. All rights reserved.
-//
-// Copyright: See COPYING file that comes with this distribution
-//
-//
-#ifndef TELLDUS_CORE_COMMON_EVENT_H_
-#define TELLDUS_CORE_COMMON_EVENT_H_
-
-
-#ifndef _WINDOWS
-	#include 
-	typedef void* EVENT_T;
-#else
-	#include 
-	#include 
-	typedef HANDLE EVENT_T;
-#endif
-#include "common/Thread.h"
-
-namespace TelldusCore {
-	class EventHandler;
-
-	class EventData {
-	public:
-		virtual ~EventData();
-		virtual bool isValid() const;
-	};
-
-	class EventDataBase : public EventData {
-	public:
-		virtual bool isValid() const;
-	};
-
-	typedef std::tr1::shared_ptr EventDataRef;
-
-	class EventBase {
-	public:
-		virtual ~EventBase();
-
-		void popSignal();
-		bool isSignaled();
-		void signal();
-		void signal(EventData *eventData);
-		void signal(EventDataRef eventData);
-		EventDataRef takeSignal();
-
-	protected:
-		explicit EventBase(EventHandler *handler);
-		void clearHandler();
-		virtual void clearSignal() = 0;
-		EventHandler *handler() const;
-		virtual void sendSignal() = 0;
-
-	private:
-		class PrivateData;
-		PrivateData *d;
-	};
-
-	class Event : public EventBase {
-	public:
-		virtual ~Event();
-
-	protected:
-		explicit Event(EventHandler *handler);
-		EVENT_T retrieveNative();
-		virtual void clearSignal();
-		virtual void sendSignal();
-
-	private:
-		class PrivateData;
-		PrivateData *d;
-
-		friend class EventHandler;
-	};
-
-	typedef std::tr1::shared_ptr EventRef;
-}
-
-#endif  // TELLDUS_CORE_COMMON_EVENT_H_
diff --git a/telldus-core/common/EventHandler.h b/telldus-core/common/EventHandler.h
deleted file mode 100644
index 620d370e..00000000
--- a/telldus-core/common/EventHandler.h
+++ /dev/null
@@ -1,39 +0,0 @@
-//
-// Copyright (C) 2012 Telldus Technologies AB. All rights reserved.
-//
-// Copyright: See COPYING file that comes with this distribution
-//
-//
-#ifndef TELLDUS_CORE_COMMON_EVENTHANDLER_H_
-#define TELLDUS_CORE_COMMON_EVENTHANDLER_H_
-
-#ifdef _MSC_VER
-typedef unsigned __int64 uint64_t;
-#else
-#include 
-#endif
-#include "common/Event.h"
-
-namespace TelldusCore {
-
-	class EventHandler {
-	public:
-		EventHandler();
-		virtual ~EventHandler(void);
-
-		EventRef addEvent();
-
-		bool waitForAny();
-
-	protected:
-		void signal(Event *event);
-
-	private:
-		class PrivateData;
-		PrivateData *d;
-		bool listIsSignalled();
-		friend class Event;
-	};
-}
-
-#endif  // TELLDUS_CORE_COMMON_EVENTHANDLER_H_
diff --git a/telldus-core/common/EventHandler_unix.cpp b/telldus-core/common/EventHandler_unix.cpp
deleted file mode 100644
index 6c65339c..00000000
--- a/telldus-core/common/EventHandler_unix.cpp
+++ /dev/null
@@ -1,96 +0,0 @@
-//
-// Copyright (C) 2012 Telldus Technologies AB. All rights reserved.
-//
-// Copyright: See COPYING file that comes with this distribution
-//
-//
-#include 
-#include 
-#include 
-#include 
-#include 
-#include "common/EventHandler.h"
-#include "common/Event.h"
-#include "common/Mutex.h"
-#include "common/Thread.h"
-
-namespace TelldusCore {
-
-class EventHandler::PrivateData {
-public:
-	pthread_cond_t event;
-	pthread_mutex_t mutex;
-	std::list eventList;
-	TelldusCore::Mutex listMutex;
-	bool isSignalled;
-};
-
-EventHandler::EventHandler() {
-	d = new PrivateData;
-	pthread_cond_init(&d->event, NULL);
-	pthread_cond_init(&d->event, NULL);
-	pthread_mutex_init(&d->mutex, NULL);
-	d->isSignalled = false;
-}
-
-EventHandler::~EventHandler(void) {
-	pthread_mutex_destroy(&d->mutex);
-	pthread_cond_destroy(&d->event);
-
-	std::list::const_iterator it = d->eventList.begin();
-	for(; it != d->eventList.end(); ++it) {
-		// We clear the handler if someone else still has a reference to the event
-		(*it)->clearHandler();
-	}
-
-	delete d;
-}
-
-EventRef EventHandler::addEvent() {
-	EventRef event(new Event(this));
-	TelldusCore::MutexLocker locker(&d->listMutex);
-	d->eventList.push_back(event);
-	return event;
-}
-
-bool EventHandler::listIsSignalled() {
-	TelldusCore::MutexLocker locker(&d->listMutex);
-
-	std::list::const_iterator it = d->eventList.begin();
-	for(; it != d->eventList.end(); ++it) {
-		if((*it)->isSignaled()) {
-			return true;
-		}
-	}
-	return false;
-}
-
-void EventHandler::signal(Event *event) {
-	pthread_mutex_lock(&d->mutex);
-	d->isSignalled = true;
-	// event->setSignaled();
-	pthread_cond_signal(&d->event);
-	pthread_mutex_unlock(&d->mutex);
-}
-
-bool EventHandler::waitForAny() {
-	pthread_mutex_lock(&d->mutex);
-	int ret;
-	while (!d->isSignalled) {
-		timeval now;
-		gettimeofday(&now, NULL);
-		uint64_t abstime_ns_large = now.tv_usec*1000 + 60000000000;  // add 60 seconds wait (5 seconds before)?
-		timespec abstime = { now.tv_sec + (abstime_ns_large / 1000000000), abstime_ns_large % 1000000000 };
-		ret = pthread_cond_timedwait(&d->event, &d->mutex, &abstime);
-		if (ret == ETIMEDOUT) {
-			continue;
-		}
-	}
-	if (!listIsSignalled()) {
-		d->isSignalled = false;
-	}
-	pthread_mutex_unlock(&d->mutex);
-	return listIsSignalled();
-}
-
-}  // namespace TelldusCore
diff --git a/telldus-core/common/EventHandler_win.cpp b/telldus-core/common/EventHandler_win.cpp
deleted file mode 100644
index 57833bde..00000000
--- a/telldus-core/common/EventHandler_win.cpp
+++ /dev/null
@@ -1,76 +0,0 @@
-//
-// Copyright (C) 2012 Telldus Technologies AB. All rights reserved.
-//
-// Copyright: See COPYING file that comes with this distribution
-//
-//
-#include "common/EventHandler.h"
-#include 
-#include 
-
-#include "common/Event.h"
-#include "common/Mutex.h"
-
-namespace TelldusCore {
-
-class EventHandler::PrivateData {
-public:
-	HANDLE *eventArray;
-	EventRef *eventObjectArray;
-	TelldusCore::Mutex mutex;
-	int eventCount;
-};
-
-EventHandler::EventHandler() {
-	d = new PrivateData;
-	d->eventCount = 0;
-	d->eventArray = new HANDLE[0];
-	d->eventObjectArray = new EventRef[0];
-}
-
-EventHandler::~EventHandler(void) {
-	delete[] d->eventObjectArray;
-	delete[] d->eventArray;
-	delete d;
-}
-
-EventRef EventHandler::addEvent() {
-	EventRef event(new Event(this));
-
-	TelldusCore::MutexLocker locker(&d->mutex);
-
-	HANDLE *newArray = new HANDLE[d->eventCount+1];
-	EventRef *newObjectArray = new EventRef[d->eventCount+1];
-	for (int i = 0; i < d->eventCount; ++i) {
-		newArray[i] = d->eventArray[i];
-		newObjectArray[i] = d->eventObjectArray[i];
-	}
-	delete[] d->eventArray;
-	delete[] d->eventObjectArray;
-	d->eventArray = newArray;
-	d->eventObjectArray = newObjectArray;
-	d->eventArray[d->eventCount] = event->retrieveNative();
-	d->eventObjectArray[d->eventCount] = event;
-	++d->eventCount;
-	return event;
-}
-
-void EventHandler::signal(Event *event) {
-}
-
-bool EventHandler::waitForAny() {
-	while(1) {
-		int result = WaitForMultipleObjects(d->eventCount, d->eventArray, FALSE, 1000);
-		if (result == WAIT_TIMEOUT) {
-			continue;
-		}
-		TelldusCore::MutexLocker locker(&d->mutex);
-		int eventIndex = result - WAIT_OBJECT_0;
-		if (eventIndex >= d->eventCount) {
-			return false;
-		}
-		return true;
-	}
-}
-
-}  // namespace TelldusCore
diff --git a/telldus-core/common/Event_unix.cpp b/telldus-core/common/Event_unix.cpp
deleted file mode 100644
index 301b6b2e..00000000
--- a/telldus-core/common/Event_unix.cpp
+++ /dev/null
@@ -1,36 +0,0 @@
-//
-// Copyright (C) 2012 Telldus Technologies AB. All rights reserved.
-//
-// Copyright: See COPYING file that comes with this distribution
-//
-//
-#include "common/Event.h"
-#include "common/EventHandler.h"
-#include "common/Thread.h"
-
-namespace TelldusCore {
-
-class Event::PrivateData {
-public:
-};
-
-Event::Event(EventHandler *handler)
-	:EventBase(handler) {
-	d = new PrivateData;
-}
-
-Event::~Event(void) {
-	delete d;
-}
-
-void Event::clearSignal() {
-}
-
-void Event::sendSignal() {
-	EventHandler *handler = this->handler();
-	if (handler) {
-		handler->signal(this);
-	}
-}
-
-}  // namespace TelldusCore
diff --git a/telldus-core/common/Event_win.cpp b/telldus-core/common/Event_win.cpp
deleted file mode 100644
index e116d380..00000000
--- a/telldus-core/common/Event_win.cpp
+++ /dev/null
@@ -1,40 +0,0 @@
-//
-// Copyright (C) 2012 Telldus Technologies AB. All rights reserved.
-//
-// Copyright: See COPYING file that comes with this distribution
-//
-//
-#include "common/Event.h"
-#include "common/Thread.h"
-
-namespace TelldusCore {
-
-class Event::PrivateData {
-public:
-	EVENT_T event;
-};
-
-Event::Event(EventHandler *handler)
-	:EventBase(handler) {
-	d = new PrivateData;
-	d->event = CreateEvent(NULL, true, false, NULL);
-}
-
-Event::~Event(void) {
-	CloseHandle(d->event);
-	delete d;
-}
-
-EVENT_T Event::retrieveNative() {
-	return d->event;
-}
-
-void Event::clearSignal() {
-	ResetEvent(d->event);
-}
-
-void Event::sendSignal() {
-	SetEvent(d->event);
-}
-
-}  // namespace TelldusCore
diff --git a/telldus-core/common/Message.cpp b/telldus-core/common/Message.cpp
deleted file mode 100644
index 6fbea009..00000000
--- a/telldus-core/common/Message.cpp
+++ /dev/null
@@ -1,131 +0,0 @@
-//
-// Copyright (C) 2012 Telldus Technologies AB. All rights reserved.
-//
-// Copyright: See COPYING file that comes with this distribution
-//
-//
-#include "common/Message.h"
-#include 
-#include 
-#include 
-#include "common/Socket.h"
-#include "common/Strings.h"
-
-namespace TelldusCore {
-
-Message::Message()
-	: std::wstring() {
-}
-
-Message::Message(const std::wstring &functionName)
-	:std::wstring() {
-	this->addArgument(functionName);
-}
-
-Message::~Message(void) {
-}
-
-void Message::addArgument(const std::wstring &value) {
-	// std::wstringstream st;
-	// st << (int)value.size();
-	this->append(TelldusCore::intToWstring(value.size()));  // st.str());
-	this->append(L":");
-	this->append(value);
-}
-
-void Message::addArgument(int value) {
-	// std::wstringstream st;
-	// st << (int)value;
-	this->append(L"i");
-	this->append(TelldusCore::intToWstring(value));  // st.str());
-	this->append(L"s");
-}
-
-/*
-void Message::addSpecialArgument(const std::wstring &value){
-	int i = 0;
-	while(i<1000000){
-		i++;
-
-		char numstr[21]; // enough to hold all numbers up to 64-bits
-		//sprintf(numstr, "%d", value.size());
-		//this->append(TelldusCore::charToWstring(numstr)); //.str());
-
-		itoa(value.size(), numstr, 10);
-		std::string test(numstr);
-		std::wstring temp(test.length(), L' ');
-		std::copy(test.begin(), test.end(), temp.begin());
-
-		this->append(temp);
-		this->append(L":");
-		this->append(value);
-
-
-		std::wstringstream st;
-		st << (int)value.size();
-		this->append(st.str());
-		this->append(L":");
-		this->append(value);
-
-	}
-}
-
-void Message::addSpecialArgument(int value){
-	int i = 0;
-	while(i<1000000){
-		i++;
-		//std::wstringstream st;
-		//st << (int)value;
-		this->append(L"i");
-		//this->append(st.str());
-		this->append(L"s");
-
-	}
-}
-*/
-/*
-void Message::addSpecialArgument(const char *value){
-	this->addSpecialArgument(TelldusCore::charToWstring(value));
-}
-*/
-
-void Message::addArgument(const char *value) {
-	this->addArgument(TelldusCore::charToWstring(value));
-}
-
-bool Message::nextIsInt(const std::wstring &message) {
-	if (message.length() == 0) {
-		return false;
-	}
-	return (message.at(0) == 'i');
-}
-
-bool Message::nextIsString(const std::wstring &message) {
-	if (message.length() == 0) {
-		return false;
-	}
-	return (iswdigit(message.at(0)) != 0);
-}
-
-std::wstring Message::takeString(std::wstring *message) {
-	if (!Message::nextIsString(*message)) {
-		return L"";
-	}
-	size_t index = message->find(':');
-	int length = wideToInteger(message->substr(0, index));
-	std::wstring retval(message->substr(index+1, length));
-	message->erase(0, index+length+1);
-	return retval;
-}
-
-int Message::takeInt(std::wstring *message) {
-	if (!Message::nextIsInt(*message)) {
-		return 0;
-	}
-	size_t index = message->find('s');
-	int value = wideToInteger(message->substr(1, index - 1));
-	message->erase(0, index+1);
-	return value;
-}
-
-}  // namespace TelldusCore
diff --git a/telldus-core/common/Message.h b/telldus-core/common/Message.h
deleted file mode 100644
index f0ca593c..00000000
--- a/telldus-core/common/Message.h
+++ /dev/null
@@ -1,36 +0,0 @@
-//
-// Copyright (C) 2012 Telldus Technologies AB. All rights reserved.
-//
-// Copyright: See COPYING file that comes with this distribution
-//
-//
-#ifndef TELLDUS_CORE_COMMON_MESSAGE_H_
-#define TELLDUS_CORE_COMMON_MESSAGE_H_
-
-#include 
-
-namespace TelldusCore {
-	class Message : public std::wstring {
-	public:
-		Message();
-		explicit Message(const std::wstring &functionName);
-		~Message(void);
-
-		void addArgument(const std::wstring &value);
-		// void addSpecialArgument(const std::wstring &);
-		// void addSpecialArgument(int);
-		// void addSpecialArgument(const char *);
-		void addArgument(int value);
-		void addArgument(const char *value);
-
-		static bool nextIsInt(const std::wstring &message);
-		static bool nextIsString(const std::wstring &message);
-
-		static std::wstring takeString(std::wstring *message);
-		static int takeInt(std::wstring *message);
-
-	private:
-	};
-}
-
-#endif  // TELLDUS_CORE_COMMON_MESSAGE_H_
diff --git a/telldus-core/common/Mutex.cpp b/telldus-core/common/Mutex.cpp
deleted file mode 100644
index 003a0f8b..00000000
--- a/telldus-core/common/Mutex.cpp
+++ /dev/null
@@ -1,88 +0,0 @@
-//
-// C++ Implementation: Thread
-//
-// Description:
-//
-//
-// Author: Micke Prag , (C) 2009
-//
-// Copyright: See COPYING file that comes with this distribution
-//
-//
-
-#include "common/Mutex.h"
-
-#ifdef _WINDOWS
-	#include 
-	typedef HANDLE MUTEX_T;
-#else
-	#include 
-	typedef pthread_mutex_t MUTEX_T;
-#endif
-
-#include "common/common.h"
-
-namespace TelldusCore {
-
-class Mutex::PrivateData {
-public:
-	MUTEX_T mutex;
-};
-
-Mutex::Mutex() {
-	d = new PrivateData;
-#ifdef _WINDOWS
-	d->mutex = CreateMutex(NULL, FALSE, NULL);
-#else
-	pthread_mutex_init(&d->mutex, NULL);
-#endif
-}
-
-Mutex::~Mutex() {
-#ifdef _WINDOWS
-	CloseHandle(d->mutex);
-#else
-	pthread_mutex_destroy(&d->mutex);
-#endif
-	delete d;
-}
-
-void Mutex::lock() {
-#ifdef _WINDOWS
-	WaitForSingleObject(d->mutex, INFINITE);
-#else
-	pthread_mutex_lock(&d->mutex);
-#endif
-}
-
-void Mutex::unlock() {
-#ifdef _WINDOWS
-	ReleaseMutex(d->mutex);
-#else
-	pthread_mutex_unlock(&d->mutex);
-#endif
-}
-
-
-void LoggedMutex::lock() {
-	debuglog(0, "Locking");
-	Mutex::lock();
-	debuglog(0, "Locked");
-}
-
-void LoggedMutex::unlock() {
-	debuglog(0, "Unlocking");
-	Mutex::unlock();
-	debuglog(0, "Unlocked");
-}
-
-MutexLocker::MutexLocker(Mutex *m)
-	:mutex(m) {
-	mutex->lock();
-}
-
-MutexLocker::~MutexLocker() {
-	mutex->unlock();
-}
-
-}  // namespace TelldusCore
diff --git a/telldus-core/common/Mutex.h b/telldus-core/common/Mutex.h
deleted file mode 100644
index 082ee173..00000000
--- a/telldus-core/common/Mutex.h
+++ /dev/null
@@ -1,45 +0,0 @@
-//
-// C++ Interface: Thread
-//
-// Description:
-//
-//
-// Author: Micke Prag , (C) 2010
-//
-// Copyright: See COPYING file that comes with this distribution
-//
-//
-#ifndef TELLDUS_CORE_COMMON_MUTEX_H_
-#define TELLDUS_CORE_COMMON_MUTEX_H_
-
-namespace TelldusCore {
-	class Mutex {
-	public:
-		Mutex();
-		virtual ~Mutex();
-
-		virtual void lock();
-		virtual void unlock();
-
-	private:
-		Mutex(const Mutex&);  // Disable copy
-		Mutex& operator = (const Mutex&);
-		class PrivateData;
-		PrivateData *d;
-	};
-	class LoggedMutex : public Mutex {
-	public:
-		void lock();
-		void unlock();
-	};
-
-	class MutexLocker {
-	public:
-		explicit MutexLocker(Mutex *m);
-		~MutexLocker();
-	private:
-		Mutex *mutex;
-	};
-}
-
-#endif  // TELLDUS_CORE_COMMON_MUTEX_H_
diff --git a/telldus-core/common/Socket.h b/telldus-core/common/Socket.h
deleted file mode 100644
index 98fdbc51..00000000
--- a/telldus-core/common/Socket.h
+++ /dev/null
@@ -1,39 +0,0 @@
-//
-// Copyright (C) 2012 Telldus Technologies AB. All rights reserved.
-//
-// Copyright: See COPYING file that comes with this distribution
-//
-//
-#ifndef TELLDUS_CORE_COMMON_SOCKET_H_
-#define TELLDUS_CORE_COMMON_SOCKET_H_
-
-#ifdef _WINDOWS
-	#include 
-	typedef HANDLE SOCKET_T;
-#else
-	typedef int SOCKET_T;
-#endif
-
-#include 
-
-namespace TelldusCore {
-	class Socket {
-	public:
-		Socket();
-		explicit Socket(SOCKET_T hPipe);
-		virtual ~Socket(void);
-
-		void connect(const std::wstring &server);
-		bool isConnected();
-		std::wstring read();
-		std::wstring read(int timeout);
-		void stopReadWait();
-		void write(const std::wstring &msg);
-
-	private:
-		class PrivateData;
-		PrivateData *d;
-	};
-}
-
-#endif  // TELLDUS_CORE_COMMON_SOCKET_H_
diff --git a/telldus-core/common/Socket_unix.cpp b/telldus-core/common/Socket_unix.cpp
deleted file mode 100644
index 79dc086f..00000000
--- a/telldus-core/common/Socket_unix.cpp
+++ /dev/null
@@ -1,146 +0,0 @@
-//
-// Copyright (C) 2012 Telldus Technologies AB. All rights reserved.
-//
-// Copyright: See COPYING file that comes with this distribution
-//
-//
-
-#include 
-#include 
-#include 
-#include 
-#include 
-#include 
-#include 
-
-#include "common/Socket.h"
-#include "common/Mutex.h"
-#include "common/Strings.h"
-
-#define BUFSIZE 512
-#if defined(_MACOSX) && !defined(SOCK_CLOEXEC)
-	#define SOCK_CLOEXEC 0
-#endif
-
-namespace TelldusCore {
-
-int connectWrapper(int sockfd, const struct sockaddr *addr, socklen_t addrlen) {
-	return connect(sockfd, addr, addrlen);
-}
-
-class Socket::PrivateData {
-public:
-	SOCKET_T socket;
-	bool connected;
-	fd_set infds;
-	Mutex mutex;
-};
-
-Socket::Socket() {
-	d = new PrivateData;
-	d->socket = -1;
-	d->connected = false;
-	FD_ZERO(&d->infds);
-}
-
-Socket::Socket(SOCKET_T socket) {
-	d = new PrivateData;
-	d->socket = socket;
-	FD_ZERO(&d->infds);
-	d->connected = true;
-}
-
-Socket::~Socket(void) {
-	if(d->socket >= 0) {
-		close(d->socket);
-	}
-	delete d;
-}
-
-void Socket::connect(const std::wstring &server) {
-	struct sockaddr_un remote;
-	socklen_t len;
-
-	if (d->socket == -1) {
-		if ((d->socket = socket(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0)) == -1) {
-			return;
-		}
-	}
-#if defined(_MACOSX)
-	int op = fcntl(d->socket, F_GETFD);
-	fcntl(d->socket, F_SETFD, op | FD_CLOEXEC);  // OS X doesn't support SOCK_CLOEXEC yet
-#endif
-	std::string name = "/tmp/" + std::string(server.begin(), server.end());
-	remote.sun_family = AF_UNIX;
-	snprintf(remote.sun_path, sizeof(remote.sun_path), "%s", name.c_str());
-
-	len = SUN_LEN(&remote);
-	if (connectWrapper(d->socket, (struct sockaddr *)&remote, len) == -1) {
-		return;
-	}
-
-	TelldusCore::MutexLocker locker(&d->mutex);
-	d->connected = true;
-}
-
-bool Socket::isConnected() {
-	TelldusCore::MutexLocker locker(&d->mutex);
-	return d->connected;
-}
-
-std::wstring Socket::read() {
-	return this->read(0);
-}
-
-std::wstring Socket::read(int timeout) {
-	struct timeval tv;
-	char inbuf[BUFSIZE];
-
-	FD_SET(d->socket, &d->infds);
-	std::string msg;
-	while(isConnected()) {
-		tv.tv_sec = floor(timeout / 1000.0);
-		tv.tv_usec = timeout % 1000;
-
-		int response = select(d->socket+1, &d->infds, NULL, NULL, &tv);
-		if (response == 0 && timeout > 0) {
-			return L"";
-		} else if (response <= 0) {
-			FD_SET(d->socket, &d->infds);
-			continue;
-		}
-
-		int received = BUFSIZE;
-		while(received >= (BUFSIZE - 1)) {
-			memset(inbuf, '\0', sizeof(inbuf));
-			received = recv(d->socket, inbuf, BUFSIZE - 1, 0);
-			if(received > 0) {
-				msg.append(std::string(inbuf));
-			}
-		}
-		if (received < 0) {
-			TelldusCore::MutexLocker locker(&d->mutex);
-			d->connected = false;
-		}
-		break;
-	}
-
-	return TelldusCore::charToWstring(msg.c_str());
-}
-
-void Socket::stopReadWait() {
-	TelldusCore::MutexLocker locker(&d->mutex);
-	d->connected = false;
-	// TODO(stefan): somehow signal the socket here?
-}
-
-void Socket::write(const std::wstring &msg) {
-	std::string newMsg(TelldusCore::wideToString(msg));
-	int sent = send(d->socket, newMsg.c_str(), newMsg.length(), 0);
-	if (sent < 0) {
-		TelldusCore::MutexLocker locker(&d->mutex);
-		d->connected = false;
-	}
-}
-
-}  // namespace TelldusCore
diff --git a/telldus-core/common/Socket_win.cpp b/telldus-core/common/Socket_win.cpp
deleted file mode 100644
index 23d87acc..00000000
--- a/telldus-core/common/Socket_win.cpp
+++ /dev/null
@@ -1,187 +0,0 @@
-//
-// Copyright (C) 2012 Telldus Technologies AB. All rights reserved.
-//
-// Copyright: See COPYING file that comes with this distribution
-//
-//
-#include 
-#include 
-#include 
-
-#include "common/common.h"
-#include "common/Socket.h"
-
-#define BUFSIZE 512
-
-namespace TelldusCore {
-
-class Socket::PrivateData {
-public:
-	HANDLE hPipe;
-	HANDLE readEvent;
-	bool connected;
-	bool running;
-};
-
-Socket::Socket() {
-	d = new PrivateData;
-	d->hPipe = INVALID_HANDLE_VALUE;
-	d->connected = false;
-	d->running = true;
-}
-
-Socket::Socket(SOCKET_T hPipe) {
-	d = new PrivateData;
-	d->hPipe = hPipe;
-	d->connected = true;
-	d->running = true;
-}
-
-
-Socket::~Socket(void) {
-	d->running = false;
-	SetEvent(d->readEvent);  // signal for break
-	if (d->hPipe != INVALID_HANDLE_VALUE) {
-		CloseHandle(d->hPipe);
-		d->hPipe = 0;
-	}
-	delete d;
-}
-
-void Socket::connect(const std::wstring &server) {
-	BOOL fSuccess = false;
-
-	std::wstring name(L"\\\\.\\pipe\\" + server);
-	d->hPipe = CreateFile(
-		(const wchar_t *)name.c_str(),           // pipe name
-		GENERIC_READ |  // read and write access
-		GENERIC_WRITE,
-		0,              // no sharing
-		NULL,           // default security attributes
-		OPEN_EXISTING,  // opens existing pipe
-		FILE_FLAG_OVERLAPPED,  // default attributes
-		NULL);          // no template file
-
-	if (d->hPipe == INVALID_HANDLE_VALUE) {
-		return;
-	}
-
-	DWORD dwMode = PIPE_READMODE_MESSAGE;
-	fSuccess = SetNamedPipeHandleState(
-		d->hPipe,  // pipe handle
-		&dwMode,   // new pipe mode
-		NULL,      // don't set maximum bytes
-		NULL);     // don't set maximum time
-
-	if (!fSuccess) {
-		return;
-	}
-	d->connected = true;
-}
-
-void Socket::stopReadWait() {
-	d->running = false;
-	SetEvent(d->readEvent);
-}
-
-std::wstring Socket::read() {
-	return read(INFINITE);
-}
-
-std::wstring Socket::read(int timeout) {
-	wchar_t buf[BUFSIZE];
-	int result;
-	DWORD cbBytesRead = 0;
-	OVERLAPPED oOverlap;
-
-	memset(&oOverlap, 0, sizeof(OVERLAPPED));
-
-	d->readEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
-	oOverlap.hEvent = d->readEvent;
-	BOOL fSuccess = false;
-	std::wstring returnString;
-	bool moreData = true;
-
-	while(moreData) {
-		moreData = false;
-		memset(&buf, 0, sizeof(buf));
-
-		ReadFile( d->hPipe, &buf, sizeof(buf)-sizeof(wchar_t), &cbBytesRead, &oOverlap);
-
-		result = WaitForSingleObject(oOverlap.hEvent, timeout);
-
-		if(!d->running) {
-			CancelIo(d->hPipe);
-			WaitForSingleObject(oOverlap.hEvent, INFINITE);
-			d->readEvent = 0;
-			CloseHandle(oOverlap.hEvent);
-			return L"";
-		}
-
-		if (result == WAIT_TIMEOUT) {
-			CancelIo(d->hPipe);
-			// Cancel, we still need to cleanup
-		}
-		fSuccess = GetOverlappedResult(d->hPipe, &oOverlap, &cbBytesRead, true);
-
-		if (!fSuccess) {
-			DWORD err = GetLastError();
-			
-			if(err == ERROR_MORE_DATA) {
-				moreData = true;
-			} else {
-				buf[0] = 0;
-			}
-			if (err == ERROR_BROKEN_PIPE) {
-				d->connected = false;
-				break;
-			}
-		}
-		returnString.append(buf);
-	}
-	d->readEvent = 0;
-	CloseHandle(oOverlap.hEvent);
-	return returnString;
-}
-
-void Socket::write(const std::wstring &msg) {
-	OVERLAPPED oOverlap;
-	DWORD bytesWritten = 0;
-	int result;
-	BOOL fSuccess = false;
-
-	memset(&oOverlap, 0, sizeof(OVERLAPPED));
-
-	HANDLE writeEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
-	oOverlap.hEvent = writeEvent;
-
-	BOOL writeSuccess = WriteFile(d->hPipe, msg.data(), (DWORD)msg.length()*sizeof(wchar_t), &bytesWritten, &oOverlap);
-	result = GetLastError();
-	if (writeSuccess || result == ERROR_IO_PENDING) {
-		result = WaitForSingleObject(writeEvent, 30000);
-		if (result == WAIT_TIMEOUT) {
-			CancelIo(d->hPipe);
-			WaitForSingleObject(oOverlap.hEvent, INFINITE);
-			CloseHandle(writeEvent);
-			CloseHandle(d->hPipe);
-			d->hPipe = 0;
-			d->connected = false;
-			return;
-		}
-		fSuccess = GetOverlappedResult(d->hPipe, &oOverlap, &bytesWritten, TRUE);
-	}
-
-	CloseHandle(writeEvent);
-	if (!fSuccess) {
-		CloseHandle(d->hPipe);
-		d->hPipe = 0;
-		d->connected = false;
-		return;
-	}
-}
-
-bool Socket::isConnected() {
-	return d->connected;
-}
-
-}  // namespace TelldusCore
diff --git a/telldus-core/common/Strings.cpp b/telldus-core/common/Strings.cpp
deleted file mode 100644
index dc15f81f..00000000
--- a/telldus-core/common/Strings.cpp
+++ /dev/null
@@ -1,276 +0,0 @@
-//
-// Copyright (C) 2012 Telldus Technologies AB. All rights reserved.
-//
-// Copyright: See COPYING file that comes with this distribution
-//
-//
-
-#include "common/Strings.h"
-#include 
-#include 
-
-#ifdef _WINDOWS
-#include 
-#else
-#include 
-#endif
-#include 
-#include 
-#include 
-
-
-#ifdef _MACOSX
-#define WCHAR_T_ENCODING "UCS-4-INTERNAL"
-#else
-#define WCHAR_T_ENCODING "WCHAR_T"
-#endif
-
-#ifndef va_copy
-#ifdef __va_copy
-#define va_copy(a, b) __va_copy(a, b)
-#else /* !__va_copy */
-#define va_copy(a, b) ((a)=(b))
-#endif /* __va_copy */
-#endif /* va_copy */
-
-std::wstring TelldusCore::charToWstring(const char *value) {
-#ifdef _WINDOWS
-	// Determine size
-	int size = MultiByteToWideChar(CP_UTF8, 0, value, -1, NULL, 0);
-	if (size == 0) {
-		return L"";
-	}
-	wchar_t *buffer;
-	buffer = new wchar_t[size];
-	memset(buffer, 0, sizeof(wchar_t)*(size));
-
-	int bytes = MultiByteToWideChar(CP_UTF8, 0, value, -1, buffer, size);
-	std::wstring retval(buffer);
-	delete[] buffer;
-	return retval;
-
-#else
-	size_t utf8Length = strlen(value);
-	size_t outbytesLeft = utf8Length*sizeof(wchar_t);
-
-	// Copy the instring
-	char *inString = new char[utf8Length+1];
-	snprintf(inString, utf8Length+1, "%s", value);
-
-	// Create buffer for output
-	char *outString = reinterpret_cast(new wchar_t[utf8Length+1]);
-	memset(outString, 0, sizeof(wchar_t)*(utf8Length+1));
-
-#ifdef _FREEBSD
-	const char *inPointer = inString;
-#else
-	char *inPointer = inString;
-#endif
-	char *outPointer = outString;
-
-	iconv_t convDesc = iconv_open(WCHAR_T_ENCODING, "UTF-8");
-	iconv(convDesc, &inPointer, &utf8Length, &outPointer, &outbytesLeft);
-	iconv_close(convDesc);
-
-	std::wstring retval( reinterpret_cast(outString) );
-
-	// Cleanup
-	delete[] inString;
-	delete[] outString;
-
-	return retval;
-#endif
-}
-
-int TelldusCore::charToInteger(const char *input) {
-	std::stringstream inputstream;
-	inputstream << input;
-	int retval;
-	inputstream >> retval;
-	return retval;
-}
-
-std::wstring TelldusCore::charUnsignedToWstring(const unsigned char value) {
-	std::wstringstream st;
-	st << value;
-	return st.str();
-}
-
-/**
-* This method doesn't support all locales
-*/
-bool TelldusCore::comparei(std::wstring stringA, std::wstring stringB) {
-	transform(stringA.begin(), stringA.end(), stringA.begin(), toupper);
-	transform(stringB.begin(), stringB.end(), stringB.begin(), toupper);
-
-	return stringA == stringB;
-}
-
-std::wstring TelldusCore::intToWstring(int value) {
-#ifdef _WINDOWS
-	// no stream used
-	// TODO(stefan): Make effective and safe...
-	wchar_t numstr[21];  // enough to hold all numbers up to 64-bits
-	_itow_s(value, numstr, sizeof(numstr), 10);
-	std::wstring newstring(numstr);
-	return newstring;
-	// return TelldusCore::charToWstring(stdstring.c_str());
-	// std::wstring temp = TelldusCore::charToWstring(stdstring.c_str());
-	// std::wstring temp(stdstring.length(), L' ');
-	// std::copy(stdstring.begin(), stdstring.end(), temp.begin());
-	// return temp;
-#else
-	std::wstringstream st;
-	st << value;
-	return st.str();
-#endif
-}
-
-std::string TelldusCore::intToString(int value) {
-	// Not sure if this is neecssary (for ordinary stringstream that is)
-#ifdef _WINDOWS
-	char numstr[21];  // enough to hold all numbers up to 64-bits
-	_itoa_s(value, numstr, sizeof(numstr), 10);
-	std::string stdstring(numstr);
-	return stdstring;
-#else
-	std::stringstream st;
-	st << value;
-	return st.str();
-#endif
-}
-
-/*
-std::wstring TelldusCore::intToWStringSafe(int value){
-	#ifdef _WINDOWS
-		//no stream used
-	//TODO! Make effective and safe...
-		char numstr[21]; // enough to hold all numbers up to 64-bits
-		itoa(value, numstr, 10);
-		std::string stdstring(numstr);
-		return TelldusCore::charToWstring(stdstring.c_str());
-		//std::wstring temp = TelldusCore::charToWstring(stdstring.c_str());
-		//std::wstring temp(stdstring.length(), L' ');
-		//std::copy(stdstring.begin(), stdstring.end(), temp.begin());
-		//return temp;
-	#else
-		return TelldusCore::intToWString(value);
-	#endif
-}
-*/
-
-uint64_t TelldusCore::hexTo64l(const std::string data) {
-#ifdef _WINDOWS
-	return _strtoui64(data.c_str(), NULL, 16);
-#elif defined(_MACOSX)
-	return strtoq(data.c_str(), NULL, 16);
-#else
-	return strtoull(data.c_str(), NULL, 16);
-#endif
-}
-
-int TelldusCore::wideToInteger(const std::wstring &input) {
-	std::wstringstream inputstream;
-	inputstream << input;
-	int retval;
-	inputstream >> retval;
-	return retval;
-}
-
-std::string TelldusCore::wideToString(const std::wstring &input) {
-#ifdef _WINDOWS
-	// Determine size
-	int size = WideCharToMultiByte(CP_UTF8, 0, input.c_str(), -1, NULL, 0, NULL, NULL);
-	if (size == 0) {
-		return "";
-	}
-	char *buffer;
-	buffer = new char[size];
-	memset(buffer, 0, sizeof(*buffer)*size);
-
-	int bytes = WideCharToMultiByte(CP_UTF8, 0, input.c_str(), -1, buffer, size, NULL, NULL);
-	std::string retval(buffer);
-	delete[] buffer;
-	return retval;
-
-#else
-	size_t wideSize = sizeof(wchar_t)*input.length();
-	// We cannot know how many wide character there is yet
-	size_t outbytesLeft = wideSize+sizeof(char);  // NOLINT(runtime/sizeof)
-
-	// Copy the instring
-	char *inString = reinterpret_cast(new wchar_t[input.length()+1]);
-	memcpy(inString, input.c_str(), wideSize+sizeof(wchar_t));
-
-	// Create buffer for output
-	char *outString = new char[outbytesLeft];
-	memset(outString, 0, sizeof(*outString)*(outbytesLeft));
-
-#ifdef _FREEBSD
-	const char *inPointer = inString;
-#else
-	char *inPointer = inString;
-#endif
-	char *outPointer = outString;
-
-	iconv_t convDesc = iconv_open("UTF-8", WCHAR_T_ENCODING);
-	iconv(convDesc, &inPointer, &wideSize, &outPointer, &outbytesLeft);
-	iconv_close(convDesc);
-
-	std::string retval(outString);
-
-	// Cleanup
-	delete[] inString;
-	delete[] outString;
-
-	return retval;
-#endif
-}
-
-std::string TelldusCore::formatf(const char *format, ...) {
-	va_list ap;
-	va_start(ap, format);
-	std::string retval = sformatf(format, ap);
-	va_end(ap);
-	return retval;
-}
-
-std::string TelldusCore::sformatf(const char *format, va_list ap) {
-	// This code is based on code from the Linux man-pages project (man vsprintf)
-	int n;
-	int size = 100;     /* Guess we need no more than 100 bytes. */
-	char *p, *np;
-
-	if ((p = reinterpret_cast(malloc(size))) == NULL) {
-		return "";
-	}
-
-	while (1) {
-		/* Try to print in the allocated space. */
-		va_list ap2;
-		va_copy(ap2, ap);
-		n = vsnprintf(p, size, format, ap2);
-		va_end(ap2);
-
-		/* If that worked, return the string. */
-		if (n > -1 && n < size) {
-			std::string retval(p);
-			free(p);
-			return retval;
-		}
-
-		/* Else try again with more space. */
-
-		if (n > -1) {   /* glibc 2.1 */
-			size = n+1; /* precisely what is needed */
-		} else {        /* glibc 2.0 */
-			size *= 2;  /* twice the old size */
-		}
-		if ((np = reinterpret_cast(realloc (p, size))) == NULL) {
-			free(p);
-			return "";
-		} else {
-			p = np;
-		}
-	}
-}
diff --git a/telldus-core/common/Strings.h b/telldus-core/common/Strings.h
deleted file mode 100644
index d4b81971..00000000
--- a/telldus-core/common/Strings.h
+++ /dev/null
@@ -1,39 +0,0 @@
-//
-// Copyright (C) 2012 Telldus Technologies AB. All rights reserved.
-//
-// Copyright: See COPYING file that comes with this distribution
-//
-//
-#ifndef TELLDUS_CORE_COMMON_STRINGS_H_
-#define TELLDUS_CORE_COMMON_STRINGS_H_
-
-#include 
-#ifdef _MSC_VER
-typedef unsigned __int8 uint8_t;
-typedef unsigned __int16 uint16_t;
-typedef unsigned __int32 uint32_t;
-typedef unsigned __int64 uint64_t;
-#else
-#include 
-#endif
-#include 
-
-namespace TelldusCore {
-	std::wstring charToWstring(const char *value);
-	int charToInteger(const char *value);
-	std::wstring charUnsignedToWstring(const unsigned char value);
-
-	bool comparei(std::wstring stringA, std::wstring stringB);
-	std::wstring intToWstring(int value);
-	// std::wstring intToWStringSafe(int value);
-	std::string intToString(int value);
-	uint64_t hexTo64l(const std::string data);
-	std::string wideToString(const std::wstring &input);
-
-	int wideToInteger(const std::wstring &input);
-
-	std::string formatf(const char *format, ...);
-	std::string sformatf(const char *format, va_list ap);
-}
-
-#endif  // TELLDUS_CORE_COMMON_STRINGS_H_
diff --git a/telldus-core/common/Thread.cpp b/telldus-core/common/Thread.cpp
deleted file mode 100644
index dd5f4b17..00000000
--- a/telldus-core/common/Thread.cpp
+++ /dev/null
@@ -1,98 +0,0 @@
-//
-// C++ Implementation: Thread
-//
-// Description:
-//
-//
-// Author: Micke Prag , (C) 2009
-//
-// Copyright: See COPYING file that comes with this distribution
-//
-//
-
-#include "common/Thread.h"
-#ifdef _WINDOWS
-#include 
-#endif
-#include "common/EventHandler.h"
-
-namespace TelldusCore {
-
-class ThreadPrivate {
-public:
-	bool running;
-	EventRef threadStarted;
-	Mutex *mutex;
-#ifdef _WINDOWS
-	HANDLE thread;
-	DWORD threadId;
-#else
-	pthread_t thread;
-#endif
-};
-
-Thread::Thread() {
-	d = new ThreadPrivate;
-	d->thread = 0;
-	d->mutex = 0;
-}
-
-Thread::~Thread() {
-	delete d;
-}
-
-void Thread::start() {
-#ifdef _WINDOWS
-	d->running = true;
-	d->thread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)&Thread::exec, this, 0, &d->threadId);
-#else
-	pthread_create(&d->thread, NULL, &Thread::exec, this );
-#endif
-}
-
-void Thread::startAndLock(Mutex *lock) {
-	EventHandler handler;
-	d->threadStarted = handler.addEvent();
-	d->mutex = lock;
-	this->start();
-	while (!handler.waitForAny()) {
-		continue;
-	}
-	d->threadStarted.reset();
-}
-
-bool Thread::wait() {
-	if (!d->thread) {
-		return true;
-	}
-#ifdef _WINDOWS
-	while(d->running) {
-		WaitForSingleObject(d->thread, 200);
-	}
-	CloseHandle(d->thread);
-#else
-	pthread_join(d->thread, 0);
-#endif
-	return true;
-}
-
-void *Thread::exec( void *ptr ) {
-	Thread *t = reinterpret_cast(ptr);
-	if (t) {
-		if (t->d->threadStarted) {
-			t->d->mutex->lock();
-			t->d->threadStarted->signal();
-		}
-		t->run();
-		if (t->d->mutex) {
-			t->d->mutex->unlock();
-		}
-		t->d->running = false;
-	}
-#ifdef _WINDOWS
-	ExitThread(0);
-#endif
-	return 0;
-}
-
-}  // namespace TelldusCore
diff --git a/telldus-core/common/Thread.h b/telldus-core/common/Thread.h
deleted file mode 100644
index c5724eb8..00000000
--- a/telldus-core/common/Thread.h
+++ /dev/null
@@ -1,37 +0,0 @@
-//
-// C++ Interface: Thread
-//
-// Description:
-//
-//
-// Author: Micke Prag , (C) 2009
-//
-// Copyright: See COPYING file that comes with this distribution
-//
-//
-#ifndef TELLDUS_CORE_COMMON_THREAD_H_
-#define TELLDUS_CORE_COMMON_THREAD_H_
-
-#include 
-#include "common/Mutex.h"
-
-namespace TelldusCore {
-	class ThreadPrivate;
-	class Thread {
-		public:
-			Thread();
-			virtual ~Thread();
-			void start();
-			void startAndLock(Mutex *lock);
-			bool wait();
-
-		protected:
-			virtual void run() = 0;
-
-		private:
-			static void* exec( void *ptr );
-			ThreadPrivate *d;
-	};
-}
-
-#endif  // TELLDUS_CORE_COMMON_THREAD_H_
diff --git a/telldus-core/common/common.h b/telldus-core/common/common.h
deleted file mode 100644
index efcd7e9a..00000000
--- a/telldus-core/common/common.h
+++ /dev/null
@@ -1,107 +0,0 @@
-//
-// Author: Micke Prag , (C) 2009
-//
-// Copyright: See COPYING file that comes with this distribution
-//
-//
-
-#ifndef TELLDUS_CORE_COMMON_COMMON_H_
-#define TELLDUS_CORE_COMMON_COMMON_H_
-
-#ifdef _WINDOWS
-#define strcasecmp _stricmp
-#define strncasecmp _strnicmp
-#include 
-#include 
-#else
-#include 
-#endif
-#include 
-#include 
-#include 
-#include 
-#include 
-
-#ifdef _WINDOWS
-#include   // NOLINT(readability/streams)
-#endif
-#include 
-#include "common/Strings.h"
-
-inline void msleep( const int msec) {
-#ifdef _WINDOWS
-	Sleep(msec);
-#else
-	usleep(msec*1000);
-#endif
-}
-
-inline void dlog(const char *fmt, ...) {
-	va_list ap;
-	va_start(ap, fmt);
-	vprintf(fmt, ap);
-	va_end(ap);
-	printf("\n");
-	fflush(stdout);
-}
-
-inline void debuglogfilename(const int intMessage, const std::string strMessage, const std::string filename) {
-#ifdef _WINDOWS
-	static bool firstRun = true;
-	std::ofstream file;
-
-	if (firstRun) {
-		file.open(filename.c_str(), std::ios::out);
-		firstRun = false;
-	} else {
-		file.open(filename.c_str(), std::ios::out | std::ios::app);
-	}
-
-	__time32_t now = _time32(0);
-
-	// Convert now to tm struct for local timezone
-	struct tm localtm;
-	_localtime32_s(&localtm, &now);
-	char thetime[32];
-	errno_t err = asctime_s(thetime, 32, &localtm);
-	if (!err) {
-		file << thetime << " [" << GetCurrentThreadId() << "] " << intMessage << " - " << strMessage << "\n";
-		file.flush();
-		file.close();
-	}
-
-#elif !defined(_MACOSX) && !defined(__FreeBSD__)
-	pthread_t thread = pthread_self();
-	printf("[%i] %i - %s\n", static_cast(thread), intMessage, strMessage.c_str());
-	fflush(stdout);
-#else
-	printf("%i - %s\n", intMessage, strMessage.c_str());
-#endif
-}
-
-inline void debuglogservice(const int intMessage, const std::string strMessage) {
-	std::string filename("C:/telldus_service_debug.txt");
-	debuglogfilename(intMessage, strMessage, filename);
-}
-
-inline void debuglog(const int intMessage, const std::string strMessage) {
-	std::string filename("C:/telldus_client_debug.txt");
-	debuglogfilename(intMessage, strMessage, filename);
-}
-
-inline char *wrapStdString( const std::string &string) {
-#ifdef _WINDOWS
-	return reinterpret_cast(SysAllocStringByteLen(string.c_str(), (unsigned int)string.size()));
-#else
-	char *returnVal;
-	returnVal = reinterpret_cast(malloc(sizeof(*returnVal) * (string.size()+1)));
-	snprintf(returnVal, string.size()+1, "%s", string.c_str());
-	return returnVal;
-#endif
-}
-
-inline char *wrapStdWstring( const std::wstring &wstring) {
-	return wrapStdString(TelldusCore::wideToString(wstring));
-}
-
-#endif  // TELLDUS_CORE_COMMON_COMMON_H_
diff --git a/telldus-core/common/stdlibc_workaround.cpp b/telldus-core/common/stdlibc_workaround.cpp
deleted file mode 100644
index 3b348c7a..00000000
--- a/telldus-core/common/stdlibc_workaround.cpp
+++ /dev/null
@@ -1,73 +0,0 @@
-//
-// Copyright (C) 2012 Telldus Technologies AB. All rights reserved.
-//
-// Copyright: See COPYING file that comes with this distribution
-//
-//
-#include   // NOLINT(readability/streams)
-// Workarounds for symbols that are missing from Leopard stdlibc++.dylib.
-_GLIBCXX_BEGIN_NAMESPACE(std)
-// From ostream_insert.h
-template ostream& __ostream_insert(ostream&, const char*, streamsize);
-
-#ifdef _GLIBCXX_USE_WCHAR_T
-	template wostream& __ostream_insert(wostream&, const wchar_t*, streamsize);
-#endif
-
-// From ostream.tcc
-template ostream& ostream::_M_insert(long);  // NOLINT(runtime/int)
-template ostream& ostream::_M_insert(unsigned long);  // NOLINT(runtime/int)
-template ostream& ostream::_M_insert(bool);  // NOLINT(readability/function)
-#ifdef _GLIBCXX_USE_LONG_LONG
-	template ostream& ostream::_M_insert(long long);  // NOLINT(runtime/int)
-	template ostream& ostream::_M_insert(unsigned long long);  // NOLINT(runtime/int)
-#endif
-template ostream& ostream::_M_insert(double);  // NOLINT(readability/function)
-template ostream& ostream::_M_insert(long double);
-template ostream& ostream::_M_insert(const void*);
-
-#ifdef _GLIBCXX_USE_WCHAR_T
-	template wostream& wostream::_M_insert(long);  // NOLINT(runtime/int)
-	template wostream& wostream::_M_insert(unsigned long);  // NOLINT(runtime/int)
-	template wostream& wostream::_M_insert(bool);  // NOLINT(readability/function)
-	#ifdef _GLIBCXX_USE_LONG_LONG
-		template wostream& wostream::_M_insert(long long);  // NOLINT(runtime/int)
-		template wostream& wostream::_M_insert(unsigned long long);  // NOLINT(runtime/int)
-	#endif
-	template wostream& wostream::_M_insert(double);  // NOLINT(readability/function)
-	template wostream& wostream::_M_insert(long double);
-	template wostream& wostream::_M_insert(const void*);
-#endif
-
-// From istream.tcc
-template istream& istream::_M_extract(unsigned short&);  // NOLINT(runtime/int)
-template istream& istream::_M_extract(unsigned int&);
-template istream& istream::_M_extract(long&);  // NOLINT(runtime/int)
-template istream& istream::_M_extract(unsigned long&);  // NOLINT(runtime/int)
-template istream& istream::_M_extract(bool&);
-#ifdef _GLIBCXX_USE_LONG_LONG
-	template istream& istream::_M_extract(long long&);  // NOLINT(runtime/int)
-	template istream& istream::_M_extract(unsigned long long&);  // NOLINT(runtime/int)
-#endif
-template istream& istream::_M_extract(float&);
-template istream& istream::_M_extract(double&);
-template istream& istream::_M_extract(long double&);
-template istream& istream::_M_extract(void*&);
-
-#ifdef _GLIBCXX_USE_WCHAR_T
-	template wistream& wistream::_M_extract(unsigned short&);  // NOLINT(runtime/int)
-	template wistream& wistream::_M_extract(unsigned int&);
-	template wistream& wistream::_M_extract(long&);  // NOLINT(runtime/int)
-	template wistream& wistream::_M_extract(unsigned long&);  // NOLINT(runtime/int)
-	template wistream& wistream::_M_extract(bool&);
-	#ifdef _GLIBCXX_USE_LONG_LONG
-		template wistream& wistream::_M_extract(long long&);  // NOLINT(runtime/int)
-		template wistream& wistream::_M_extract(unsigned long long&);  // NOLINT(runtime/int)
-	#endif
-	template wistream& wistream::_M_extract(float&);
-	template wistream& wistream::_M_extract(double&);
-	template wistream& wistream::_M_extract(long double&);
-	template wistream& wistream::_M_extract(void*&);
-#endif
-
-_GLIBCXX_END_NAMESPACE
diff --git a/telldus-core/service/CMakeLists.txt b/telldus-core/service/CMakeLists.txt
deleted file mode 100644
index 595d551c..00000000
--- a/telldus-core/service/CMakeLists.txt
+++ /dev/null
@@ -1,278 +0,0 @@
-IF(COMMAND cmake_policy)
-	CMAKE_POLICY(SET CMP0003 NEW)
-ENDIF(COMMAND cmake_policy)
-
-FIND_PACKAGE( SignTool REQUIRED )
-
-SET (telldusd_DESCRIPTION
-	"background service for Telldus TellStick, must be running to control TellStick"
-)
-
-ADD_DEFINITIONS( -DVERSION="${DISPLAYED_VERSION}" )
-
-######## Non configurable options  ########
-SET( telldus-service_SRCS
-	ClientCommunicationHandler.cpp
-	Controller.cpp
-	ControllerManager.cpp
-	ControllerMessage.cpp
-	Device.cpp
-	DeviceManager.cpp
-	Log.cpp
-	Sensor.cpp
-	Settings.cpp
-	TelldusMain.cpp
-	TellStick.cpp
-	Timer.cpp
-	EventUpdateManager.cpp
-)
-SET( telldus-service_protocol_SRCS
-	Protocol.h
-	Protocol.cpp
-	ProtocolBrateck.h
-	ProtocolBrateck.cpp
-	ProtocolComen.h
-	ProtocolComen.cpp
-	ProtocolEverflourish.h
-	ProtocolEverflourish.cpp
-	ProtocolFineoffset.h
-	ProtocolFineoffset.cpp
-	ProtocolFuhaote.h
-	ProtocolFuhaote.cpp
-	ProtocolGroup.h
-	ProtocolGroup.cpp
-	ProtocolHasta.h
-	ProtocolHasta.cpp
-	ProtocolIkea.h
-	ProtocolIkea.cpp
-	ProtocolMandolyn.h
-	ProtocolMandolyn.cpp
-	ProtocolNexa.h
-	ProtocolNexa.cpp
-	ProtocolOregon.h
-	ProtocolOregon.cpp
-	ProtocolRisingSun.h
-	ProtocolRisingSun.cpp
-	ProtocolSartano.h
-	ProtocolSartano.cpp
-	ProtocolScene.h
-	ProtocolScene.cpp
-	ProtocolSilvanChip.h
-	ProtocolSilvanChip.cpp
-	ProtocolUpm.h
-	ProtocolUpm.cpp
-	ProtocolWaveman.h
-	ProtocolWaveman.cpp
-	ProtocolX10.h
-	ProtocolX10.cpp
-	ProtocolYidong.h
-	ProtocolYidong.cpp
-)
-SET( telldus-service_HDRS
-	ClientCommunicationHandler.h
-	ConnectionListener.h
-	Controller.h
-	ControllerListener.h
-	ControllerManager.h
-	ControllerMessage.h
-	Device.h
-	DeviceManager.h
-	EventUpdateManager.h
-	Log.h
-	Sensor.h
-	Settings.h
-	TelldusMain.h
-	TellStick.h
-	Timer.h
-)
-FIND_PACKAGE(Threads REQUIRED)
-LIST(APPEND telldus-service_LIBRARIES ${CMAKE_THREAD_LIBS_INIT})
-
-INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR})
-
-######## Configurable options for the platform  ########
-
-IF (UNIX AND NOT APPLE)
-	SET(SCRIPT_PATH "/usr/local/share/telldus/scripts" CACHE PATH "The paths for scripts to execute on sensor events")
-	SET(SYSCONF_INSTALL_DIR "/etc" CACHE PATH "The sysconfig install dir (default prefix/etc)" )
-	IF (${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD")
-		SET(DEFAULT_STATE_INSTALL_DIR "/var/spool")
-	ELSE ()
-		SET(DEFAULT_STATE_INSTALL_DIR "/var/state")
-	ENDIF ()
-	SET(STATE_INSTALL_DIR "${DEFAULT_STATE_INSTALL_DIR}" CACHE PATH "The directory to store state information of the devices")
-
-ENDIF()
-
-######## Platforms-specific, non configurable  ########
-
-IF (APPLE) #### Mac OS X ####
-	SET(DEFAULT_FTDI_ENGINE "ftd2xx")
-	SET( telldus-service_TARGET	TelldusService )
-	ADD_DEFINITIONS( -D_MACOSX )
-	FIND_LIBRARY(COREFOUNDATION_LIBRARY CoreFoundation)
-	FIND_LIBRARY(IOKIT_LIBRARY IOKit)
-
-	SET( telldus-service_LIBRARIES
-		${telldus-service_LIBRARIES}
-		${COREFOUNDATION_LIBRARY}
-		${IOKIT_LIBRARY}
-		TelldusCommon
-	)
-	LIST(APPEND telldus-service_SRCS
-		main_mac.cpp
-		ConnectionListener_unix.cpp
-		ControllerListener_mac.cpp
-		SettingsCoreFoundationPreferences.cpp
-	)
-
-ELSEIF (WIN32) #### Windows ####
-	SET(DEFAULT_FTDI_ENGINE "ftd2xx")
-	SET( telldus-service_TARGET	TelldusService )
-	ADD_DEFINITIONS( -DUNICODE )
-	ADD_DEFINITIONS( /Zc:wchar_t- ) # Treat wchar_t as Built-in Type' = No
-	SET(CMAKE_EXE_LINKER_FLAGS
-		"${CMAKE_EXE_LINKER_FLAGS} /SUBSYSTEM:CONSOLE"
-	)
-	LIST(APPEND telldus-service_LIBRARIES
-		TelldusCommon
-	)
-	LIST(APPEND telldus-service_SRCS
-		ConnectionListener_win.cpp
-		main_win.cpp
-		SettingsWinRegistry.cpp
-		TelldusWinService_win.cpp
-		Messages.mc
-		${CMAKE_CURRENT_BINARY_DIR}/Messages.rc
-		${CMAKE_CURRENT_BINARY_DIR}/service/Messages.h
-	)
-	LIST(APPEND telldus-service_HDRS
-		TelldusWinService_win.h
-	)
-	ADD_CUSTOM_COMMAND(
-		OUTPUT Messages.rc service/Messages.h
-		COMMAND mc.exe -u -r \"${CMAKE_CURRENT_BINARY_DIR}\" -h \"${CMAKE_CURRENT_BINARY_DIR}/service\" \"${CMAKE_CURRENT_SOURCE_DIR}/Messages.mc\"
-		DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/Messages.mc
-		DEPENDS Messages.rc
-		COMMENT "Compiling Messages Resource"
-	)
-	INCLUDE_DIRECTORIES( ${CMAKE_CURRENT_BINARY_DIR} )
-
-ELSE (APPLE) #### Linux ####
-	SET(DEFAULT_FTDI_ENGINE "libftdi")
-	FIND_LIBRARY(CONFUSE_LIBRARY confuse)
-	ADD_DEFINITIONS( -D_CONFUSE )
-	ADD_DEFINITIONS( -D_LINUX )
-
-	SET( telldus-service_TARGET	telldusd )
-	LIST(APPEND telldus-service_SRCS
-		ConnectionListener_unix.cpp
-		main_unix.cpp
-		SettingsConfuse.cpp
-	)
-
-	LIST(APPEND telldus-service_LIBRARIES
-		${CONFUSE_LIBRARY}
-		TelldusCommon
-	)
-ENDIF (APPLE)
-
-SET(FTDI_ENGINE ${DEFAULT_FTDI_ENGINE} CACHE STRING "Which FTDI engine to use. This could be either 'libftdi' or 'ftd2xx'")
-IF (FTDI_ENGINE STREQUAL "ftd2xx")
-	FIND_LIBRARY(FTD2XX_LIBRARY ftd2xx)
-	ADD_DEFINITIONS( -DLIBFTD2XX )
-	LIST(APPEND telldus-service_SRCS TellStick_ftd2xx.cpp )
-	LIST(APPEND telldus-service_LIBRARIES ${FTD2XX_LIBRARY})
-ELSE (FTDI_ENGINE STREQUAL "ftd2xx")
-	FIND_LIBRARY(FTDI_LIBRARY ftdi)
-	INCLUDE(FindPkgConfig)
-	PKG_SEARCH_MODULE(FTDI libftdi)
-	INCLUDE_DIRECTORIES( ${FTDI_INCLUDEDIR} )
-	ADD_DEFINITIONS( -DLIBFTDI )
-	LIST(APPEND telldus-service_SRCS TellStick_libftdi.cpp )
-	LIST(APPEND telldus-service_LIBRARIES ${FTDI_LIBRARY})
-ENDIF (FTDI_ENGINE STREQUAL "ftd2xx")
-
-######## Configuring  ########
-
-SOURCE_GROUP("Protocol Files" FILES ${telldus-service_protocol_SRCS})
-
-CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/config.h.in
-	${CMAKE_CURRENT_BINARY_DIR}/service/config.h)
-INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR})
-
-SET(telldus-service_TARGET ${telldus-service_TARGET} PARENT_SCOPE)
-ADD_EXECUTABLE(${telldus-service_TARGET}
-	${telldus-service_SRCS}
-	${telldus-service_protocol_SRCS}
-	${telldus-service_HDRS}
-)
-ADD_DEPENDENCIES(${telldus-service_TARGET} TelldusCommon)
-SET_SOURCE_FILES_PROPERTIES(${telldus-service_RESOURCES} PROPERTIES MACOSX_PACKAGE_LOCATION Resources)
-
-TARGET_LINK_LIBRARIES( ${telldus-service_TARGET}	${telldus-service_LIBRARIES} )
-
-SIGN(${telldus-service_TARGET})
-
-SET_TARGET_PROPERTIES(${telldus-service_TARGET} PROPERTIES
-	MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/Info.plist
-)
-IF (APPLE)
-	SET(TELLDUS_SERVICE_TARGET_PATH "/Library/Telldus" CACHE STRING "Path to install TelldusService")
-	SET_TARGET_PROPERTIES(${telldus-service_TARGET} PROPERTIES
-		RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}
-	)
-	INSTALL(TARGETS ${telldus-service_TARGET}
-		RUNTIME DESTINATION ${TELLDUS_SERVICE_TARGET_PATH}
-	)
-	INSTALL(CODE "
-		INCLUDE(GetPrerequisites)
-		GET_FILENAME_COMPONENT(DESTDIR \$ENV{DESTDIR} ABSOLUTE)
-		GET_PREREQUISITES(\"\${DESTDIR}/${TELLDUS_SERVICE_TARGET_PATH}/${telldus-service_TARGET}\" prereqs 1 0 \"\$\" \"\$\")
-		FOREACH(pr \${prereqs})
-			GET_FILENAME_COMPONENT(lib \${pr} NAME)
-			FILE(INSTALL \${pr} DESTINATION ${TELLDUS_SERVICE_TARGET_PATH})
-			EXECUTE_PROCESS(COMMAND install_name_tool
-				-change \"\${pr}\" \"${TELLDUS_SERVICE_TARGET_PATH}/\${lib}\" \"\${DESTDIR}/${TELLDUS_SERVICE_TARGET_PATH}/${telldus-service_TARGET}\"
-			)
-		ENDFOREACH ()
-	")
-	INSTALL(FILES com.telldus.service.plist DESTINATION /Library/LaunchDaemons)
-ENDIF (APPLE)
-
-IF (UNIX)
-	IF (GENERATE_MAN)
-		ADD_CUSTOM_COMMAND(
-			TARGET ${telldus-service_TARGET}
-			POST_BUILD
-			COMMAND help2man -n ${telldusd_DESCRIPTION} ./telldusd > telldusd.1
-			WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
-			COMMENT "Generating man file telldusd.1"
-		)
-		INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/telldusd.1 DESTINATION share/man/man1)
-	ENDIF (GENERATE_MAN)
-ENDIF (UNIX)
-
-IF (UNIX AND NOT APPLE)
-	INSTALL(TARGETS ${telldus-service_TARGET} RUNTIME DESTINATION sbin)
-	INSTALL(FILES tellstick.conf
-		DESTINATION ${SYSCONF_INSTALL_DIR}
-	)
-	INSTALL(FILES telldus-core.conf
-		DESTINATION ${STATE_INSTALL_DIR}
-		PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ GROUP_WRITE WORLD_READ WORLD_WRITE
-	)
-ENDIF (UNIX AND NOT APPLE)
-
-IF(ENABLE_TESTING)
-	# Build it once more, but as static library so it can be linked by the test-tool
-	ADD_LIBRARY(TelldusServiceStatic STATIC
-		${telldus-service_SRCS}
-		${telldus-service_protocol_SRCS}
-		${telldus-service_HDRS}
-	)
-	TARGET_LINK_LIBRARIES( TelldusServiceStatic	${telldus-service_LIBRARIES} )
-	IF (UNIX)
-		SET_TARGET_PROPERTIES( TelldusServiceStatic PROPERTIES COMPILE_FLAGS "-fPIC")
-	ENDIF (UNIX)
-ENDIF()
diff --git a/telldus-core/service/ClientCommunicationHandler.cpp b/telldus-core/service/ClientCommunicationHandler.cpp
deleted file mode 100644
index 16700697..00000000
--- a/telldus-core/service/ClientCommunicationHandler.cpp
+++ /dev/null
@@ -1,266 +0,0 @@
-//
-// Copyright (C) 2012 Telldus Technologies AB. All rights reserved.
-//
-// Copyright: See COPYING file that comes with this distribution
-//
-//
-#include "service/ClientCommunicationHandler.h"
-
-#include 
-#include 
-
-#include "common/Message.h"
-#include "common/Strings.h"
-
-class ClientCommunicationHandler::PrivateData {
-public:
-	TelldusCore::Socket *clientSocket;
-	TelldusCore::EventRef event, deviceUpdateEvent;
-	bool done;
-	DeviceManager *deviceManager;
-	ControllerManager *controllerManager;
-};
-
-ClientCommunicationHandler::ClientCommunicationHandler() {
-}
-
-ClientCommunicationHandler::ClientCommunicationHandler(TelldusCore::Socket *clientSocket, TelldusCore::EventRef event, DeviceManager *deviceManager, TelldusCore::EventRef deviceUpdateEvent, ControllerManager *controllerManager)
-	:Thread() {
-	d = new PrivateData;
-	d->clientSocket = clientSocket;
-	d->event = event;
-	d->done = false;
-	d->deviceManager = deviceManager;
-	d->deviceUpdateEvent = deviceUpdateEvent;
-	d->controllerManager = controllerManager;
-}
-
-ClientCommunicationHandler::~ClientCommunicationHandler(void) {
-	wait();
-	delete(d->clientSocket);
-	delete d;
-}
-
-void ClientCommunicationHandler::run() {
-	// run thread
-
-	std::wstring clientMessage = d->clientSocket->read(2000);
-
-	int intReturn;
-	std::wstring strReturn;
-	strReturn = L"";
-	parseMessage(clientMessage, &intReturn, &strReturn);
-
-	TelldusCore::Message msg;
-
-	if(strReturn == L"") {
-		msg.addArgument(intReturn);
-	} else {
-		msg.addArgument(strReturn);
-	}
-	msg.append(L"\n");
-	d->clientSocket->write(msg);
-
-	// We are done, signal for removal
-	d->done = true;
-	d->event->signal();
-}
-
-bool ClientCommunicationHandler::isDone() {
-	return d->done;
-}
-
-
-void ClientCommunicationHandler::parseMessage(const std::wstring &clientMessage, int *intReturn, std::wstring *wstringReturn) {
-	(*intReturn) = 0;
-	(*wstringReturn) = L"";
-	std::wstring msg(clientMessage);  // Copy
-	std::wstring function(TelldusCore::Message::takeString(&msg));
-
-	if (function == L"tdTurnOn") {
-		int deviceId = TelldusCore::Message::takeInt(&msg);
-		(*intReturn) = d->deviceManager->doAction(deviceId, TELLSTICK_TURNON, 0);
-
-	} else if (function == L"tdTurnOff") {
-		int deviceId = TelldusCore::Message::takeInt(&msg);
-		(*intReturn) = d->deviceManager->doAction(deviceId, TELLSTICK_TURNOFF, 0);
-
-	} else if (function == L"tdBell") {
-		int deviceId = TelldusCore::Message::takeInt(&msg);
-		(*intReturn) = d->deviceManager->doAction(deviceId, TELLSTICK_BELL, 0);
-
-	} else if (function == L"tdDim") {
-		int deviceId = TelldusCore::Message::takeInt(&msg);
-		int level = TelldusCore::Message::takeInt(&msg);
-		(*intReturn) = d->deviceManager->doAction(deviceId, TELLSTICK_DIM, level);
-
-	} else if (function == L"tdExecute") {
-		int deviceId = TelldusCore::Message::takeInt(&msg);
-		(*intReturn) = d->deviceManager->doAction(deviceId, TELLSTICK_EXECUTE, 0);
-
-	} else if (function == L"tdUp") {
-		int deviceId = TelldusCore::Message::takeInt(&msg);
-		(*intReturn) = d->deviceManager->doAction(deviceId, TELLSTICK_UP, 0);
-
-	} else if (function == L"tdDown") {
-		int deviceId = TelldusCore::Message::takeInt(&msg);
-		(*intReturn) = d->deviceManager->doAction(deviceId, TELLSTICK_DOWN, 0);
-
-	} else if (function == L"tdStop") {
-		int deviceId = TelldusCore::Message::takeInt(&msg);
-		(*intReturn) = d->deviceManager->doAction(deviceId, TELLSTICK_STOP, 0);
-
-	} else if (function == L"tdLearn") {
-		int deviceId = TelldusCore::Message::takeInt(&msg);
-		(*intReturn) = d->deviceManager->doAction(deviceId, TELLSTICK_LEARN, 0);
-
-	} else if (function == L"tdLastSentCommand") {
-		int deviceId = TelldusCore::Message::takeInt(&msg);
-		int methodsSupported = TelldusCore::Message::takeInt(&msg);
-		(*intReturn) = d->deviceManager->getDeviceLastSentCommand(deviceId, methodsSupported);
-
-	} else if (function == L"tdLastSentValue") {
-		int deviceId = TelldusCore::Message::takeInt(&msg);
-		(*wstringReturn) = d->deviceManager->getDeviceStateValue(deviceId);
-
-	} else if(function == L"tdGetNumberOfDevices") {
-		(*intReturn) = d->deviceManager->getNumberOfDevices();
-
-	} else if (function == L"tdGetDeviceId") {
-		int deviceIndex = TelldusCore::Message::takeInt(&msg);
-		(*intReturn) = d->deviceManager->getDeviceId(deviceIndex);
-
-	} else if (function == L"tdGetDeviceType") {
-		int deviceId = TelldusCore::Message::takeInt(&msg);
-		(*intReturn) = d->deviceManager->getDeviceType(deviceId);
-
-	} else if (function == L"tdGetName") {
-		int deviceId = TelldusCore::Message::takeInt(&msg);
-		(*wstringReturn) = d->deviceManager->getDeviceName(deviceId);
-
-	} else if (function == L"tdSetName") {
-		int deviceId = TelldusCore::Message::takeInt(&msg);
-		std::wstring name = TelldusCore::Message::takeString(&msg);
-		(*intReturn) = d->deviceManager->setDeviceName(deviceId, name);
-		sendDeviceSignal(deviceId, TELLSTICK_DEVICE_CHANGED, TELLSTICK_CHANGE_NAME);
-
-	} else if (function == L"tdGetProtocol") {
-		int deviceId = TelldusCore::Message::takeInt(&msg);
-		(*wstringReturn) = d->deviceManager->getDeviceProtocol(deviceId);
-
-	} else if (function == L"tdSetProtocol") {
-		int deviceId = TelldusCore::Message::takeInt(&msg);
-		std::wstring protocol = TelldusCore::Message::takeString(&msg);
-		int oldMethods = d->deviceManager->getDeviceMethods(deviceId);
-		(*intReturn) = d->deviceManager->setDeviceProtocol(deviceId, protocol);
-		sendDeviceSignal(deviceId, TELLSTICK_DEVICE_CHANGED, TELLSTICK_CHANGE_PROTOCOL);
-		if(oldMethods != d->deviceManager->getDeviceMethods(deviceId)) {
-			sendDeviceSignal(deviceId, TELLSTICK_DEVICE_CHANGED, TELLSTICK_CHANGE_METHOD);
-		}
-
-	} else if (function == L"tdGetModel") {
-		int deviceId = TelldusCore::Message::takeInt(&msg);
-		(*wstringReturn) = d->deviceManager->getDeviceModel(deviceId);
-
-	} else if (function == L"tdSetModel") {
-		int deviceId = TelldusCore::Message::takeInt(&msg);
-		std::wstring model = TelldusCore::Message::takeString(&msg);
-		int oldMethods = d->deviceManager->getDeviceMethods(deviceId);
-		(*intReturn) = d->deviceManager->setDeviceModel(deviceId, model);
-		sendDeviceSignal(deviceId, TELLSTICK_DEVICE_CHANGED, TELLSTICK_CHANGE_MODEL);
-		if(oldMethods != d->deviceManager->getDeviceMethods(deviceId)) {
-			sendDeviceSignal(deviceId, TELLSTICK_DEVICE_CHANGED, TELLSTICK_CHANGE_METHOD);
-		}
-
-	} else if (function == L"tdGetDeviceParameter") {
-		int deviceId = TelldusCore::Message::takeInt(&msg);
-		std::wstring name = TelldusCore::Message::takeString(&msg);
-		std::wstring defaultValue = TelldusCore::Message::takeString(&msg);
-		(*wstringReturn) = d->deviceManager->getDeviceParameter(deviceId, name, defaultValue);
-
-	} else if (function == L"tdSetDeviceParameter") {
-		int deviceId = TelldusCore::Message::takeInt(&msg);
-		std::wstring name = TelldusCore::Message::takeString(&msg);
-		std::wstring value = TelldusCore::Message::takeString(&msg);
-		int oldMethods = d->deviceManager->getDeviceMethods(deviceId);
-		(*intReturn) = d->deviceManager->setDeviceParameter(deviceId, name, value);
-		if(oldMethods != d->deviceManager->getDeviceMethods(deviceId)) {
-			sendDeviceSignal(deviceId, TELLSTICK_DEVICE_CHANGED, TELLSTICK_CHANGE_METHOD);
-		}
-
-	} else if (function == L"tdAddDevice") {
-		(*intReturn) = d->deviceManager->addDevice();
-		if((*intReturn) >= 0) {
-			sendDeviceSignal((*intReturn), TELLSTICK_DEVICE_ADDED, 0);
-		}
-
-	} else if (function == L"tdRemoveDevice") {
-		int deviceId = TelldusCore::Message::takeInt(&msg);
-		(*intReturn) = d->deviceManager->removeDevice(deviceId);
-		if((*intReturn) == TELLSTICK_SUCCESS) {
-			sendDeviceSignal(deviceId, TELLSTICK_DEVICE_REMOVED, 0);
-		}
-
-	} else if (function == L"tdMethods") {
-		int deviceId = TelldusCore::Message::takeInt(&msg);
-		int intMethodsSupported = TelldusCore::Message::takeInt(&msg);
-		(*intReturn) = d->deviceManager->getDeviceMethods(deviceId, intMethodsSupported);
-
-	} else if (function == L"tdSendRawCommand") {
-		std::wstring command = TelldusCore::Message::takeString(&msg);
-		int reserved = TelldusCore::Message::takeInt(&msg);
-		(*intReturn) = d->deviceManager->sendRawCommand(command, reserved);
-
-	} else if (function == L"tdConnectTellStickController") {
-		int vid = TelldusCore::Message::takeInt(&msg);
-		int pid = TelldusCore::Message::takeInt(&msg);
-		std::string serial = TelldusCore::wideToString(TelldusCore::Message::takeString(&msg));
-		d->deviceManager->connectTellStickController(vid, pid, serial);
-
-	} else if (function == L"tdDisconnectTellStickController") {
-		int vid = TelldusCore::Message::takeInt(&msg);
-		int pid = TelldusCore::Message::takeInt(&msg);
-		std::string serial = TelldusCore::wideToString(TelldusCore::Message::takeString(&msg));
-		d->deviceManager->disconnectTellStickController(vid, pid, serial);
-
-	} else if (function == L"tdSensor") {
-		(*wstringReturn) = d->deviceManager->getSensors();
-
-	} else if (function == L"tdSensorValue") {
-		std::wstring protocol = TelldusCore::Message::takeString(&msg);
-		std::wstring model = TelldusCore::Message::takeString(&msg);
-		int id = TelldusCore::Message::takeInt(&msg);
-		int dataType = TelldusCore::Message::takeInt(&msg);
-		(*wstringReturn) = d->deviceManager->getSensorValue(protocol, model, id, dataType);
-
-	} else if (function == L"tdController") {
-		(*wstringReturn) = d->controllerManager->getControllers();
-
-	} else if (function == L"tdControllerValue") {
-		int id = TelldusCore::Message::takeInt(&msg);
-		std::wstring name = TelldusCore::Message::takeString(&msg);
-		(*wstringReturn) = d->controllerManager->getControllerValue(id, name);
-
-	} else if (function == L"tdSetControllerValue") {
-		int id = TelldusCore::Message::takeInt(&msg);
-		std::wstring name = TelldusCore::Message::takeString(&msg);
-		std::wstring value = TelldusCore::Message::takeString(&msg);
-		(*intReturn) = d->controllerManager->setControllerValue(id, name, value);
-
-	} else if (function == L"tdRemoveController") {
-		int controllerId = TelldusCore::Message::takeInt(&msg);
-		(*intReturn) = d->controllerManager->removeController(controllerId);
-
-	} else {
-		(*intReturn) = TELLSTICK_ERROR_UNKNOWN;
-	}
-}
-
-void ClientCommunicationHandler::sendDeviceSignal(int deviceId, int eventDeviceChanges, int eventChangeType) {
-	EventUpdateData *eventData = new EventUpdateData();
-	eventData->messageType = L"TDDeviceChangeEvent";
-	eventData->deviceId = deviceId;
-	eventData->eventDeviceChanges = eventDeviceChanges;
-	eventData->eventChangeType = eventChangeType;
-	d->deviceUpdateEvent->signal(eventData);
-}
diff --git a/telldus-core/service/ClientCommunicationHandler.h b/telldus-core/service/ClientCommunicationHandler.h
deleted file mode 100644
index e25f1729..00000000
--- a/telldus-core/service/ClientCommunicationHandler.h
+++ /dev/null
@@ -1,41 +0,0 @@
-//
-// Copyright (C) 2012 Telldus Technologies AB. All rights reserved.
-//
-// Copyright: See COPYING file that comes with this distribution
-//
-//
-#ifndef TELLDUS_CORE_SERVICE_CLIENTCOMMUNICATIONHANDLER_H_
-#define TELLDUS_CORE_SERVICE_CLIENTCOMMUNICATIONHANDLER_H_
-
-#include 
-#include "common/Thread.h"
-#include "common/Socket.h"
-#include "common/Event.h"
-#include "service/DeviceManager.h"
-#include "service/ControllerManager.h"
-
-class ClientCommunicationHandler : public TelldusCore::Thread {
-public:
-	ClientCommunicationHandler();
-	ClientCommunicationHandler(
-		TelldusCore::Socket *clientSocket,
-		TelldusCore::EventRef event,
-		DeviceManager *deviceManager,
-		TelldusCore::EventRef deviceUpdateEvent,
-		ControllerManager *controllerManager
-	);
-	~ClientCommunicationHandler(void);
-
-	bool isDone();
-
-protected:
-	void run();
-
-private:
-	class PrivateData;
-	PrivateData *d;
-	void parseMessage(const std::wstring &clientMessage, int *intReturn, std::wstring *wstringReturn);
-	void sendDeviceSignal(int deviceId, int eventDeviceChanges, int eventChangeType);
-};
-
-#endif  // TELLDUS_CORE_SERVICE_CLIENTCOMMUNICATIONHANDLER_H_
diff --git a/telldus-core/service/ConnectionListener.h b/telldus-core/service/ConnectionListener.h
deleted file mode 100644
index 08e838e3..00000000
--- a/telldus-core/service/ConnectionListener.h
+++ /dev/null
@@ -1,37 +0,0 @@
-//
-// Copyright (C) 2012 Telldus Technologies AB. All rights reserved.
-//
-// Copyright: See COPYING file that comes with this distribution
-//
-//
-#ifndef TELLDUS_CORE_SERVICE_CONNECTIONLISTENER_H_
-#define TELLDUS_CORE_SERVICE_CONNECTIONLISTENER_H_
-
-#include 
-#include "common/Thread.h"
-#include "common/Event.h"
-
-class Event;
-namespace TelldusCore {
-	class Socket;
-};
-
-class ConnectionListenerEventData : public TelldusCore::EventDataBase {
-public:
-	TelldusCore::Socket *socket;
-};
-
-class ConnectionListener : public TelldusCore::Thread {
-public:
-	ConnectionListener(const std::wstring &name, TelldusCore::EventRef waitEvent);
-	virtual ~ConnectionListener(void);
-
-protected:
-	void run();
-
-private:
-	class PrivateData;
-	PrivateData *d;
-};
-
-#endif  // TELLDUS_CORE_SERVICE_CONNECTIONLISTENER_H_
diff --git a/telldus-core/service/ConnectionListener_unix.cpp b/telldus-core/service/ConnectionListener_unix.cpp
deleted file mode 100644
index d3b238f9..00000000
--- a/telldus-core/service/ConnectionListener_unix.cpp
+++ /dev/null
@@ -1,100 +0,0 @@
-//
-// Copyright (C) 2012 Telldus Technologies AB. All rights reserved.
-//
-// Copyright: See COPYING file that comes with this distribution
-//
-//
-#include 
-#include 
-#include 
-#include 
-#include 
-#include 
-#include 
-#include 
-#include 
-
-#include "service/ConnectionListener.h"
-#include "common/Socket.h"
-
-#if defined(_MACOSX) && !defined(SOCK_CLOEXEC)
-#define SOCK_CLOEXEC 0
-#endif
-
-class ConnectionListener::PrivateData {
-public:
-	TelldusCore::EventRef waitEvent;
-	std::string name;
-	bool running;
-};
-
-ConnectionListener::ConnectionListener(const std::wstring &name, TelldusCore::EventRef waitEvent) {
-	d = new PrivateData;
-	d->waitEvent = waitEvent;
-
-	d->name = "/tmp/" + std::string(name.begin(), name.end());
-	d->running = true;
-
-	this->start();
-}
-
-ConnectionListener::~ConnectionListener(void) {
-	d->running = false;
-	this->wait();
-	unlink(d->name.c_str());
-	delete d;
-}
-
-void ConnectionListener::run() {
-	struct timeval tv = { 0, 0 };
-
-	// Timeout for select
-
-	SOCKET_T serverSocket;
-	struct sockaddr_un name;
-	serverSocket = socket(PF_LOCAL, SOCK_STREAM | SOCK_CLOEXEC, 0);
-	if (serverSocket < 0) {
-		return;
-	}
-#if defined(_MACOSX)
-	int op = fcntl(serverSocket, F_GETFD);
-	fcntl(serverSocket, F_SETFD, op | FD_CLOEXEC);  // OS X doesn't support SOCK_CLOEXEC yet
-#endif
-	name.sun_family = AF_LOCAL;
-	memset(name.sun_path, '\0', sizeof(name.sun_path));
-	strncpy(name.sun_path, d->name.c_str(), sizeof(name.sun_path));
-	unlink(name.sun_path);
-	int size = SUN_LEN(&name);
-	bind(serverSocket, (struct sockaddr *)&name, size);
-	listen(serverSocket, 5);
-
-	// Change permissions to allow everyone
-	chmod(d->name.c_str(), S_IRWXU | S_IRWXG | S_IRWXO);
-
-	fd_set infds;
-	FD_ZERO(&infds);
-	FD_SET(serverSocket, &infds);
-
-	while(d->running) {
-		tv.tv_sec = 5;
-
-		int response = select(serverSocket+1, &infds, NULL, NULL, &tv);
-		if (response == 0) {
-			FD_SET(serverSocket, &infds);
-			continue;
-		} else if (response < 0 ) {
-			continue;
-		}
-		// Make sure it is a new connection
-		if (!FD_ISSET(serverSocket, &infds)) {
-			continue;
-		}
-		SOCKET_T clientSocket = accept(serverSocket, NULL, NULL);
-
-		ConnectionListenerEventData *data = new ConnectionListenerEventData();
-		data->socket = new TelldusCore::Socket(clientSocket);
-		d->waitEvent->signal(data);
-	}
-	close(serverSocket);
-}
-
diff --git a/telldus-core/service/ConnectionListener_win.cpp b/telldus-core/service/ConnectionListener_win.cpp
deleted file mode 100644
index 6fced4e2..00000000
--- a/telldus-core/service/ConnectionListener_win.cpp
+++ /dev/null
@@ -1,153 +0,0 @@
-//
-// Copyright (C) 2012 Telldus Technologies AB. All rights reserved.
-//
-// Copyright: See COPYING file that comes with this distribution
-//
-//
-#include "service/ConnectionListener.h"
-
-#include 
-#include 
-#include 
-
-#include "common/Event.h"
-#include "common/Socket.h"
-
-#define BUFSIZE 512
-
-class ConnectionListener::PrivateData {
-public:
-	std::wstring pipename;
-	SECURITY_ATTRIBUTES sa;
-	HANDLE hEvent;
-	bool running;
-	TelldusCore::EventRef waitEvent;
-};
-
-ConnectionListener::ConnectionListener(const std::wstring &name, TelldusCore::EventRef waitEvent) {
-	d = new PrivateData;
-	d->hEvent = 0;
-
-	d->running = true;
-	d->waitEvent = waitEvent;
-	d->pipename = L"\\\\.\\pipe\\" + name;
-
-	PSECURITY_DESCRIPTOR pSD = NULL;
-	PACL pACL = NULL;
-	EXPLICIT_ACCESS ea;
-	PSID pEveryoneSID = NULL;
-	SID_IDENTIFIER_AUTHORITY SIDAuthWorld = SECURITY_WORLD_SID_AUTHORITY;
-
-	pSD = (PSECURITY_DESCRIPTOR) LocalAlloc(LPTR, SECURITY_DESCRIPTOR_MIN_LENGTH);
-	if (pSD == NULL) {
-		return;
-	}
-
-	if (!InitializeSecurityDescriptor(pSD, SECURITY_DESCRIPTOR_REVISION)) {
-		LocalFree(pSD);
-		return;
-	}
-
-	if(!AllocateAndInitializeSid(&SIDAuthWorld, 1, SECURITY_WORLD_RID, 0, 0, 0, 0, 0, 0, 0, &pEveryoneSID)) {
-		LocalFree(pSD);
-	}
-
-	ZeroMemory(&ea, sizeof(EXPLICIT_ACCESS));
-	ea.grfAccessPermissions = STANDARD_RIGHTS_ALL;
-	ea.grfAccessMode = SET_ACCESS;
-	ea.grfInheritance= NO_INHERITANCE;
-	ea.Trustee.TrusteeForm = TRUSTEE_IS_SID;
-	ea.Trustee.TrusteeType = TRUSTEE_IS_WELL_KNOWN_GROUP;
-	ea.Trustee.ptstrName  = (LPTSTR) pEveryoneSID;
-
-	// Add the ACL to the security descriptor.
-	if (!SetSecurityDescriptorDacl(pSD,
-				TRUE,     // bDaclPresent flag
-				pACL,
-				FALSE)) {   // not a default DACL
-		LocalFree(pSD);
-		FreeSid(pEveryoneSID);
-	}
-
-
-	d->sa.nLength = sizeof(SECURITY_ATTRIBUTES);
-	d->sa.lpSecurityDescriptor = pSD;
-	d->sa.bInheritHandle = false;
-
-	start();
-}
-
-ConnectionListener::~ConnectionListener(void) {
-	d->running = false;
-	if (d->hEvent) {
-		SetEvent(d->hEvent);
-	}
-	wait();
-	delete d;
-}
-
-void ConnectionListener::run() {
-	HANDLE hPipe;
-	OVERLAPPED oOverlap;
-	DWORD cbBytesRead;
-
-	memset(&oOverlap, 0, sizeof(OVERLAPPED));
-
-	d->hEvent = CreateEvent(NULL, true, false, NULL);
-	oOverlap.hEvent = d->hEvent;
-	bool recreate = true;
-
-	while (1) {
-		BOOL alreadyConnected = false;
-		if (recreate) {
-			hPipe = CreateNamedPipe(
-				(const wchar_t *)d->pipename.c_str(),             // pipe name
-				PIPE_ACCESS_DUPLEX |       // read/write access
-				FILE_FLAG_OVERLAPPED,	   // Overlapped mode
-				PIPE_TYPE_MESSAGE |        // message type pipe
-				PIPE_READMODE_MESSAGE |    // message-read mode
-				PIPE_WAIT,                 // blocking mode
-				PIPE_UNLIMITED_INSTANCES,  // max. instances
-				BUFSIZE,                   // output buffer size
-				BUFSIZE,                   // input buffer size
-				0,                         // client time-out
-				&d->sa);                   // default security attribute
-
-			if (hPipe == INVALID_HANDLE_VALUE) {
-				return;
-			}
-
-			ConnectNamedPipe(hPipe, &oOverlap);
-			alreadyConnected = GetLastError() == ERROR_PIPE_CONNECTED;
-			recreate = false;
-		}
-		if(!alreadyConnected) {
-			DWORD result = WaitForSingleObject(oOverlap.hEvent, 1000);
-			if (!d->running) {
-				CancelIo(hPipe);
-				WaitForSingleObject(oOverlap.hEvent, INFINITE);
-				break;
-			}
-
-			if(result == WAIT_TIMEOUT) {
-				// CloseHandle(hPipe);
-				continue;
-			}
-			BOOL connected = GetOverlappedResult(hPipe, &oOverlap, &cbBytesRead, false);
-
-			if (!connected) {
-				CloseHandle(hPipe);
-				return;
-			}
-		}
-		ConnectionListenerEventData *data = new ConnectionListenerEventData();
-		ResetEvent(oOverlap.hEvent);
-		data->socket = new TelldusCore::Socket(hPipe);
-		d->waitEvent->signal(data);
-
-		recreate = true;
-	}
-
-	CloseHandle(d->hEvent);
-	CloseHandle(hPipe);
-}
diff --git a/telldus-core/service/Controller.cpp b/telldus-core/service/Controller.cpp
deleted file mode 100644
index 1a0e43f7..00000000
--- a/telldus-core/service/Controller.cpp
+++ /dev/null
@@ -1,99 +0,0 @@
-//
-// Copyright (C) 2012 Telldus Technologies AB. All rights reserved.
-//
-// Copyright: See COPYING file that comes with this distribution
-//
-//
-#define _CRT_RAND_S
-#include "service/Controller.h"
-#include 
-#include 
-#include 
-#include 
-#include 
-#include "service/Protocol.h"
-#include "service/EventUpdateManager.h"
-#include "common/Strings.h"
-
-inline int random( unsigned int* seed ) {
-	#ifdef _WINDOWS
-		unsigned int randomNumber;
-		rand_s( &randomNumber );  // no seed needed
-		return randomNumber;
-	#else
-		return rand_r( seed );
-	#endif
-}
-
-class Controller::PrivateData {
-public:
-	TelldusCore::EventRef event, updateEvent;
-	int id, firmwareVersion;
-	unsigned int randSeed;
-	std::map duplicates;
-};
-
-Controller::Controller(int id, TelldusCore::EventRef event, TelldusCore::EventRef updateEvent) {
-	d = new PrivateData;
-	d->event = event;
-	d->updateEvent = updateEvent;
-	d->id = id;
-	d->firmwareVersion = 0;
-	d->randSeed = time(NULL);
-}
-
-Controller::~Controller() {
-	delete d;
-}
-
-void Controller::publishData(const std::string &msg) const {
-	ControllerEventData *data = new ControllerEventData;
-	data->msg = msg;
-	data->controllerId = d->id;
-	d->event->signal(data);
-}
-
-void Controller::decodePublishData(const std::string &data) const {
-	// Garbange collect?
-	if (random(&d->randSeed) % 1000 == 1) {
-		time_t t = time(NULL);
-		// Standard associative-container erase idiom
-		for (std::map::iterator it = d->duplicates.begin(); it != d->duplicates.end(); /* no increment */) {
-			if ((*it).second != t) {
-				d->duplicates.erase(it++);
-			} else {
-				++it;
-			}
-		}
-	}
-	// Duplicate check
-	if (d->duplicates.count(data) > 0) {
-		time_t t = d->duplicates[data];
-		if (t == time(NULL)) {
-			// Duplicate message
-			return;
-		}
-	}
-	d->duplicates[data] = time(NULL);
-
-	std::list msgList = Protocol::decodeData(data);
-
-	for (std::list::iterator msgIt = msgList.begin(); msgIt != msgList.end(); ++msgIt) {
-		this->publishData(*msgIt);
-	}
-}
-
-int Controller::firmwareVersion() const {
-	return d->firmwareVersion;
-}
-
-void Controller::setFirmwareVersion(int version) {
-	d->firmwareVersion = version;
-	EventUpdateData *eventData = new EventUpdateData();
-	eventData->messageType = L"TDControllerEvent";
-	eventData->controllerId = d->id;
-	eventData->eventState = TELLSTICK_DEVICE_CHANGED;
-	eventData->eventChangeType = TELLSTICK_CHANGE_FIRMWARE;
-	eventData->eventValue = TelldusCore::intToWstring(version);
-	d->updateEvent->signal(eventData);
-}
diff --git a/telldus-core/service/Controller.h b/telldus-core/service/Controller.h
deleted file mode 100644
index 3bbb667c..00000000
--- a/telldus-core/service/Controller.h
+++ /dev/null
@@ -1,38 +0,0 @@
-//
-// Copyright (C) 2012 Telldus Technologies AB. All rights reserved.
-//
-// Copyright: See COPYING file that comes with this distribution
-//
-//
-#ifndef TELLDUS_CORE_SERVICE_CONTROLLER_H_
-#define TELLDUS_CORE_SERVICE_CONTROLLER_H_
-
-#include 
-#include "common/Event.h"
-
-class ControllerEventData : public TelldusCore::EventDataBase {
-public:
-	std::string msg;
-	int controllerId;
-};
-
-class Controller {
-public:
-	virtual ~Controller();
-
-	virtual int firmwareVersion() const;
-	virtual int send( const std::string &message ) = 0;
-	virtual int reset() = 0;
-
-protected:
-	Controller(int id, TelldusCore::EventRef event, TelldusCore::EventRef updateEvent);
-	void publishData(const std::string &data) const;
-	void decodePublishData(const std::string &data) const;
-	void setFirmwareVersion(int version);
-
-private:
-	class PrivateData;
-	PrivateData *d;
-};
-
-#endif  // TELLDUS_CORE_SERVICE_CONTROLLER_H_
diff --git a/telldus-core/service/ControllerListener.h b/telldus-core/service/ControllerListener.h
deleted file mode 100644
index 3730f0fc..00000000
--- a/telldus-core/service/ControllerListener.h
+++ /dev/null
@@ -1,32 +0,0 @@
-//
-// Copyright (C) 2012 Telldus Technologies AB. All rights reserved.
-//
-// Copyright: See COPYING file that comes with this distribution
-//
-//
-#ifndef TELLDUS_CORE_SERVICE_CONTROLLERLISTENER_H_
-#define TELLDUS_CORE_SERVICE_CONTROLLERLISTENER_H_
-
-#include "common/Thread.h"
-#include "common/Event.h"
-
-class ControllerChangeEventData : public TelldusCore::EventDataBase {
-public:
-	int vid, pid;
-	bool inserted;
-};
-
-class ControllerListener : public TelldusCore::Thread {
-public:
-	explicit ControllerListener(TelldusCore::EventRef event);
-	virtual ~ControllerListener();
-
-protected:
-	void run();
-
-private:
-	class PrivateData;
-	PrivateData *d;
-};
-
-#endif  // TELLDUS_CORE_SERVICE_CONTROLLERLISTENER_H_
diff --git a/telldus-core/service/ControllerListener_mac.cpp b/telldus-core/service/ControllerListener_mac.cpp
deleted file mode 100644
index f45ae100..00000000
--- a/telldus-core/service/ControllerListener_mac.cpp
+++ /dev/null
@@ -1,187 +0,0 @@
-//
-// Copyright (C) 2012 Telldus Technologies AB. All rights reserved.
-//
-// Copyright: See COPYING file that comes with this distribution
-//
-//
-#include "service/ControllerListener.h"
-
-#include 
-#include 
-#include 
-#include 
-#include 
-#include 
-
-class TellStickData {
-public:
-	io_object_t				notification;
-	CFStringRef             serialNumber;
-	UInt32					vid;
-	UInt32					pid;
-	TelldusCore::EventRef				event;
-};
-
-class ControllerListener::PrivateData {
-public:
-	IONotificationPortRef	gNotifyPort;
-	CFRunLoopRef			gRunLoop;
-	io_iterator_t			gAddedIter;
-	TelldusCore::EventRef				event;
-	bool running;
-
-	void addUsbFilter(int vid, int pid);
-	static void DeviceAdded(void *refCon, io_iterator_t iterator);
-	static void DeviceNotification(void *refCon, io_service_t service, natural_t messageType, void *messageArgument);
-};
-
-ControllerListener::ControllerListener(TelldusCore::EventRef event)
-:Thread() {
-	d = new PrivateData;
-	d->event = event;
-	d->running = true;
-	d->gRunLoop = NULL;
-	this->start();
-}
-
-ControllerListener::~ControllerListener() {
-	d->running = false;
-	if(d->gRunLoop != NULL)
-		CFRunLoopStop(d->gRunLoop);
-
-	this->wait();
-	delete d;
-}
-
-void ControllerListener::run() {
-	CFRunLoopSourceRef		runLoopSource;
-
-	d->gNotifyPort = IONotificationPortCreate(kIOMasterPortDefault);
-	runLoopSource = IONotificationPortGetRunLoopSource(d->gNotifyPort);
-
-	d->gRunLoop = CFRunLoopGetCurrent();
-	CFRunLoopAddSource(d->gRunLoop, runLoopSource, kCFRunLoopDefaultMode);
-
-	d->addUsbFilter(0x1781, 0x0c30);
-	d->addUsbFilter(0x1781, 0x0c31);
-
-	// Race check, if destructor was called really close to thread init,
-	// running might have gone false. Make sure we don't get stuck
-	if (d->running) {
-		CFRunLoopRun();
-	}
-}
-
-void ControllerListener::PrivateData::addUsbFilter(int vid, int pid) {
-	CFNumberRef				numberRef;
-	CFMutableDictionaryRef 	matchingDict;
-
-	matchingDict = IOServiceMatching(kIOUSBDeviceClassName);  // Interested in instances of class
-	                                                          // IOUSBDevice and its subclasses
-	if (matchingDict == NULL) {
-		return;
-	}
-
-	// Create a CFNumber for the idVendor and set the value in the dictionary
-	numberRef = CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, &vid);
-	CFDictionarySetValue(matchingDict, CFSTR(kUSBVendorID), numberRef);
-	CFRelease(numberRef);
-
-	// Create a CFNumber for the idProduct and set the value in the dictionary
-	numberRef = CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, &pid);
-	CFDictionarySetValue(matchingDict, CFSTR(kUSBProductID), numberRef);
-	CFRelease(numberRef);
-
-	// Now set up a notification to be called when a device is first matched by I/O Kit.
-	IOServiceAddMatchingNotification(gNotifyPort,                // notifyPort
-	                                 kIOFirstMatchNotification,  // notificationType
-	                                 matchingDict,               // matching
-	                                 PrivateData::DeviceAdded,   // callback
-	                                 this,                       // refCon
-	                                 &gAddedIter                 // notification
-	                                 );
-	// Iterate once to get already-present devices and arm the notification
-	PrivateData::DeviceAdded(this, gAddedIter);
-}
-
-void ControllerListener::PrivateData::DeviceNotification(void *refCon, io_service_t service, natural_t messageType, void *messageArgument) {
-	if (messageType != kIOMessageServiceIsTerminated) {
-		return;
-	}
-
-	TellStickData *tsd = reinterpret_cast (refCon);
-	if (!tsd) {
-		return;
-	}
-
-	CFIndex size = CFStringGetLength(tsd->serialNumber);
-	char *s = new char[size+1];
-	CFStringGetCString(tsd->serialNumber, s, size+1, kCFStringEncodingASCII);
-	std::string serial(s);  // Copy the string to the stack
-	delete[] s;
-
-	ControllerChangeEventData *data = new ControllerChangeEventData;
-	data->vid = tsd->vid;
-	data->pid = tsd->pid;
-	data->inserted = false;
-	tsd->event->signal(data);
-
-	// Free the data we're no longer using now that the device is going away
-	CFRelease(tsd->serialNumber);
-
-	IOObjectRelease(tsd->notification);
-
-	delete tsd;
-}
-
-void ControllerListener::PrivateData::DeviceAdded(void *refCon, io_iterator_t iterator) {
-	io_service_t usbDevice;
-
-	PrivateData *pd = reinterpret_cast (refCon);
-
-	while ((usbDevice = IOIteratorNext(iterator))) {
-		TellStickData *tsd = new TellStickData;
-		tsd->event = pd->event;
-
-		// Get the serial number
-		CFStringRef serialRef = reinterpret_cast(IORegistryEntryCreateCFProperty(  usbDevice, CFSTR("USB Serial Number" ), kCFAllocatorDefault, 0 ));
-		if (serialRef == NULL) {
-			// No serial number, we cannot continue. Sorry
-			continue;
-		}
-
-		CFNumberRef vidRef = reinterpret_cast (IORegistryEntryCreateCFProperty(usbDevice, CFSTR("idVendor"), kCFAllocatorDefault, 0));
-		if (vidRef) {
-			CFNumberGetValue(vidRef, kCFNumberIntType, &(tsd->vid));
-			CFRelease(vidRef);
-		}
-
-		CFNumberRef pidRef = reinterpret_cast (IORegistryEntryCreateCFProperty(usbDevice, CFSTR("idProduct"), kCFAllocatorDefault, 0));
-		if (pidRef) {
-			CFNumberGetValue(pidRef, kCFNumberIntType, &(tsd->pid));
-			CFRelease(pidRef);
-		}
-
-		CFStringRef serialNumberAsCFString = CFStringCreateCopy(kCFAllocatorDefault, serialRef);
-		tsd->serialNumber = serialNumberAsCFString;
-		CFRelease(serialRef);
-
-		// Register for an interest notification of this device being removed. Use a reference to our
-		// private data as the refCon which will be passed to the notification callback.
-		IOServiceAddInterestNotification(pd->gNotifyPort, usbDevice, kIOGeneralInterest, DeviceNotification, tsd, &(tsd->notification));
-
-		CFIndex size = CFStringGetLength(serialNumberAsCFString);
-		char *s = new char[size+1];
-		CFStringGetCString(serialNumberAsCFString, s, size+1, kCFStringEncodingASCII);
-		std::string serial(s);  // Copy the string to the stack
-		delete[] s;
-
-		IOObjectRelease(usbDevice);
-
-		ControllerChangeEventData *data = new ControllerChangeEventData;
-		data->vid = tsd->vid;
-		data->pid = tsd->pid;
-		data->inserted = true;
-		tsd->event->signal(data);
-	}
-}
diff --git a/telldus-core/service/ControllerManager.cpp b/telldus-core/service/ControllerManager.cpp
deleted file mode 100644
index b02d65a5..00000000
--- a/telldus-core/service/ControllerManager.cpp
+++ /dev/null
@@ -1,374 +0,0 @@
-//
-// Copyright (C) 2012 Telldus Technologies AB. All rights reserved.
-//
-// Copyright: See COPYING file that comes with this distribution
-//
-//
-#include "service/ControllerManager.h"
-
-#include 
-#include 
-#include 
-#include 
-
-#include "service/Controller.h"
-#include "common/Mutex.h"
-#include "service/TellStick.h"
-#include "service/Log.h"
-#include "common/Message.h"
-#include "common/Strings.h"
-#include "service/Settings.h"
-#include "service/EventUpdateManager.h"
-#include "client/telldus-core.h"
-
-class ControllerDescriptor {
-public:
-	std::wstring name, serial;
-	int type;
-	Controller *controller;
-};
-
-typedef std::map ControllerMap;
-
-class ControllerManager::PrivateData {
-public:
-	int lastControllerId;
-	Settings settings;
-	ControllerMap controllers;
-	TelldusCore::EventRef event, updateEvent;
-	TelldusCore::Mutex mutex;
-};
-
-ControllerManager::ControllerManager(TelldusCore::EventRef event, TelldusCore::EventRef updateEvent) {
-	d = new PrivateData;
-	d->lastControllerId = 0;
-	d->event = event;
-	d->updateEvent = updateEvent;
-	this->loadStoredControllers();
-	this->loadControllers();
-}
-
-ControllerManager::~ControllerManager() {
-	for (ControllerMap::iterator it = d->controllers.begin(); it != d->controllers.end(); ++it) {
-		if (it->second.controller) {
-			delete( it->second.controller );
-		}
-	}
-	delete d;
-}
-
-int ControllerManager::count() {
-	unsigned int count = 0;
-	{
-		TelldusCore::MutexLocker locker(&d->mutex);
-		// Find all available controllers
-		for(ControllerMap::const_iterator it = d->controllers.begin(); it != d->controllers.end(); ++it) {
-			if (it->second.controller) {
-				++count;
-			}
-		}
-	}
-	if (count == 0) {
-		this->loadControllers();
-		// Try again
-		TelldusCore::MutexLocker locker(&d->mutex);
-		// Find all available controllers
-		for(ControllerMap::const_iterator it = d->controllers.begin(); it != d->controllers.end(); ++it) {
-			if (it->second.controller) {
-				++count;
-			}
-		}
-	}
-	return count;
-}
-
-void ControllerManager::deviceInsertedOrRemoved(int vid, int pid, const std::string &serial, bool inserted) {
-	if (vid == 0x0 && pid == 0x0) {  // All
-		if (inserted) {
-			loadControllers();
-		} else {
-			// Disconnect all
-			TelldusCore::MutexLocker locker(&d->mutex);
-			while(d->controllers.size()) {
-				ControllerMap::iterator it = d->controllers.begin();
-				delete it->second.controller;
-				it->second.controller = 0;
-				signalControllerEvent(it->first, TELLSTICK_DEVICE_STATE_CHANGED, TELLSTICK_CHANGE_AVAILABLE, L"0");
-			}
-		}
-		return;
-	}
-	if (vid != 0x1781) {
-		return;
-	}
-	if (pid != 0x0C30 && pid != 0x0C31) {
-		return;
-	}
-	if (inserted) {
-		loadControllers();
-	} else {
-		// Autodetect which has been disconnected
-		TelldusCore::MutexLocker locker(&d->mutex);
-		for(ControllerMap::iterator it = d->controllers.begin(); it != d->controllers.end(); ++it) {
-			if (!it->second.controller) {
-				continue;
-			}
-			TellStick *tellstick = reinterpret_cast(it->second.controller);
-			if (!tellstick) {
-				continue;
-			}
-			if (serial.compare("") != 0) {
-				TellStickDescriptor tsd;
-				tsd.vid = vid;
-				tsd.pid = pid;
-				tsd.serial = serial;
-				if (!tellstick->isSameAsDescriptor(tsd)) {
-					continue;
-				}
-			} else if (tellstick->stillConnected()) {
-				continue;
-			}
-
-			it->second.controller = 0;
-			delete tellstick;
-			signalControllerEvent(it->first, TELLSTICK_DEVICE_STATE_CHANGED, TELLSTICK_CHANGE_AVAILABLE, L"0");
-		}
-	}
-}
-
-Controller *ControllerManager::getBestControllerById(int id) {
-	TelldusCore::MutexLocker locker(&d->mutex);
-	if (!d->controllers.size()) {
-		return 0;
-	}
-	ControllerMap::const_iterator it = d->controllers.find(id);
-	if (it != d->controllers.end() && it->second.controller) {
-		return it->second.controller;
-	}
-	// Find first available controller
-	for(it = d->controllers.begin(); it != d->controllers.end(); ++it) {
-		if (it->second.controller) {
-			return it->second.controller;
-		}
-	}
-	return 0;
-}
-
-void ControllerManager::loadControllers() {
-	TelldusCore::MutexLocker locker(&d->mutex);
-
-	std::list list = TellStick::findAll();
-
-	std::list::iterator it = list.begin();
-	for(; it != list.end(); ++it) {
-		// Most backend only report non-opened devices.
-		// If they don't make sure we don't open them twice
-		bool found = false;
-		ControllerMap::const_iterator cit = d->controllers.begin();
-		for(; cit != d->controllers.end(); ++cit) {
-			if (!cit->second.controller) {
-				continue;
-			}
-			TellStick *tellstick = reinterpret_cast(cit->second.controller);
-			if (!tellstick) {
-				continue;
-			}
-			if (tellstick->isSameAsDescriptor(*it)) {
-				found = true;
-				break;
-			}
-		}
-		if (found) {
-			continue;
-		}
-
-		int type = TELLSTICK_CONTROLLER_TELLSTICK;
-		if ((*it).pid == 0x0c31) {
-			type = TELLSTICK_CONTROLLER_TELLSTICK_DUO;
-		}
-		int controllerId = 0;
-		// See if the controller matches one of the loaded, non available controllers
-		std::wstring serial = TelldusCore::charToWstring((*it).serial.c_str());
-		for(cit = d->controllers.begin(); cit != d->controllers.end(); ++cit) {
-			if (cit->second.type == type && cit->second.serial.compare(serial) == 0) {
-				controllerId = cit->first;
-				break;
-			}
-		}
-		bool isNew = false;
-		if (!controllerId) {
-			controllerId = d->settings.addNode(Settings::Controller);
-			if(controllerId < 0) {
-				// TODO(micke): How to handle this?
-				continue;
-			}
-			isNew = true;
-			d->controllers[controllerId].type = type;
-			d->settings.setControllerType(controllerId, type);
-			d->controllers[controllerId].serial = TelldusCore::charToWstring((*it).serial.c_str());
-			d->settings.setControllerSerial(controllerId, d->controllers[controllerId].serial);
-		}
-
-		// int controllerId = d->lastControllerId+1;
-		TellStick *controller = new TellStick(controllerId, d->event, d->updateEvent, *it);
-		if (!controller->isOpen()) {
-			delete controller;
-			continue;
-		}
-		d->controllers[controllerId].controller = controller;
-		if (isNew) {
-			signalControllerEvent(controllerId, TELLSTICK_DEVICE_ADDED, type, L"");
-		} else {
-			signalControllerEvent(controllerId, TELLSTICK_DEVICE_STATE_CHANGED, TELLSTICK_CHANGE_AVAILABLE, L"1");
-		}
-	}
-}
-
-void ControllerManager::loadStoredControllers() {
-	int numberOfControllers = d->settings.getNumberOfNodes(Settings::Controller);
-	TelldusCore::MutexLocker locker(&d->mutex);
-
-	for (int i = 0; i < numberOfControllers; ++i) {
-		int id = d->settings.getNodeId(Settings::Controller, i);
-		d->controllers[id].controller = NULL;
-		d->controllers[id].name = d->settings.getName(Settings::Controller, id);
-		const int type = d->settings.getControllerType(id);
-		d->controllers[id].type = type;
-		d->controllers[id].serial = d->settings.getControllerSerial(id);
-		signalControllerEvent(id, TELLSTICK_DEVICE_ADDED, type, L"");
-	}
-}
-
-void ControllerManager::queryControllerStatus() {
-	std::list tellStickControllers;
-
-	{
-		TelldusCore::MutexLocker locker(&d->mutex);
-		for(ControllerMap::iterator it = d->controllers.begin(); it != d->controllers.end(); ++it) {
-			if (!it->second.controller) {
-				continue;
-			}
-			TellStick *tellstick = reinterpret_cast(it->second.controller);
-			if (tellstick) {
-				tellStickControllers.push_back(tellstick);
-			}
-		}
-	}
-
-	bool reloadControllers = false;
-	std::string noop = "N+";
-	for(std::list::iterator it = tellStickControllers.begin(); it != tellStickControllers.end(); ++it) {
-		int success = (*it)->send(noop);
-		if(success == TELLSTICK_ERROR_BROKEN_PIPE) {
-			Log::warning("TellStick query: Error in communication with TellStick, resetting USB");
-			resetController(*it);
-		}
-		if(success == TELLSTICK_ERROR_BROKEN_PIPE || success == TELLSTICK_ERROR_NOT_FOUND) {
-			reloadControllers = true;
-		}
-	}
-
-	if(!tellStickControllers.size() || reloadControllers) {
-		// no tellstick at all found, or controller was reset
-		Log::debug("TellStick query: Rescanning USB ports");  // only log as debug, since this will happen all the time if no TellStick is connected
-		loadControllers();
-	}
-}
-
-int ControllerManager::resetController(Controller *controller) {
-	TellStick *tellstick = reinterpret_cast(controller);
-	if (!tellstick) {
-		return true;  // not tellstick, nothing to reset at the moment, just return true
-	}
-	int success = tellstick->reset();
-	deviceInsertedOrRemoved(tellstick->vid(), tellstick->pid(), tellstick->serial(), false);  // remove from list and delete
-	return success;
-}
-
-std::wstring ControllerManager::getControllers() const {
-	TelldusCore::MutexLocker locker(&d->mutex);
-
-	TelldusCore::Message msg;
-
-	msg.addArgument(static_cast(d->controllers.size()));
-
-	for(ControllerMap::iterator it = d->controllers.begin(); it != d->controllers.end(); ++it) {
-		msg.addArgument(it->first);
-		msg.addArgument(it->second.type);
-		msg.addArgument(it->second.name.c_str());
-		msg.addArgument(it->second.controller ? 1 : 0);
-	}
-	return msg;
-}
-
-std::wstring ControllerManager::getControllerValue(int id, const std::wstring &name) {
-	TelldusCore::MutexLocker locker(&d->mutex);
-
-	ControllerMap::iterator it = d->controllers.find(id);
-	if (it == d->controllers.end()) {
-		return L"";
-	}
-	if (name == L"serial") {
-		return it->second.serial;
-	} else if (name == L"name") {
-		return it->second.name;
-	} else if (name == L"available") {
-		return it->second.controller ? L"1" : L"0";
-	} else if (name == L"firmware") {
-		if (!it->second.controller) {
-			return L"-1";
-		}
-		return TelldusCore::intToWstring(it->second.controller->firmwareVersion());
-	}
-	return L"";
-}
-
-int ControllerManager::removeController(int id) {
-	TelldusCore::MutexLocker locker(&d->mutex);
-
-	ControllerMap::iterator it = d->controllers.find(id);
-	if (it == d->controllers.end()) {
-		return TELLSTICK_ERROR_NOT_FOUND;
-	}
-	if (it->second.controller) {
-		// Still connected
-		return TELLSTICK_ERROR_PERMISSION_DENIED;
-	}
-
-	int ret = d->settings.removeNode(Settings::Controller, id);
-	if (ret != TELLSTICK_SUCCESS) {
-		return ret;
-	}
-
-	d->controllers.erase(it);
-
-	signalControllerEvent(id, TELLSTICK_DEVICE_REMOVED, 0, L"");
-	return TELLSTICK_SUCCESS;
-}
-
-int ControllerManager::setControllerValue(int id, const std::wstring &name, const std::wstring &value) {
-	TelldusCore::MutexLocker locker(&d->mutex);
-
-	ControllerMap::iterator it = d->controllers.find(id);
-	if (it == d->controllers.end()) {
-		return TELLSTICK_ERROR_NOT_FOUND;
-	}
-	if (name == L"name") {
-		it->second.name = value;
-		d->settings.setName(Settings::Controller, id, value);
-		signalControllerEvent(id, TELLSTICK_DEVICE_CHANGED, TELLSTICK_CHANGE_NAME, value);
-	} else {
-		return TELLSTICK_ERROR_SYNTAX;  // TODO(micke): Is this the best error?
-	}
-	return TELLSTICK_SUCCESS;
-}
-
-void ControllerManager::signalControllerEvent(int controllerId, int changeEvent, int changeType, const std::wstring &newValue) {
-	EventUpdateData *eventData = new EventUpdateData();
-	eventData->messageType = L"TDControllerEvent";
-	eventData->controllerId = controllerId;
-	eventData->eventState = changeEvent;
-	eventData->eventChangeType = changeType;
-	eventData->eventValue = newValue;
-	d->updateEvent->signal(eventData);
-}
diff --git a/telldus-core/service/ControllerManager.h b/telldus-core/service/ControllerManager.h
deleted file mode 100644
index 093caf2b..00000000
--- a/telldus-core/service/ControllerManager.h
+++ /dev/null
@@ -1,40 +0,0 @@
-//
-// Copyright (C) 2012 Telldus Technologies AB. All rights reserved.
-//
-// Copyright: See COPYING file that comes with this distribution
-//
-//
-#ifndef TELLDUS_CORE_SERVICE_CONTROLLERMANAGER_H_
-#define TELLDUS_CORE_SERVICE_CONTROLLERMANAGER_H_
-
-#include 
-#include "common/Event.h"
-class Controller;
-
-
-class ControllerManager {
-public:
-	ControllerManager(TelldusCore::EventRef event, TelldusCore::EventRef updateEvent);
-	~ControllerManager(void);
-
-	void deviceInsertedOrRemoved(int vid, int pid, const std::string &serial, bool inserted);
-
-	int count();
-	Controller *getBestControllerById(int id);
-	void loadControllers();
-	void loadStoredControllers();
-	void queryControllerStatus();
-	int resetController(Controller *controller);
-
-	std::wstring getControllers() const;
-	std::wstring getControllerValue(int id, const std::wstring &name);
-	int removeController(int id);
-	int setControllerValue(int id, const std::wstring &name, const std::wstring &value);
-
-private:
-	void signalControllerEvent(int controllerId, int changeEvent, int changeType, const std::wstring &newValue);
-	class PrivateData;
-	PrivateData *d;
-};
-
-#endif  // TELLDUS_CORE_SERVICE_CONTROLLERMANAGER_H_
diff --git a/telldus-core/service/ControllerMessage.cpp b/telldus-core/service/ControllerMessage.cpp
deleted file mode 100644
index 90f54cd6..00000000
--- a/telldus-core/service/ControllerMessage.cpp
+++ /dev/null
@@ -1,95 +0,0 @@
-//
-// Copyright (C) 2012 Telldus Technologies AB. All rights reserved.
-//
-// Copyright: See COPYING file that comes with this distribution
-//
-//
-#include "service/ControllerMessage.h"
-#include 
-#include 
-#include "service/Device.h"
-#include "common/Strings.h"
-#include "common/common.h"
-
-class ControllerMessage::PrivateData {
-public:
-	std::map parameters;
-	std::string protocol, model, msgClass;
-	int method;
-};
-
-ControllerMessage::ControllerMessage(const std::string &message) {
-	d = new PrivateData;
-
-	// Process our message into bits
-	size_t prevPos = 0;
-	size_t pos = message.find(";");
-	while(pos != std::string::npos) {
-		std::string param = message.substr(prevPos, pos-prevPos);
-		prevPos = pos+1;
-		size_t delim = param.find(":");
-		if (delim == std::string::npos) {
-			break;
-		}
-		if (param.substr(0, delim).compare("class") == 0) {
-			d->msgClass = param.substr(delim+1, param.length()-delim);
-		} else if (param.substr(0, delim).compare("protocol") == 0) {
-			d->protocol = param.substr(delim+1, param.length()-delim);
-		} else if (param.substr(0, delim).compare("model") == 0) {
-			d->model = param.substr(delim+1, param.length()-delim);
-		} else if (param.substr(0, delim).compare("method") == 0) {
-			d->method = Device::methodId(param.substr(delim+1, param.length()-delim));
-		} else {
-			d->parameters[param.substr(0, delim)] = param.substr(delim+1, param.length()-delim);
-		}
-		pos = message.find(";", pos+1);
-	}
-}
-
-ControllerMessage::~ControllerMessage() {
-	delete d;
-}
-
-std::string ControllerMessage::msgClass() const {
-	return d->msgClass;
-}
-
-int ControllerMessage::method() const {
-	return d->method;
-}
-
-std::wstring ControllerMessage::protocol() const {
-	return TelldusCore::charToWstring(d->protocol.c_str());
-}
-
-std::wstring ControllerMessage::model() const {
-	return TelldusCore::charToWstring(d->model.c_str());
-}
-
-uint64_t ControllerMessage::getInt64Parameter(const std::string &key) const {
-	std::string strValue = getParameter(key);
-	if (strValue.compare("") == 0) {
-		return -1;
-	}
-	if (strValue.substr(0, 2).compare("0x") == 0) {
-		return TelldusCore::hexTo64l(strValue);
-	}
-	// TODO(micke): strtol() does not return uint64_t. Create a platform independent version similar to hexTo64l()
-	return strtol(strValue.c_str(), NULL, 10);
-}
-
-std::string ControllerMessage::getParameter(const std::string &key) const {
-	std::map::iterator it = d->parameters.find(key);
-	if (it == d->parameters.end()) {
-		return "";
-	}
-	return d->parameters[key];
-}
-
-bool ControllerMessage::hasParameter(const std::string &key) const {
-	std::map::iterator it = d->parameters.find(key);
-	if (it == d->parameters.end()) {
-		return false;
-	}
-	return true;
-}
diff --git a/telldus-core/service/ControllerMessage.h b/telldus-core/service/ControllerMessage.h
deleted file mode 100644
index 9532ea8d..00000000
--- a/telldus-core/service/ControllerMessage.h
+++ /dev/null
@@ -1,36 +0,0 @@
-//
-// Copyright (C) 2012 Telldus Technologies AB. All rights reserved.
-//
-// Copyright: See COPYING file that comes with this distribution
-//
-//
-#ifndef TELLDUS_CORE_SERVICE_CONTROLLERMESSAGE_H_
-#define TELLDUS_CORE_SERVICE_CONTROLLERMESSAGE_H_
-
-#ifdef _MSC_VER
-typedef unsigned __int64 uint64_t;
-#else
-#include 
-#endif
-#include 
-
-class ControllerMessage {
-public:
-	explicit ControllerMessage(const std::string &rawMessage);
-	virtual ~ControllerMessage();
-
-	std::string msgClass() const;
-	uint64_t getInt64Parameter(const std::string &key) const;
-	std::string getParameter(const std::string &key) const;
-	int method() const;
-	std::wstring protocol() const;
-	std::wstring model() const;
-
-	bool hasParameter(const std::string &key) const;
-
-private:
-	class PrivateData;
-	PrivateData *d;
-};
-
-#endif  // TELLDUS_CORE_SERVICE_CONTROLLERMESSAGE_H_
diff --git a/telldus-core/service/Device.cpp b/telldus-core/service/Device.cpp
deleted file mode 100644
index 6aa44ac8..00000000
--- a/telldus-core/service/Device.cpp
+++ /dev/null
@@ -1,272 +0,0 @@
-//
-// Copyright (C) 2012 Telldus Technologies AB. All rights reserved.
-//
-// Copyright: See COPYING file that comes with this distribution
-//
-//
-#include "service/Device.h"
-#include 
-#include 
-#include "service/Settings.h"
-#include "service/TellStick.h"
-
-class Device::PrivateData {
-public:
-	std::wstring model;
-	std::wstring name;
-	ParameterMap parameterList;
-	Protocol *protocol;
-	std::wstring protocolName;
-	int preferredControllerId;
-	int state;
-	std::wstring stateValue;
-};
-
-Device::Device(int id)
-	:Mutex() {
-	d = new PrivateData;
-	d->protocol = 0;
-	d->preferredControllerId = 0;
-	d->state = 0;
-}
-
-Device::~Device(void) {
-	delete d->protocol;
-	delete d;
-}
-
-/**
-* Get-/Set-methods
-*/
-
-int Device::getLastSentCommand(int methodsSupported) {
-	int lastSentCommand = Device::maskUnsupportedMethods(d->state, methodsSupported);
-
-	if (lastSentCommand == TELLSTICK_BELL) {
-		// Bell is not a state
-		lastSentCommand = TELLSTICK_TURNOFF;
-	}
-	if (lastSentCommand == 0) {
-		lastSentCommand = TELLSTICK_TURNOFF;
-	}
-	return lastSentCommand;
-}
-
-int Device::getMethods() const {
-	Protocol *p = this->retrieveProtocol();
-	if (p) {
-		return p->methods();
-	}
-	return 0;
-}
-
-void Device::setLastSentCommand(int command, std::wstring value) {
-	d->state = command;
-	d->stateValue = value;
-}
-
-std::wstring Device::getModel() {
-	return d->model;
-}
-
-void Device::setModel(const std::wstring &model) {
-	if(d->protocol) {
-		delete(d->protocol);
-		d->protocol = 0;
-	}
-	d->model = model;
-}
-
-std::wstring Device::getName() {
-	return d->name;
-}
-
-void Device::setName(const std::wstring &name) {
-	d->name = name;
-}
-
-std::wstring Device::getParameter(const std::wstring &key) {
-	ParameterMap::iterator it = d->parameterList.find(key);
-	if (it == d->parameterList.end()) {
-		return L"";
-	}
-	return d->parameterList[key];
-}
-
-std::list Device::getParametersForProtocol() const {
-	return Protocol::getParametersForProtocol(getProtocolName());
-}
-
-void Device::setParameter(const std::wstring &key, const std::wstring &value) {
-	d->parameterList[key] = value;
-	if(d->protocol) {
-		d->protocol->setParameters(d->parameterList);
-	}
-}
-
-int Device::getPreferredControllerId() {
-	return d->preferredControllerId;
-}
-
-void Device::setPreferredControllerId(int controllerId) {
-	d->preferredControllerId = controllerId;
-}
-
-std::wstring Device::getProtocolName() const {
-	return d->protocolName;
-}
-
-void Device::setProtocolName(const std::wstring &protocolName) {
-	if(d->protocol) {
-		delete(d->protocol);
-		d->protocol = 0;
-	}
-	d->protocolName = protocolName;
-}
-
-std::wstring Device::getStateValue() {
-	return d->stateValue;
-}
-
-int Device::getType() {
-	if(d->protocolName == L"group") {
-		return TELLSTICK_TYPE_GROUP;
-	} else if(d->protocolName == L"scene") {
-		return TELLSTICK_TYPE_SCENE;
-	}
-	return TELLSTICK_TYPE_DEVICE;
-}
-
-/**
-* End Get-/Set
-*/
-
-int Device::doAction(int action, unsigned char data, Controller *controller) {
-	Protocol *p = this->retrieveProtocol();
-	if (!p) {
-		// Syntax error in configuration, no such protocol
-		return TELLSTICK_ERROR_CONFIG_SYNTAX;
-	}
-	// Try to determine if we need to call another method due to masking
-	int method = this->isMethodSupported(action);
-	if (method <= 0) {
-		return TELLSTICK_ERROR_METHOD_NOT_SUPPORTED;
-	}
-	std::string code = p->getStringForMethod(method, data, controller);
-	if (code == "") {
-		return TELLSTICK_ERROR_METHOD_NOT_SUPPORTED;
-	}
-	if (code[0] != 'S' && code[0] != 'T' && code[0] != 'P' && code[0] != 'R') {
-		// Try autodetect sendtype
-		TellStick *tellstick = reinterpret_cast(controller);
-		if (!tellstick) {
-			return TELLSTICK_ERROR_UNKNOWN;
-		}
-		unsigned int maxlength = 80;
-		if (tellstick->pid() == 0x0c31) {
-			maxlength = 512;
-		}
-		if (code.length() <= maxlength) {
-			// S is enough
-			code.insert(0, 1, 'S');
-			code.append(1, '+');
-		} else {
-			code = TellStick::createTPacket(code);
-		}
-	}
-	return controller->send(code);
-}
-
-int Device::isMethodSupported(int method) const {
-	Protocol *p = this->retrieveProtocol();
-	if (!p) {
-		// Syntax error in configuration, no such protocol
-		return TELLSTICK_ERROR_CONFIG_SYNTAX;
-	}
-	// Try to determine if we need to call another method due to masking
-	int methods = p->methods();
-	if ((method & methods) == 0) {
-		// Loop all methods an see if any method masks to this one
-		for(int i = 1; i <= methods; i <<= 1) {
-			if ((i & methods) == 0) {
-				continue;
-			}
-			if (this->maskUnsupportedMethods(i, method)) {
-				method = i;
-				break;
-			}
-		}
-	}
-	if ((method & methods) == 0) {
-		return TELLSTICK_ERROR_METHOD_NOT_SUPPORTED;
-	}
-	return method;
-}
-
-Protocol* Device::retrieveProtocol() const {
-	if (d->protocol) {
-		return d->protocol;
-	}
-
-	d->protocol = Protocol::getProtocolInstance(d->protocolName);
-	if(d->protocol) {
-		d->protocol->setModel(d->model);
-		d->protocol->setParameters(d->parameterList);
-		return d->protocol;
-	}
-
-	return 0;
-}
-
-int Device::maskUnsupportedMethods(int methods, int supportedMethods) {
-	// Bell -> On
-	if ((methods & TELLSTICK_BELL) && !(supportedMethods & TELLSTICK_BELL)) {
-		methods |= TELLSTICK_TURNON;
-	}
-
-	// Execute -> On
-	if ((methods & TELLSTICK_EXECUTE) && !(supportedMethods & TELLSTICK_EXECUTE)) {
-		methods |= TELLSTICK_TURNON;
-	}
-
-	// Up -> Off
-	if ((methods & TELLSTICK_UP) && !(supportedMethods & TELLSTICK_UP)) {
-		methods |= TELLSTICK_TURNOFF;
-	}
-
-	// Down -> On
-	if ((methods & TELLSTICK_DOWN) && !(supportedMethods & TELLSTICK_DOWN)) {
-		methods |= TELLSTICK_TURNON;
-	}
-
-	// Cut of the rest of the unsupported methods we don't have a fallback for
-	return methods & supportedMethods;
-}
-
-int Device::methodId( const std::string &methodName ) {
-	if (methodName.compare("turnon") == 0) {
-		return TELLSTICK_TURNON;
-	}
-	if (methodName.compare("turnoff") == 0) {
-		return TELLSTICK_TURNOFF;
-	}
-	if (methodName.compare("bell") == 0) {
-		return TELLSTICK_BELL;
-	}
-	if (methodName.compare("dim") == 0) {
-		return TELLSTICK_DIM;
-	}
-	if (methodName.compare("execute") == 0) {
-		return TELLSTICK_EXECUTE;
-	}
-	if (methodName.compare("up") == 0) {
-		return TELLSTICK_UP;
-	}
-	if (methodName.compare("down") == 0) {
-		return TELLSTICK_DOWN;
-	}
-	if (methodName.compare("stop") == 0) {
-		return TELLSTICK_STOP;
-	}
-	return 0;
-}
diff --git a/telldus-core/service/Device.h b/telldus-core/service/Device.h
deleted file mode 100644
index 35b3668c..00000000
--- a/telldus-core/service/Device.h
+++ /dev/null
@@ -1,51 +0,0 @@
-//
-// Copyright (C) 2012 Telldus Technologies AB. All rights reserved.
-//
-// Copyright: See COPYING file that comes with this distribution
-//
-//
-#ifndef TELLDUS_CORE_SERVICE_DEVICE_H_
-#define TELLDUS_CORE_SERVICE_DEVICE_H_
-
-#include 
-#include 
-#include "service/Controller.h"
-#include "common/Mutex.h"
-#include "service/Protocol.h"
-
-class Device : public TelldusCore::Mutex {
-public:
-	explicit Device(int id);
-	~Device(void);
-
-	int doAction(int action, unsigned char data, Controller *controller);
-	int isMethodSupported(int method) const;
-	std::wstring getStateValue();
-	int getLastSentCommand(int methodsSupported);
-	int getMethods() const;
-	std::wstring getModel();
-	void setModel(const std::wstring &model);
-	std::wstring getName();
-	void setName(const std::wstring &name);
-	std::wstring getParameter(const std::wstring &key);
-	std::list getParametersForProtocol() const;
-	void setParameter(const std::wstring &key, const std::wstring &value);
-	int getPreferredControllerId();
-	void setPreferredControllerId(int controllerId);
-	std::wstring getProtocolName() const;
-	void setProtocolName(const std::wstring &name);
-	void setStateValue(int stateValue);
-	void setLastSentCommand(int command, std::wstring value);
-	int getType();
-
-	static int maskUnsupportedMethods(int methods, int supportedMethods);
-	static int methodId( const std::string &methodName );
-
-private:
-	Protocol *retrieveProtocol() const;
-
-	class PrivateData;
-	PrivateData *d;
-};
-
-#endif  // TELLDUS_CORE_SERVICE_DEVICE_H_
diff --git a/telldus-core/service/DeviceManager.cpp b/telldus-core/service/DeviceManager.cpp
deleted file mode 100644
index 82b8cba4..00000000
--- a/telldus-core/service/DeviceManager.cpp
+++ /dev/null
@@ -1,790 +0,0 @@
-//
-// Copyright (C) 2012 Telldus Technologies AB. All rights reserved.
-//
-// Copyright: See COPYING file that comes with this distribution
-//
-//
-#include "service/DeviceManager.h"
-#include 
-#include 
-#include 
-#include 
-#include 
-#include 
-#include 
-#include 
-
-#include "service/ControllerMessage.h"
-#include "common/Mutex.h"
-#include "service/Sensor.h"
-#include "service/Settings.h"
-#include "common/Strings.h"
-#include "common/Message.h"
-#include "service/Log.h"
-
-typedef std::map DeviceMap;
-
-class DeviceManager::PrivateData {
-public:
-	 DeviceMap devices;
-	 std::list sensorList;
-	 Settings set;
-	 TelldusCore::Mutex lock;
-	 ControllerManager *controllerManager;
-	 TelldusCore::EventRef deviceUpdateEvent, executeActionEvent;
-};
-
-class ExecuteActionEventData : public TelldusCore::EventDataBase {
-public:
-	int deviceId;
-	int method;
-	unsigned char data;
-};
-
-
-DeviceManager::DeviceManager(ControllerManager *controllerManager, TelldusCore::EventRef deviceUpdateEvent) {
-	d = new PrivateData;
-	d->controllerManager = controllerManager;
-	d->deviceUpdateEvent = deviceUpdateEvent;
-	fillDevices();
-}
-
-DeviceManager::~DeviceManager(void) {
-	{
-		TelldusCore::MutexLocker deviceListLocker(&d->lock);
-		for (DeviceMap::iterator it = d->devices.begin(); it != d->devices.end(); ++it) {
-			{TelldusCore::MutexLocker deviceLocker(it->second);}  // aquire lock, and release it, just to see that the device it's not in use anywhere
-			delete(it->second);
-		}
-		for (std::list::iterator it = d->sensorList.begin(); it != d->sensorList.end(); ++it) {
-			{TelldusCore::MutexLocker sensorLocker(*it);}  // aquire lock, and release it, just to see that the device it's not in use anywhere
-			delete(*it);
-		}
-	}
-	delete d;
-}
-
-void DeviceManager::executeActionEvent() {
-	Device *device = 0;
-	TelldusCore::EventDataRef eventData = d->executeActionEvent->takeSignal();
-	ExecuteActionEventData *data = dynamic_cast(eventData.get());
-	if (!data) {
-		Log::error("Could not cast executeAction data");
-		return;
-	}
-	Log::notice("Execute a TellStick Action for device %i", data->deviceId);
-
-	std::auto_ptr deviceLocker(0);
-	{
-		// devicelist locked
-		TelldusCore::MutexLocker deviceListLocker(&d->lock);
-
-		DeviceMap::iterator it = d->devices.find(data->deviceId);
-		if (it == d->devices.end()) {
-			return;
-		}
-		// device locked
-		deviceLocker = std::auto_ptr(new TelldusCore::MutexLocker(it->second));
-		device = it->second;
-	}  // devicelist unlocked
-
-	Controller *controller = d->controllerManager->getBestControllerById(device->getPreferredControllerId());
-	if(!controller) {
-		return;
-	}
-
-	int retval = device->doAction(data->method, data->data, controller);
-	if(retval == TELLSTICK_ERROR_BROKEN_PIPE) {
-		Log::warning("Error in communication with TellStick when executing action. Resetting USB");
-		d->controllerManager->resetController(controller);
-	}
-	if(retval == TELLSTICK_ERROR_BROKEN_PIPE || retval == TELLSTICK_ERROR_NOT_FOUND) {
-		Log::warning("Rescanning USB ports");
-		d->controllerManager->loadControllers();
-		controller = d->controllerManager->getBestControllerById(device->getPreferredControllerId());
-		if(!controller) {
-			Log::error("No contoller (TellStick) found, even after reset. Giving up.");
-			return;
-		}
-		retval = device->doAction(data->method, data->data, controller);  // retry one more time
-	}
-
-	if(retval == TELLSTICK_SUCCESS && device->getMethods() & data->method) {
-		// if method isn't explicitly supported by device, but used anyway as a fallback (i.e. bell), don't change state
-		std::wstring datastring = TelldusCore::charUnsignedToWstring(data->data);
-		if (this->triggerDeviceStateChange(data->deviceId, data->method, datastring)) {
-			device->setLastSentCommand(data->method, datastring);
-			d->set.setDeviceState(data->deviceId, data->method, datastring);
-		}
-	}
-}
-
-void DeviceManager::setExecuteActionEvent(TelldusCore::EventRef event) {
-	d->executeActionEvent = event;
-}
-
-void DeviceManager::fillDevices() {
-	int numberOfDevices = d->set.getNumberOfNodes(Settings::Device);
-	TelldusCore::MutexLocker deviceListLocker(&d->lock);
-
-	for (int i = 0; i < numberOfDevices; ++i) {
-		int id = d->set.getNodeId(Settings::Device, i);
-		d->devices[id] = new Device(id);
-		d->devices[id]->setName(d->set.getName(Settings::Device, id));
-		d->devices[id]->setModel(d->set.getModel(id));
-		d->devices[id]->setProtocolName(d->set.getProtocol(id));
-		d->devices[id]->setPreferredControllerId(d->set.getPreferredControllerId(id));
-		d->devices[id]->setLastSentCommand(d->set.getDeviceState(id), d->set.getDeviceStateValue(id));
-		d->devices[id]->setParameter(L"house", d->set.getDeviceParameter(id, L"house"));
-		d->devices[id]->setParameter(L"unit", d->set.getDeviceParameter(id, L"unit"));
-		d->devices[id]->setParameter(L"code", d->set.getDeviceParameter(id, L"code"));
-		d->devices[id]->setParameter(L"units", d->set.getDeviceParameter(id, L"units"));
-		d->devices[id]->setParameter(L"fade", d->set.getDeviceParameter(id, L"fade"));
-		d->devices[id]->setParameter(L"system", d->set.getDeviceParameter(id, L"system"));
-		d->devices[id]->setParameter(L"devices", d->set.getDeviceParameter(id, L"devices"));
-	}
-}
-
-int DeviceManager::getDeviceLastSentCommand(int deviceId, int methodsSupported) {
-	TelldusCore::MutexLocker deviceListLocker(&d->lock);
-	if (!d->devices.size()) {
-			return TELLSTICK_ERROR_DEVICE_NOT_FOUND;
-	}
-	DeviceMap::iterator it = d->devices.find(deviceId);
-	if (it != d->devices.end()) {
-		TelldusCore::MutexLocker deviceLocker(it->second);
-		return it->second->getLastSentCommand(methodsSupported);
-	}
-	return TELLSTICK_ERROR_DEVICE_NOT_FOUND;
-}
-
-int DeviceManager::setDeviceLastSentCommand(int deviceId, int command, const std::wstring &value) {
-	TelldusCore::MutexLocker deviceListLocker(&d->lock);
-	if (!d->devices.size()) {
-		return TELLSTICK_ERROR_DEVICE_NOT_FOUND;
-	}
-	DeviceMap::iterator it = d->devices.find(deviceId);
-	if (it != d->devices.end()) {
-		TelldusCore::MutexLocker deviceLocker(it->second);
-		d->set.setDeviceState(deviceId, command, value);
-		it->second->setLastSentCommand(command, value);
-	} else {
-		return TELLSTICK_ERROR_DEVICE_NOT_FOUND;
-	}
-	return TELLSTICK_SUCCESS;
-}
-
-std::wstring DeviceManager::getDeviceStateValue(int deviceId) {
-	TelldusCore::MutexLocker deviceListLocker(&d->lock);
-	if (!d->devices.size()) {
-			return L"UNKNOWN";
-	}
-	DeviceMap::iterator it = d->devices.find(deviceId);
-	if (it != d->devices.end()) {
-		TelldusCore::MutexLocker deviceLocker(it->second);
-		return it->second->getStateValue();
-	}
-	return L"UNKNOWN";
-}
-
-int DeviceManager::getDeviceMethods(int deviceId, int methodsSupported) {
-	return Device::maskUnsupportedMethods(DeviceManager::getDeviceMethods(deviceId), methodsSupported);
-}
-
-int DeviceManager::getDeviceMethods(int deviceId) {
-	std::set duplicateDeviceIds;
-	return DeviceManager::getDeviceMethods(deviceId, &duplicateDeviceIds);
-}
-
-int DeviceManager::getDeviceMethods(int deviceId, std::set *duplicateDeviceIds) {
-	int type = 0;
-	int methods = 0;
-	std::wstring deviceIds;
-	std::wstring protocol;
-
-	{
-		// devices locked
-		TelldusCore::MutexLocker deviceListLocker(&d->lock);
-
-		if (!d->devices.size()) {
-			return TELLSTICK_ERROR_DEVICE_NOT_FOUND;
-		}
-		DeviceMap::iterator it = d->devices.find(deviceId);
-		if (it != d->devices.end()) {
-			{
-				TelldusCore::MutexLocker deviceLocker(it->second);
-				type = it->second->getType();
-				methods = it->second->getMethods();
-				deviceIds = it->second->getParameter(L"devices");
-				protocol = it->second->getProtocolName();
-			}
-		}
-	}
-	if(type == 0) {
-		return 0;
-	}
-	if(type == TELLSTICK_TYPE_GROUP) {
-		// get all methods that some device in the groups supports
-		std::wstring deviceIdBuffer;
-		std::wstringstream devicesstream(deviceIds);
-		methods = 0;
-
-		duplicateDeviceIds->insert(deviceId);
-
-		while(std::getline(devicesstream, deviceIdBuffer, L',')) {
-			int deviceIdInGroup = TelldusCore::wideToInteger(deviceIdBuffer);
-			if(duplicateDeviceIds->count(deviceIdInGroup) == 1) {
-				// action for device already executed, or will execute, do nothing to avoid infinite loop
-				continue;
-			}
-
-			duplicateDeviceIds->insert(deviceIdInGroup);
-
-			int deviceMethods = getDeviceMethods(deviceIdInGroup, duplicateDeviceIds);
-			if(deviceMethods > 0) {
-				methods |= deviceMethods;
-			}
-		}
-	}
-	return methods;
-}
-
-std::wstring DeviceManager::getDeviceModel(int deviceId) {
-	TelldusCore::MutexLocker deviceListLocker(&d->lock);
-	if (!d->devices.size()) {
-			return L"UNKNOWN";
-	}
-	DeviceMap::iterator it = d->devices.find(deviceId);
-	if (it != d->devices.end()) {
-		TelldusCore::MutexLocker deviceLocker(it->second);
-		return it->second->getModel();
-	}
-	return L"UNKNOWN";
-}
-
-int DeviceManager::setDeviceModel(int deviceId, const std::wstring &model) {
-	TelldusCore::MutexLocker deviceListLocker(&d->lock);
-	if (!d->devices.size()) {
-			return TELLSTICK_ERROR_DEVICE_NOT_FOUND;
-	}
-	DeviceMap::iterator it = d->devices.find(deviceId);
-	if (it != d->devices.end()) {
-		TelldusCore::MutexLocker deviceLocker(it->second);
-		int ret = d->set.setModel(deviceId, model);
-		if (ret != TELLSTICK_SUCCESS) {
-			return ret;
-		}
-		it->second->setModel(model);
-	} else {
-		return TELLSTICK_ERROR_DEVICE_NOT_FOUND;
-	}
-
-	return TELLSTICK_SUCCESS;
-}
-
-std::wstring DeviceManager::getDeviceName(int deviceId) {
-	TelldusCore::MutexLocker deviceListLocker(&d->lock);
-	if (!d->devices.size()) {
-			return L"UNKNOWN";
-	}
-	DeviceMap::iterator it = d->devices.find(deviceId);
-	if (it != d->devices.end()) {
-		TelldusCore::MutexLocker deviceLocker(it->second);
-		return it->second->getName();
-	}
-	return L"UNKNOWN";
-}
-
-int DeviceManager::setDeviceName(int deviceId, const std::wstring &name) {
-	TelldusCore::MutexLocker deviceListLocker(&d->lock);
-	if (!d->devices.size()) {
-			return TELLSTICK_ERROR_DEVICE_NOT_FOUND;
-	}
-	DeviceMap::iterator it = d->devices.find(deviceId);
-	if (it != d->devices.end()) {
-		TelldusCore::MutexLocker deviceLocker(it->second);
-		int ret = d->set.setName(Settings::Device, deviceId, name);
-		if (ret != TELLSTICK_SUCCESS) {
-			return ret;
-		}
-		it->second->setName(name);
-	} else {
-		return TELLSTICK_ERROR_DEVICE_NOT_FOUND;
-	}
-
-	return TELLSTICK_SUCCESS;
-}
-
-std::wstring DeviceManager::getDeviceParameter(int deviceId, const std::wstring &name, const std::wstring &defaultValue) {
-	TelldusCore::MutexLocker deviceListLocker(&d->lock);
-	if (!d->devices.size()) {
-			return defaultValue;
-	}
-	DeviceMap::iterator it = d->devices.find(deviceId);
-	if (it != d->devices.end()) {
-		TelldusCore::MutexLocker deviceLocker(it->second);
-		std::wstring returnString = it->second->getParameter(name);
-		if(returnString != L"") {
-			return returnString;
-		}
-	}
-	return defaultValue;
-}
-
-int DeviceManager::setDeviceParameter(int deviceId, const std::wstring &name, const std::wstring &value) {
-	TelldusCore::MutexLocker deviceListLocker(&d->lock);
-	if (!d->devices.size()) {
-			return TELLSTICK_ERROR_DEVICE_NOT_FOUND;
-	}
-	DeviceMap::iterator it = d->devices.find(deviceId);
-	if (it != d->devices.end()) {
-		TelldusCore::MutexLocker deviceLocker(it->second);
-		int ret = d->set.setDeviceParameter(deviceId, name, value);
-		if (ret != TELLSTICK_SUCCESS) {
-			return ret;
-		}
-		it->second->setParameter(name, value);
-	} else {
-		return TELLSTICK_ERROR_DEVICE_NOT_FOUND;
-	}
-
-	return TELLSTICK_SUCCESS;
-}
-
-std::wstring DeviceManager::getDeviceProtocol(int deviceId) {
-	TelldusCore::MutexLocker deviceListLocker(&d->lock);
-	if (!d->devices.size()) {
-			return L"UNKNOWN";
-	}
-	DeviceMap::iterator it = d->devices.find(deviceId);
-	if (it != d->devices.end()) {
-		TelldusCore::MutexLocker deviceLocker(it->second);
-		return it->second->getProtocolName();
-	}
-	return L"UNKNOWN";
-}
-
-int DeviceManager::setDeviceProtocol(int deviceId, const std::wstring &protocol) {
-	TelldusCore::MutexLocker deviceListLocker(&d->lock);
-	if (!d->devices.size()) {
-			return TELLSTICK_ERROR_DEVICE_NOT_FOUND;
-	}
-	DeviceMap::iterator it = d->devices.find(deviceId);
-	if (it != d->devices.end()) {
-		TelldusCore::MutexLocker deviceLocker(it->second);
-		int ret = d->set.setProtocol(deviceId, protocol);
-		if (ret != TELLSTICK_SUCCESS) {
-			return ret;
-		}
-		it->second->setProtocolName(protocol);
-	} else {
-		return TELLSTICK_ERROR_DEVICE_NOT_FOUND;
-	}
-
-	return TELLSTICK_SUCCESS;
-}
-
-int DeviceManager::getNumberOfDevices() {
-	TelldusCore::MutexLocker deviceListLocker(&d->lock);
-	return static_cast(d->devices.size());
-}
-
-int DeviceManager::addDevice() {
-	int id = d->set.addNode(Settings::Device);
-	if(id < 0) {
-		return id;
-	}
-
-	TelldusCore::MutexLocker deviceListLocker(&d->lock);
-	d->devices[id] = new Device(id);
-	if(!d->devices[id]) {
-		return TELLSTICK_ERROR_DEVICE_NOT_FOUND;
-	}
-	return id;
-}
-
-int DeviceManager::getDeviceId(int deviceIndex) {
-	return d->set.getNodeId(Settings::Device, deviceIndex);
-}
-
-int DeviceManager::getDeviceType(int deviceId) {
-	TelldusCore::MutexLocker deviceListLocker(&d->lock);
-	if (!d->devices.size()) {
-		return TELLSTICK_ERROR_DEVICE_NOT_FOUND;
-	}
-	DeviceMap::iterator it = d->devices.find(deviceId);
-	if (it != d->devices.end()) {
-		TelldusCore::MutexLocker deviceLocker(it->second);
-		return it->second->getType();
-	}
-	return TELLSTICK_ERROR_DEVICE_NOT_FOUND;
-}
-
-int DeviceManager::getPreferredControllerId(int deviceId) {
-	TelldusCore::MutexLocker deviceListLocker(&d->lock);
-
-	if (!d->devices.size()) {
-			return TELLSTICK_ERROR_DEVICE_NOT_FOUND;
-	}
-	DeviceMap::iterator it = d->devices.find(deviceId);
-	if (it != d->devices.end()) {
-		TelldusCore::MutexLocker deviceLocker(it->second);
-		return it->second->getPreferredControllerId();
-	}
-	return TELLSTICK_ERROR_DEVICE_NOT_FOUND;
-}
-
-void DeviceManager::connectTellStickController(int vid, int pid, const std::string &serial) {
-	d->controllerManager->deviceInsertedOrRemoved(vid, pid, serial, true);
-}
-
-void DeviceManager::disconnectTellStickController(int vid, int pid, const std::string &serial) {
-	d->controllerManager->deviceInsertedOrRemoved(vid, pid, serial, false);
-}
-
-int DeviceManager::doAction(int deviceId, int action, unsigned char data) {
-	int deviceType = 0;
-	{
-		// devicelist locked
-		TelldusCore::MutexLocker deviceListLocker(&d->lock);
-
-		DeviceMap::iterator it = d->devices.find(deviceId);
-		if (it == d->devices.end()) {
-			return TELLSTICK_ERROR_DEVICE_NOT_FOUND;  // not found
-		}
-		// device locked
-		TelldusCore::MutexLocker deviceLocker(it->second);
-
-		deviceType = it->second->getType();
-		if (it->second->isMethodSupported(action) <= 0) {
-			return TELLSTICK_ERROR_METHOD_NOT_SUPPORTED;
-		}
-	}
-
-	if (d->controllerManager->count() == 0) {
-		return TELLSTICK_ERROR_NOT_FOUND;
-	}
-
-	// The device exists and there is at least one connected controller
-
-	if(deviceType == TELLSTICK_TYPE_GROUP || deviceType == TELLSTICK_TYPE_SCENE) {
-		return this->doGroupSceneAction(deviceId, action, data);
-	}
-
-	ExecuteActionEventData *eventData = new ExecuteActionEventData();
-	eventData->deviceId = deviceId;
-	eventData->method = action;
-	eventData->data = data;
-	d->executeActionEvent->signal(eventData);
-	return TELLSTICK_SUCCESS;
-}
-
-int DeviceManager::doGroupSceneAction(int deviceId, int action, unsigned char data) {
-	std::set parsedDevices;
-	std::queue devicesToParse;
-
-	devicesToParse.push(deviceId);
-	while (!devicesToParse.empty()) {
-		int deviceId = devicesToParse.front();
-		devicesToParse.pop();
-		if (parsedDevices.count(deviceId)) {
-			continue;
-		}
-		parsedDevices.insert(deviceId);
-
-		TelldusCore::MutexLocker deviceListLocker(&d->lock);
-		DeviceMap::iterator it = d->devices.find(deviceId);
-		if (it == d->devices.end()) {
-			// Not found
-			continue;
-		}
-
-		if (it->second->isMethodSupported(action) <= 0) {
-			return TELLSTICK_ERROR_METHOD_NOT_SUPPORTED;
-		}
-
-		TelldusCore::MutexLocker deviceLocker(it->second);
-		if (it->second->getType() == TELLSTICK_TYPE_DEVICE) {
-			ExecuteActionEventData *eventData = new ExecuteActionEventData();
-			eventData->deviceId = deviceId;
-			eventData->method = action;
-			eventData->data = data;
-			d->executeActionEvent->signal(eventData);
-			continue;
-		}
-		if (it->second->getType() == TELLSTICK_TYPE_GROUP) {
-			std::string devices = TelldusCore::wideToString(it->second->getParameter(L"devices"));
-			std::stringstream devicesstream(devices);
-			std::string singledevice;
-			while(std::getline(devicesstream, singledevice, ',')) {
-				devicesToParse.push(TelldusCore::charToInteger(singledevice.c_str()));
-			}
-			// Update state
-			if(it->second->getMethods() & action) {
-				// if method isn't explicitly supported by device, but used anyway as a fallback (i.e. bell), don't change state
-				std::wstring datastring = TelldusCore::charUnsignedToWstring(data);
-				if (this->triggerDeviceStateChange(deviceId, action, datastring)) {
-					it->second->setLastSentCommand(action, datastring);
-					d->set.setDeviceState(deviceId, action, datastring);
-				}
-			}
-		}
-		if (it->second->getType() == TELLSTICK_TYPE_SCENE) {
-			// TODO(micke): Not supported yet
-			Log::warning("Scenes are not supported yet!");
-		}
-	}
-
-	return TELLSTICK_SUCCESS;
-}
-
-int DeviceManager::executeScene(std::wstring singledevice, int groupDeviceId) {
-	std::wstringstream devicestream(singledevice);
-
-	const int deviceParameterLength = 3;
-	std::wstring deviceParts[deviceParameterLength] = {L"", L"", L""};
-	std::wstring devicePart = L"";
-	int i = 0;
-	while(std::getline(devicestream, devicePart, L':') && i < deviceParameterLength) {
-		deviceParts[i] = devicePart;
-		i++;
-	}
-
-	if(deviceParts[0] == L"" || deviceParts[1] == L"") {
-		return TELLSTICK_ERROR_UNKNOWN;  // malformed or missing parameter
-	}
-
-	int deviceId = TelldusCore::wideToInteger(deviceParts[0]);
-	if(deviceId == groupDeviceId) {
-		return TELLSTICK_ERROR_UNKNOWN;  // the scene itself has been added to its devices, avoid infinite loop
-	}
-	int method = Device::methodId(TelldusCore::wideToString(deviceParts[1]));  // support methodparts both in the form of integers (e.g. TELLSTICK_TURNON) or text (e.g. "turnon")
-	if(method == 0) {
-		method = TelldusCore::wideToInteger(deviceParts[1]);
-	}
-	unsigned char devicedata = 0;
-	if(deviceParts[2] != L"") {
-		devicedata = TelldusCore::wideToInteger(deviceParts[2]);
-	}
-
-	if(deviceId > 0 && method > 0) {  // check for format error in parameter "devices"
-		return doAction(deviceId, method, devicedata);
-	}
-
-	return TELLSTICK_ERROR_UNKNOWN;
-}
-
-int DeviceManager::removeDevice(int deviceId) {
-	Device *device = 0;
-	{
-		int ret = d->set.removeNode(Settings::Device, deviceId);  // remove from register/settings
-		if (ret != TELLSTICK_SUCCESS) {
-			return ret;
-		}
-
-		TelldusCore::MutexLocker deviceListLocker(&d->lock);
-		if (!d->devices.size()) {
-				return TELLSTICK_ERROR_DEVICE_NOT_FOUND;
-		}
-		DeviceMap::iterator it = d->devices.find(deviceId);
-		if (it != d->devices.end()) {
-			device = it->second;
-			d->devices.erase(it);  // remove from list, keep reference
-		} else {
-			return TELLSTICK_ERROR_DEVICE_NOT_FOUND;
-		}
-	}
-	{TelldusCore::MutexLocker lock(device);}  // waiting for device lock, if it's aquired, just unlock again. Device is removed from list, and cannot be accessed from anywhere else
-	delete device;
-
-	return TELLSTICK_SUCCESS;
-}
-
-std::wstring DeviceManager::getSensors() const {
-	TelldusCore::MutexLocker sensorListLocker(&d->lock);
-
-	TelldusCore::Message msg;
-
-	msg.addArgument(static_cast(d->sensorList.size()));
-
-	for (std::list::iterator it = d->sensorList.begin(); it != d->sensorList.end(); ++it) {
-		TelldusCore::MutexLocker sensorLocker(*it);
-		msg.addArgument((*it)->protocol());
-		msg.addArgument((*it)->model());
-		msg.addArgument((*it)->id());
-		msg.addArgument((*it)->dataTypes());
-	}
-
-	return msg;
-}
-
-std::wstring DeviceManager::getSensorValue(const std::wstring &protocol, const std::wstring &model, int id, int dataType) const {
-	TelldusCore::MutexLocker sensorListLocker(&d->lock);
-	Sensor *sensor = 0;
-	for (std::list::iterator it = d->sensorList.begin(); it != d->sensorList.end(); ++it) {
-		TelldusCore::MutexLocker sensorLocker(*it);
-		if (!TelldusCore::comparei((*it)->protocol(), protocol)) {
-			continue;
-		}
-		if (!TelldusCore::comparei((*it)->model(), model)) {
-			continue;
-		}
-		if ((*it)->id() != id) {
-			continue;
-		}
-		sensor = *it;
-		break;
-	}
-
-	if (!sensor) {
-		return L"";
-	}
-	TelldusCore::MutexLocker sensorLocker(sensor);
-	TelldusCore::Message msg;
-	std::string value = sensor->value(dataType);
-	if (value.length() > 0) {
-		msg.addArgument(TelldusCore::charToWstring(value.c_str()));
-		msg.addArgument(static_cast(sensor->timestamp()));
-	}
-	return msg;
-}
-
-
-void DeviceManager::handleControllerMessage(const ControllerEventData &eventData) {
-	// Trigger raw-event
-	EventUpdateData *eventUpdateData = new EventUpdateData();
-	eventUpdateData->messageType = L"TDRawDeviceEvent";
-	eventUpdateData->controllerId = eventData.controllerId;
-	eventUpdateData->eventValue = TelldusCore::charToWstring(eventData.msg.c_str());
-	d->deviceUpdateEvent->signal(eventUpdateData);
-
-	ControllerMessage msg(eventData.msg);
-	if (msg.msgClass().compare("sensor") == 0) {
-		handleSensorMessage(msg);
-		return;
-	}
-
-	TelldusCore::MutexLocker deviceListLocker(&d->lock);
-	for (DeviceMap::iterator it = d->devices.begin(); it != d->devices.end(); ++it) {
-		TelldusCore::MutexLocker deviceLocker(it->second);
-		if (!TelldusCore::comparei(it->second->getProtocolName(), msg.protocol())) {
-			continue;
-		}
-		if ( !(it->second->getMethods() & msg.method()) ) {
-			continue;
-		}
-
-		std::list parameters = it->second->getParametersForProtocol();
-		bool thisDevice = true;
-		for (std::list::iterator paramIt = parameters.begin(); paramIt != parameters.end(); ++paramIt) {
-			if(!TelldusCore::comparei(it->second->getParameter(TelldusCore::charToWstring((*paramIt).c_str())), TelldusCore::charToWstring(msg.getParameter(*paramIt).c_str()))) {
-				thisDevice = false;
-				break;
-			}
-		}
-
-		if(!thisDevice) {
-			continue;
-		}
-
-		if (this->triggerDeviceStateChange(it->first, msg.method(), L"")) {
-			d->set.setDeviceState(it->first, msg.method(), L"");
-			it->second->setLastSentCommand(msg.method(), L"");
-		}
-	}
-}
-
-void DeviceManager::handleSensorMessage(const ControllerMessage &msg) {
-	TelldusCore::MutexLocker sensorListLocker(&d->lock);
-	Sensor *sensor = 0;
-	for (std::list::iterator it = d->sensorList.begin(); it != d->sensorList.end(); ++it) {
-		TelldusCore::MutexLocker sensorLocker(*it);
-		if (!TelldusCore::comparei((*it)->protocol(), msg.protocol())) {
-			continue;
-		}
-		if (!TelldusCore::comparei((*it)->model(), msg.model())) {
-			continue;
-		}
-		if ((*it)->id() != msg.getInt64Parameter("id")) {
-			continue;
-		}
-		sensor = *it;
-		break;
-	}
-
-	if (!sensor) {
-		sensor = new Sensor(msg.protocol(), msg.model(), msg.getInt64Parameter("id"));
-		d->sensorList.push_back(sensor);
-	}
-	TelldusCore::MutexLocker sensorLocker(sensor);
-
-	time_t t = time(NULL);
-
-	setSensorValueAndSignal("temp", TELLSTICK_TEMPERATURE, sensor, msg, t);
-	setSensorValueAndSignal("humidity", TELLSTICK_HUMIDITY, sensor, msg, t);
-	setSensorValueAndSignal("rainrate", TELLSTICK_RAINRATE, sensor, msg, t);
-	setSensorValueAndSignal("raintotal", TELLSTICK_RAINTOTAL, sensor, msg, t);
-	setSensorValueAndSignal("winddirection", TELLSTICK_WINDDIRECTION, sensor, msg, t);
-	setSensorValueAndSignal("windaverage", TELLSTICK_WINDAVERAGE, sensor, msg, t);
-	setSensorValueAndSignal("windgust", TELLSTICK_WINDGUST, sensor, msg, t);
-}
-
-void DeviceManager::setSensorValueAndSignal( const std::string &dataType, int dataTypeId, Sensor *sensor, const ControllerMessage &msg, time_t timestamp) const {
-	if (!msg.hasParameter(dataType)) {
-		return;
-	}
-	sensor->setValue(dataTypeId, msg.getParameter(dataType), timestamp);
-
-	EventUpdateData *eventData = new EventUpdateData();
-	eventData->messageType = L"TDSensorEvent";
-	eventData->protocol = sensor->protocol();
-	eventData->model = sensor->model();
-	eventData->sensorId = sensor->id();
-	eventData->dataType = dataTypeId;
-	eventData->value = TelldusCore::charToWstring(sensor->value(dataTypeId).c_str());
-	eventData->timestamp = static_cast(timestamp);
-	d->deviceUpdateEvent->signal(eventData);
-}
-
-int DeviceManager::sendRawCommand(const std::wstring &command, int reserved) {
-	Controller *controller = d->controllerManager->getBestControllerById(-1);
-
-	if(!controller) {
-		// no controller found, scan for one, and retry once
-		d->controllerManager->loadControllers();
-		controller = d->controllerManager->getBestControllerById(-1);
-	}
-
-	int retval = TELLSTICK_ERROR_UNKNOWN;
-	if(controller) {
-		retval = controller->send(TelldusCore::wideToString(command));
-		if(retval == TELLSTICK_ERROR_BROKEN_PIPE) {
-			d->controllerManager->resetController(controller);
-		}
-		if(retval == TELLSTICK_ERROR_BROKEN_PIPE || retval == TELLSTICK_ERROR_NOT_FOUND) {
-			d->controllerManager->loadControllers();
-			controller = d->controllerManager->getBestControllerById(-1);
-			if(!controller) {
-				return TELLSTICK_ERROR_NOT_FOUND;
-			}
-			retval = controller->send(TelldusCore::wideToString(command));  // retry one more time
-		}
-		return retval;
-	} else {
-		return TELLSTICK_ERROR_NOT_FOUND;
-	}
-}
-
-bool DeviceManager::triggerDeviceStateChange(int deviceId, int intDeviceState, const std::wstring &strDeviceStateValue ) {
-	if ( intDeviceState == TELLSTICK_BELL || intDeviceState == TELLSTICK_LEARN || intDeviceState == TELLSTICK_EXECUTE) {
-		return false;
-	}
-
-	EventUpdateData *eventData = new EventUpdateData();
-	eventData->messageType = L"TDDeviceEvent";
-	eventData->eventState = intDeviceState;
-	eventData->deviceId = deviceId;
-	eventData->eventValue = strDeviceStateValue;
-	d->deviceUpdateEvent->signal(eventData);
-	return true;
-}
diff --git a/telldus-core/service/DeviceManager.h b/telldus-core/service/DeviceManager.h
deleted file mode 100644
index 6e5a6f25..00000000
--- a/telldus-core/service/DeviceManager.h
+++ /dev/null
@@ -1,68 +0,0 @@
-//
-// Copyright (C) 2012 Telldus Technologies AB. All rights reserved.
-//
-// Copyright: See COPYING file that comes with this distribution
-//
-//
-#ifndef TELLDUS_CORE_SERVICE_DEVICEMANAGER_H_
-#define TELLDUS_CORE_SERVICE_DEVICEMANAGER_H_
-
-#include 
-#include 
-#include "service/Device.h"
-#include "service/ControllerManager.h"
-#include "service/ControllerMessage.h"
-#include "service/EventUpdateManager.h"
-
-class Sensor;
-
-class DeviceManager {
-public:
-	DeviceManager(ControllerManager *controllerManager, TelldusCore::EventRef deviceUpdateEvent);
-	~DeviceManager(void);
-	int getNumberOfDevices(void);
-	int addDevice();
-	void connectTellStickController(int vid, int pid, const std::string &serial);
-	void disconnectTellStickController(int vid, int pid, const std::string &serial);
-	void executeActionEvent();
-	int getDeviceId(int deviceIndex);
-	int getDeviceLastSentCommand(int deviceId, int methodsSupported);
-	int setDeviceLastSentCommand(int deviceId, int command, const std::wstring &value);
-	int getDeviceMethods(int deviceId);
-	int getDeviceMethods(int deviceId, int methodsSupported);
-	std::wstring getDeviceModel(int deviceId);
-	int setDeviceModel(int deviceId, const std::wstring &model);
-	std::wstring getDeviceName(int deviceId);
-	int setDeviceName(int deviceId, const std::wstring &name);
-	std::wstring getDeviceParameter(int deviceId, const std::wstring &name, const std::wstring &defauleValue);
-	int setDeviceParameter(int deviceId, const std::wstring &name, const std::wstring &value);
-	std::wstring getDeviceProtocol(int deviceId);
-	int setDeviceProtocol(int deviceId, const std::wstring &name);
-	std::wstring getDeviceStateValue(int deviceId);
-	int getDeviceType(int deviceId);
-	int getPreferredControllerId(int deviceId);
-	int doAction(int deviceId, int action, unsigned char data);
-	int removeDevice(int deviceId);
-	int sendRawCommand(const std::wstring &command, int reserved);
-
-	void setExecuteActionEvent(TelldusCore::EventRef event);
-
-	std::wstring getSensors() const;
-	std::wstring getSensorValue(const std::wstring &protocol, const std::wstring &model, int id, int dataType) const;
-
-	void handleControllerMessage(const ControllerEventData &event);
-
-private:
-	void handleSensorMessage(const ControllerMessage &msg);
-	void setSensorValueAndSignal( const std::string &dataType, int dataTypeId, Sensor *sensor, const ControllerMessage &msg, time_t timestamp) const;
-	int getDeviceMethods(int deviceId, std::set *duplicateDeviceIds);
-	int doGroupSceneAction(int deviceId, int action, unsigned char data);
-	int executeScene(std::wstring singledevice, int groupDeviceId);
-	bool triggerDeviceStateChange(int deviceId, int intDeviceState, const std::wstring &strDeviceStateValue );
-	void fillDevices(void);
-
-	class PrivateData;
-	PrivateData *d;
-};
-
-#endif  // TELLDUS_CORE_SERVICE_DEVICEMANAGER_H_
diff --git a/telldus-core/service/EventUpdateManager.cpp b/telldus-core/service/EventUpdateManager.cpp
deleted file mode 100644
index a76d5ca1..00000000
--- a/telldus-core/service/EventUpdateManager.cpp
+++ /dev/null
@@ -1,259 +0,0 @@
-//
-// Copyright (C) 2012 Telldus Technologies AB. All rights reserved.
-//
-// Copyright: See COPYING file that comes with this distribution
-//
-//
-#include "service/EventUpdateManager.h"
-
-#ifdef _LINUX
-#include 
-#include 
-#include 
-#include 
-#include 
-#include 
-#include 
-#include 
-#endif  // _LINUX
-
-#include 
-#include 
-#include 
-#ifdef _LINUX
-#include 
-#include 
-#endif  // _LINUX
-
-#include "common/EventHandler.h"
-#include "common/Message.h"
-#include "common/Socket.h"
-#include "common/Strings.h"
-#include "service/config.h"
-#include "service/ConnectionListener.h"
-#include "service/Log.h"
-
-typedef std::list SocketList;
-typedef std::list StringList;
-
-class EventUpdateManager::PrivateData {
-public:
-	TelldusCore::EventHandler eventHandler;
-	TelldusCore::EventRef stopEvent, updateEvent, clientConnectEvent;
-	SocketList clients;
-	ConnectionListener *eventUpdateClientListener;
-#ifdef _LINUX
-	std::map fileList;
-#endif  // _LINUX
-};
-
-EventUpdateManager::EventUpdateManager()
-	:Thread() {
-	d = new PrivateData;
-	d->stopEvent = d->eventHandler.addEvent();
-	d->updateEvent = d->eventHandler.addEvent();
-	d->clientConnectEvent = d->eventHandler.addEvent();
-	d->eventUpdateClientListener = new ConnectionListener(L"TelldusEvents", d->clientConnectEvent);
-#ifdef _LINUX
-	loadScripts("deviceevent");
-	loadScripts("devicechangeevent");
-	loadScripts("rawdeviceevent");
-	loadScripts("sensorevent");
-	loadScripts("controllerevent");
-#endif  // _LINUX
-}
-
-EventUpdateManager::~EventUpdateManager(void) {
-	d->stopEvent->signal();
-	wait();
-	delete d->eventUpdateClientListener;
-
-	for (SocketList::iterator it = d->clients.begin(); it != d->clients.end(); ++it) {
-		delete(*it);
-	}
-
-	delete d;
-}
-
-TelldusCore::EventRef EventUpdateManager::retrieveUpdateEvent() {
-	return d->updateEvent;
-}
-
-void EventUpdateManager::run() {
-	while(!d->stopEvent->isSignaled()) {
-		if (!d->eventHandler.waitForAny()) {
-			continue;
-		}
-
-		if(d->clientConnectEvent->isSignaled()) {
-			// new client added
-			TelldusCore::EventDataRef eventData = d->clientConnectEvent->takeSignal();
-			ConnectionListenerEventData *data = dynamic_cast(eventData.get());
-			if(data) {
-				d->clients.push_back(data->socket);
-			}
-		} else if(d->updateEvent->isSignaled()) {
-			// device event, signal all clients
-			TelldusCore::EventDataRef eventData = d->updateEvent->takeSignal();
-			EventUpdateData *data = reinterpret_cast(eventData.get());
-			if(data) {
-				sendMessageToClients(data);
-				executeScripts(data);
-			}
-		}
-	}
-}
-
-void EventUpdateManager::loadScripts(const std::string &folder) {
-#ifdef _LINUX
-	std::string path = TelldusCore::formatf("%s/%s", SCRIPT_PATH, folder.c_str());
-	struct dirent **namelist;
-	int count = scandir(path.c_str(), &namelist, NULL, alphasort);
-	if (count < 0) {
-		return;
-	}
-
-	for(int i = 0; i < count; ++i) {
-		if (strcmp(namelist[i]->d_name, ".") != 0 && strcmp(namelist[i]->d_name, "..") != 0) {
-			d->fileList[folder].push_back(namelist[i]->d_name);
-		}
-		free(namelist[i]);
-	}
-	free(namelist);
-#endif  // _LINUX
-}
-
-void EventUpdateManager::sendMessageToClients(EventUpdateData *data) {
-	int connected = 0;
-	for(SocketList::iterator it = d->clients.begin(); it != d->clients.end();) {
-		if((*it)->isConnected()) {
-			connected++;
-			TelldusCore::Message msg;
-
-			if(data->messageType == L"TDDeviceEvent") {
-				msg.addArgument("TDDeviceEvent");
-				msg.addArgument(data->deviceId);
-				msg.addArgument(data->eventState);
-				msg.addArgument(data->eventValue);  // string
-			} else if(data->messageType == L"TDDeviceChangeEvent") {
-				msg.addArgument("TDDeviceChangeEvent");
-				msg.addArgument(data->deviceId);
-				msg.addArgument(data->eventDeviceChanges);
-				msg.addArgument(data->eventChangeType);
-			} else if(data->messageType == L"TDRawDeviceEvent") {
-				msg.addArgument("TDRawDeviceEvent");
-				msg.addArgument(data->eventValue);  // string
-				msg.addArgument(data->controllerId);
-			} else if(data->messageType == L"TDSensorEvent") {
-				msg.addArgument("TDSensorEvent");
-				msg.addArgument(data->protocol);
-				msg.addArgument(data->model);
-				msg.addArgument(data->sensorId);
-				msg.addArgument(data->dataType);
-				msg.addArgument(data->value);
-				msg.addArgument(data->timestamp);
-			} else if(data->messageType == L"TDControllerEvent") {
-				msg.addArgument("TDControllerEvent");
-				msg.addArgument(data->controllerId);
-				msg.addArgument(data->eventState);
-				msg.addArgument(data->eventChangeType);
-				msg.addArgument(data->eventValue);
-			}
-
-			(*it)->write(msg);
-
-			it++;
-		} else {
-			// connection is dead, remove it
-			delete *it;
-			it = d->clients.erase(it);
-		}
-	}
-}
-
-void EventUpdateManager::executeScripts(EventUpdateData *data) {
-#ifdef _LINUX
-	std::string dir;
-	std::vector env;
-
-	// Create a copy of the environment
-	unsigned int size = 0;
-	for(; ; ++size) {
-		if (environ[size] == 0) {
-			break;
-		}
-	}
-	env.reserve(size + 6);  // 6 is the most used extra environmental variables any event uses
-	for(unsigned int i = 0; i < size; ++i) {
-		env.push_back(environ[i]);
-	}
-
-	if(data->messageType == L"TDDeviceEvent") {
-		dir = "deviceevent";
-		env.push_back(TelldusCore::formatf("DEVICEID=%i", data->deviceId));
-		env.push_back(TelldusCore::formatf("METHOD=%i", data->eventState));
-		env.push_back(TelldusCore::formatf("METHODDATA=%s", TelldusCore::wideToString(data->eventValue).c_str()));
-	} else if(data->messageType == L"TDDeviceChangeEvent") {
-		dir = "devicechangeevent";
-		env.push_back(TelldusCore::formatf("DEVICEID=%i", data->deviceId));
-		env.push_back(TelldusCore::formatf("CHANGEEVENT=%i", data->eventDeviceChanges));
-		env.push_back(TelldusCore::formatf("CHANGETYPE=%i", data->eventChangeType));
-	} else if(data->messageType == L"TDRawDeviceEvent") {
-		dir = "rawdeviceevent";
-		env.push_back(TelldusCore::formatf("RAWDATA=%s", TelldusCore::wideToString(data->eventValue).c_str()));  // string
-		env.push_back(TelldusCore::formatf("CONTROLLERID=%i", data->controllerId));
-	} else if (data->messageType == L"TDSensorEvent") {
-		dir = "sensorevent";
-		env.push_back(TelldusCore::formatf("PROTOCOL=%s", TelldusCore::wideToString(data->protocol).c_str()));
-		env.push_back(TelldusCore::formatf("MODEL=%s", TelldusCore::wideToString(data->model).c_str()));
-		env.push_back(TelldusCore::formatf("SENSORID=%i", data->sensorId));
-		env.push_back(TelldusCore::formatf("DATATYPE=%i", data->dataType));
-		env.push_back(TelldusCore::formatf("VALUE=%s", TelldusCore::wideToString(data->value).c_str()));
-		env.push_back(TelldusCore::formatf("TIMESTAMP=%i", data->timestamp));
-	} else if(data->messageType == L"TDControllerEvent") {
-		dir = "controllerevent";
-		env.push_back(TelldusCore::formatf("CONTROLLERID=%i", data->controllerId));
-		env.push_back(TelldusCore::formatf("CHANGEEVENT=%i", data->eventState));
-		env.push_back(TelldusCore::formatf("CHANGETYPE=%i", data->eventChangeType));
-		env.push_back(TelldusCore::formatf("VALUE=%s", TelldusCore::wideToString(data->eventValue).c_str()));
-	} else {
-		// Unknown event, should not happen
-		return;
-	}
-
-	char *newEnv[env.size()+1];  // +1 for the last stop element
-	for(int i = 0; i < env.size(); ++i) {
-		newEnv[i] = new char[env.at(i).length()+1];
-		snprintf(newEnv[i], env.at(i).length()+1, "%s", env.at(i).c_str());
-	}
-	newEnv[env.size()] = NULL;  // Mark end of array
-
-	for(StringList::iterator it = d->fileList[dir].begin(); it != d->fileList[dir].end(); ++it) {
-		executeScript(TelldusCore::formatf("%s/%s/%s", SCRIPT_PATH, dir.c_str(), (*it).c_str()), (*it), newEnv);
-	}
-	// Cleanup
-	for(int i = 0; newEnv[i] != 0; ++i) {
-		delete[] newEnv[i];
-	}
-#endif  // _LINUX
-}
-
-void EventUpdateManager::executeScript(std::string script, const std::string &name, char ** env) {
-#ifdef _LINUX
-	pid_t pid = fork();
-	if (pid == -1) {
-		Log::error("Could not fork() to execute script %s", script.c_str());
-		return;
-	}
-
-	if (pid == 0) {
-		char *n = new char[name.length()+1];
-		snprintf(n, name.length()+1, "%s", name.c_str());
-		static char * argv[] = { n, NULL };
-		execve(script.c_str(), argv, env);
-		delete[] n;
-		Log::error("Could not execute %s (%i): %s", script.c_str(), errno, strerror(errno));
-		exit(1);
-	}
-#endif  // _LINUX
-}
diff --git a/telldus-core/service/EventUpdateManager.h b/telldus-core/service/EventUpdateManager.h
deleted file mode 100644
index 59560722..00000000
--- a/telldus-core/service/EventUpdateManager.h
+++ /dev/null
@@ -1,53 +0,0 @@
-//
-// Copyright (C) 2012 Telldus Technologies AB. All rights reserved.
-//
-// Copyright: See COPYING file that comes with this distribution
-//
-//
-#ifndef TELLDUS_CORE_SERVICE_EVENTUPDATEMANAGER_H_
-#define TELLDUS_CORE_SERVICE_EVENTUPDATEMANAGER_H_
-
-#include 
-#include "common/Thread.h"
-#include "common/Event.h"
-
-class EventUpdateData : public TelldusCore::EventDataBase {
-public:
-	std::wstring messageType;
-	int controllerId;
-	int deviceId;
-	int eventChangeType;
-	int eventDeviceChanges;
-	int eventState;
-	std::wstring eventValue;
-
-	// Sensor event
-	std::wstring protocol;
-	std::wstring model;
-	int sensorId;
-	int dataType;
-	std::wstring value;
-	int timestamp;
-};
-
-class EventUpdateManager  : public TelldusCore::Thread {
-public:
-	EventUpdateManager(void);
-	~EventUpdateManager(void);
-
-	TelldusCore::EventRef retrieveUpdateEvent();
-	TelldusCore::EventRef retrieveClientConnectEvent();
-
-protected:
-	void run();
-
-private:
-	class PrivateData;
-	PrivateData *d;
-	void loadScripts(const std::string &folder);
-	void sendMessageToClients(EventUpdateData *data);
-	void executeScripts(EventUpdateData *data);
-	static void executeScript(std::string script, const std::string &name, char **env);
-};
-
-#endif  // TELLDUS_CORE_SERVICE_EVENTUPDATEMANAGER_H_
diff --git a/telldus-core/service/Log.cpp b/telldus-core/service/Log.cpp
deleted file mode 100644
index 64c11a06..00000000
--- a/telldus-core/service/Log.cpp
+++ /dev/null
@@ -1,183 +0,0 @@
-//
-// Copyright (C) 2012 Telldus Technologies AB. All rights reserved.
-//
-// Copyright: See COPYING file that comes with this distribution
-//
-//
-#include "service/Log.h"
-#include 
-
-#if defined(_LINUX)
-#include 
-#elif defined(_WINDOWS)
-#include 
-#include "common/Strings.h"
-#include "service/Messages.h"
-#endif
-
-class Log::PrivateData {
-public:
-	PrivateData() : logOutput(Log::System), debug(false) {}
-
-	Log::LogOutput logOutput;
-	bool debug;
-
-	static Log *instance;
-#ifdef _WINDOWS
-	HANDLE eventSource;
-#endif
-};
-
-Log *Log::PrivateData::instance = 0;
-
-Log::Log()
-	:d(new PrivateData) {
-#if defined(_LINUX)
-	setlogmask(LOG_UPTO(LOG_INFO));
-	openlog("telldusd", LOG_CONS, LOG_USER);
-#elif defined(_MACOSX)
-	d->logOutput = Log::StdOut;
-#elif defined(_WINDOWS)
-	// Add ourselves to the registy
-	HKEY hRegKey = NULL;
-	DWORD dwError = 0;
-	TCHAR filePath[MAX_PATH];
-
-	std::wstring path(L"SYSTEM\\CurrentControlSet\\Services\\EventLog\\Application\\TelldusService");
-	dwError = RegCreateKey( HKEY_LOCAL_MACHINE, path.c_str(), &hRegKey );
-
-	GetModuleFileName( NULL, filePath, MAX_PATH );
-	dwError = RegSetValueEx( hRegKey, L"EventMessageFile", 0, REG_EXPAND_SZ, (PBYTE) filePath, (DWORD)(wcslen(filePath) + 1) * sizeof TCHAR );
-
-	DWORD dwTypes = LOG_DEBUG | LOG_NOTICE | LOG_WARNING | LOG_ERR;
-		dwError = RegSetValueEx( hRegKey, L"TypesSupported", 0, REG_DWORD, (LPBYTE) &dwTypes, sizeof dwTypes );
-
-	RegCloseKey(hRegKey);
-
-	d->eventSource = RegisterEventSource(NULL, L"TelldusService");
-#endif
-}
-
-Log::~Log() {
-#if defined(_LINUX)
-	closelog();
-#elif defined(_WINDOWS)
-	if (d->eventSource != NULL) {
-		DeregisterEventSource(d->eventSource);
-	}
-#endif
-	delete d;
-}
-
-void Log::destroy() {
-	if (PrivateData::instance == 0) {
-		return;
-	}
-	delete PrivateData::instance;
-	PrivateData::instance = 0;
-}
-
-void Log::debug(const char *fmt, ...) {
-	Log *log = Log::instance();
-	va_list ap;
-	va_start(ap, fmt);
-	log->message(Debug, fmt, ap);
-	va_end(ap);
-}
-
-void Log::notice(const char *fmt, ...) {
-	Log *log = Log::instance();
-	va_list ap;
-	va_start(ap, fmt);
-	log->message(Notice, fmt, ap);
-	va_end(ap);
-}
-
-void Log::warning(const char *fmt, ...) {
-	Log *log = Log::instance();
-	va_list ap;
-	va_start(ap, fmt);
-	log->message(Warning, fmt, ap);
-	va_end(ap);
-}
-
-void Log::error(const char *fmt, ...) {
-	Log *log = Log::instance();
-	va_list ap;
-	va_start(ap, fmt);
-	log->message(Error, fmt, ap);
-	va_end(ap);
-}
-
-void Log::setDebug() {
-	Log *log = Log::instance();
-	log->d->debug = true;
-	Log::debug("Debug message output enabled");
-}
-
-void Log::setLogOutput(LogOutput logOutput) {
-#ifdef _MACOSX
-	// Always stdout
-	return;
-#endif
-	Log *log = Log::instance();
-	log->d->logOutput = logOutput;
-}
-
-void Log::message(Log::LogLevel logLevel, const char *format, va_list ap) const {
-	if (logLevel == Debug && d->debug == false) {
-		return;
-	}
-	if (d->logOutput == StdOut) {
-		FILE *stream = stdout;
-		if (logLevel == Warning || logLevel == Error) {
-			stream = stderr;
-		}
-		vfprintf(stream, format, ap);
-		fprintf(stream, "\n");
-		fflush(stream);
-	} else {
-#if defined(_LINUX)
-		switch (logLevel) {
-			case Debug:
-				vsyslog(LOG_DEBUG, format, ap);
-				break;
-			case Notice:
-				vsyslog(LOG_NOTICE, format, ap);
-				break;
-			case Warning:
-				vsyslog(LOG_WARNING, format, ap);
-				break;
-			case Error:
-				vsyslog(LOG_ERR, format, ap);
-				break;
-		}
-#elif defined(_WINDOWS)
-		LPWSTR pInsertStrings[2] = {NULL, NULL};
-		std::wstring str = TelldusCore::charToWstring(TelldusCore::sformatf(format, ap).c_str());
-		pInsertStrings[0] = (LPWSTR)str.c_str();
-
-		switch (logLevel) {
-			case Debug:
-				ReportEvent(d->eventSource, EVENTLOG_SUCCESS, NULL, LOG_DEBUG, NULL, 1, 0, reinterpret_cast(&pInsertStrings), NULL);
-				break;
-			case Notice:
-				ReportEvent(d->eventSource, EVENTLOG_INFORMATION_TYPE, NULL, LOG_NOTICE, NULL, 1, 0, reinterpret_cast(&pInsertStrings), NULL);
-				break;
-			case Warning:
-				ReportEvent(d->eventSource, EVENTLOG_WARNING_TYPE, NULL, LOG_WARNING, NULL, 1, 0, reinterpret_cast(&pInsertStrings), NULL);
-				break;
-			case Error:
-				ReportEvent(d->eventSource, EVENTLOG_ERROR_TYPE, NULL, LOG_ERR, NULL, 1, 0, reinterpret_cast(&pInsertStrings), NULL);
-				break;
-		}
-#endif
-	}
-}
-
-Log *Log::instance() {
-	if (PrivateData::instance == 0) {
-		PrivateData::instance = new Log();
-	}
-	return PrivateData::instance;
-}
diff --git a/telldus-core/service/Log.h b/telldus-core/service/Log.h
deleted file mode 100644
index fc2491e8..00000000
--- a/telldus-core/service/Log.h
+++ /dev/null
@@ -1,40 +0,0 @@
-//
-// Copyright (C) 2012 Telldus Technologies AB. All rights reserved.
-//
-// Copyright: See COPYING file that comes with this distribution
-//
-//
-#ifndef TELLDUS_CORE_SERVICE_LOG_H_
-#define TELLDUS_CORE_SERVICE_LOG_H_
-
-#include 
-#include 
-
-class Log {
-public:
-	enum LogLevel { Debug, Notice, Warning, Error };
-	enum LogOutput { StdOut, System };
-	virtual ~Log();
-
-	static void destroy();
-
-	static void debug(const char *fmt, ...);
-	static void notice(const char *fmt, ...);
-	static void warning(const char *fmt, ...);
-	static void error(const char *fmt, ...);
-
-	static void setDebug();
-	static void setLogOutput(LogOutput logOutput);
-
-protected:
-	Log();
-	void message(LogLevel logLevel, const char *format, va_list ap) const;
-	static Log *instance();
-
-private:
-	class PrivateData;
-	PrivateData *d;
-};
-
-
-#endif  // TELLDUS_CORE_SERVICE_LOG_H_
diff --git a/telldus-core/service/Messages.mc b/telldus-core/service/Messages.mc
deleted file mode 100644
index b7f81b41..00000000
Binary files a/telldus-core/service/Messages.mc and /dev/null differ
diff --git a/telldus-core/service/Protocol.cpp b/telldus-core/service/Protocol.cpp
deleted file mode 100644
index 2a8f00e6..00000000
--- a/telldus-core/service/Protocol.cpp
+++ /dev/null
@@ -1,267 +0,0 @@
-//
-// Copyright (C) 2012 Telldus Technologies AB. All rights reserved.
-//
-// Copyright: See COPYING file that comes with this distribution
-//
-//
-#include "service/Protocol.h"
-#include 
-#include 
-#include 
-
-#include "client/telldus-core.h"
-#include "service/ControllerMessage.h"
-#include "service/ProtocolBrateck.h"
-#include "service/ProtocolComen.h"
-#include "service/ProtocolEverflourish.h"
-#include "service/ProtocolFineoffset.h"
-#include "service/ProtocolFuhaote.h"
-#include "service/ProtocolGroup.h"
-#include "service/ProtocolHasta.h"
-#include "service/ProtocolIkea.h"
-#include "service/ProtocolMandolyn.h"
-#include "service/ProtocolNexa.h"
-#include "service/ProtocolOregon.h"
-#include "service/ProtocolRisingSun.h"
-#include "service/ProtocolSartano.h"
-#include "service/ProtocolScene.h"
-#include "service/ProtocolSilvanChip.h"
-#include "service/ProtocolUpm.h"
-#include "service/ProtocolWaveman.h"
-#include "service/ProtocolX10.h"
-#include "service/ProtocolYidong.h"
-#include "common/Strings.h"
-
-class Protocol::PrivateData {
-public:
-	ParameterMap parameterList;
-	std::wstring model;
-};
-
-Protocol::Protocol() {
-	d = new PrivateData;
-}
-
-Protocol::~Protocol(void) {
-	delete d;
-}
-
-std::wstring Protocol::model() const {
-	std::wstring strModel = d->model;
-	// Strip anything after : if it is found
-	size_t pos = strModel.find(L":");
-	if (pos != std::wstring::npos) {
-		strModel = strModel.substr(0, pos);
-	}
-
-	return strModel;
-}
-
-void Protocol::setModel(const std::wstring &model) {
-	d->model = model;
-}
-
-void Protocol::setParameters(const ParameterMap ¶meterList) {
-	d->parameterList = parameterList;
-}
-
-std::wstring Protocol::getStringParameter(const std::wstring &name, const std::wstring &defaultValue) const {
-	ParameterMap::const_iterator it = d->parameterList.find(name);
-	if (it == d->parameterList.end()) {
-		return defaultValue;
-	}
-	return it->second;
-}
-
-int Protocol::getIntParameter(const std::wstring &name, int min, int max) const {
-	std::wstring value = getStringParameter(name, L"");
-	if (value == L"") {
-		return min;
-	}
-	std::wstringstream st;
-	st << value;
-	int intValue = 0;
-	st >> intValue;
-	if (intValue < min) {
-		return min;
-	}
-	if (intValue > max) {
-		return max;
-	}
-	return intValue;
-}
-
-bool Protocol::checkBit(int data, int bitno) {
-	return ((data >> bitno)&0x01);
-}
-
-
-Protocol *Protocol::getProtocolInstance(const std::wstring &protocolname) {
-	if(TelldusCore::comparei(protocolname, L"arctech")) {
-		return new ProtocolNexa();
-
-	} else if (TelldusCore::comparei(protocolname, L"brateck")) {
-		return new ProtocolBrateck();
-
-	} else if (TelldusCore::comparei(protocolname, L"comen")) {
-		return new ProtocolComen();
-
-	} else if (TelldusCore::comparei(protocolname, L"everflourish")) {
-		return new ProtocolEverflourish();
-
-	} else if (TelldusCore::comparei(protocolname, L"fuhaote")) {
-		return new ProtocolFuhaote();
-
-	} else if (TelldusCore::comparei(protocolname, L"hasta")) {
-		return new ProtocolHasta();
-
-	} else if (TelldusCore::comparei(protocolname, L"ikea")) {
-		return new ProtocolIkea();
-
-	} else if (TelldusCore::comparei(protocolname, L"risingsun")) {
-		return new ProtocolRisingSun();
-
-	} else if (TelldusCore::comparei(protocolname, L"sartano")) {
-		return new ProtocolSartano();
-
-	} else if (TelldusCore::comparei(protocolname, L"silvanchip")) {
-		return new ProtocolSilvanChip();
-
-	} else if (TelldusCore::comparei(protocolname, L"upm")) {
-		return new ProtocolUpm();
-
-	} else if (TelldusCore::comparei(protocolname, L"waveman")) {
-		return new ProtocolWaveman();
-
-	} else if (TelldusCore::comparei(protocolname, L"x10")) {
-		return new ProtocolX10();
-
-	} else if (TelldusCore::comparei(protocolname, L"yidong")) {
-		return new ProtocolYidong();
-
-	} else if (TelldusCore::comparei(protocolname, L"group")) {
-		return new ProtocolGroup();
-
-	} else if (TelldusCore::comparei(protocolname, L"scene")) {
-		return new ProtocolScene();
-	}
-
-	return 0;
-}
-
-std::list Protocol::getParametersForProtocol(const std::wstring &protocolName) {
-	std::list parameters;
-	if(TelldusCore::comparei(protocolName, L"arctech")) {
-		parameters.push_back("house");
-		parameters.push_back("unit");
-
-	} else if (TelldusCore::comparei(protocolName, L"brateck")) {
-		parameters.push_back("house");
-
-	} else if (TelldusCore::comparei(protocolName, L"comen")) {
-		parameters.push_back("house");
-		parameters.push_back("unit");
-
-	} else if (TelldusCore::comparei(protocolName, L"everflourish")) {
-		parameters.push_back("house");
-		parameters.push_back("unit");
-
-	} else if (TelldusCore::comparei(protocolName, L"fuhaote")) {
-		parameters.push_back("code");
-
-	} else if (TelldusCore::comparei(protocolName, L"hasta")) {
-		parameters.push_back("house");
-		parameters.push_back("unit");
-
-	} else if (TelldusCore::comparei(protocolName, L"ikea")) {
-		parameters.push_back("system");
-		parameters.push_back("units");
-		// parameters.push_back("fade");
-
-	} else if (TelldusCore::comparei(protocolName, L"risingsun")) {
-		parameters.push_back("house");
-		parameters.push_back("unit");
-
-	} else if (TelldusCore::comparei(protocolName, L"sartano")) {
-		parameters.push_back("code");
-
-	} else if (TelldusCore::comparei(protocolName, L"silvanchip")) {
-		parameters.push_back("house");
-
-	} else if (TelldusCore::comparei(protocolName, L"upm")) {
-		parameters.push_back("house");
-		parameters.push_back("unit");
-
-	} else if (TelldusCore::comparei(protocolName, L"waveman")) {
-		parameters.push_back("house");
-		parameters.push_back("unit");
-
-	} else if (TelldusCore::comparei(protocolName, L"x10")) {
-		parameters.push_back("house");
-		parameters.push_back("unit");
-
-	} else if (TelldusCore::comparei(protocolName, L"yidong")) {
-		parameters.push_back("unit");
-
-	} else if (TelldusCore::comparei(protocolName, L"group")) {
-		parameters.push_back("devices");
-
-	} else if (TelldusCore::comparei(protocolName, L"scene")) {
-		parameters.push_back("devices");
-	}
-
-	return parameters;
-}
-
-std::list Protocol::decodeData(const std::string &fullData) {
-	std::list retval;
-	std::string decoded = "";
-
-	ControllerMessage dataMsg(fullData);
-	if( TelldusCore::comparei(dataMsg.protocol(), L"arctech") ) {
-		decoded = ProtocolNexa::decodeData(dataMsg);
-		if (decoded != "") {
-			retval.push_back(decoded);
-		}
-		decoded = ProtocolWaveman::decodeData(dataMsg);
-		if (decoded != "") {
-			retval.push_back(decoded);
-		}
-		decoded = ProtocolSartano::decodeData(dataMsg);
-		if (decoded != "") {
-			retval.push_back(decoded);
-		}
-	} else if(TelldusCore::comparei(dataMsg.protocol(), L"everflourish") ) {
-		decoded = ProtocolEverflourish::decodeData(dataMsg);
-		if (decoded != "") {
-			retval.push_back(decoded);
-		}
-	} else if(TelldusCore::comparei(dataMsg.protocol(), L"fineoffset") ) {
-		decoded = ProtocolFineoffset::decodeData(dataMsg);
-		if (decoded != "") {
-			retval.push_back(decoded);
-		}
-	} else if(TelldusCore::comparei(dataMsg.protocol(), L"mandolyn") ) {
-		decoded = ProtocolMandolyn::decodeData(dataMsg);
-		if (decoded != "") {
-			retval.push_back(decoded);
-		}
-	} else if(TelldusCore::comparei(dataMsg.protocol(), L"oregon") ) {
-		decoded = ProtocolOregon::decodeData(dataMsg);
-		if (decoded != "") {
-			retval.push_back(decoded);
-		}
-	} else if(TelldusCore::comparei(dataMsg.protocol(), L"x10") ) {
-		decoded = ProtocolX10::decodeData(dataMsg);
-		if (decoded != "") {
-			retval.push_back(decoded);
-		}
-	} else if(TelldusCore::comparei(dataMsg.protocol(), L"hasta") ) {
-		decoded = ProtocolHasta::decodeData(dataMsg);
-		if (decoded != "") {
-			retval.push_back(decoded);
-		}
-	}
-
-	return retval;
-}
diff --git a/telldus-core/service/Protocol.h b/telldus-core/service/Protocol.h
deleted file mode 100644
index a4e7e6cd..00000000
--- a/telldus-core/service/Protocol.h
+++ /dev/null
@@ -1,46 +0,0 @@
-//
-// Copyright (C) 2012 Telldus Technologies AB. All rights reserved.
-//
-// Copyright: See COPYING file that comes with this distribution
-//
-//
-#ifndef TELLDUS_CORE_SERVICE_PROTOCOL_H_
-#define TELLDUS_CORE_SERVICE_PROTOCOL_H_
-
-#include 
-#include 
-#include 
-#include "client/telldus-core.h"
-
-typedef std::map ParameterMap;
-
-class Controller;
-
-class Protocol {
-public:
-	Protocol();
-	virtual ~Protocol(void);
-
-	static Protocol *getProtocolInstance(const std::wstring &protocolname);
-	static std::list getParametersForProtocol(const std::wstring &protocolName);
-	static std::list decodeData(const std::string &fullData);
-
-	virtual int methods() const = 0;
-	std::wstring model() const;
-	void setModel(const std::wstring &model);
-	void setParameters(const ParameterMap ¶meterList);
-
-	virtual std::string getStringForMethod(int method, unsigned char data, Controller *controller) = 0;
-
-protected:
-	virtual std::wstring getStringParameter(const std::wstring &name, const std::wstring &defaultValue = L"") const;
-	virtual int getIntParameter(const std::wstring &name, int min, int max) const;
-
-	static bool checkBit(int data, int bit);
-
-private:
-	class PrivateData;
-	PrivateData *d;
-};
-
-#endif  // TELLDUS_CORE_SERVICE_PROTOCOL_H_
diff --git a/telldus-core/service/ProtocolBrateck.cpp b/telldus-core/service/ProtocolBrateck.cpp
deleted file mode 100644
index ab03387c..00000000
--- a/telldus-core/service/ProtocolBrateck.cpp
+++ /dev/null
@@ -1,53 +0,0 @@
-//
-// Copyright (C) 2012 Telldus Technologies AB. All rights reserved.
-//
-// Copyright: See COPYING file that comes with this distribution
-//
-//
-#include "service/ProtocolBrateck.h"
-#include 
-
-int ProtocolBrateck::methods() const {
-	return TELLSTICK_UP | TELLSTICK_DOWN | TELLSTICK_STOP;
-}
-
-std::string ProtocolBrateck::getStringForMethod(int method, unsigned char, Controller *) {
-	const char S = '!';
-	const char L = 'V';
-	const char B1[] = {L, S, L, S, 0};
-	const char BX[] = {S, L, L, S, 0};
-	const char B0[] = {S, L, S, L, 0};
-	const char BUP[]   = {L, S, L, S, S, L, S, L, S, L, S, L, S, L, S, L, S, 0};
-	const char BSTOP[] = {S, L, S, L, L, S, L, S, S, L, S, L, S, L, S, L, S, 0};
-	const char BDOWN[] = {S, L, S, L, S, L, S, L, S, L, S, L, L, S, L, S, S, 0};
-
-	std::string strReturn;
-	std::wstring strHouse = this->getStringParameter(L"house", L"");
-	if (strHouse == L"") {
-		return "";
-	}
-
-	for( size_t i = 0; i < strHouse.length(); ++i ) {
-		if (strHouse[i] == '1') {
-			strReturn.insert(0, B1);
-		} else if (strHouse[i] == '-') {
-			strReturn.insert(0, BX);
-		} else if (strHouse[i] == '0') {
-			strReturn.insert(0, B0);
-		}
-	}
-
-	strReturn.insert(0, "S");
-	if (method == TELLSTICK_UP) {
-		strReturn.append(BUP);
-	} else if (method == TELLSTICK_DOWN) {
-		strReturn.append(BDOWN);
-	} else if (method == TELLSTICK_STOP) {
-		strReturn.append(BSTOP);
-	} else {
-		return "";
-	}
-	strReturn.append("+");
-
-	return strReturn;
-}
diff --git a/telldus-core/service/ProtocolBrateck.h b/telldus-core/service/ProtocolBrateck.h
deleted file mode 100644
index c533308a..00000000
--- a/telldus-core/service/ProtocolBrateck.h
+++ /dev/null
@@ -1,19 +0,0 @@
-//
-// Copyright (C) 2012 Telldus Technologies AB. All rights reserved.
-//
-// Copyright: See COPYING file that comes with this distribution
-//
-//
-#ifndef TELLDUS_CORE_SERVICE_PROTOCOLBRATECK_H_
-#define TELLDUS_CORE_SERVICE_PROTOCOLBRATECK_H_
-
-#include 
-#include "service/Protocol.h"
-
-class ProtocolBrateck : public Protocol {
-public:
-	int methods() const;
-	virtual std::string getStringForMethod(int method, unsigned char data, Controller *controller);
-};
-
-#endif  // TELLDUS_CORE_SERVICE_PROTOCOLBRATECK_H_
diff --git a/telldus-core/service/ProtocolComen.cpp b/telldus-core/service/ProtocolComen.cpp
deleted file mode 100644
index dfc7d38d..00000000
--- a/telldus-core/service/ProtocolComen.cpp
+++ /dev/null
@@ -1,23 +0,0 @@
-//
-// Copyright (C) 2012 Telldus Technologies AB. All rights reserved.
-//
-// Copyright: See COPYING file that comes with this distribution
-//
-//
-#include "service/ProtocolComen.h"
-#include 
-
-int ProtocolComen::methods() const {
-	return (TELLSTICK_TURNON | TELLSTICK_TURNOFF | TELLSTICK_LEARN);
-}
-
-int ProtocolComen::getIntParameter(const std::wstring &name, int min, int max) const {
-	if (name.compare(L"house") == 0) {
-		int intHouse = Protocol::getIntParameter(L"house", 1, 16777215);
-		// The last two bits must be hardcoded
-		intHouse <<= 2;
-		intHouse += 2;
-		return intHouse;
-	}
-	return Protocol::getIntParameter(name, min, max);
-}
diff --git a/telldus-core/service/ProtocolComen.h b/telldus-core/service/ProtocolComen.h
deleted file mode 100644
index f43167a8..00000000
--- a/telldus-core/service/ProtocolComen.h
+++ /dev/null
@@ -1,21 +0,0 @@
-//
-// Copyright (C) 2012 Telldus Technologies AB. All rights reserved.
-//
-// Copyright: See COPYING file that comes with this distribution
-//
-//
-#ifndef TELLDUS_CORE_SERVICE_PROTOCOLCOMEN_H_
-#define TELLDUS_CORE_SERVICE_PROTOCOLCOMEN_H_
-
-#include 
-#include "service/ProtocolNexa.h"
-
-class ProtocolComen : public ProtocolNexa {
-public:
-	virtual int methods() const;
-
-protected:
-	virtual int getIntParameter(const std::wstring &name, int min, int max) const;
-};
-
-#endif  // TELLDUS_CORE_SERVICE_PROTOCOLCOMEN_H_
diff --git a/telldus-core/service/ProtocolEverflourish.cpp b/telldus-core/service/ProtocolEverflourish.cpp
deleted file mode 100644
index cc193931..00000000
--- a/telldus-core/service/ProtocolEverflourish.cpp
+++ /dev/null
@@ -1,133 +0,0 @@
-//
-// Copyright (C) 2012 Telldus Technologies AB. All rights reserved.
-//
-// Copyright: See COPYING file that comes with this distribution
-//
-//
-#include "service/ProtocolEverflourish.h"
-#include 
-#include 
-#include 
-#include "service/ControllerMessage.h"
-
-int ProtocolEverflourish::methods() const {
-	return TELLSTICK_TURNON | TELLSTICK_TURNOFF | TELLSTICK_LEARN;
-}
-
-std::string ProtocolEverflourish::getStringForMethod(int method, unsigned char, Controller *) {
-	unsigned int deviceCode = this->getIntParameter(L"house", 0, 16383);
-	unsigned int intCode = this->getIntParameter(L"unit", 1, 4)-1;
-	unsigned char action;
-
-	if (method == TELLSTICK_TURNON) {
-		action = 15;
-	} else if (method == TELLSTICK_TURNOFF) {
-		action = 0;
-	} else if (method == TELLSTICK_LEARN) {
-		action = 10;
-	} else {
-		return "";
-	}
-
-	const char ssss = 85;
-	const char sssl = 84;  // 0
-	const char slss = 69;  // 1
-
-	const char bits[2] = {sssl, slss};
-	int i, check;
-
-	std::string strCode;
-
-	deviceCode = (deviceCode << 2) | intCode;
-
-	check = calculateChecksum(deviceCode);
-
-	char preamble[] = {'R', 5, 'T', 114, 60, 1, 1, 105, ssss, ssss, 0};
-	strCode.append(preamble);
-
-	for(i = 15; i >= 0; i--) {
-		strCode.append(1, bits[(deviceCode >> i)&0x01]);
-	}
-	for(i = 3; i >= 0; i--) {
-		strCode.append(1, bits[(check >> i)&0x01]);
-	}
-	for(i = 3; i >= 0; i--) {
-		strCode.append(1, bits[(action >> i)&0x01]);
-	}
-
-	strCode.append(1, ssss);
-	strCode.append(1, '+');
-
-	return strCode;
-}
-
-// The calculation used in this function is provided by Frank Stevenson
-unsigned int ProtocolEverflourish::calculateChecksum(unsigned int x) {
-	unsigned int bits[16] = {
-		0xf, 0xa, 0x7, 0xe,
-		0xf, 0xd, 0x9, 0x1,
-		0x1, 0x2, 0x4, 0x8,
-		0x3, 0x6, 0xc, 0xb
-	};
-	unsigned int bit = 1;
-	unsigned int res = 0x5;
-	int i;
-	unsigned int lo, hi;
-
-	if ((x & 0x3) == 3) {
-		lo = x & 0x00ff;
-		hi = x & 0xff00;
-		lo += 4;
-		if (lo>0x100) {
-			lo = 0x12;
-		}
-		x = lo | hi;
-	}
-
-	for(i = 0; i < 16; i++) {
-		if (x & bit) {
-			res = res ^ bits[i];
-		}
-		bit = bit << 1;
-	}
-
-	return res;
-}
-
-std::string ProtocolEverflourish::decodeData(const ControllerMessage &dataMsg) {
-	uint64_t allData;
-	unsigned int house = 0;
-	unsigned int unit = 0;
-	unsigned int method = 0;
-
-	allData = dataMsg.getInt64Parameter("data");
-
-	house = allData & 0xFFFC00;
-	house >>= 10;
-
-	unit = allData & 0x300;
-	unit >>= 8;
-	unit++;  // unit from 1 to 4
-
-	method = allData & 0xF;
-
-	if(house > 16383 || unit < 1 || unit > 4) {
-		// not everflourish
-		return "";
-	}
-
-	std::stringstream retString;
-	retString << "class:command;protocol:everflourish;model:selflearning;house:" << house << ";unit:" << unit << ";method:";
-	if(method == 0) {
-		retString << "turnoff;";
-	} else if(method == 15) {
-		retString << "turnon;";
-	} else if(method == 10) {
-		retString << "learn;";
-	} else {
-		// not everflourish
-		return "";
-	}
-
-	return retString.str();
-}
diff --git a/telldus-core/service/ProtocolEverflourish.h b/telldus-core/service/ProtocolEverflourish.h
deleted file mode 100644
index ae4abf7c..00000000
--- a/telldus-core/service/ProtocolEverflourish.h
+++ /dev/null
@@ -1,24 +0,0 @@
-//
-// Copyright (C) 2012 Telldus Technologies AB. All rights reserved.
-//
-// Copyright: See COPYING file that comes with this distribution
-//
-//
-#ifndef TELLDUS_CORE_SERVICE_PROTOCOLEVERFLOURISH_H_
-#define TELLDUS_CORE_SERVICE_PROTOCOLEVERFLOURISH_H_
-
-#include 
-#include "service/Protocol.h"
-#include "service/ControllerMessage.h"
-
-class ProtocolEverflourish :  public Protocol {
-public:
-	int methods() const;
-	virtual std::string getStringForMethod(int method, unsigned char data, Controller *controller);
-	static std::string decodeData(const ControllerMessage &dataMsg);
-
-private:
-	static unsigned int calculateChecksum(unsigned int x);
-};
-
-#endif  // TELLDUS_CORE_SERVICE_PROTOCOLEVERFLOURISH_H_
diff --git a/telldus-core/service/ProtocolFineoffset.cpp b/telldus-core/service/ProtocolFineoffset.cpp
deleted file mode 100644
index 2fd6f5ae..00000000
--- a/telldus-core/service/ProtocolFineoffset.cpp
+++ /dev/null
@@ -1,52 +0,0 @@
-//
-// Copyright (C) 2012 Telldus Technologies AB. All rights reserved.
-//
-// Copyright: See COPYING file that comes with this distribution
-//
-//
-#include "service/ProtocolFineoffset.h"
-#include 
-#include 
-#include 
-#include 
-#include "common/Strings.h"
-
-std::string ProtocolFineoffset::decodeData(const ControllerMessage &dataMsg) {
-	std::string data = dataMsg.getParameter("data");
-	if (data.length() < 8) {
-		return "";
-	}
-
-	// Checksum currently not used
-	// uint8_t checksum = (uint8_t)TelldusCore::hexTo64l(data.substr(data.length()-2));
-	data = data.substr(0, data.length()-2);
-
-	uint8_t humidity = (uint8_t)TelldusCore::hexTo64l(data.substr(data.length()-2));
-	data = data.substr(0, data.length()-2);
-
-	uint16_t value = (uint16_t)TelldusCore::hexTo64l(data.substr(data.length()-3));
-	double temperature = (value & 0x7FF)/10.0;
-
-	value >>= 11;
-	if (value & 1) {
-		temperature = -temperature;
-	}
-	data = data.substr(0, data.length()-3);
-
-	uint16_t id = (uint16_t)TelldusCore::hexTo64l(data) & 0xFF;
-
-	std::stringstream retString;
-	retString << "class:sensor;protocol:fineoffset;id:" << id << ";model:";
-
-	if (humidity <= 100) {
-		retString << "temperaturehumidity;humidity:" << static_cast(humidity) << ";";
-	} else if (humidity == 0xFF) {
-		retString << "temperature;";
-	} else {
-		return "";
-	}
-
-	retString << "temp:" << std::fixed << std::setprecision(1) << temperature << ";";
-
-	return retString.str();
-}
diff --git a/telldus-core/service/ProtocolFineoffset.h b/telldus-core/service/ProtocolFineoffset.h
deleted file mode 100644
index b3bc3ce1..00000000
--- a/telldus-core/service/ProtocolFineoffset.h
+++ /dev/null
@@ -1,19 +0,0 @@
-//
-// Copyright (C) 2012 Telldus Technologies AB. All rights reserved.
-//
-// Copyright: See COPYING file that comes with this distribution
-//
-//
-#ifndef TELLDUS_CORE_SERVICE_PROTOCOLFINEOFFSET_H_
-#define TELLDUS_CORE_SERVICE_PROTOCOLFINEOFFSET_H_
-
-#include 
-#include "service/Protocol.h"
-#include "service/ControllerMessage.h"
-
-class ProtocolFineoffset : public Protocol {
-public:
-	static std::string decodeData(const ControllerMessage &dataMsg);
-};
-
-#endif  // TELLDUS_CORE_SERVICE_PROTOCOLFINEOFFSET_H_
diff --git a/telldus-core/service/ProtocolFuhaote.cpp b/telldus-core/service/ProtocolFuhaote.cpp
deleted file mode 100644
index 7254520e..00000000
--- a/telldus-core/service/ProtocolFuhaote.cpp
+++ /dev/null
@@ -1,60 +0,0 @@
-//
-// Copyright (C) 2012 Telldus Technologies AB. All rights reserved.
-//
-// Copyright: See COPYING file that comes with this distribution
-//
-//
-#include "service/ProtocolFuhaote.h"
-#include 
-
-int ProtocolFuhaote::methods() const {
-	return TELLSTICK_TURNON | TELLSTICK_TURNOFF;
-}
-
-std::string ProtocolFuhaote::getStringForMethod(int method, unsigned char, Controller *) {
-	const char S = 19;
-	const char L = 58;
-	const char B0[] = {S, L, L, S, 0};
-	const char B1[] = {L, S, L, S, 0};
-	const char OFF[] = {S, L, S, L, S, L, L, S, 0};
-	const char ON[]  = {S, L, L, S, S, L, S, L, 0};
-
-	std::string strReturn = "S";
-	std::wstring strCode = this->getStringParameter(L"code", L"");
-	if (strCode == L"") {
-		return "";
-	}
-
-	// House code
-	for(size_t i = 0; i < 5; ++i) {
-		if (strCode[i] == '0') {
-			strReturn.append(B0);
-		} else if (strCode[i] == '1') {
-			strReturn.append(B1);
-		}
-	}
-	// Unit code
-	for(size_t i = 5; i < 10; ++i) {
-		if (strCode[i] == '0') {
-			strReturn.append(B0);
-		} else if (strCode[i] == '1') {
-			strReturn.append(1, S);
-			strReturn.append(1, L);
-			strReturn.append(1, S);
-			strReturn.append(1, L);
-		}
-	}
-
-	if (method == TELLSTICK_TURNON) {
-		strReturn.append(ON);
-	} else if (method == TELLSTICK_TURNOFF) {
-		strReturn.append(OFF);
-	} else {
-		return "";
-	}
-
-	strReturn.append(1, S);
-	strReturn.append("+");
-	return strReturn;
-}
-
diff --git a/telldus-core/service/ProtocolFuhaote.h b/telldus-core/service/ProtocolFuhaote.h
deleted file mode 100644
index 2618ef86..00000000
--- a/telldus-core/service/ProtocolFuhaote.h
+++ /dev/null
@@ -1,19 +0,0 @@
-//
-// Copyright (C) 2012 Telldus Technologies AB. All rights reserved.
-//
-// Copyright: See COPYING file that comes with this distribution
-//
-//
-#ifndef TELLDUS_CORE_SERVICE_PROTOCOLFUHAOTE_H_
-#define TELLDUS_CORE_SERVICE_PROTOCOLFUHAOTE_H_
-
-#include 
-#include "service/Protocol.h"
-
-class ProtocolFuhaote : public Protocol {
-public:
-	int methods() const;
-	virtual std::string getStringForMethod(int method, unsigned char data, Controller *controller);
-};
-
-#endif  // TELLDUS_CORE_SERVICE_PROTOCOLFUHAOTE_H_
diff --git a/telldus-core/service/ProtocolGroup.cpp b/telldus-core/service/ProtocolGroup.cpp
deleted file mode 100644
index 4c4d0d15..00000000
--- a/telldus-core/service/ProtocolGroup.cpp
+++ /dev/null
@@ -1,16 +0,0 @@
-//
-// Copyright (C) 2012 Telldus Technologies AB. All rights reserved.
-//
-// Copyright: See COPYING file that comes with this distribution
-//
-//
-#include "service/ProtocolGroup.h"
-#include 
-
-int ProtocolGroup::methods() const {
-	return TELLSTICK_TURNON | TELLSTICK_TURNOFF | TELLSTICK_DIM | TELLSTICK_BELL | TELLSTICK_LEARN | TELLSTICK_EXECUTE | TELLSTICK_TOGGLE | TELLSTICK_UP | TELLSTICK_DOWN | TELLSTICK_STOP;
-}
-
-std::string ProtocolGroup::getStringForMethod(int method, unsigned char data, Controller *) {
-	return "";
-}
diff --git a/telldus-core/service/ProtocolGroup.h b/telldus-core/service/ProtocolGroup.h
deleted file mode 100644
index 509c2a3a..00000000
--- a/telldus-core/service/ProtocolGroup.h
+++ /dev/null
@@ -1,22 +0,0 @@
-//
-// Copyright (C) 2012 Telldus Technologies AB. All rights reserved.
-//
-// Copyright: See COPYING file that comes with this distribution
-//
-//
-#ifndef TELLDUS_CORE_SERVICE_PROTOCOLGROUP_H_
-#define TELLDUS_CORE_SERVICE_PROTOCOLGROUP_H_
-
-#include 
-#include "service/Protocol.h"
-
-class ProtocolGroup : public Protocol {
-public:
-	virtual int methods() const;
-	virtual std::string getStringForMethod(int method, unsigned char data, Controller *controller);
-};
-
-#endif  // TELLDUS_CORE_SERVICE_PROTOCOLGROUP_H_
-
-
-
diff --git a/telldus-core/service/ProtocolHasta.cpp b/telldus-core/service/ProtocolHasta.cpp
deleted file mode 100644
index 786f068b..00000000
--- a/telldus-core/service/ProtocolHasta.cpp
+++ /dev/null
@@ -1,201 +0,0 @@
-//
-// Copyright (C) 2012 Telldus Technologies AB. All rights reserved.
-//
-// Copyright: See COPYING file that comes with this distribution
-//
-//
-#include "service/ProtocolHasta.h"
-#include 
-#include 
-#include 
-#include "common/Strings.h"
-
-int ProtocolHasta::methods() const {
-	return TELLSTICK_UP | TELLSTICK_DOWN | TELLSTICK_STOP | TELLSTICK_LEARN;
-}
-
-std::string ProtocolHasta::getStringForMethod(int method, unsigned char, Controller *) {
-	if (TelldusCore::comparei(model(), L"selflearningv2")) {
-		return getStringForMethodv2(method);
-	}
-	return getStringForMethodv1(method);
-}
-
-std::string ProtocolHasta::getStringForMethodv1(int method) {
-	int house = this->getIntParameter(L"house", 1, 65536);
-	int unit = this->getIntParameter(L"unit", 1, 15);
-	std::string strReturn;
-
-	strReturn.append(1, 164);
-	strReturn.append(1, 1);
-	strReturn.append(1, 164);
-	strReturn.append(1, 1);
-	strReturn.append(1, 164);
-	strReturn.append(1, 164);
-
-	strReturn.append(convertByte( (house & 0xFF) ));
-	strReturn.append(convertByte( (house>>8) & 0xFF ));
-
-	int byte = unit&0x0F;
-
-	if (method == TELLSTICK_UP) {
-		byte |= 0x00;
-
-	} else if (method == TELLSTICK_DOWN) {
-		byte |= 0x10;
-
-	} else if (method == TELLSTICK_STOP) {
-		byte |= 0x50;
-
-	} else if (method == TELLSTICK_LEARN) {
-		byte |= 0x40;
-
-	} else {
-		return "";
-	}
-	strReturn.append(convertByte(byte));
-
-	strReturn.append(convertByte(0x0));
-	strReturn.append(convertByte(0x0));
-
-	// Remove the last pulse
-	strReturn.erase(strReturn.end()-1, strReturn.end());
-
-	return strReturn;
-}
-
-std::string ProtocolHasta::convertByte(unsigned char byte) {
-	std::string retval;
-	for(int i = 0; i < 8; ++i) {
-		if (byte & 1) {
-			retval.append(1, 33);
-			retval.append(1, 17);
-		} else {
-			retval.append(1, 17);
-			retval.append(1, 33);
-		}
-		byte >>= 1;
-	}
-	return retval;
-}
-
-std::string ProtocolHasta::getStringForMethodv2(int method) {
-	int house = this->getIntParameter(L"house", 1, 65536);
-	int unit = this->getIntParameter(L"unit", 1, 15);
-	int sum = 0;
-	std::string strReturn;
-	strReturn.append(1, 245);
-	strReturn.append(1, 1);
-	strReturn.append(1, 245);
-	strReturn.append(1, 245);
-	strReturn.append(1, 63);
-	strReturn.append(1, 1);
-	strReturn.append(1, 63);
-	strReturn.append(1, 1);
-	strReturn.append(1, 35);
-	strReturn.append(1, 35);
-
-	strReturn.append(convertBytev2( (house>>8) & 0xFF ));
-	sum = ((house>>8)&0xFF);
-	strReturn.append(convertBytev2( (house & 0xFF) ));
-	sum += (house & 0xFF);
-
-	int byte = unit&0x0F;
-
-	if (method == TELLSTICK_UP) {
-		byte |= 0xC0;
-
-	} else if (method == TELLSTICK_DOWN) {
-		byte |= 0x10;
-
-	} else if (method == TELLSTICK_STOP) {
-		byte |= 0x50;
-
-	} else if (method == TELLSTICK_LEARN) {
-		byte |= 0x40;
-
-	} else {
-		return "";
-	}
-	strReturn.append(convertBytev2(byte));
-	sum += byte;
-
-	strReturn.append(convertBytev2(0x01));
-	sum += 0x01;
-
-	int checksum = ((static_cast(sum/256)+1)*256+1) - sum;
-	strReturn.append(convertBytev2(checksum));
-	strReturn.append(1, 63);
-	strReturn.append(1, 35);
-
-	return strReturn;
-}
-
-std::string ProtocolHasta::convertBytev2(unsigned char byte) {
-	std::string retval;
-	for(int i = 0; i < 8; ++i) {
-		if (byte & 1) {
-			retval.append(1, 63);
-			retval.append(1, 35);
-		} else {
-			retval.append(1, 35);
-			retval.append(1, 63);
-		}
-		byte >>= 1;
-	}
-	return retval;
-}
-
-std::string ProtocolHasta::decodeData(const ControllerMessage& dataMsg) {
-	uint64_t allData = dataMsg.getInt64Parameter("data");
-
-	unsigned int house = 0;
-	unsigned int unit = 0;
-	unsigned int method = 0;
-	std::string model;
-	std::string methodstring;
-
-	allData >>= 8;
-	unit = allData & 0xF;
-	allData >>= 4;
-	method = allData & 0xF;
-	allData >>= 4;
-	if(TelldusCore::comparei(dataMsg.model(), L"selflearning")) {
-		// version1
-		house = allData & 0xFFFF;
-		house = ((house << 8) | (house >> 8)) & 0xFFFF;
-		model = "selflearning";
-		if(method == 0) {
-			methodstring = "up";
-		} else if(method == 1) {
-			methodstring = "down";
-		} else if(method == 5) {
-			methodstring = "stop";
-		} else {
-			return "";
-		}
-	} else {
-		// version2
-		house = allData & 0xFFFF;
-
-		model = "selflearningv2";
-		if(method == 12) {
-			methodstring = "up";
-		} else if(method == 1 || method == 8) {  // is method 8 correct?
-			methodstring = "down";
-		} else if(method == 5) {
-			methodstring = "stop";
-		} else {
-			return "";
-		}
-	}
-
-	if(house < 1 || house > 65535 || unit < 1 || unit > 16) {
-		// not hasta
-		return "";
-	}
-
-	std::stringstream retString;
-	retString << "class:command;protocol:hasta;model:" << model << ";house:" << house << ";unit:" << unit << ";method:" << methodstring << ";";
-	return retString.str();
-}
diff --git a/telldus-core/service/ProtocolHasta.h b/telldus-core/service/ProtocolHasta.h
deleted file mode 100644
index 7a122bb2..00000000
--- a/telldus-core/service/ProtocolHasta.h
+++ /dev/null
@@ -1,27 +0,0 @@
-//
-// Copyright (C) 2012 Telldus Technologies AB. All rights reserved.
-//
-// Copyright: See COPYING file that comes with this distribution
-//
-//
-#ifndef TELLDUS_CORE_SERVICE_PROTOCOLHASTA_H_
-#define TELLDUS_CORE_SERVICE_PROTOCOLHASTA_H_
-
-#include 
-#include "service/ControllerMessage.h"
-#include "service/Protocol.h"
-
-class ProtocolHasta : public Protocol {
-public:
-	int methods() const;
-	virtual std::string getStringForMethod(int method, unsigned char data, Controller *controller);
-	static std::string decodeData(const ControllerMessage &dataMsg);
-
-protected:
-	static std::string convertByte(unsigned char byte);
-	static std::string convertBytev2(unsigned char byte);
-	std::string getStringForMethodv1(int method);
-	std::string getStringForMethodv2(int method);
-};
-
-#endif  // TELLDUS_CORE_SERVICE_PROTOCOLHASTA_H_
diff --git a/telldus-core/service/ProtocolIkea.cpp b/telldus-core/service/ProtocolIkea.cpp
deleted file mode 100644
index 2c19f858..00000000
--- a/telldus-core/service/ProtocolIkea.cpp
+++ /dev/null
@@ -1,151 +0,0 @@
-//
-// Copyright (C) 2012 Telldus Technologies AB. All rights reserved.
-//
-// Copyright: See COPYING file that comes with this distribution
-//
-//
-#include "service/ProtocolIkea.h"
-#include 
-#include 
-#include 
-#include 
-#include "common/Strings.h"
-#ifdef _WINDOWS
-#define strtok_r(s, d, p) strtok_s(s, d, p)
-#endif
-
-int ProtocolIkea::methods() const {
-	if (TelldusCore::comparei(model(), L"selflearning-switch")) {
-		return TELLSTICK_TURNON | TELLSTICK_TURNOFF;
-	}
-	return TELLSTICK_TURNON | TELLSTICK_TURNOFF | TELLSTICK_DIM;
-}
-
-std::string ProtocolIkea::getStringForMethod(int method, unsigned char level, Controller *) {
-	const char B1[] = {84, 84, 0};
-	const unsigned char B0[] = {170, 0};
-
-	int intSystem = this->getIntParameter(L"system", 1, 16)-1;
-	int intFadeStyle = TelldusCore::comparei(this->getStringParameter(L"fade", L"true"), L"true");
-	std::wstring wstrUnits = this->getStringParameter(L"units", L"");
-
-	if (method == TELLSTICK_TURNON) {
-		level = 255;
-	} else if (method == TELLSTICK_TURNOFF) {
-		level = 0;
-	} else if (method == TELLSTICK_DIM) {
-	} else {
-		return "";
-	}
-
-	if (wstrUnits == L"") {
-		return "";
-	}
-
-	std::string strUnits(TelldusCore::wideToString(wstrUnits));
-	int intUnits = 0;  // Start without any units
-
-	char *tempUnits = new char[strUnits.size()+1];
-#ifdef _WINDOWS
-	strcpy_s(tempUnits, strUnits.size()+1, strUnits.c_str());
-#else
-	snprintf(tempUnits, strUnits.size()+1, "%s", strUnits.c_str());
-#endif
-
-	char *saveptr;
-	char *strToken = strtok_r(tempUnits, ",", &saveptr);
-	do {
-		int intUnit = atoi(strToken);
-		if (intUnit == 10) {
-			intUnit = 0;
-		}
-		intUnits = intUnits | ( 1<<(9-intUnit) );
-	} while ( (strToken = strtok_r(NULL, ",", &saveptr)) != NULL );
-
-	delete[] tempUnits;
-
-	std::string strReturn;
-	strReturn.append(1, 'S');
-	strReturn.append(1, 84);
-	strReturn.append(1, 84);
-	strReturn.append(1, 84);
-	strReturn.append(1, 84);
-	strReturn.append(1, 84);
-	strReturn.append(1, 84);
-	strReturn.append(1, 170);
-
-	std::string strChannels = "";
-	int intCode = (intSystem << 10) | intUnits;
-	int checksum1 = 0;
-	int checksum2 = 0;
-	for (int i = 13; i >= 0; --i) {
-		if ((intCode >> i) & 1) {
-			strChannels.append(B1);
-			if (i % 2 == 0)
-				checksum2++;
-			else
-				checksum1++;
-		} else {
-			strChannels.append(reinterpret_cast(B0));
-		}
-	}
-	strReturn.append(strChannels);  // System + Units
-
-	strReturn.append(checksum1 %2 == 0 ? B1 : reinterpret_cast(B0));  // 1st checksum
-	strReturn.append(checksum2 %2 == 0 ? B1 : reinterpret_cast(B0));  // 2nd checksum
-
-	int intLevel = 0;
-	if (level <= 12) {
-		intLevel = 10;  // Level 10 is actually off
-	} else if (level <= 37) {
-		intLevel = 1;
-	} else if (level <= 62) {
-		intLevel = 2;
-	} else if (level <= 87) {
-		intLevel = 3;
-	} else if (level <= 112) {
-		intLevel = 4;
-	} else if (level <= 137) {
-		intLevel = 5;
-	} else if (level <= 162) {
-		intLevel = 6;
-	} else if (level <= 187) {
-		intLevel = 7;
-	} else if (level <= 212) {
-		intLevel = 8;
-	} else if (level <= 237) {
-		intLevel = 9;
-	} else {
-		intLevel = 0;  // Level 0 is actually full on
-	}
-
-	int intFade = 0;
-	if (intFadeStyle == 1) {
-		intFade = 11 << 4;  // Smooth
-	} else {
-		intFade = 1 << 4;  // Instant
-	}
-
-	intCode = intLevel | intFade;  // Concat level and fade
-
-	checksum1 = 0;
-	checksum2 = 0;
-	for (int i = 0; i < 6; ++i) {
-		if ((intCode >> i) & 1) {
-			strReturn.append(B1);
-			if (i % 2 == 0)
-				checksum1++;
-			else
-				checksum2++;
-		} else {
-			strReturn.append(reinterpret_cast(B0));
-		}
-	}
-
-	strReturn += checksum1 %2 == 0 ? B1 : reinterpret_cast(B0);  // 1st checksum
-	strReturn += checksum2 %2 == 0 ? B1 : reinterpret_cast(B0);  // 2nd checksum
-
-	strReturn.append("+");
-
-	return strReturn;
-}
diff --git a/telldus-core/service/ProtocolIkea.h b/telldus-core/service/ProtocolIkea.h
deleted file mode 100644
index 11a18cbf..00000000
--- a/telldus-core/service/ProtocolIkea.h
+++ /dev/null
@@ -1,19 +0,0 @@
-//
-// Copyright (C) 2012 Telldus Technologies AB. All rights reserved.
-//
-// Copyright: See COPYING file that comes with this distribution
-//
-//
-#ifndef TELLDUS_CORE_SERVICE_PROTOCOLIKEA_H_
-#define TELLDUS_CORE_SERVICE_PROTOCOLIKEA_H_
-
-#include 
-#include "service/Protocol.h"
-
-class ProtocolIkea : public Protocol {
-public:
-	int methods() const;
-	virtual std::string getStringForMethod(int method, unsigned char data, Controller *controller);
-};
-
-#endif  // TELLDUS_CORE_SERVICE_PROTOCOLIKEA_H_
diff --git a/telldus-core/service/ProtocolMandolyn.cpp b/telldus-core/service/ProtocolMandolyn.cpp
deleted file mode 100644
index c37555c0..00000000
--- a/telldus-core/service/ProtocolMandolyn.cpp
+++ /dev/null
@@ -1,46 +0,0 @@
-//
-// Copyright (C) 2012 Telldus Technologies AB. All rights reserved.
-//
-// Copyright: See COPYING file that comes with this distribution
-//
-//
-#include "service/ProtocolMandolyn.h"
-#include 
-#include 
-#include 
-#include 
-#include "common/Strings.h"
-
-std::string ProtocolMandolyn::decodeData(const ControllerMessage &dataMsg) {
-	std::string data = dataMsg.getParameter("data");
-	uint32_t value = (uint32_t)TelldusCore::hexTo64l(data);
-
-	// parity not used
-	// bool parity = value & 0x1;
-	value >>= 1;
-
-	double temp = static_cast(value & 0x7FFF) - static_cast(6400);
-	temp = temp/128.0;
-	value >>= 15;
-
-	uint8_t humidity = (value & 0x7F);
-	value >>= 7;
-
-	// battOk not used
-	// bool battOk = value & 0x1;
-	value >>= 3;
-
-	uint8_t channel = (value & 0x3)+1;
-	value >>= 2;
-
-	uint8_t house = value & 0xF;
-
-	std::stringstream retString;
-	retString << "class:sensor;protocol:mandolyn;id:"
-		<< house*10+channel
-		<< ";model:temperaturehumidity;"
-		<< "temp:" << std::fixed << std::setprecision(1) << temp
-		<< ";humidity:" << static_cast(humidity) << ";";
-
-	return retString.str();
-}
diff --git a/telldus-core/service/ProtocolMandolyn.h b/telldus-core/service/ProtocolMandolyn.h
deleted file mode 100644
index 8fcd90a5..00000000
--- a/telldus-core/service/ProtocolMandolyn.h
+++ /dev/null
@@ -1,19 +0,0 @@
-//
-// Copyright (C) 2012 Telldus Technologies AB. All rights reserved.
-//
-// Copyright: See COPYING file that comes with this distribution
-//
-//
-#ifndef TELLDUS_CORE_SERVICE_PROTOCOLMANDOLYN_H_
-#define TELLDUS_CORE_SERVICE_PROTOCOLMANDOLYN_H_
-
-#include 
-#include "service/Protocol.h"
-#include "service/ControllerMessage.h"
-
-class ProtocolMandolyn : public Protocol {
-public:
-	static std::string decodeData(const ControllerMessage &dataMsg);
-};
-
-#endif  // TELLDUS_CORE_SERVICE_PROTOCOLMANDOLYN_H_
diff --git a/telldus-core/service/ProtocolNexa.cpp b/telldus-core/service/ProtocolNexa.cpp
deleted file mode 100644
index 76cc1efc..00000000
--- a/telldus-core/service/ProtocolNexa.cpp
+++ /dev/null
@@ -1,279 +0,0 @@
-//
-// Copyright (C) 2012 Telldus Technologies AB. All rights reserved.
-//
-// Copyright: See COPYING file that comes with this distribution
-//
-//
-#include "service/ProtocolNexa.h"
-#include 
-#include 
-#include 
-#include "service/TellStick.h"
-#include "common/Strings.h"
-
-int ProtocolNexa::lastArctecCodeSwitchWasTurnOff = 0;  // TODO(stefan): always removing first turnon now, make more flexible (waveman too)
-
-int ProtocolNexa::methods() const {
-	if (TelldusCore::comparei(model(), L"codeswitch")) {
-		return (TELLSTICK_TURNON | TELLSTICK_TURNOFF);
-
-	} else if (TelldusCore::comparei(model(), L"selflearning-switch")) {
-		return (TELLSTICK_TURNON | TELLSTICK_TURNOFF | TELLSTICK_LEARN);
-
-	} else if (TelldusCore::comparei(model(), L"selflearning-dimmer")) {
-		return (TELLSTICK_TURNON | TELLSTICK_TURNOFF | TELLSTICK_DIM | TELLSTICK_LEARN);
-
-	} else if (TelldusCore::comparei(model(), L"bell")) {
-		return TELLSTICK_BELL;
-	}
-	return 0;
-}
-
-std::string ProtocolNexa::getStringForMethod(int method, unsigned char data, Controller *controller) {
-	if (TelldusCore::comparei(model(), L"codeswitch")) {
-		return getStringCodeSwitch(method);
-	} else if (TelldusCore::comparei(model(), L"bell")) {
-		return getStringBell();
-	}
-	if ((method == TELLSTICK_TURNON) && TelldusCore::comparei(model(), L"selflearning-dimmer")) {
-		// Workaround for not letting a dimmer do into "dimming mode"
-		return getStringSelflearning(TELLSTICK_DIM, 255);
-	}
-	if (method == TELLSTICK_LEARN) {
-		std::string str = getStringSelflearning(TELLSTICK_TURNON, data);
-
-		// Check to see if we are an old TellStick (fw <= 2, batch <= 8)
-		TellStick *ts = reinterpret_cast(controller);
-		if (!ts) {
-			return str;
-		}
-		if (ts->pid() == 0x0c30 && ts->firmwareVersion() <= 2) {
-			// Workaround for the bug in early firmwares
-			// The TellStick have a fixed pause (max) between two packets.
-			// It is only correct between the first and second packet.
-			// It seems faster to send two packes at a time and some
-			// receivers seems picky about this when learning.
-			// We also return the last packet so Device::doAction() doesn't
-			// report TELLSTICK_ERROR_METHOD_NOT_SUPPORTED
-
-			str.insert(0, 1, 2);  // Repeat two times
-			str.insert(0, 1, 'R');
-			for (int i = 0; i < 5; ++i) {
-				controller->send(str);
-			}
-		}
-		return str;
-	}
-	return getStringSelflearning(method, data);
-}
-
-std::string ProtocolNexa::getStringCodeSwitch(int method) {
-	std::string strReturn = "S";
-
-	std::wstring house = getStringParameter(L"house", L"A");
-	int intHouse = house[0] - L'A';
-	strReturn.append(getCodeSwitchTuple(intHouse));
-	strReturn.append(getCodeSwitchTuple(getIntParameter(L"unit", 1, 16)-1));
-
-	if (method == TELLSTICK_TURNON) {
-		strReturn.append("$k$k$kk$$kk$$kk$$k+");
-	} else if (method == TELLSTICK_TURNOFF) {
-		strReturn.append(this->getOffCode());
-	} else {
-		return "";
-	}
-	return strReturn;
-}
-
-std::string ProtocolNexa::getStringBell() {
-	std::string strReturn = "S";
-
-	std::wstring house = getStringParameter(L"house", L"A");
-	int intHouse = house[0] - L'A';
-	strReturn.append(getCodeSwitchTuple(intHouse));
-	strReturn.append("$kk$$kk$$kk$$k$k");  // Unit 7
-	strReturn.append("$kk$$kk$$kk$$kk$$k+");  // Bell
-	return strReturn;
-}
-
-std::string ProtocolNexa::getStringSelflearning(int method, unsigned char level) {
-	int intHouse = getIntParameter(L"house", 1, 67108863);
-	int intCode = getIntParameter(L"unit", 1, 16)-1;
-	return getStringSelflearningForCode(intHouse, intCode, method, level);
-}
-
-std::string ProtocolNexa::getStringSelflearningForCode(int intHouse, int intCode, int method, unsigned char level) {
-	const unsigned char START[] = {'T', 127, 255, 24, 1, 0};
-	// const char START[] = {'T',130,255,26,24,0};
-
-	std::string strMessage(reinterpret_cast(START));
-	strMessage.append(1, (method == TELLSTICK_DIM ? 147 : 132));  // Number of pulses
-
-	std::string m;
-	for (int i = 25; i >= 0; --i) {
-		m.append( intHouse & 1 << i ? "10" : "01" );
-	}
-	m.append("01");  // Group
-
-	// On/off
-	if (method == TELLSTICK_DIM) {
-		m.append("00");
-	} else if (method == TELLSTICK_TURNOFF) {
-		m.append("01");
-	} else if (method == TELLSTICK_TURNON) {
-		m.append("10");
-	} else {
-		return "";
-	}
-
-	for (int i = 3; i >= 0; --i) {
-		m.append( intCode & 1 << i ? "10" : "01" );
-	}
-
-	if (method == TELLSTICK_DIM) {
-		unsigned char newLevel = level/16;
-		for (int i = 3; i >= 0; --i) {
-			m.append(newLevel & 1 << i ? "10" : "01");
-		}
-	}
-
-	// The number of data is odd.
-	// Add this to make it even, otherwise the following loop will not work
-	m.append("0");
-
-	unsigned char code = 9;  // b1001, startcode
-	for (unsigned int i = 0; i < m.length(); ++i) {
-		code <<= 4;
-		if (m[i] == '1') {
-			code |= 8;  // b1000
-		} else {
-			code |= 10;  // b1010
-			// code |= 11; //b1011
-		}
-		if (i % 2 == 0) {
-			strMessage.append(1, code);
-			code = 0;
-		}
-	}
-	strMessage.append("+");
-
-// 	for( int i = 0; i < strMessage.length(); ++i ) {
-// 		printf("%i,", (unsigned char)strMessage[i]);
-// 	}
-// 	printf("\n");
-	return strMessage;
-}
-
-std::string ProtocolNexa::decodeData(const ControllerMessage& dataMsg) {
-	uint64_t allData = dataMsg.getInt64Parameter("data");
-
-	if(TelldusCore::comparei(dataMsg.model(), L"selflearning")) {
-		// selflearning
-		return decodeDataSelfLearning(allData);
-	} else {
-		// codeswitch
-		return decodeDataCodeSwitch(allData);
-	}
-}
-
-std::string ProtocolNexa::decodeDataSelfLearning(uint64_t allData) {
-	unsigned int house = 0;
-	unsigned int unit = 0;
-	unsigned int group = 0;
-	unsigned int method = 0;
-
-	house = allData & 0xFFFFFFC0;
-	house >>= 6;
-
-	group = allData & 0x20;
-	group >>= 5;
-
-	method = allData & 0x10;
-	method >>= 4;
-
-	unit = allData & 0xF;
-	unit++;
-
-	if(house < 1 || house > 67108863 || unit < 1 || unit > 16) {
-		// not arctech selflearning
-		return "";
-	}
-
-	std::stringstream retString;
-	retString << "class:command;protocol:arctech;model:selflearning;house:" << house << ";unit:" << unit << ";group:" << group << ";method:";
-	if(method == 1) {
-		retString << "turnon;";
-	} else if(method == 0) {
-		retString << "turnoff;";
-	} else {
-		// not arctech selflearning
-		return "";
-	}
-
-	return retString.str();
-}
-
-std::string ProtocolNexa::decodeDataCodeSwitch(uint64_t allData) {
-	unsigned int house = 0;
-	unsigned int unit = 0;
-	unsigned int method = 0;
-
-	method = allData & 0xF00;
-	method >>= 8;
-
-	unit = allData & 0xF0;
-	unit >>= 4;
-	unit++;
-
-	house = allData & 0xF;
-
-	if(house > 16 || unit < 1 || unit > 16) {
-		// not arctech codeswitch
-		return "";
-	}
-
-	house = house + 'A';  // house from A to P
-
-	if(method != 6 && lastArctecCodeSwitchWasTurnOff == 1) {
-		lastArctecCodeSwitchWasTurnOff = 0;
-		return "";  // probably a stray turnon or bell	(perhaps: only certain time interval since last, check that it's the same house/unit... Will lose
-						// one turnon/bell, but it's better than the alternative...
-	}
-
-	if(method == 6) {
-		lastArctecCodeSwitchWasTurnOff = 1;
-	}
-
-	std::stringstream retString;
-	retString << "class:command;protocol:arctech;model:codeswitch;house:" << static_cast(house);
-
-	if(method == 6) {
-		retString << ";unit:" << unit << ";method:turnoff;";
-	} else if(method == 14) {
-		retString << ";unit:" << unit << ";method:turnon;";
-	} else if(method == 15) {
-		retString << ";method:bell;";
-	} else {
-		// not arctech codeswitch
-		return "";
-	}
-
-	return retString.str();
-}
-
-std::string ProtocolNexa::getCodeSwitchTuple(int intCode) {
-	std::string strReturn = "";
-	for( int i = 0; i < 4; ++i ) {
-		if (intCode & 1) {  // Convert 1
-			strReturn.append("$kk$");
-		} else {  // Convert 0
-			strReturn.append("$k$k");
-		}
-		intCode >>= 1;
-	}
-	return strReturn;
-}
-
-std::string ProtocolNexa::getOffCode() const {
-	return "$k$k$kk$$kk$$k$k$k+";
-}
diff --git a/telldus-core/service/ProtocolNexa.h b/telldus-core/service/ProtocolNexa.h
deleted file mode 100644
index 82809973..00000000
--- a/telldus-core/service/ProtocolNexa.h
+++ /dev/null
@@ -1,39 +0,0 @@
-//
-// Copyright (C) 2012 Telldus Technologies AB. All rights reserved.
-//
-// Copyright: See COPYING file that comes with this distribution
-//
-//
-#ifndef TELLDUS_CORE_SERVICE_PROTOCOLNEXA_H_
-#define TELLDUS_CORE_SERVICE_PROTOCOLNEXA_H_
-
-#ifdef _MSC_VER
-typedef unsigned __int64 uint64_t;
-#else
-#include 
-#endif
-#include 
-#include "service/ControllerMessage.h"
-#include "service/Device.h"
-
-class ProtocolNexa : public Protocol {
-public:
-	virtual int methods() const;
-	virtual std::string getStringForMethod(int method, unsigned char data, Controller *controller);
-	static std::string decodeData(const ControllerMessage &dataMsg);
-
-protected:
-	std::string getStringSelflearning(int method, unsigned char data);
-	std::string getStringCodeSwitch(int method);
-	std::string getStringBell();
-	virtual std::string getOffCode() const;
-	static std::string getCodeSwitchTuple(int code);
-	static std::string getStringSelflearningForCode(int house, int unit, int method, unsigned char data);
-
-private:
-	static int lastArctecCodeSwitchWasTurnOff;
-	static std::string decodeDataCodeSwitch(uint64_t allData);
-	static std::string decodeDataSelfLearning(uint64_t allData);
-};
-
-#endif  // TELLDUS_CORE_SERVICE_PROTOCOLNEXA_H_
diff --git a/telldus-core/service/ProtocolOregon.cpp b/telldus-core/service/ProtocolOregon.cpp
deleted file mode 100644
index 3fcfe6dc..00000000
--- a/telldus-core/service/ProtocolOregon.cpp
+++ /dev/null
@@ -1,347 +0,0 @@
-//
-// Copyright (C) 2012 Telldus Technologies AB. All rights reserved.
-//
-// Copyright: See COPYING file that comes with this distribution
-//
-//
-#include "service/ProtocolOregon.h"
-#include 
-#include 
-#include 
-#include 
-#include "common/Strings.h"
-
-std::string ProtocolOregon::decodeData(const ControllerMessage &dataMsg) {
-	std::string data = dataMsg.getParameter("data");
-
-	std::wstring model = dataMsg.model();
-	if (model.compare(L"0xEA4C") == 0) {
-		return decodeEA4C(data);
-	} else if (model.compare(L"0x1A2D") == 0) {
-		return decode1A2D(data);
-	} else if (model.compare(L"0xF824") == 0) {
-		return decodeF824(data);
-	} else if (model.compare(L"0x1984") == 0 || model.compare(L"0x1994") == 0) {
-		return decode1984(data, model);
-	} else if (model.compare(L"0x2914") == 0) {
-		return decode2914(data);
-	} else if (model.compare(L"0xC844") == 0 || model.compare(L"0xEC40") == 0) {
-		// C844 - pool thermometer
-		return decodeC844(data, model);
-	}
-
-	return "";
-}
-
-std::string ProtocolOregon::decodeEA4C(const std::string &data) {
-	uint64_t value = TelldusCore::hexTo64l(data);
-
-	uint8_t checksum = 0xE + 0xA + 0x4 + 0xC;
-	checksum -= (value & 0xF) * 0x10;
-	checksum -= 0xA;
-	value >>= 8;
-
-	uint8_t checksumw = (value >> 4) & 0xF;
-	bool neg = value & (1 << 3);
-	int hundred = value & 3;
-	checksum += (value & 0xF);
-	value >>= 8;
-
-	uint8_t temp2 = value & 0xF;
-	uint8_t temp1 = (value >> 4) & 0xF;
-	checksum += temp2 + temp1;
-	value >>= 8;
-
-	uint8_t temp3 = (value >> 4) & 0xF;
-	checksum += (value & 0xF) + temp3;
-	value >>= 8;
-
-	checksum += ((value >> 4) & 0xF) + (value & 0xF);
-	uint8_t address = value & 0xFF;
-	value >>= 8;
-
-	checksum += ((value >> 4) & 0xF) + (value & 0xF);
-	// channel not used
-	// uint8_t channel = (value >> 4) & 0x7;
-
-	if (checksum != checksumw) {
-		return "";
-	}
-
-	double temperature = ((hundred * 1000) + (temp1 * 100) + (temp2 * 10) + temp3)/10.0;
-	if (neg) {
-		temperature = -temperature;
-	}
-
-	std::stringstream retString;
-	retString << "class:sensor;protocol:oregon;model:EA4C;id:" << static_cast(address)
-		<< ";temp:" << std::fixed << std::setprecision(1) << temperature << ";";
-
-	return retString.str();
-}
-
-std::string ProtocolOregon::decode1984(const std::string &data, const std::wstring &model) {
-	// wind
-	uint64_t value = TelldusCore::hexTo64l(data);
-
-	uint8_t crcCheck = value & 0xF;  // PROBABLY crc
-	value >>= 4;
-	uint8_t messageChecksum1 = value & 0xF;
-	value >>= 4;
-	uint8_t messageChecksum2 = value & 0xF;
-
-	value >>= 4;
-	uint8_t avg1 = value & 0xF;
-	value >>= 4;
-	uint8_t avg2 = value & 0xF;
-	value >>= 4;
-	uint8_t avg3 = value & 0xF;
-	value >>= 4;
-	uint8_t gust1 = value & 0xF;
-	value >>= 4;
-	uint8_t gust2 = value & 0xF;
-	value >>= 4;
-	uint8_t gust3 = value & 0xF;
-	value >>= 4;
-	uint8_t unknown1 = value & 0xF;
-	value >>= 4;
-	uint8_t unknown2 = value & 0xF;
-	value >>= 4;
-	uint8_t direction = value & 0xF;
-
-	value >>= 4;
-	uint8_t battery = value & 0xF;  // PROBABLY battery
-	value >>= 4;
-	uint8_t rollingcode = ((value >> 4) & 0xF) + (value & 0xF);
-	uint8_t checksum = ((value >> 4) & 0xF) + (value & 0xF);
-	value >>= 8;
-	uint8_t channel = value & 0xF;
-	checksum += unknown1 + unknown2 + avg1 + avg2 + avg3 + gust1 + gust2 + gust3 + direction + battery + channel;
-
-	if (model.compare(L"0x1984") == 0) {
-		checksum += 0x1 + 0x9 + 0x8 + 0x4;
-	} else {
-		checksum += 0x1 + 0x9 + 0x9 + 0x4;
-	}
-
-	if (((checksum >> 4) & 0xF) != messageChecksum1 || (checksum & 0xF) != messageChecksum2) {
-		// checksum error
-		return "";
-	}
-
-
-	double avg = ((avg1 * 100) + (avg2 * 10) + avg3)/10.0;
-	double gust = ((gust1 * 100) + (gust2 * 10) + gust3)/10.0;
-	float directiondegree = 22.5 * direction;
-
-	std::stringstream retString;
-	retString << "class:sensor;protocol:oregon;model:1984;id:" << static_cast(rollingcode)
-		<< ";winddirection:" << directiondegree
-		<< ";windaverage:" << std::fixed << std::setprecision(1) << avg
-		<< ";windgust:" << std::fixed << std::setprecision(1) << gust << ";";
-
-	return retString.str();
-}
-
-std::string ProtocolOregon::decode1A2D(const std::string &data) {
-	uint64_t value = TelldusCore::hexTo64l(data);
-	// checksum2 not used yet
-	// uint8_t checksum2 = value & 0xFF;
-	value >>= 8;
-	uint8_t checksum1 = value & 0xFF;
-	value >>= 8;
-
-	uint8_t checksum = ((value >> 4) & 0xF) + (value & 0xF);
-	uint8_t hum1 = value & 0xF;
-	value >>= 8;
-
-	checksum += ((value >> 4) & 0xF) + (value & 0xF);
-	uint8_t neg = value & (1 << 3);
-	uint8_t hum2 = (value >> 4) & 0xF;
-	value >>= 8;
-
-	checksum += ((value >> 4) & 0xF) + (value & 0xF);
-	uint8_t temp2 = value & 0xF;
-	uint8_t temp1 = (value >> 4) & 0xF;
-	value >>= 8;
-
-	checksum += ((value >> 4) & 0xF) + (value & 0xF);
-	uint8_t temp3 = (value >> 4) & 0xF;
-	value >>= 8;
-
-	checksum += ((value >> 4) & 0xF) + (value & 0xF);
-	uint8_t address = value & 0xFF;
-	value >>= 8;
-
-	checksum += ((value >> 4) & 0xF) + (value & 0xF);
-	// channel not used
-	// uint8_t channel = (value >> 4) & 0x7;
-
-	checksum += 0x1 + 0xA + 0x2 + 0xD - 0xA;
-
-	// TODO(micke): Find out how checksum2 works
-	if (checksum != checksum1) {
-		return "";
-	}
-
-	double temperature = ((temp1 * 100) + (temp2 * 10) + temp3)/10.0;
-	if (neg) {
-		temperature = -temperature;
-	}
-	int humidity = (hum1 * 10.0) + hum2;
-
-	std::stringstream retString;
-	retString << "class:sensor;protocol:oregon;model:1A2D;id:" << static_cast(address)
-		<< ";temp:" << std::fixed << std::setprecision(1) << temperature
-		<< ";humidity:" << humidity << ";";
-
-	return retString.str();
-}
-
-std::string ProtocolOregon::decode2914(const std::string &data) {
-	// rain
-	uint64_t value = TelldusCore::hexTo64l(data);
-
-	uint8_t messageChecksum1 = value & 0xF;
-	value >>= 4;
-	uint8_t messageChecksum2 = value & 0xF;
-
-	value >>= 4;
-	uint8_t totRain1 = value & 0xF;
-	value >>= 4;
-	uint8_t totRain2 = value & 0xF;
-	value >>= 4;
-	uint8_t totRain3 = value & 0xF;
-	value >>= 4;
-	uint8_t totRain4 = value & 0xF;
-	value >>= 4;
-	uint8_t totRain5 = value & 0xF;
-	value >>= 4;
-	uint8_t totRain6 = value & 0xF;
-	value >>= 4;
-	uint8_t rainRate1 = value & 0xF;
-	value >>= 4;
-	uint8_t rainRate2 = value & 0xF;
-	value >>= 4;
-	uint8_t rainRate3 = value & 0xF;
-	value >>= 4;
-	uint8_t rainRate4 = value & 0xF;
-
-	value >>= 4;
-	uint8_t battery = value & 0xF;  // PROBABLY battery
-	value >>= 4;
-	uint8_t rollingcode = ((value >> 4) & 0xF) + (value & 0xF);
-	uint8_t checksum = ((value >> 4) & 0xF) + (value & 0xF);
-	value >>= 8;
-	uint8_t channel = value & 0xF;
-	checksum += totRain1 + totRain2 + totRain3 + totRain4 + totRain5 + totRain6 + rainRate1 + rainRate2 + rainRate3 + rainRate4 + battery + channel + 0x2 + 0x9 + 0x1 + 0x4;
-
-	if (((checksum >> 4) & 0xF) != messageChecksum1 || (checksum & 0xF) != messageChecksum2) {
-		// checksum error
-		return "";
-	}
-
-	double totRain = ((totRain1 * 100000) + (totRain2 * 10000) + (totRain3 * 1000) + (totRain4 * 100) + (totRain5 * 10) + totRain6)/1000.0*25.4;
-	double rainRate = ((rainRate1 * 1000) + (rainRate2 * 100) + (rainRate3 * 10) + rainRate4)/100.0*25.4;
-
-	std::stringstream retString;
-	retString << "class:sensor;protocol:oregon;model:2914;id:" << static_cast(rollingcode)
-		<< ";raintotal:" << std::fixed << std::setprecision(1) << totRain
-		<< ";rainrate:" << std::fixed << std::setprecision(1) << rainRate << ";";
-	return retString.str();
-}
-
-std::string ProtocolOregon::decodeF824(const std::string &data) {
-	uint64_t value = TelldusCore::hexTo64l(data);
-
-	uint8_t crcCheck = value & 0xF;  // PROBABLY crc
-	value >>= 4;
-	uint8_t messageChecksum1 = value & 0xF;
-	value >>= 4;
-	uint8_t messageChecksum2 = value & 0xF;
-	value >>= 4;
-	uint8_t unknown = value & 0xF;
-	value >>= 4;
-	uint8_t hum1 = value & 0xF;
-	value >>= 4;
-	uint8_t hum2 = value & 0xF;
-	value >>= 4;
-	uint8_t neg = value & 0xF;
-	value >>= 4;
-	uint8_t temp1 = value & 0xF;
-	value >>= 4;
-	uint8_t temp2 = value & 0xF;
-	value >>= 4;
-	uint8_t temp3 = value & 0xF;
-	value >>= 4;
-	uint8_t battery = value & 0xF;  // PROBABLY battery
-	value >>= 4;
-	uint8_t rollingcode = ((value >> 4) & 0xF) + (value & 0xF);
-	uint8_t checksum = ((value >> 4) & 0xF) + (value & 0xF);
-	value >>= 8;
-	uint8_t channel = value & 0xF;
-	checksum += unknown + hum1 + hum2 + neg + temp1 + temp2 + temp3 + battery + channel + 0xF + 0x8 + 0x2 + 0x4;
-
-	if (((checksum >> 4) & 0xF) != messageChecksum1 || (checksum & 0xF) != messageChecksum2) {
-		// checksum error
-		return "";
-	}
-
-	double temperature = ((temp1 * 100) + (temp2 * 10) + temp3)/10.0;
-	if (neg) {
-		temperature = -temperature;
-	}
-	int humidity = (hum1 * 10.0) + hum2;
-
-	std::stringstream retString;
-	retString << "class:sensor;protocol:oregon;model:F824;id:" << static_cast(rollingcode)
-		<< ";temp:" << std::fixed << std::setprecision(1) << temperature
-		<< ";humidity:" << humidity << ";";
-
-	return retString.str();
-}
-
-std::string ProtocolOregon::decodeC844(const std::string &data, const std::wstring &model) {
-	uint64_t value = TelldusCore::hexTo64l(data);
-
-	uint8_t messageChecksum1 = value & 0xF;
-	value >>= 4;
-	uint8_t messageChecksum2 = value & 0xF;
-	value >>= 4;
-	uint8_t neg = value & 0xF;
-	value >>= 4;
-	uint8_t temp1 = value & 0xF;
-	value >>= 4;
-	uint8_t temp2 = value & 0xF;
-	value >>= 4;
-	uint8_t temp3 = value & 0xF;
-	value >>= 4;
-	uint8_t battery = value & 0xF;  // PROBABLY battery
-	value >>= 4;
-	uint8_t rollingcode = ((value >> 4) & 0xF) + (value & 0xF);
-	uint8_t checksum = ((value >> 4) & 0xF) + (value & 0xF);
-	value >>= 8;
-	uint8_t channel = value & 0xF;
-	checksum += neg + temp1 + temp2 + temp3 + battery + channel;
-
-	if (model.compare(L"0xC844") == 0) {
-		checksum += 0xC + 0x8 + 0x4 + 0x4;
-	} else {
-		checksum += 0xE + 0xC + 0x4 + 0x0;
-	}
-
-	if (((checksum >> 4) & 0xF) != messageChecksum1 || (checksum & 0xF) != messageChecksum2) {
-		// checksum error
-		return "";
-	}
-
-	double temperature = ((temp1 * 100) + (temp2 * 10) + temp3)/10.0;
-	if (neg) {
-		temperature = -temperature;
-	}
-
-	std::stringstream retString;
-	retString << "class:sensor;protocol:oregon;model:C844;id:" << static_cast(rollingcode)
-		<< ";temp:" << std::fixed << std::setprecision(1) << temperature << ";";
-	return retString.str();
-}
diff --git a/telldus-core/service/ProtocolOregon.h b/telldus-core/service/ProtocolOregon.h
deleted file mode 100644
index cc68fe86..00000000
--- a/telldus-core/service/ProtocolOregon.h
+++ /dev/null
@@ -1,27 +0,0 @@
-//
-// Copyright (C) 2012 Telldus Technologies AB. All rights reserved.
-//
-// Copyright: See COPYING file that comes with this distribution
-//
-//
-#ifndef TELLDUS_CORE_SERVICE_PROTOCOLOREGON_H_
-#define TELLDUS_CORE_SERVICE_PROTOCOLOREGON_H_
-
-#include 
-#include "service/Protocol.h"
-#include "service/ControllerMessage.h"
-
-class ProtocolOregon : public Protocol {
-public:
-	static std::string decodeData(const ControllerMessage &dataMsg);
-
-protected:
-	static std::string decodeEA4C(const std::string &data);
-	static std::string decode1A2D(const std::string &data);
-	static std::string decodeF824(const std::string &data);
-	static std::string decode1984(const std::string &data, const std::wstring &model);
-	static std::string decode2914(const std::string &data);
-	static std::string decodeC844(const std::string &data, const std::wstring &model);
-};
-
-#endif  // TELLDUS_CORE_SERVICE_PROTOCOLOREGON_H_
diff --git a/telldus-core/service/ProtocolRisingSun.cpp b/telldus-core/service/ProtocolRisingSun.cpp
deleted file mode 100644
index c4e9ae0c..00000000
--- a/telldus-core/service/ProtocolRisingSun.cpp
+++ /dev/null
@@ -1,115 +0,0 @@
-//
-// Copyright (C) 2012 Telldus Technologies AB. All rights reserved.
-//
-// Copyright: See COPYING file that comes with this distribution
-//
-//
-#include "service/ProtocolRisingSun.h"
-#include 
-#include "common/Strings.h"
-
-int ProtocolRisingSun::methods() const {
-	if (TelldusCore::comparei(model(), L"selflearning")) {
-		return (TELLSTICK_TURNON | TELLSTICK_TURNOFF | TELLSTICK_LEARN);
-	}
-	return TELLSTICK_TURNON | TELLSTICK_TURNOFF;
-}
-
-std::string ProtocolRisingSun::getStringForMethod(int method, unsigned char data, Controller *controller) {
-	if (TelldusCore::comparei(model(), L"selflearning")) {
-		return getStringSelflearning(method);
-	}
-	return getStringCodeSwitch(method);
-}
-
-std::string ProtocolRisingSun::getStringSelflearning(int method) {
-	int intHouse = this->getIntParameter(L"house", 1, 33554432)-1;
-	int intCode = this->getIntParameter(L"code", 1, 16)-1;
-
-	const char code_on[][7] = {
-		"110110", "001110", "100110", "010110",
-		"111001", "000101", "101001", "011001",
-		"110000", "001000", "100000", "010000",
-		"111100", "000010", "101100", "011100"
-	};
-	const char code_off[][7] = {
-		"111110", "000001", "101110", "011110",
-		"110101", "001101", "100101", "010101",
-		"111000", "000100", "101000", "011000",
-		"110010", "001010", "100010", "010010"
-	};
-	const char l = 120;
-	const char s = 51;
-
-	std::string strCode = "10";
-	int code = intCode;
-	code = (code < 0 ? 0 : code);
-	code = (code > 15 ? 15 : code);
-	if (method == TELLSTICK_TURNON) {
-		strCode.append(code_on[code]);
-	} else if (method == TELLSTICK_TURNOFF) {
-		strCode.append(code_off[code]);
-	} else if (method == TELLSTICK_LEARN) {
-		strCode.append(code_on[code]);
-	} else {
-		return "";
-	}
-
-	int house = intHouse;
-	for(int i = 0; i < 25; ++i) {
-		if (house & 1) {
-			strCode.append(1, '1');
-		} else {
-			strCode.append(1, '0');
-		}
-		house >>= 1;
-	}
-
-	std::string strReturn;
-	for(unsigned int i = 0; i < strCode.length(); ++i) {
-		if (strCode[i] == '1') {
-			strReturn.append(1, l);
-			strReturn.append(1, s);
-		} else {
-			strReturn.append(1, s);
-			strReturn.append(1, l);
-		}
-	}
-
-	std::string prefix = "P";
-	prefix.append(1, 5);
-	if (method == TELLSTICK_LEARN) {
-		prefix.append("R");
-		prefix.append( 1, 50 );
-	}
-	prefix.append("S");
-	strReturn.insert(0, prefix);
-	strReturn.append(1, '+');
-	return strReturn;
-}
-
-std::string ProtocolRisingSun::getStringCodeSwitch(int method) {
-	std::string strReturn = "S.e";
-	strReturn.append(getCodeSwitchTuple(this->getIntParameter(L"house", 1, 4)-1));
-	strReturn.append(getCodeSwitchTuple(this->getIntParameter(L"unit", 1, 4)-1));
-	if (method == TELLSTICK_TURNON) {
-		strReturn.append("e..ee..ee..ee..e+");
-	} else if (method == TELLSTICK_TURNOFF) {
-		strReturn.append("e..ee..ee..e.e.e+");
-	} else {
-		return "";
-	}
-	return strReturn;
-}
-
-std::string ProtocolRisingSun::getCodeSwitchTuple(int intToConvert) {
-	std::string strReturn = "";
-	for(int i = 0; i < 4; ++i) {
-		if (i == intToConvert) {
-			strReturn.append( ".e.e" );
-		} else {
-			strReturn.append( "e..e" );
-		}
-	}
-	return strReturn;
-}
diff --git a/telldus-core/service/ProtocolRisingSun.h b/telldus-core/service/ProtocolRisingSun.h
deleted file mode 100644
index ef6262e5..00000000
--- a/telldus-core/service/ProtocolRisingSun.h
+++ /dev/null
@@ -1,24 +0,0 @@
-//
-// Copyright (C) 2012 Telldus Technologies AB. All rights reserved.
-//
-// Copyright: See COPYING file that comes with this distribution
-//
-//
-#ifndef TELLDUS_CORE_SERVICE_PROTOCOLRISINGSUN_H_
-#define TELLDUS_CORE_SERVICE_PROTOCOLRISINGSUN_H_
-
-#include 
-#include "service/Protocol.h"
-
-class ProtocolRisingSun : public Protocol {
-public:
-	int methods() const;
-	virtual std::string getStringForMethod(int method, unsigned char data, Controller *controller);
-
-protected:
-	std::string getStringSelflearning(int method);
-	std::string getStringCodeSwitch(int method);
-	static std::string getCodeSwitchTuple(int code);
-};
-
-#endif  // TELLDUS_CORE_SERVICE_PROTOCOLRISINGSUN_H_
diff --git a/telldus-core/service/ProtocolSartano.cpp b/telldus-core/service/ProtocolSartano.cpp
deleted file mode 100644
index 0b33f354..00000000
--- a/telldus-core/service/ProtocolSartano.cpp
+++ /dev/null
@@ -1,108 +0,0 @@
-//
-// Copyright (C) 2012 Telldus Technologies AB. All rights reserved.
-//
-// Copyright: See COPYING file that comes with this distribution
-//
-//
-#include "service/ProtocolSartano.h"
-#ifdef _MSC_VER
-typedef unsigned __int16 uint16_t;
-#else
-#include 
-#endif
-#include 
-#include 
-#include 
-
-int ProtocolSartano::methods() const {
-	return TELLSTICK_TURNON | TELLSTICK_TURNOFF;
-}
-
-std::string ProtocolSartano::getStringForMethod(int method, unsigned char, Controller *) {
-	std::wstring strCode = this->getStringParameter(L"code", L"");
-	return getStringForCode(strCode, method);
-}
-
-std::string ProtocolSartano::getStringForCode(const std::wstring &strCode, int method) {
-	std::string strReturn("S");
-
-	for (size_t i = 0; i < strCode.length(); ++i) {
-		if (strCode[i] == L'1') {
-			strReturn.append("$k$k");
-		} else {
-			strReturn.append("$kk$");
-		}
-	}
-
-	if (method == TELLSTICK_TURNON) {
-		strReturn.append("$k$k$kk$$k+");
-	} else if (method == TELLSTICK_TURNOFF) {
-		strReturn.append("$kk$$k$k$k+");
-	} else {
-		return "";
-	}
-
-	return strReturn;
-}
-
-std::string ProtocolSartano::decodeData(const ControllerMessage &dataMsg) {
-	uint64_t allDataIn;
-	uint16_t allData = 0;
-	unsigned int code = 0;
-	unsigned int method1 = 0;
-	unsigned int method2 = 0;
-	unsigned int method = 0;
-
-	allDataIn = dataMsg.getInt64Parameter("data");
-
-	uint16_t mask = (1<<11);
-	for(int i = 0; i < 12; ++i) {
-		allData >>= 1;
-		if((allDataIn & mask) == 0) {
-			allData |= (1<<11);
-		}
-		mask >>= 1;
-	}
-
-	code = allData & 0xFFC;
-	code >>= 2;
-
-	method1 = allData & 0x2;
-	method1 >>= 1;
-
-	method2 = allData & 0x1;
-
-	if(method1 == 0 && method2 == 1) {
-		method = 0;  // off
-	} else if(method1 == 1 && method2 == 0) {
-		method = 1;  // on
-	} else {
-		return "";
-	}
-
-	if(code > 1023) {
-		// not sartano
-		return "";
-	}
-
-	std::stringstream retString;
-	retString << "class:command;protocol:sartano;model:codeswitch;code:";
-	mask = (1<<9);
-	for(int i = 0; i < 10; i++) {
-		if((code & mask) != 0) {
-			retString << 1;
-		} else {
-			retString << 0;
-		}
-		mask >>= 1;
-	}
-	retString << ";method:";
-
-	if(method == 0) {
-		retString << "turnoff;";
-	} else {
-		retString << "turnon;";
-	}
-
-	return retString.str();
-}
diff --git a/telldus-core/service/ProtocolSartano.h b/telldus-core/service/ProtocolSartano.h
deleted file mode 100644
index d644a0e8..00000000
--- a/telldus-core/service/ProtocolSartano.h
+++ /dev/null
@@ -1,24 +0,0 @@
-//
-// Copyright (C) 2012 Telldus Technologies AB. All rights reserved.
-//
-// Copyright: See COPYING file that comes with this distribution
-//
-//
-#ifndef TELLDUS_CORE_SERVICE_PROTOCOLSARTANO_H_
-#define TELLDUS_CORE_SERVICE_PROTOCOLSARTANO_H_
-
-#include 
-#include "service/Protocol.h"
-#include "service/ControllerMessage.h"
-
-class ProtocolSartano : public Protocol {
-public:
-	int methods() const;
-	virtual std::string getStringForMethod(int method, unsigned char data, Controller *controller);
-	static std::string decodeData(const ControllerMessage &dataMsg);
-
-protected:
-	std::string getStringForCode(const std::wstring &code, int method);
-};
-
-#endif  // TELLDUS_CORE_SERVICE_PROTOCOLSARTANO_H_
diff --git a/telldus-core/service/ProtocolScene.cpp b/telldus-core/service/ProtocolScene.cpp
deleted file mode 100644
index 24ae5318..00000000
--- a/telldus-core/service/ProtocolScene.cpp
+++ /dev/null
@@ -1,16 +0,0 @@
-//
-// Copyright (C) 2012 Telldus Technologies AB. All rights reserved.
-//
-// Copyright: See COPYING file that comes with this distribution
-//
-//
-#include "service/ProtocolScene.h"
-#include 
-
-int ProtocolScene::methods() const {
-	return TELLSTICK_EXECUTE;
-}
-
-std::string ProtocolScene::getStringForMethod(int method, unsigned char data, Controller *) {
-	return "";
-}
diff --git a/telldus-core/service/ProtocolScene.h b/telldus-core/service/ProtocolScene.h
deleted file mode 100644
index 87f80afe..00000000
--- a/telldus-core/service/ProtocolScene.h
+++ /dev/null
@@ -1,22 +0,0 @@
-//
-// Copyright (C) 2012 Telldus Technologies AB. All rights reserved.
-//
-// Copyright: See COPYING file that comes with this distribution
-//
-//
-#ifndef TELLDUS_CORE_SERVICE_PROTOCOLSCENE_H_
-#define TELLDUS_CORE_SERVICE_PROTOCOLSCENE_H_
-
-#include 
-#include "service/Protocol.h"
-
-class ProtocolScene : public Protocol {
-public:
-	virtual int methods() const;
-	virtual std::string getStringForMethod(int method, unsigned char data, Controller *controller);
-};
-
-#endif  // TELLDUS_CORE_SERVICE_PROTOCOLSCENE_H_
-
-
-
diff --git a/telldus-core/service/ProtocolSilvanChip.cpp b/telldus-core/service/ProtocolSilvanChip.cpp
deleted file mode 100644
index ddc20068..00000000
--- a/telldus-core/service/ProtocolSilvanChip.cpp
+++ /dev/null
@@ -1,146 +0,0 @@
-//
-// Copyright (C) 2012 Telldus Technologies AB. All rights reserved.
-//
-// Copyright: See COPYING file that comes with this distribution
-//
-//
-#include "service/ProtocolSilvanChip.h"
-#include 
-#include "common/Strings.h"
-
-int ProtocolSilvanChip::methods() const {
-	if (TelldusCore::comparei(model(), L"kp100")) {
-		return TELLSTICK_UP | TELLSTICK_DOWN | TELLSTICK_STOP | TELLSTICK_LEARN;
-	} else if (TelldusCore::comparei(model(), L"ecosavers")) {
-		return TELLSTICK_TURNON | TELLSTICK_TURNOFF | TELLSTICK_LEARN;
-	} else if (TelldusCore::comparei(model(), L"displaymatic")) {
-		return TELLSTICK_UP | TELLSTICK_DOWN | TELLSTICK_STOP;
-	}
-	return 0;
-}
-
-std::string ProtocolSilvanChip::getStringForMethod(int method, unsigned char data, Controller *controller) {
-	if (TelldusCore::comparei(model(), L"kp100")) {
-		std::string preamble;
-		preamble.append(1, 100);
-		preamble.append(1, 255);
-		preamble.append(1, 1);
-		preamble.append(1, 255);
-		preamble.append(1, 1);
-		preamble.append(1, 255);
-		preamble.append(1, 1);
-		preamble.append(1, 255);
-		preamble.append(1, 1);
-		preamble.append(1, 255);
-		preamble.append(1, 1);
-		preamble.append(1, 255);
-		preamble.append(1, 1);
-		preamble.append(1, 255);
-		preamble.append(1, 1);
-		preamble.append(1, 255);
-		preamble.append(1, 1);
-		preamble.append(1, 255);
-		preamble.append(1, 1);
-		preamble.append(1, 255);
-		preamble.append(1, 1);
-		preamble.append(1, 255);
-		preamble.append(1, 1);
-		preamble.append(1, 255);
-		preamble.append(1, 1);
-		preamble.append(1, 100);
-
-		const std::string one = "\xFF\x1\x2E\x2E";
-		const std::string zero = "\x2E\xFF\x1\x2E";
-		int button = 0;
-		if (method == TELLSTICK_UP) {
-			button = 2;
-		} else if (method == TELLSTICK_DOWN) {
-			button = 8;
-		} else if (method == TELLSTICK_STOP) {
-			button = 4;
-		} else if (method == TELLSTICK_LEARN) {
-			button = 1;
-		} else {
-			return "";
-		}
-		return this->getString(preamble, one, zero, button);
-	} else if (TelldusCore::comparei(model(), L"displaymatic")) {
-		std::string preamble;
-		preamble.append(1, 0x25);
-		preamble.append(1, 255);
-		preamble.append(1, 1);
-		preamble.append(1, 255);
-		preamble.append(1, 1);
-		preamble.append(1, 255);
-		preamble.append(1, 1);
-		preamble.append(1, 255);
-		preamble.append(1, 1);
-		preamble.append(1, 0x25);
-		const std::string one = "\x69\25";
-		const std::string zero = "\x25\x69";
-		int button = 0;
-		if (method == TELLSTICK_UP) {
-			button = 1;
-		} else if (method == TELLSTICK_DOWN) {
-			button = 4;
-		} else if (method == TELLSTICK_STOP) {
-			button = 2;
-		}
-		return this->getString(preamble, one, zero, button);
-	} else if (TelldusCore::comparei(model(), L"ecosavers")) {
-		std::string preamble;
-		preamble.append(1, 0x25);
-		preamble.append(1, 255);
-		preamble.append(1, 1);
-		preamble.append(1, 255);
-		preamble.append(1, 1);
-		preamble.append(1, 255);
-		preamble.append(1, 1);
-		preamble.append(1, 255);
-		preamble.append(1, 1);
-		preamble.append(1, 0x25);
-		const std::string one = "\x69\25";
-		const std::string zero = "\x25\x69";
-		int intUnit = this->getIntParameter(L"unit", 1, 4);
-		int button = 0;
-		if (intUnit == 1) {
-			button = 7;
-		} else if (intUnit == 2) {
-			button = 3;
-		} else if (intUnit == 3) {
-			button = 5;
-		} else if (intUnit == 4) {
-			button = 6;
-		}
-
-		if (method == TELLSTICK_TURNON || method == TELLSTICK_LEARN) {
-			button |= 8;
-		}
-		return this->getString(preamble, one, zero, button);
-	}
-	return "";
-}
-
-std::string ProtocolSilvanChip::getString(const std::string &preamble, const std::string &one, const std::string &zero, int button) {
-	int intHouse = this->getIntParameter(L"house", 1, 1048575);
-	std::string strReturn = preamble;
-
-	for( int i = 19; i >= 0; --i ) {
-		if (intHouse & (1 << i)) {
-			strReturn.append(one);
-		} else {
-			strReturn.append(zero);
-		}
-	}
-
-	for( int i = 3; i >= 0; --i) {
-		if (button & (1 << i)) {
-			strReturn.append(one);
-		} else {
-			strReturn.append(zero);
-		}
-	}
-
-	strReturn.append(zero);
-	return strReturn;
-}
diff --git a/telldus-core/service/ProtocolSilvanChip.h b/telldus-core/service/ProtocolSilvanChip.h
deleted file mode 100644
index 188a2d4a..00000000
--- a/telldus-core/service/ProtocolSilvanChip.h
+++ /dev/null
@@ -1,22 +0,0 @@
-//
-// Copyright (C) 2012 Telldus Technologies AB. All rights reserved.
-//
-// Copyright: See COPYING file that comes with this distribution
-//
-//
-#ifndef TELLDUS_CORE_SERVICE_PROTOCOLSILVANCHIP_H_
-#define TELLDUS_CORE_SERVICE_PROTOCOLSILVANCHIP_H_
-
-#include 
-#include "service/Protocol.h"
-
-class ProtocolSilvanChip : public Protocol {
-public:
-	int methods() const;
-	virtual std::string getStringForMethod(int method, unsigned char data, Controller *controller);
-
-protected:
-	virtual std::string getString(const std::string &preamble, const std::string &one, const std::string &zero, int button);
-};
-
-#endif  // TELLDUS_CORE_SERVICE_PROTOCOLSILVANCHIP_H_
diff --git a/telldus-core/service/ProtocolUpm.cpp b/telldus-core/service/ProtocolUpm.cpp
deleted file mode 100644
index 4e70b797..00000000
--- a/telldus-core/service/ProtocolUpm.cpp
+++ /dev/null
@@ -1,78 +0,0 @@
-//
-// Copyright (C) 2012 Telldus Technologies AB. All rights reserved.
-//
-// Copyright: See COPYING file that comes with this distribution
-//
-//
-#include "service/ProtocolUpm.h"
-#include 
-
-int ProtocolUpm::methods() const {
-	return TELLSTICK_TURNON | TELLSTICK_TURNOFF | TELLSTICK_LEARN;
-}
-
-std::string ProtocolUpm::getStringForMethod(int method, unsigned char, Controller *) {
-	const char S = ';';
-	const char L = '~';
-	const char START[] = {S, 0};
-	const char B1[] = {L, S, 0};
-	const char B0[] = {S, L, 0};
-	// const char BON[] = {S,L,L,S,0};
-	// const char BOFF[] = {S,L,S,L,0};
-
-	int intUnit = this->getIntParameter(L"unit", 1, 4)-1;
-	std::string strReturn;
-
-	int code = this->getIntParameter(L"house", 0, 4095);
-	for( size_t i = 0; i < 12; ++i ) {
-		if (code & 1) {
-			strReturn.insert(0, B1);
-		} else {
-			strReturn.insert(0, B0);
-		}
-		code >>= 1;
-	}
-	strReturn.insert(0, START);  // Startcode, first
-
-	code = 0;
-	if (method == TELLSTICK_TURNON || method == TELLSTICK_LEARN) {
-		code += 2;
-	} else if (method != TELLSTICK_TURNOFF) {
-		return "";
-	}
-	code <<= 2;
-	code += intUnit;
-
-	int check1 = 0, check2 = 0;
-	for( size_t i = 0; i < 6; ++i ) {
-		if (code & 1) {
-			if (i % 2 == 0) {
-				check1++;
-			} else {
-				check2++;
-			}
-		}
-		if (code & 1) {
-			strReturn.append(B1);
-		} else {
-			strReturn.append(B0);
-		}
-		code >>= 1;
-	}
-
-	if (check1 % 2 == 0) {
-		strReturn.append(B0);
-	} else {
-		strReturn.append(B1);
-	}
-	if (check2 % 2 == 0) {
-		strReturn.append(B0);
-	} else {
-		strReturn.append(B1);
-	}
-
-	strReturn.insert(0, "S");
-	strReturn.append("+");
-	return strReturn;
-}
-
diff --git a/telldus-core/service/ProtocolUpm.h b/telldus-core/service/ProtocolUpm.h
deleted file mode 100644
index 9283a408..00000000
--- a/telldus-core/service/ProtocolUpm.h
+++ /dev/null
@@ -1,19 +0,0 @@
-//
-// Copyright (C) 2012 Telldus Technologies AB. All rights reserved.
-//
-// Copyright: See COPYING file that comes with this distribution
-//
-//
-#ifndef TELLDUS_CORE_SERVICE_PROTOCOLUPM_H_
-#define TELLDUS_CORE_SERVICE_PROTOCOLUPM_H_
-
-#include 
-#include "service/Protocol.h"
-
-class ProtocolUpm : public Protocol {
-public:
-	int methods() const;
-	virtual std::string getStringForMethod(int method, unsigned char data, Controller *controller);
-};
-
-#endif  // TELLDUS_CORE_SERVICE_PROTOCOLUPM_H_
diff --git a/telldus-core/service/ProtocolWaveman.cpp b/telldus-core/service/ProtocolWaveman.cpp
deleted file mode 100644
index 9684934b..00000000
--- a/telldus-core/service/ProtocolWaveman.cpp
+++ /dev/null
@@ -1,77 +0,0 @@
-//
-// Copyright (C) 2012 Telldus Technologies AB. All rights reserved.
-//
-// Copyright: See COPYING file that comes with this distribution
-//
-//
-#include "service/ProtocolWaveman.h"
-#ifdef _MSC_VER
-#else
-#include 
-#endif
-#include 
-#include 
-#include 
-
-int ProtocolWaveman::lastArctecCodeSwitchWasTurnOff = 0;
-
-int ProtocolWaveman::methods() const {
-	return TELLSTICK_TURNON | TELLSTICK_TURNOFF;
-}
-
-std::string ProtocolWaveman::getStringForMethod(int method, unsigned char, Controller *) {
-	return getStringCodeSwitch(method);
-}
-
-std::string ProtocolWaveman::getOffCode() const {
-	return "$k$k$k$k$k$k$k$k$k+";
-}
-
-std::string ProtocolWaveman::decodeData(const ControllerMessage& dataMsg) {
-	uint64_t allData = 0;
-	unsigned int house = 0;
-	unsigned int unit = 0;
-	unsigned int method = 0;
-
-	allData = dataMsg.getInt64Parameter("data");
-
-	method = allData & 0xF00;
-	method >>= 8;
-
-	unit = allData & 0xF0;
-	unit >>= 4;
-	unit++;
-
-	house = allData & 0xF;
-
-	if(house > 16 || unit < 1 || unit > 16) {
-		// not waveman
-		return "";
-	}
-
-	house = house + 'A';  // house from A to P
-
-	if(method != 6 && lastArctecCodeSwitchWasTurnOff == 1) {
-		lastArctecCodeSwitchWasTurnOff = 0;
-		return "";  // probably a stray turnon or bell	(perhaps: only certain time interval since last, check that it's the same house/unit... Will lose
-						// one turnon/bell, but it's better than the alternative...
-	}
-
-	if(method == 6) {
-		lastArctecCodeSwitchWasTurnOff = 1;
-	}
-
-	std::stringstream retString;
-	retString << "class:command;protocol:waveman;model:codeswitch;house:" << static_cast(house);
-
-	if(method == 0) {
-		retString << ";unit:" << unit << ";method:turnoff;";
-	} else if(method == 14) {
-		retString << ";unit:" << unit << ";method:turnon;";
-	}	else {
-		// not waveman
-		return "";
-	}
-
-	return retString.str();
-}
diff --git a/telldus-core/service/ProtocolWaveman.h b/telldus-core/service/ProtocolWaveman.h
deleted file mode 100644
index a6feb394..00000000
--- a/telldus-core/service/ProtocolWaveman.h
+++ /dev/null
@@ -1,26 +0,0 @@
-//
-// Copyright (C) 2012 Telldus Technologies AB. All rights reserved.
-//
-// Copyright: See COPYING file that comes with this distribution
-//
-//
-#ifndef TELLDUS_CORE_SERVICE_PROTOCOLWAVEMAN_H_
-#define TELLDUS_CORE_SERVICE_PROTOCOLWAVEMAN_H_
-
-#include 
-#include "service/ProtocolNexa.h"
-
-class ProtocolWaveman : public ProtocolNexa {
-public:
-	int methods() const;
-	virtual std::string getStringForMethod(int method, unsigned char data, Controller *controller);
-	static std::string decodeData(const ControllerMessage &dataMsg);
-
-protected:
-	virtual std::string getOffCode() const;
-
-private:
-	static int lastArctecCodeSwitchWasTurnOff;
-};
-
-#endif  // TELLDUS_CORE_SERVICE_PROTOCOLWAVEMAN_H_
diff --git a/telldus-core/service/ProtocolX10.cpp b/telldus-core/service/ProtocolX10.cpp
deleted file mode 100644
index fc9cda35..00000000
--- a/telldus-core/service/ProtocolX10.cpp
+++ /dev/null
@@ -1,185 +0,0 @@
-//
-// Copyright (C) 2012 Telldus Technologies AB. All rights reserved.
-//
-// Copyright: See COPYING file that comes with this distribution
-//
-//
-#include "service/ProtocolX10.h"
-#ifdef _MSC_VER
-#else
-#include 
-#endif
-#include 
-#include 
-#include 
-
-const unsigned char HOUSES[] = {6, 0xE, 2, 0xA, 1, 9, 5, 0xD, 7, 0xF, 3, 0xB, 0, 8, 4, 0xC};
-
-int ProtocolX10::methods() const {
-	return TELLSTICK_TURNON | TELLSTICK_TURNOFF;
-}
-
-std::string ProtocolX10::getStringForMethod(int method, unsigned char data, Controller *controller) {
-	const unsigned char S = 59, L = 169;
-	const char B0[] = {S, S, 0};
-	const unsigned char B1[] = {S, L, 0};
-	const unsigned char START_CODE[] = {'S', 255, 1, 255, 1, 255, 1, 100, 255, 1, 180, 0};
-	const unsigned char STOP_CODE[] = {S, 0};
-
-	std::string strReturn = reinterpret_cast(START_CODE);
-	std::string strComplement = "";
-
-	std::wstring strHouse = getStringParameter(L"house", L"A");
-	int intHouse = strHouse[0] - L'A';
-	if (intHouse < 0) {
-		intHouse = 0;
-	} else if (intHouse > 15) {
-		intHouse = 15;
-	}
-	// Translate it
-	intHouse = HOUSES[intHouse];
-	int intCode = getIntParameter(L"unit", 1, 16)-1;
-
-	for( int i = 0; i < 4; ++i ) {
-		if (intHouse & 1) {
-			strReturn.append(reinterpret_cast(B1));
-			strComplement.append(B0);
-		} else {
-			strReturn.append(B0);
-			strComplement.append(reinterpret_cast(B1));
-		}
-		intHouse >>= 1;
-	}
-	strReturn.append( B0 );
-	strComplement.append( reinterpret_cast(B1) );
-
-	if (intCode >= 8) {
-		strReturn.append(reinterpret_cast(B1));
-		strComplement.append(B0);
-	} else {
-		strReturn.append(B0);
-		strComplement.append(reinterpret_cast(B1));
-	}
-
-	strReturn.append( B0 );
-	strComplement.append( reinterpret_cast(B1) );
-	strReturn.append( B0 );
-	strComplement.append( reinterpret_cast(B1) );
-
-	strReturn.append( strComplement );
-	strComplement = "";
-
-	strReturn.append( B0 );
-	strComplement.append( reinterpret_cast(B1) );
-
-	if (intCode >> 2 & 1) {  // Bit 2 of intCode
-		strReturn.append(reinterpret_cast(B1));
-		strComplement.append(B0);
-	} else {
-		strReturn.append(B0);
-		strComplement.append(reinterpret_cast(B1));
-	}
-
-	if (method == TELLSTICK_TURNON) {
-		strReturn.append(B0);
-		strComplement.append(reinterpret_cast(B1));
-	} else if (method == TELLSTICK_TURNOFF) {
-		strReturn.append(reinterpret_cast(B1));
-		strComplement.append(B0);
-	} else {
-		return "";
-	}
-
-	if (intCode & 1) {  // Bit 0 of intCode
-		strReturn.append(reinterpret_cast(B1));
-		strComplement.append(B0);
-	} else {
-		strReturn.append(B0);
-		strComplement.append(reinterpret_cast(B1));
-	}
-
-	if (intCode >> 1 & 1) {  // Bit 1 of intCode
-		strReturn.append(reinterpret_cast(B1));
-		strComplement.append(B0);
-	} else {
-		strReturn.append(B0);
-		strComplement.append(reinterpret_cast(B1));
-	}
-
-	for( int i = 0; i < 3; ++i ) {
-		strReturn.append( B0 );
-		strComplement.append( reinterpret_cast(B1) );
-	}
-
-	strReturn.append( strComplement );
-	strReturn.append( reinterpret_cast(STOP_CODE) );
-	strReturn.append("+");
-	return strReturn;
-}
-
-std::string ProtocolX10::decodeData(const ControllerMessage& dataMsg) {
-	uint64_t intData = 0, currentBit = 31;
-	bool method = 0;
-
-	intData = dataMsg.getInt64Parameter("data");
-
-	int unit = 0;
-	int rawHouse = 0;
-	for(int i = 0; i < 4; ++i) {
-		rawHouse >>= 1;
-		if (checkBit(intData, currentBit--)) {
-			rawHouse |= 0x8;
-		}
-	}
-
-	if (checkBit(intData, currentBit--) != 0) {
-		return "";
-	}
-
-	if (checkBit(intData, currentBit--)) {
-		unit |= (1<<3);
-	}
-
-	if (checkBit(intData, currentBit--)) {
-		return "";
-	}
-	if (checkBit(intData, currentBit--)) {
-		return "";
-	}
-
-	currentBit = 14;
-
-	if (checkBit(intData, currentBit--)) {
-		unit |= (1<<2);
-	}
-	if (checkBit(intData, currentBit--)) {
-		method = 1;
-	}
-	if (checkBit(intData, currentBit--)) {
-		unit |= (1<<0);
-	}
-	if (checkBit(intData, currentBit--)) {
-		unit |= (1<<1);
-	}
-
-	int intHouse = 0;
-	for(int i = 0; i < 16; ++i) {
-		if (HOUSES[i] == rawHouse) {
-			intHouse = i;
-			break;
-		}
-	}
-
-	std::stringstream retString;
-	retString << "class:command;protocol:x10;model:codeswitch;";
-	retString << "house:" << static_cast('A' + intHouse);
-	retString << ";unit:" << unit+1;
-	retString << ";method:";
-	if(method == 0) {
-		retString << "turnon;";
-	} else {
-		retString << "turnoff;";
-	}
-
-	return retString.str();
-}
diff --git a/telldus-core/service/ProtocolX10.h b/telldus-core/service/ProtocolX10.h
deleted file mode 100644
index c8cf8422..00000000
--- a/telldus-core/service/ProtocolX10.h
+++ /dev/null
@@ -1,22 +0,0 @@
-//
-// Copyright (C) 2012 Telldus Technologies AB. All rights reserved.
-//
-// Copyright: See COPYING file that comes with this distribution
-//
-//
-#ifndef TELLDUS_CORE_SERVICE_PROTOCOLX10_H_
-#define TELLDUS_CORE_SERVICE_PROTOCOLX10_H_
-
-#include 
-#include "service/Protocol.h"
-#include "service/ControllerMessage.h"
-
-class ProtocolX10 : public Protocol {
-public:
-	int methods() const;
-	virtual std::string getStringForMethod(int method, unsigned char data, Controller *controller);
-
-	static std::string decodeData(const ControllerMessage &dataMsg);
-};
-
-#endif  // TELLDUS_CORE_SERVICE_PROTOCOLX10_H_
diff --git a/telldus-core/service/ProtocolYidong.cpp b/telldus-core/service/ProtocolYidong.cpp
deleted file mode 100644
index 61b9f33f..00000000
--- a/telldus-core/service/ProtocolYidong.cpp
+++ /dev/null
@@ -1,31 +0,0 @@
-//
-// Copyright (C) 2012 Telldus Technologies AB. All rights reserved.
-//
-// Copyright: See COPYING file that comes with this distribution
-//
-//
-#include 
-#include "service/ProtocolYidong.h"
-
-std::string ProtocolYidong::getStringForMethod(int method, unsigned char, Controller *) {
-	int intCode = this->getIntParameter(L"unit", 1, 4);
-	std::wstring strCode = L"111";
-
-	switch(intCode) {
-	case 1:
-		strCode.append(L"0010");
-		break;
-	case 2:
-		strCode.append(L"0001");
-		break;
-	case 3:
-		strCode.append(L"0100");
-		break;
-	case 4:
-		strCode.append(L"1000");
-		break;
-	}
-
-	strCode.append(L"110");
-	return getStringForCode(strCode, method);
-}
diff --git a/telldus-core/service/ProtocolYidong.h b/telldus-core/service/ProtocolYidong.h
deleted file mode 100644
index c6b628c4..00000000
--- a/telldus-core/service/ProtocolYidong.h
+++ /dev/null
@@ -1,18 +0,0 @@
-//
-// Copyright (C) 2012 Telldus Technologies AB. All rights reserved.
-//
-// Copyright: See COPYING file that comes with this distribution
-//
-//
-#ifndef TELLDUS_CORE_SERVICE_PROTOCOLYIDONG_H_
-#define TELLDUS_CORE_SERVICE_PROTOCOLYIDONG_H_
-
-#include 
-#include "service/ProtocolSartano.h"
-
-class ProtocolYidong : public ProtocolSartano {
-public:
-	virtual std::string getStringForMethod(int method, unsigned char data, Controller *controller);
-};
-
-#endif  // TELLDUS_CORE_SERVICE_PROTOCOLYIDONG_H_
diff --git a/telldus-core/service/Sensor.cpp b/telldus-core/service/Sensor.cpp
deleted file mode 100644
index d5002651..00000000
--- a/telldus-core/service/Sensor.cpp
+++ /dev/null
@@ -1,73 +0,0 @@
-//
-// Copyright (C) 2012 Telldus Technologies AB. All rights reserved.
-//
-// Copyright: See COPYING file that comes with this distribution
-//
-//
-#include "service/Sensor.h"
-#include 
-#include 
-#include "common/common.h"
-#include "client/telldus-core.h"
-
-class Sensor::PrivateData {
-public:
-	std::wstring protocol, model;
-	int id;
-	std::map values;
-	time_t timestamp;
-};
-
-Sensor::Sensor(const std::wstring &protocol, const std::wstring &model, int id)
-	:Mutex() {
-	d = new PrivateData;
-	d->protocol = protocol;
-	d->model = model;
-	d->id = id;
-}
-
-Sensor::~Sensor() {
-	delete d;
-}
-
-std::wstring Sensor::protocol() const {
-	return d->protocol;
-}
-
-std::wstring Sensor::model() const {
-	return d->model;
-}
-
-int Sensor::id() const {
-	return d->id;
-}
-
-time_t Sensor::timestamp() const {
-	return d->timestamp;
-}
-
-int Sensor::dataTypes() const {
-	int retval = 0;
-	for (std::map::iterator it = d->values.begin(); it != d->values.end(); ++it) {
-		retval |= (*it).first;
-	}
-	return retval;
-}
-
-void Sensor::setValue(int type, const std::string &value, time_t timestamp) {
-	if (value.substr(0, 2).compare("0x") == 0) {
-		int intval = strtol(value.c_str(), NULL, 16);
-		d->values[type] = TelldusCore::intToString(intval);
-	} else {
-		d->values[type] = value;
-	}
-	d->timestamp = timestamp;
-}
-
-std::string Sensor::value(int type) const {
-	std::map::const_iterator it = d->values.find(type);
-	if (it == d->values.end()) {
-		return "";
-	}
-	return (*it).second;
-}
diff --git a/telldus-core/service/Sensor.h b/telldus-core/service/Sensor.h
deleted file mode 100644
index 0ebd6332..00000000
--- a/telldus-core/service/Sensor.h
+++ /dev/null
@@ -1,33 +0,0 @@
-//
-// Copyright (C) 2012 Telldus Technologies AB. All rights reserved.
-//
-// Copyright: See COPYING file that comes with this distribution
-//
-//
-#ifndef TELLDUS_CORE_SERVICE_SENSOR_H_
-#define TELLDUS_CORE_SERVICE_SENSOR_H_
-
-#include 
-#include "common/Mutex.h"
-
-class Sensor : public TelldusCore::Mutex {
-public:
-	Sensor(const std::wstring &protocol, const std::wstring &model, int id);
-	~Sensor();
-
-	std::wstring protocol() const;
-	std::wstring model() const;
-	int id() const;
-	time_t timestamp() const;
-
-	int dataTypes() const;
-
-	void setValue(int type, const std::string &value, time_t timestamp);
-	std::string value(int type) const;
-
-private:
-	class PrivateData;
-	PrivateData *d;
-};
-
-#endif  // TELLDUS_CORE_SERVICE_SENSOR_H_
diff --git a/telldus-core/service/Settings.cpp b/telldus-core/service/Settings.cpp
deleted file mode 100644
index 296c49d2..00000000
--- a/telldus-core/service/Settings.cpp
+++ /dev/null
@@ -1,140 +0,0 @@
-//
-// Copyright (C) 2012 Telldus Technologies AB. All rights reserved.
-//
-// Copyright: See COPYING file that comes with this distribution
-//
-//
-#include "service/Settings.h"
-#include 
-
-TelldusCore::Mutex Settings::mutex;
-
-/*
-* Get the name of the device
-*/
-std::wstring Settings::getName(Node type, int intNodeId) const {
-	TelldusCore::MutexLocker locker(&mutex);
-	return getStringSetting(type, intNodeId, L"name", false);
-}
-
-/*
-* Set the name of the device
-*/
-int Settings::setName(Node type, int intDeviceId, const std::wstring &strNewName) {
-	TelldusCore::MutexLocker locker(&mutex);
-	return setStringSetting(type, intDeviceId, L"name", strNewName, false);
-}
-
-/*
-* Get the device vendor
-*/
-std::wstring Settings::getProtocol(int intDeviceId) const {
-	TelldusCore::MutexLocker locker(&mutex);
-	return getStringSetting(Device, intDeviceId, L"protocol", false);
-}
-
-/*
-* Set the device vendor
-*/
-int Settings::setProtocol(int intDeviceId, const std::wstring &strVendor) {
-	TelldusCore::MutexLocker locker(&mutex);
-	return setStringSetting(Device, intDeviceId, L"protocol", strVendor, false);
-}
-
-/*
-* Get the device model
-*/
-std::wstring Settings::getModel(int intDeviceId) const {
-	TelldusCore::MutexLocker locker(&mutex);
-	return getStringSetting(Device, intDeviceId, L"model", false);
-}
-
-/*
-* Set the device model
-*/
-int Settings::setModel(int intDeviceId, const std::wstring &strModel) {
-	TelldusCore::MutexLocker locker(&mutex);
-	return setStringSetting(Device, intDeviceId, L"model", strModel, false);
-}
-
-/*
-* Set device argument
-*/
-int Settings::setDeviceParameter(int intDeviceId, const std::wstring &strName, const std::wstring &strValue) {
-	TelldusCore::MutexLocker locker(&mutex);
-	return setStringSetting(Device, intDeviceId, strName, strValue, true);
-}
-
-/*
-* Get device argument
-*/
-std::wstring Settings::getDeviceParameter(int intDeviceId, const std::wstring &strName) const {
-	TelldusCore::MutexLocker locker(&mutex);
-	return getStringSetting(Device, intDeviceId, strName, true);
-}
-
-/*
-* Set preferred controller id
-*/
-int Settings::setPreferredControllerId(int intDeviceId, int value) {
-	TelldusCore::MutexLocker locker(&mutex);
-	return setIntSetting(Device, intDeviceId,  L"controller", value, false);
-}
-
-/*
-* Get preferred controller id
-*/
-int Settings::getPreferredControllerId(int intDeviceId) {
-	TelldusCore::MutexLocker locker(&mutex);
-	return getIntSetting(Device, intDeviceId, L"controller", false);
-}
-
-std::wstring Settings::getControllerSerial(int intControllerId) const {
-	TelldusCore::MutexLocker locker(&mutex);
-	return getStringSetting(Controller, intControllerId, L"serial", false);
-}
-
-int Settings::setControllerSerial(int intControllerId, const std::wstring &serial) {
-	TelldusCore::MutexLocker locker(&mutex);
-	return setStringSetting(Controller, intControllerId,  L"serial", serial, false);
-}
-
-int Settings::getControllerType(int intControllerId) const {
-	TelldusCore::MutexLocker locker(&mutex);
-	return getIntSetting(Controller, intControllerId, L"type", false);
-}
-
-int Settings::setControllerType(int intControllerId, int type) {
-	TelldusCore::MutexLocker locker(&mutex);
-	return setIntSetting(Controller, intControllerId,  L"type", type, false);
-}
-
-std::string Settings::getNodeString(Settings::Node type) const {
-	if (type == Device) {
-		return "device";
-	} else if (type == Controller) {
-		return "controller";
-	}
-	return "";
-}
-
-#ifndef _CONFUSE
-
-bool Settings::setDeviceState( int intDeviceId, int intDeviceState, const std::wstring &strDeviceStateValue ) {
-	TelldusCore::MutexLocker locker(&mutex);
-	bool retval = setIntSetting( Settings::Device, intDeviceId, L"state", intDeviceState, true );
-	setStringSetting( Settings::Device, intDeviceId, L"stateValue", strDeviceStateValue, true );
-	return retval;
-}
-
-int Settings::getDeviceState( int intDeviceId ) const {
-	TelldusCore::MutexLocker locker(&mutex);
-	return getIntSetting( Settings::Device, intDeviceId, L"state", true );
-}
-
-std::wstring Settings::getDeviceStateValue( int intDeviceId ) const {
-	TelldusCore::MutexLocker locker(&mutex);
-	return getStringSetting( Settings::Device, intDeviceId, L"stateValue", true );
-}
-
-#endif
diff --git a/telldus-core/service/Settings.h b/telldus-core/service/Settings.h
deleted file mode 100644
index 4b26d843..00000000
--- a/telldus-core/service/Settings.h
+++ /dev/null
@@ -1,60 +0,0 @@
-//
-// Copyright (C) 2012 Telldus Technologies AB. All rights reserved.
-//
-// Copyright: See COPYING file that comes with this distribution
-//
-//
-#ifndef TELLDUS_CORE_SERVICE_SETTINGS_H_
-#define TELLDUS_CORE_SERVICE_SETTINGS_H_
-
-#include 
-#include "common/Mutex.h"
-
-class Settings {
-public:
-	enum Node { Device, Controller };
-
-	Settings(void);
-	virtual ~Settings(void);
-
-	std::wstring getSetting(const std::wstring &strName) const;
-	int getNumberOfNodes(Node type) const;
-	std::wstring getName(Node type, int intNodeId) const;
-	int setName(Node type, int intDeviceId, const std::wstring &strNewName);
-	std::wstring getProtocol(int intDeviceId) const;
-	int setProtocol(int intDeviceId, const std::wstring &strVendor);
-	std::wstring getModel(int intDeviceId) const;
-	int setModel(int intDeviceId, const std::wstring &strModel);
-	std::wstring getDeviceParameter(int intDeviceId, const std::wstring &strName) const;
-	int setDeviceParameter(int intDeviceId, const std::wstring &strName, const std::wstring &strValue);
-	bool setDeviceState( int intDeviceId, int intDeviceState, const std::wstring &strDeviceStateValue );
-	int getDeviceState( int intDeviceId ) const;
-	std::wstring getDeviceStateValue( int intDeviceId ) const;
-	int getPreferredControllerId(int intDeviceId);
-	int setPreferredControllerId(int intDeviceId, int value);
-
-	int addNode(Node type);
-	int getNodeId(Node type, int intDeviceIndex) const;
-	int removeNode(Node type, int intNodeId);
-
-	std::wstring getControllerSerial(int intControllerId) const;
-	int setControllerSerial(int intControllerId, const std::wstring &serial);
-	int getControllerType(int intControllerId) const;
-	int setControllerType(int intControllerId, int type);
-
-protected:
-	std::wstring getStringSetting(Node type, int intNodeId, const std::wstring &name, bool parameter) const;
-	int setStringSetting(Node type, int intDeviceId, const std::wstring &name, const std::wstring &value, bool parameter);
-	int getIntSetting(Node type, int intDeviceId, const std::wstring &name, bool parameter) const;
-	int setIntSetting(Node type, int intDeviceId, const std::wstring &name, int value, bool parameter);
-
-private:
-	int getNextNodeId(Node type) const;
-	std::string getNodeString(Node type) const;
-
-	class PrivateData;
-	PrivateData *d;
-	static TelldusCore::Mutex mutex;
-};
-
-#endif  // TELLDUS_CORE_SERVICE_SETTINGS_H_
diff --git a/telldus-core/service/SettingsConfuse.cpp b/telldus-core/service/SettingsConfuse.cpp
deleted file mode 100644
index 05030417..00000000
--- a/telldus-core/service/SettingsConfuse.cpp
+++ /dev/null
@@ -1,451 +0,0 @@
-//
-// Copyright (C) 2012 Telldus Technologies AB. All rights reserved.
-//
-// Copyright: See COPYING file that comes with this distribution
-//
-//
-#include 
-#include 
-#include 
-#include 
-#include 
-#include "service/Settings.h"
-#include "service/config.h"
-#include "client/telldus-core.h"
-#include "common/Strings.h"
-#include "service/Log.h"
-
-class Settings::PrivateData {
-public:
-	cfg_t *cfg;
-	cfg_t *var_cfg;
-};
-
-bool readConfig(cfg_t **cfg);
-bool readVarConfig(cfg_t **cfg);
-
-const char* CONFIG_FILE = CONFIG_PATH "/tellstick.conf";
-const char* VAR_CONFIG_FILE = VAR_CONFIG_PATH "/telldus-core.conf";
-
-/*
-* Constructor
-*/
-Settings::Settings(void) {
-	TelldusCore::MutexLocker locker(&mutex);
-	d = new PrivateData;
-	readConfig(&d->cfg);
-	readVarConfig(&d->var_cfg);
-}
-
-/*
-* Destructor
-*/
-Settings::~Settings(void) {
-	TelldusCore::MutexLocker locker(&mutex);
-	if (d->cfg > 0) {
-		cfg_free(d->cfg);
-	}
-	if (d->var_cfg > 0) {
-		cfg_free(d->var_cfg);
-	}
-	delete d;
-}
-
-/*
-* Return a setting
-*/
-std::wstring Settings::getSetting(const std::wstring &strName) const {
-	TelldusCore::MutexLocker locker(&mutex);
-	if (d->cfg > 0) {
-		std::string setting(cfg_getstr(d->cfg, TelldusCore::wideToString(strName).c_str()));
-		return TelldusCore::charToWstring(setting.c_str());
-	}
-	return L"";
-}
-
-/*
-* Return the number of stored devices
-*/
-int Settings::getNumberOfNodes(Node node) const {
-	TelldusCore::MutexLocker locker(&mutex);
-	if (d->cfg > 0) {
-		if (node == Device) {
-			return cfg_size(d->cfg, "device");
-		} else if (node == Controller) {
-			return cfg_size(d->cfg, "controller");
-		}
-	}
-	return 0;
-}
-
-int Settings::getNodeId(Node type, int intDeviceIndex) const {
-	if (intDeviceIndex >= getNumberOfNodes(type)) {  // Out of bounds
-		return -1;
-	}
-	TelldusCore::MutexLocker locker(&mutex);
-	cfg_t *cfg_node;
-	if (type == Device) {
-		cfg_node = cfg_getnsec(d->cfg, "device", intDeviceIndex);
-	} else if (type == Controller) {
-		cfg_node = cfg_getnsec(d->cfg, "controller", intDeviceIndex);
-	}
-	int id = cfg_getint(cfg_node, "id");
-	return id;
-}
-
-/*
-* Add a new node
-*/
-int Settings::addNode(Node type) {
-	TelldusCore::MutexLocker locker(&mutex);
-	int intNodeId = getNextNodeId(type);
-
-	FILE *fp = fopen(CONFIG_FILE, "we");  // e for setting O_CLOEXEC on the file handle
-	if (!fp) {
-		return TELLSTICK_ERROR_PERMISSION_DENIED;
-	}
-	cfg_print(d->cfg, fp);  // Print the config-file
-	if (type == Device) {
-		fprintf(fp, "device {\n  id=%d\n}\n", intNodeId);  // Print the new device
-	} else if (type == Controller) {
-		fprintf(fp, "controller {\n  id=%d\n}\n", intNodeId);  // Print the new controller
-	}
-	fclose(fp);
-
-	// Re-read config-file
-	cfg_free(d->cfg);
-	readConfig(&d->cfg);
-	return intNodeId;
-}
-
-/*
-* Get next available node id
-*/
-int Settings::getNextNodeId(Node type) const {
-	// Private, no locks needed
-	int intNodeId = 0;
-	cfg_t *cfg_node;
-	std::string strType;
-	if (type == Device) {
-		strType = "device";
-	} else if (type == Controller) {
-		strType = "controller";
-	}
-	for (int i = 0; i < cfg_size(d->cfg, strType.c_str()); ++i) {
-		cfg_node = cfg_getnsec(d->cfg, strType.c_str(), i);
-		if (cfg_getint(cfg_node, "id") >= intNodeId)  {
-			intNodeId = cfg_getint(cfg_node, "id");
-		}
-	}
-	intNodeId++;
-	return intNodeId;
-}
-
-/*
-* Remove a device
-*/
-int Settings::removeNode(Node type, int intNodeId) {
-	TelldusCore::MutexLocker locker(&mutex);
-	FILE *fp = fopen(CONFIG_FILE, "we");  // e for setting O_CLOEXEC on the file handle
-	if (!fp) {
-		return TELLSTICK_ERROR_PERMISSION_DENIED;
-	}
-
-	std::string strType = getNodeString(type);
-
-	// Print all opts
-	for(int i = 0; d->cfg->opts[i].name; i++) {
-		// Check if it isn't a device section
-		if (strcmp(d->cfg->opts[i].name, strType.c_str()) != 0) {
-			cfg_opt_print(&d->cfg->opts[i], fp);
-		} else {
-			// Print all sections except the one to remove
-			cfg_t *cfg_node;
-			for (int i = 0; i < cfg_size(d->cfg, strType.c_str()); ++i) {
-				cfg_node = cfg_getnsec(d->cfg, strType.c_str(), i);
-				if (cfg_getint(cfg_node, "id") != intNodeId) {  // This isn't the one to skip
-					fprintf(fp, "%s {\n", strType.c_str());
-					cfg_print_indent(cfg_node, fp, 1);
-					fprintf(fp, "}\n");
-				}
-			}
-		}
-	}
-	fclose(fp);
-
-	// Re-read config-file
-	cfg_free(d->cfg);
-	readConfig(&d->cfg);
-
-	return TELLSTICK_SUCCESS;
-}
-
-bool Settings::setDeviceState( int intDeviceId, int intDeviceState, const std::wstring &strDeviceStateValue ) {
-	TelldusCore::MutexLocker locker(&mutex);
-	if (d->var_cfg == 0) {
-		return false;
-	}
-	cfg_t *cfg_device;
-	for (int i = 0; i < cfg_size(d->var_cfg, "device"); ++i) {
-		cfg_device = cfg_getnsec(d->var_cfg, "device", i);
-		int deviceId = atoi(cfg_title(cfg_device));
-		if (deviceId == intDeviceId)  {
-			cfg_setint(cfg_device, "state", intDeviceState);
-			cfg_setstr(cfg_device, "stateValue", TelldusCore::wideToString(strDeviceStateValue).c_str());
-
-			FILE *fp = fopen(VAR_CONFIG_FILE, "we");  // e for setting O_CLOEXEC on the file handle
-			if(fp == 0) {
-				return false;
-			}
-			cfg_print(d->var_cfg, fp);
-			fclose(fp);
-			return true;
-		}
-	}
-	//  The device is not found in the file, we must create it manualy...
-	FILE *fp = fopen(VAR_CONFIG_FILE, "we");  // e for setting O_CLOEXEC on the file handle
-	if(!fp) {
-		fprintf(stderr, "Failed to write state to %s: %s\n",
-				VAR_CONFIG_FILE, strerror(errno));
-		return false;
-	}
-
-	cfg_print(d->var_cfg, fp);  // Print the config-file
-	fprintf(fp, "device %d {\n}\n", intDeviceId);  // Print the new device
-	fclose(fp);
-
-	// Re-read config-file
-	cfg_free(d->var_cfg);
-	readVarConfig(&d->var_cfg);
-
-	return false;
-}
-
-int Settings::getDeviceState( int intDeviceId ) const {
-	TelldusCore::MutexLocker locker(&mutex);
-	if (d->var_cfg == 0) {
-		return false;
-	}
-	cfg_t *cfg_device;
-	for (int i = 0; i < cfg_size(d->var_cfg, "device"); ++i) {
-		cfg_device = cfg_getnsec(d->var_cfg, "device", i);
-		int deviceId = atoi(cfg_title(cfg_device));
-		if (deviceId == intDeviceId)  {
-			return cfg_getint(cfg_device, "state");
-		}
-	}
-	return TELLSTICK_TURNOFF;
-}
-
-std::wstring Settings::getDeviceStateValue( int intDeviceId ) const {
-	TelldusCore::MutexLocker locker(&mutex);
-	if (d->var_cfg == 0) {
-		return L"";
-	}
-	cfg_t *cfg_device;
-	for (int i = 0; i < cfg_size(d->var_cfg, "device"); ++i) {
-		cfg_device = cfg_getnsec(d->var_cfg, "device", i);
-		int deviceId = atoi(cfg_title(cfg_device));
-		if (deviceId == intDeviceId)  {
-			std::string value(cfg_getstr(cfg_device, "stateValue"));
-			return TelldusCore::charToWstring(value.c_str());
-		}
-	}
-	return L"";
-}
-
-std::wstring Settings::getStringSetting(Node type, int intNodeId, const std::wstring &name, bool parameter) const {
-	// already locked
-	if (d->cfg == 0) {
-		return L"";
-	}
-	std::string strType = getNodeString(type);
-
-	cfg_t *cfg_device;
-	for (int i = 0; i < cfg_size(d->cfg, strType.c_str()); ++i) {
-		cfg_device = cfg_getnsec(d->cfg, strType.c_str(), i);
-		if (cfg_getint(cfg_device, "id") == intNodeId)  {
-			if (parameter) {
-				cfg_device = cfg_getsec(cfg_device, "parameters");
-			}
-			std::wstring setting;
-			char *cSetting = cfg_getstr(cfg_device, TelldusCore::wideToString(name).c_str());
-			if (cSetting) {
-				setting = TelldusCore::charToWstring(cSetting);
-			}
-			return setting;
-		}
-	}
-	return L"";
-}
-
-int Settings::setStringSetting(Node type, int intDeviceId, const std::wstring &name, const std::wstring &value, bool parameter) {
-	// already locked
-	if (d->cfg == 0) {
-		return TELLSTICK_ERROR_PERMISSION_DENIED;
-	}
-	std::string strType = getNodeString(type);
-	cfg_t *cfg_device;
-	for (int i = 0; i < cfg_size(d->cfg, strType.c_str()); ++i) {
-		cfg_device = cfg_getnsec(d->cfg, strType.c_str(), i);
-		if (cfg_getint(cfg_device, "id") == intDeviceId)  {
-			std::string newValue = TelldusCore::wideToString(value);
-			cfg_t *p = cfg_device;
-			if (parameter) {
-				p = cfg_getsec(cfg_device, "parameters");
-			}
-			cfg_opt_t *opt = cfg_getopt(p, TelldusCore::wideToString(name).c_str());
-			if (!opt) {
-				return TELLSTICK_ERROR_CONFIG_SYNTAX;
-			}
-			cfg_setstr(p, TelldusCore::wideToString(name).c_str(), newValue.c_str());
-			FILE *fp = fopen(CONFIG_FILE, "we");  // e for setting O_CLOEXEC on the file handle
-			if (!fp) {
-				return TELLSTICK_ERROR_PERMISSION_DENIED;
-			}
-			cfg_print(d->cfg, fp);
-			fclose(fp);
-			return TELLSTICK_SUCCESS;
-		}
-	}
-	return TELLSTICK_ERROR_DEVICE_NOT_FOUND;
-}
-
-int Settings::getIntSetting(Node type, int intDeviceId, const std::wstring &name, bool parameter) const {
-	// already locked
-	if (d->cfg == 0) {
-		return 0;
-	}
-	std::string strType = getNodeString(type);
-	cfg_t *cfg_node;
-	for(int i = 0; i < cfg_size(d->cfg, strType.c_str()); ++i) {
-		cfg_node = cfg_getnsec(d->cfg, strType.c_str(), i);
-		if (cfg_getint(cfg_node, "id") == intDeviceId) {
-			if (parameter) {
-				cfg_node = cfg_getsec(cfg_node, "parameters");
-			}
-			return cfg_getint(cfg_node, TelldusCore::wideToString(name).c_str());
-		}
-	}
-	return 0;
-}
-
-int Settings::setIntSetting(Node type, int intDeviceId, const std::wstring &name, int value, bool parameter) {
-	// already locked
-	if (d->cfg == 0) {
-		return TELLSTICK_ERROR_PERMISSION_DENIED;
-	}
-	std::string strType = getNodeString(type);
-	cfg_t *cfg_device;
-	for (int i = 0; i < cfg_size(d->cfg, strType.c_str()); ++i) {
-		cfg_device = cfg_getnsec(d->cfg, strType.c_str(), i);
-		if (cfg_getint(cfg_device, "id") == intDeviceId)  {
-			if (parameter) {
-				cfg_t *cfg_parameters = cfg_getsec(cfg_device, "parameters");
-				cfg_setint(cfg_parameters, TelldusCore::wideToString(name).c_str(), value);
-			} else {
-				cfg_setint(cfg_device, TelldusCore::wideToString(name).c_str(), value);
-			}
-			FILE *fp = fopen(CONFIG_FILE, "we");  // e for setting O_CLOEXEC on the file handle
-			if (!fp) {
-				return TELLSTICK_ERROR_PERMISSION_DENIED;
-			}
-			cfg_print(d->cfg, fp);
-			fclose(fp);
-			return TELLSTICK_SUCCESS;
-		}
-	}
-	return TELLSTICK_ERROR_DEVICE_NOT_FOUND;
-}
-
-
-bool readConfig(cfg_t **cfg) {
-	// All the const_cast keywords is to remove the compiler warnings generated by the C++-compiler.
-	cfg_opt_t controller_opts[] = {
-		CFG_INT(const_cast("id"), -1, CFGF_NONE),
-		CFG_STR(const_cast("name"), const_cast(""), CFGF_NONE),
-		CFG_INT(const_cast("type"), 0, CFGF_NONE),
-		CFG_STR(const_cast("serial"), const_cast(""), CFGF_NONE),
-
-		CFG_END()
-	};
-
-	cfg_opt_t device_parameter_opts[] = {
-		// Groups
-		CFG_STR(const_cast("devices"), 0, CFGF_NONE),
-
-		CFG_STR(const_cast("house"), 0, CFGF_NONE),
-		CFG_STR(const_cast("unit"), 0, CFGF_NONE),
-		CFG_STR(const_cast("code"), 0, CFGF_NONE),
-		CFG_STR(const_cast("system"), 0, CFGF_NONE),
-		CFG_STR(const_cast("units"), 0, CFGF_NONE),
-		CFG_STR(const_cast("fade"), 0, CFGF_NONE),
-
-		CFG_END()
-	};
-
-	cfg_opt_t device_opts[] = {
-		CFG_INT(const_cast("id"), -1, CFGF_NONE),
-		CFG_STR(const_cast("name"), const_cast("Unnamed"), CFGF_NONE),
-		CFG_INT(const_cast("controller"), 0, CFGF_NONE),
-		CFG_STR(const_cast("protocol"), const_cast("arctech"), CFGF_NONE),
-		CFG_STR(const_cast("model"), const_cast(""), CFGF_NONE),
-		CFG_SEC(const_cast("parameters"), device_parameter_opts, CFGF_NONE),
-		CFG_END()
-	};
-
-	cfg_opt_t opts[] = {
-		CFG_STR(const_cast("user"), const_cast("nobody"), CFGF_NONE),
-		CFG_STR(const_cast("group"), const_cast("plugdev"), CFGF_NONE),
-		CFG_STR(const_cast("deviceNode"), const_cast("/dev/tellstick"), CFGF_NONE),
-		CFG_STR(const_cast("ignoreControllerConfirmation"), const_cast("false"), CFGF_NONE),
-		CFG_SEC(const_cast("device"), device_opts, CFGF_MULTI),
-		CFG_SEC(const_cast("controller"), controller_opts, CFGF_MULTI),
-		CFG_END()
-	};
-
-	FILE *fp = fopen(CONFIG_FILE, "re");  // e for setting O_CLOEXEC on the file handle
-	if (!fp) {
-		Log::warning("Unable to open config file, %s", CONFIG_FILE);
-		return false;
-	}
-	(*cfg) = cfg_init(opts, CFGF_NOCASE);
-	if (cfg_parse_fp((*cfg), fp) == CFG_PARSE_ERROR) {
-		(*cfg) = 0;
-		fclose(fp);
-		Log::warning("Unable to parse config file, %s", CONFIG_FILE);
-		return false;
-	}
-
-	fclose(fp);
-	return true;
-}
-
-bool readVarConfig(cfg_t **cfg) {
-	cfg_opt_t device_opts[] = {
-		CFG_INT(const_cast("state"), 0, CFGF_NONE),
-		CFG_STR(const_cast("stateValue"), const_cast(""), CFGF_NONE),
-		CFG_END()
-	};
-
-	cfg_opt_t opts[] = {
-		CFG_SEC(const_cast("device"), device_opts, CFGF_MULTI | CFGF_TITLE),
-		CFG_END()
-	};
-
-	FILE *fp = fopen(VAR_CONFIG_FILE, "re");  // e for setting O_CLOEXEC on the file handle
-	if (!fp) {
-		Log::warning("Unable to open var config file, %s", VAR_CONFIG_FILE);
-		return false;
-	}
-	(*cfg) = cfg_init(opts, CFGF_NOCASE);
-	if (cfg_parse_fp((*cfg), fp) == CFG_PARSE_ERROR) {
-		(*cfg) = 0;
-		fclose(fp);
-		Log::warning("Unable to parse var config file, %s", VAR_CONFIG_FILE);
-		return false;
-	}
-
-	fclose(fp);
-	return true;
-}
diff --git a/telldus-core/service/SettingsCoreFoundationPreferences.cpp b/telldus-core/service/SettingsCoreFoundationPreferences.cpp
deleted file mode 100644
index 207ae928..00000000
--- a/telldus-core/service/SettingsCoreFoundationPreferences.cpp
+++ /dev/null
@@ -1,310 +0,0 @@
-//
-// C++ Implementation: telldussettingsconfuse
-//
-// Description:
-//
-//
-// Author: Micke Prag , (C) 2008
-//
-// Copyright: See COPYING file that comes with this distribution
-//
-//
-#include 
-#include 
-#include 
-#include 
-#include "common/Strings.h"
-#include "service/Settings.h"
-#include "client/telldus-core.h"
-
-class privateVars {
-public:
-	CFStringRef app_ID;
-	CFStringRef userName;
-	CFStringRef hostName;
-};
-
-class Settings::PrivateData {
-public:
-	CFStringRef app_ID;
-	CFStringRef userName;
-	CFStringRef hostName;
-};
-
-/*
-* Constructor
-*/
-Settings::Settings(void) {
-	d = new PrivateData();
-	d->app_ID = CFSTR( "com.telldus.core" );
-	d->userName = kCFPreferencesAnyUser;
-	d->hostName = kCFPreferencesCurrentHost;
-}
-
-/*
-* Destructor
-*/
-Settings::~Settings(void) {
-	delete d;
-}
-
-/*
-* Return a setting
-*/
-std::wstring Settings::getSetting(const std::wstring &strName) const {
-	return L"";
-}
-
-/*
-* Return the number of stored devices
-*/
-int Settings::getNumberOfNodes(Node type) const {
-	CFArrayRef cfarray = CFPreferencesCopyKeyList( d->app_ID, d->userName, d->hostName );
-	if (!cfarray) {
-		return 0;
-	}
-	CFIndex size = CFArrayGetCount( cfarray );
-	int nodes = 0;
-	for (CFIndex k = 0; k < size; ++k) {
-		CFStringRef key = (CFStringRef) CFArrayGetValueAtIndex(cfarray, k);
-		if (!CFStringHasSuffix( key, CFSTR(".name") )) {
-			continue;
-		}
-		if (type == Device && CFStringHasPrefix( key, CFSTR("devices.") )) {
-			++nodes;
-		} else if (type == Controller && CFStringHasPrefix( key, CFSTR("controllers.") )) {
-			++nodes;
-		}
-	}
-	CFRelease(cfarray);
-	return nodes;
-}
-
-int Settings::getNodeId(Node type, int intNodeIndex) const {
-	CFArrayRef cfarray = CFPreferencesCopyKeyList( d->app_ID, d->userName, d->hostName );
-	if (!cfarray) {
-		return 0;
-	}
-	CFIndex size = CFArrayGetCount( cfarray );
-	int index = 0;
-	int id = 0;
-	for (CFIndex k = 0; k < size; ++k) {
-		CFStringRef key = (CFStringRef) CFArrayGetValueAtIndex(cfarray, k);
-		if (!CFStringHasSuffix( key, CFSTR(".name") )) {
-			continue;
-		}
-		if ( type == Device && !CFStringHasPrefix(key, CFSTR("devices.")) ) {
-			continue;
-		}
-		if ( type == Controller && !CFStringHasPrefix(key, CFSTR("controllers.")) ) {
-			continue;
-		}
-		if (index == intNodeIndex) {
-			CFArrayRef split = CFStringCreateArrayBySeparatingStrings( 0, key, CFSTR(".") );
-			if ( !split ) {
-				continue;
-			}
-			if (CFArrayGetCount( split ) != 3 ) {
-				CFRelease( split );
-				continue;
-			}
-
-			// This code crashes!
-			// CFNumberRef cfid = (CFNumberRef) CFArrayGetValueAtIndex( split, 1 );
-			// if (cfid)
-			// 	CFNumberGetValue( cfid, kCFNumberIntType, &id);
-
-			CFStringRef cfid = (CFStringRef) CFArrayGetValueAtIndex( split, 1 );
-			char *cp = NULL;
-			CFIndex size = CFStringGetMaximumSizeForEncoding( CFStringGetLength( cfid ), kCFStringEncodingUTF8) + 1;
-			cp = reinterpret_cast(malloc(size));
-			CFStringGetCString( cfid, cp, size, kCFStringEncodingUTF8 );
-			char *newcp = reinterpret_cast(realloc( cp, strlen(cp) + 1));
-			if (newcp != NULL) {
-				cp = newcp;
-				id = atoi(cp);
-			} else {
-				// Should not happen
-				id = 0;
-			}
-			free(cp);
-
-			CFRelease(split);
-			break;
-		}
-		index++;
-	}
-	CFRelease(cfarray);
-	return id;
-}
-
-/*
-* Add a new node
-*/
-int Settings::addNode(Node type) {
-	int id = getNextNodeId(type);
-	setStringSetting( type, id, L"name", L"", false );  // Create a empty name so the node has an entry
-	if (type == Device) {
-		// Is there a reason we do this?
-		setStringSetting( type, id, L"model", L"", false );
-	}
-	return id;
-}
-
-/*
-* Get next available node id
-*/
-int Settings::getNextNodeId(Node type) const {
-	int id = 0, max = 0;
-	int numberOfNodes = getNumberOfNodes(type);
-	for( int i = 0; i < numberOfNodes; i++) {
-		id = getNodeId( type, i );
-		if (id > max) {
-			max = id;
-		}
-	}
-	max++;
-	return max;
-}
-
-/*
-* Remove a device
-*/
-int Settings::removeNode(Node type, int intNodeId) {
-	int ret = TELLSTICK_ERROR_DEVICE_NOT_FOUND;
-	CFStringRef filterKey = CFStringCreateWithFormat(0, NULL, CFSTR("%ss.%d."), getNodeString(type).c_str(), intNodeId);  // The key to search for
-
-	CFArrayRef cfarray = CFPreferencesCopyKeyList( d->app_ID, d->userName, d->hostName );
-	if (!cfarray) {
-		CFRelease(filterKey);
-		return TELLSTICK_ERROR_UNKNOWN;
-	}
-	CFIndex size = CFArrayGetCount( cfarray );
-	for (CFIndex k = 0; k < size; ++k) {
-		CFStringRef key = (CFStringRef) CFArrayGetValueAtIndex(cfarray, k);
-		if (CFStringHasPrefix( key, filterKey ) ) {
-			CFPreferencesSetValue( key, NULL, d->app_ID, d->userName, d->hostName );  // Remove the key
-			ret = TELLSTICK_SUCCESS;
-		}
-	}
-
-	CFPreferencesSynchronize( d->app_ID, d->userName, d->hostName );
-	CFRelease(cfarray);
-	CFRelease(filterKey);
-	return ret;
-}
-
-std::wstring Settings::getStringSetting(Node type, int intNodeId, const std::wstring &wname, bool parameter) const {
-	std::string name(TelldusCore::wideToString(wname));
-	CFStringRef cfname = CFStringCreateWithCString( 0, name.c_str(), kCFStringEncodingUTF8 );
-
-	CFStringRef key;
-	if (parameter) {
-		key = CFStringCreateWithFormat(0, NULL, CFSTR("%ss.%d.parameters.%@"), getNodeString(type).c_str(), intNodeId, cfname);
-	} else {
-		key = CFStringCreateWithFormat(0, NULL, CFSTR("%ss.%d.%@"), getNodeString(type).c_str(), intNodeId, cfname);
-	}
-
-	CFStringRef value;
-
-	value = (CFStringRef)CFPreferencesCopyValue(key, d->app_ID, d->userName, d->hostName);
-	if (!value) {
-		CFRelease(key);
-		CFRelease(cfname);
-		return L"";
-	}
-
-	std::wstring retval;
-	char *cp = NULL;
-	CFIndex size = CFStringGetMaximumSizeForEncoding( CFStringGetLength( value ), kCFStringEncodingUTF8) + 1;
-	cp = reinterpret_cast(malloc(size));
-	CFStringGetCString( value, cp, size, kCFStringEncodingUTF8 );
-	char *newcp = reinterpret_cast(realloc( cp, strlen(cp) + 1));
-	if (newcp != NULL) {
-		cp = newcp;
-		retval = TelldusCore::charToWstring(cp);
-	} else {
-		// Should not happen
-		retval = L"";
-	}
-	free(cp);
-
-	CFRelease(value);
-	CFRelease(key);
-	CFRelease(cfname);
-	return retval;
-}
-
-int Settings::setStringSetting(Node type, int intNodeId, const std::wstring &wname, const std::wstring &wvalue, bool parameter) {
-	std::string name(TelldusCore::wideToString(wname));
-	std::string value(TelldusCore::wideToString(wvalue));
-	CFStringRef cfname = CFStringCreateWithCString( 0, name.c_str(), kCFStringEncodingUTF8 );
-	CFStringRef cfvalue = CFStringCreateWithCString( 0, value.c_str(), kCFStringEncodingUTF8 );
-
-	CFStringRef key;
-	if (parameter) {
-		key = CFStringCreateWithFormat(0, NULL, CFSTR("%ss.%d.parameters.%@"), getNodeString(type).c_str(), intNodeId, cfname);
-	} else {
-		key = CFStringCreateWithFormat(0, NULL, CFSTR("%ss.%d.%@"), getNodeString(type).c_str(), intNodeId, cfname);
-	}
-
-	CFPreferencesSetValue( key, cfvalue, d->app_ID, d->userName, d->hostName );
-	CFPreferencesSynchronize( d->app_ID, d->userName, d->hostName );
-	CFRelease(key);
-	CFRelease(cfvalue);
-	CFRelease(cfname);
-	return TELLSTICK_SUCCESS;
-}
-
-int Settings::getIntSetting(Node type, int intNodeId, const std::wstring &wname, bool parameter) const {
-	int retval = 0;
-	std::string name(TelldusCore::wideToString(wname));
-	CFStringRef cfname = CFStringCreateWithCString( 0, name.c_str(), kCFStringEncodingUTF8 );
-	CFNumberRef cfvalue;
-
-	CFStringRef key;
-	if (parameter) {
-		key = CFStringCreateWithFormat(0, NULL, CFSTR("%ss.%d.parameters.%@"), getNodeString(type).c_str(), intNodeId, cfname);
-	} else {
-		key = CFStringCreateWithFormat(0, NULL, CFSTR("%ss.%d.%@"), getNodeString(type).c_str(), intNodeId, cfname);
-	}
-
-	cfvalue = (CFNumberRef)CFPreferencesCopyValue(key, d->app_ID, d->userName, d->hostName);
-
-	// If the preference exists, use it.
-	if (cfvalue) {
-		try {
-			// Numbers come out of preferences as CFNumber objects.
-			if (!CFNumberGetValue(cfvalue, kCFNumberIntType, &retval)) {
-				retval = 0;
-			}
-			CFRelease(cfvalue);
-		} catch (std::exception e) {
-			retval = 0;
-		}
-	}
-
-	CFRelease(key);
-	CFRelease(cfname);
-	return retval;
-}
-
-int Settings::setIntSetting(Node type, int intNodeId, const std::wstring &wname, int value, bool parameter) {
-	std::string name(TelldusCore::wideToString(wname));
-	CFStringRef cfname = CFStringCreateWithCString( 0, name.c_str(), kCFStringEncodingUTF8 );
-	CFNumberRef cfvalue = CFNumberCreate(NULL, kCFNumberIntType, &value);
-
-	CFStringRef key;
-	if (parameter) {
-		key = CFStringCreateWithFormat(0, NULL, CFSTR("%ss.%d.parameters.%@"), getNodeString(type).c_str(), intNodeId, cfname);
-	} else {
-		key = CFStringCreateWithFormat(0, NULL, CFSTR("%ss.%d.%@"), getNodeString(type).c_str(), intNodeId, cfname);
-	}
-
-	CFPreferencesSetValue( key, cfvalue, d->app_ID, d->userName, d->hostName );
-	CFPreferencesSynchronize( d->app_ID, d->userName, d->hostName );
-	CFRelease(key);
-	CFRelease(cfvalue);
-	CFRelease(cfname);
-	return TELLSTICK_SUCCESS;
-}
diff --git a/telldus-core/service/SettingsWinRegistry.cpp b/telldus-core/service/SettingsWinRegistry.cpp
deleted file mode 100644
index c27eaaff..00000000
--- a/telldus-core/service/SettingsWinRegistry.cpp
+++ /dev/null
@@ -1,270 +0,0 @@
-//
-// Copyright (C) 2012 Telldus Technologies AB. All rights reserved.
-//
-// Copyright: See COPYING file that comes with this distribution
-//
-//
-#include 
-#include 
-#include 
-#include 
-
-#include "../client/telldus-core.h"
-#include "common/common.h"
-#include "common/Strings.h"
-#include "service/Settings.h"
-
-const int intMaxRegValueLength = 1000;
-
-class Settings::PrivateData {
-public:
-	HKEY rootKey;
-	std::wstring strRegPath;
-	std::wstring getNodePath(Settings::Node type);
-};
-
-std::wstring Settings::PrivateData::getNodePath(Settings::Node type) {
-	if (type == Settings::Device) {
-		return L"SOFTWARE\\Telldus\\Devices\\";
-	} else if (type == Settings::Controller) {
-		return L"SOFTWARE\\Telldus\\Controllers\\";
-	}
-	return L"";
-}
-
-/*
-* Constructor
-*/
-Settings::Settings(void) {
-	d = new PrivateData();
-	d->strRegPath = L"SOFTWARE\\Telldus\\";
-	d->rootKey = HKEY_LOCAL_MACHINE;
-}
-
-/*
-* Destructor
-*/
-Settings::~Settings(void) {
-	delete d;
-}
-
-/*
-* Return the number of stored devices
-*/
-int Settings::getNumberOfNodes(Node type) const {
-	TelldusCore::MutexLocker locker(&mutex);
-
-	int intNumberOfNodes = 0;
-	HKEY hk;
-
-	LONG lnExists = RegOpenKeyEx(d->rootKey, d->getNodePath(type).c_str(), 0, KEY_QUERY_VALUE, &hk);
-
-	if(lnExists == ERROR_SUCCESS) {
-		std::wstring strNumSubKeys;
-		DWORD dNumSubKeys;
-		RegQueryInfoKey(hk, NULL, NULL, NULL, &dNumSubKeys, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-
-		intNumberOfNodes = static_cast(dNumSubKeys);
-
-		RegCloseKey(hk);
-	}
-	return intNumberOfNodes;
-}
-
-
-int Settings::getNodeId(Node type, int intNodeIndex) const {
-	TelldusCore::MutexLocker locker(&mutex);
-
-	int intReturn = -1;
-	HKEY hk;
-
-	LONG lnExists = RegOpenKeyEx(d->rootKey, d->getNodePath(type).c_str(), 0, KEY_READ, &hk);
-
-	if(lnExists == ERROR_SUCCESS) {
-		wchar_t* Buff = new wchar_t[intMaxRegValueLength];
-		DWORD size = intMaxRegValueLength;
-		if (RegEnumKeyEx(hk, intNodeIndex, (LPWSTR)Buff, &size, NULL, NULL, NULL, NULL) == ERROR_SUCCESS) {
-			intReturn = _wtoi(Buff);
-		}
-
-		delete[] Buff;
-		RegCloseKey(hk);
-	}
-	return intReturn;
-}
-
-/*
-* Add a new node
-*/
-int Settings::addNode(Node type) {
-	TelldusCore::MutexLocker locker(&mutex);
-
-	int intNodeId = -1;
-	HKEY hk;
-
-	DWORD dwDisp;
-	intNodeId = getNextNodeId(type);
-
-	std::wstring strCompleteRegPath = d->getNodePath(type);
-	strCompleteRegPath.append(TelldusCore::intToWstring(intNodeId));
-
-	if (RegCreateKeyEx(d->rootKey, strCompleteRegPath.c_str(), 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hk, &dwDisp)) {
-		// fail
-		intNodeId = -1;
-	}
-
-	RegCloseKey(hk);
-	return intNodeId;
-}
-
-/*
-* Get next available device id
-*/
-int Settings::getNextNodeId(Node type) const {
-	// Private, no locks needed
-	int intReturn = -1;
-	HKEY hk;
-	DWORD dwDisp;
-
-	LONG lnExists = RegCreateKeyEx(d->rootKey, d->getNodePath(type).c_str(), 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hk, &dwDisp);	 // create or open if already created
-
-	if(lnExists == ERROR_SUCCESS) {
-		DWORD dwLength = sizeof(DWORD);
-		DWORD nResult(0);
-
-		LONG lngStatus = RegQueryValueEx(hk, L"LastUsedId", NULL, NULL, reinterpret_cast(&nResult), &dwLength);
-
-		if(lngStatus == ERROR_SUCCESS) {
-			intReturn = nResult + 1;
-		} else {
-			intReturn = 1;
-		}
-		DWORD dwVal = intReturn;
-		RegSetValueEx (hk, L"LastUsedId", 0L, REG_DWORD, (CONST BYTE*) &dwVal, sizeof(DWORD));
-	}
-	RegCloseKey(hk);
-	return intReturn;
-}
-
-/*
-* Remove a device
-*/
-int Settings::removeNode(Node type, int intNodeId) {
-	TelldusCore::MutexLocker locker(&mutex);
-
-	std::wstring strCompleteRegPath = d->getNodePath(type);
-	strCompleteRegPath.append(TelldusCore::intToWstring(intNodeId));
-
-	LONG lngSuccess = RegDeleteKey(d->rootKey, strCompleteRegPath.c_str());
-
-	if(lngSuccess == ERROR_SUCCESS) {
-		// one of the deletions succeeded
-		return TELLSTICK_SUCCESS;
-	}
-
-	return TELLSTICK_ERROR_UNKNOWN;
-}
-
-std::wstring Settings::getSetting(const std::wstring &strName) const {
-	std::wstring strReturn;
-	HKEY hk;
-
-	std::wstring strCompleteRegPath = d->strRegPath;
-	LONG lnExists = RegOpenKeyEx(d->rootKey, strCompleteRegPath.c_str(), 0, KEY_QUERY_VALUE, &hk);
-
-	if(lnExists == ERROR_SUCCESS) {
-		wchar_t* Buff = new wchar_t[intMaxRegValueLength];
-		DWORD dwLength = sizeof(wchar_t)*intMaxRegValueLength;
-		LONG lngStatus = RegQueryValueEx(hk, strName.c_str(), NULL, NULL, (LPBYTE)Buff, &dwLength);
-
-		if(lngStatus == ERROR_MORE_DATA) {
-			// The buffer is to small, recreate it
-			delete[] Buff;
-			Buff = new wchar_t[dwLength];
-			lngStatus = RegQueryValueEx(hk, strName.c_str(), NULL, NULL, (LPBYTE)Buff, &dwLength);
-		}
-		if (lngStatus == ERROR_SUCCESS) {
-			strReturn = Buff;
-		}
-		delete[] Buff;
-	}
-	RegCloseKey(hk);
-	return strReturn;
-}
-
-std::wstring Settings::getStringSetting(Node type, int intNodeId, const std::wstring &name, bool parameter) const {
-	std::wstring strReturn;
-	HKEY hk;
-
-	std::wstring strCompleteRegPath = d->getNodePath(type);
-	strCompleteRegPath.append(TelldusCore::intToWstring(intNodeId));
-	LONG lnExists = RegOpenKeyEx(d->rootKey, strCompleteRegPath.c_str(), 0, KEY_QUERY_VALUE, &hk);
-
-	if(lnExists == ERROR_SUCCESS) {
-		wchar_t* Buff = new wchar_t[intMaxRegValueLength];
-		DWORD dwLength = sizeof(wchar_t)*intMaxRegValueLength;
-		LONG lngStatus = RegQueryValueEx(hk, name.c_str(), NULL, NULL, (LPBYTE)Buff, &dwLength);
-
-		if(lngStatus == ERROR_MORE_DATA) {
-			// The buffer is to small, recreate it
-			delete[] Buff;
-			Buff = new wchar_t[dwLength];
-			lngStatus = RegQueryValueEx(hk, name.c_str(), NULL, NULL, (LPBYTE)Buff, &dwLength);
-		}
-		if (lngStatus == ERROR_SUCCESS) {
-			strReturn = Buff;
-		}
-		delete[] Buff;
-	}
-	RegCloseKey(hk);
-	return strReturn;
-}
-
-int Settings::setStringSetting(Node type, int intNodeId, const std::wstring &name, const std::wstring &value, bool parameter) {
-	HKEY hk;
-	int ret = TELLSTICK_SUCCESS;
-
-	std::wstring strNodeId = TelldusCore::intToWstring(intNodeId);
-	std::wstring strCompleteRegPath = d->getNodePath(type);
-	strCompleteRegPath.append(strNodeId);
-	LONG lnExists = RegOpenKeyEx(d->rootKey, strCompleteRegPath.c_str(), 0, KEY_WRITE, &hk);
-
-	if (lnExists == ERROR_SUCCESS) {
-		int length = static_cast(value.length()) * sizeof(wchar_t);
-		RegSetValueEx(hk, name.c_str(), 0, REG_SZ, (LPBYTE)value.c_str(), length+1);
-	} else {
-		ret = TELLSTICK_ERROR_UNKNOWN;
-	}
-	RegCloseKey(hk);
-
-	return ret;
-}
-
-int Settings::getIntSetting(Node type, int intNodeId, const std::wstring &name, bool parameter) const {
-	int intReturn = 0;
-
-	std::wstring strSetting = getStringSetting(type, intNodeId, name, parameter);
-	if (strSetting.length()) {
-		intReturn = static_cast(strSetting[0]);  // TODO(micke): do real conversion instead
-	}
-
-	return intReturn;
-}
-
-int Settings::setIntSetting(Node type, int intNodeId, const std::wstring &name, int value, bool parameter) {
-	int intReturn = TELLSTICK_ERROR_UNKNOWN;
-	HKEY hk;
-
-	std::wstring strCompleteRegPath =  d->getNodePath(type);
-	strCompleteRegPath.append(TelldusCore::intToWstring(intNodeId));
-	LONG lnExists = RegOpenKeyEx(d->rootKey, strCompleteRegPath.c_str(), 0, KEY_WRITE, &hk);
-	if (lnExists == ERROR_SUCCESS) {
-		DWORD dwVal = value;
-		lnExists = RegSetValueEx (hk, name.c_str(), 0L, REG_DWORD, (CONST BYTE*) &dwVal, sizeof(DWORD));
-		if (lnExists == ERROR_SUCCESS) {
-			intReturn = TELLSTICK_SUCCESS;
-		}
-	}
-	RegCloseKey(hk);
-	return intReturn;
-}
diff --git a/telldus-core/service/TellStick.cpp b/telldus-core/service/TellStick.cpp
deleted file mode 100644
index 3fa0205a..00000000
--- a/telldus-core/service/TellStick.cpp
+++ /dev/null
@@ -1,79 +0,0 @@
-//
-// Copyright (C) 2012 Telldus Technologies AB. All rights reserved.
-//
-// Copyright: See COPYING file that comes with this distribution
-//
-//
-#include "service/TellStick.h"
-
-#include 
-#include 
-#include 
-
-std::string TellStick::createTPacket( const std::string &msg ) {
-	std::map times;
-	std::string data;
-	int index = 0;
-	for(size_t i = 0; i < msg.length(); ++i) {
-		// Search to se if it already exists and get the index
-		if (times.find(msg.at(i)) == times.end()) {
-			times[msg.at(i)] = index++;
-			if (times.size() > 4) {
-				return "";
-			}
-		}
-		data.append(1, times[msg.at(i)]);
-	}
-	// Reorder the times
-	unsigned char t0 = 1, t1 = 1, t2 = 1, t3 = 1;
-	for(std::map::const_iterator it = times.begin(); it != times.end(); ++it) {
-		if ((*it).second == 0) {
-			t0 = (*it).first;
-		} else if ((*it).second == 1) {
-			t1 = (*it).first;
-		} else if ((*it).second == 2) {
-			t2 = (*it).first;
-		} else if ((*it).second == 3) {
-			t3 = (*it).first;
-		}
-	}
-
-	return TellStick::convertSToT(t0, t1, t2, t3, data);
-}
-
-std::string TellStick::convertSToT( unsigned char t0, unsigned char t1, unsigned char t2, unsigned char t3, const std::string &data ) {
-	unsigned char dataByte = 0;
-	std::string retString = "T";
-	retString.append(1, t0);
-	retString.append(1, t1);
-	retString.append(1, t2);
-	retString.append(1, t3);
-
-	if (data.length() > 255) {
-		return "";
-	}
-	unsigned char length = (unsigned char)data.length();
-	retString.append(1, length);
-
-	for (size_t i = 0; i < data.length(); ++i) {
-		dataByte <<= 2;
-		if (data.at(i) == 1) {
-			dataByte |= 1;
-		} else if (data.at(i) == 2) {
-			dataByte |= 2;
-		} else if (data.at(i) == 3) {
-			dataByte |= 3;
-		}
-		if ( (i+1) % 4 == 0) {
-			retString.append(1, dataByte);
-			dataByte = 0;
-		}
-	}
-	if (data.length() % 4 != 0) {
-		dataByte <<= (data.length() % 4)*2;
-		retString.append(1, dataByte);
-	}
-
-	retString.append("+");
-	return retString;
-}
diff --git a/telldus-core/service/TellStick.h b/telldus-core/service/TellStick.h
deleted file mode 100644
index 61d844bb..00000000
--- a/telldus-core/service/TellStick.h
+++ /dev/null
@@ -1,54 +0,0 @@
-//
-// Copyright (C) 2012 Telldus Technologies AB. All rights reserved.
-//
-// Copyright: See COPYING file that comes with this distribution
-//
-//
-#ifndef TELLDUS_CORE_SERVICE_TELLSTICK_H_
-#define TELLDUS_CORE_SERVICE_TELLSTICK_H_
-
-#include 
-#include 
-#include "service/Controller.h"
-#include "common/Thread.h"
-
-class TellStickDescriptor {
-public:
-	std::string serial;
-	int vid, pid;
-};
-
-class TellStick : public Controller, public TelldusCore::Thread {
-public:
-	TellStick(int controllerId, TelldusCore::EventRef event, TelldusCore::EventRef updateEvent, const TellStickDescriptor &d);
-	virtual ~TellStick();
-
-	virtual int pid() const;
-	virtual int vid() const;
-	virtual std::string serial() const;
-
-	bool isOpen() const;
-	bool isSameAsDescriptor(const TellStickDescriptor &d) const;
-	virtual int reset();
-	virtual int send( const std::string &message );
-	bool stillConnected() const;
-
-	static std::list findAll();
-
-	static std::string createTPacket( const std::string & );
-	static std::string convertSToT(  unsigned char t0, unsigned char t1, unsigned char t2, unsigned char t3, const std::string &data );
-
-protected:
-	void processData( const std::string &data );
-	void run();
-	void setBaud( int baud );
-	void stop();
-
-private:
-	static std::list findAllByVIDPID( int vid, int pid );
-
-	class PrivateData;
-	PrivateData *d;
-};
-
-#endif  // TELLDUS_CORE_SERVICE_TELLSTICK_H_
diff --git a/telldus-core/service/TellStick_ftd2xx.cpp b/telldus-core/service/TellStick_ftd2xx.cpp
deleted file mode 100644
index 23c5677f..00000000
--- a/telldus-core/service/TellStick_ftd2xx.cpp
+++ /dev/null
@@ -1,343 +0,0 @@
-//
-// C++ Implementation: TellStick
-//
-// Description:
-//
-//
-// Author: Micke Prag , (C) 2009
-//
-// Copyright: See COPYING file that comes with this distribution
-//
-//
-#include 
-#include 
-#include 
-#include 
-#include "common/common.h"
-#include "common/Mutex.h"
-#include "common/Strings.h"
-#include "service/Log.h"
-#include "service/Settings.h"
-#include "service/TellStick.h"
-#include "../client/telldus-core.h"
-
-#include "service/ftd2xx.h"
-
-class TellStick::PrivateData {
-public:
-	bool open, running, ignoreControllerConfirmation;
-	int vid, pid;
-	std::string serial, message;
-	FT_HANDLE ftHandle;
-	TelldusCore::Mutex mutex;
-
-#ifdef _WINDOWS
-	HANDLE eh;
-#else
-// #include 
-	struct {
-		pthread_cond_t eCondVar;
-		pthread_mutex_t eMutex;
-	} eh;
-#endif
-};
-
-TellStick::TellStick(int controllerId, TelldusCore::EventRef event, TelldusCore::EventRef updateEvent, const TellStickDescriptor &td )
-	:Controller(controllerId, event, updateEvent) {
-	d = new PrivateData;
-#ifdef _WINDOWS
-	d->eh = CreateEvent( NULL, false, false, NULL );
-#else
-	pthread_mutex_init(&d->eh.eMutex, NULL);
-	pthread_cond_init(&d->eh.eCondVar, NULL);
-#endif
-	d->open = false;
-	d->running = false;
-	d->vid = td.vid;
-	d->pid = td.pid;
-	d->serial = td.serial;
-	Settings set;
-	d->ignoreControllerConfirmation = set.getSetting(L"ignoreControllerConfirmation") == L"true";
-
-	char *tempSerial = new char[td.serial.size()+1];
-#ifdef _WINDOWS
-	strcpy_s(tempSerial, td.serial.size()+1, td.serial.c_str());
-#else
-	snprintf(tempSerial, td.serial.size()+1, "%s", td.serial.c_str());
-	FT_SetVIDPID(td.vid, td.pid);
-#endif
-	Log::notice("Connecting to TellStick (%X/%X) with serial %s", d->vid, d->pid, d->serial.c_str());
-	FT_STATUS ftStatus = FT_OpenEx(tempSerial, FT_OPEN_BY_SERIAL_NUMBER, &d->ftHandle);
-	delete[] tempSerial;
-	if (ftStatus == FT_OK) {
-		d->open = true;
-		FT_SetFlowControl(d->ftHandle, FT_FLOW_NONE, 0, 0);
-		FT_SetTimeouts(d->ftHandle, 5000, 0);
-	}
-
-	if (d->open) {
-		if (td.pid == 0x0C31) {
-			setBaud(9600);
-		} else {
-			setBaud(4800);
-		}
-		this->start();
-	} else {
-		Log::warning("Failed to open TellStick");
-	}
-}
-
-TellStick::~TellStick() {
-	Log::warning("Disconnected TellStick (%X/%X) with serial %s", d->vid, d->pid, d->serial.c_str());
-	if (d->running) {
-		TelldusCore::MutexLocker locker(&d->mutex);
-		d->running = false;
-#ifdef _WINDOWS
-		SetEvent(d->eh);
-#else
-		pthread_cond_broadcast(&d->eh.eCondVar);
-#endif
-	}
-	this->wait();
-	if (d->open) {
-		FT_Close(d->ftHandle);
-	}
-	delete d;
-}
-
-void TellStick::setBaud( int baud ) {
-	FT_SetBaudRate(d->ftHandle, baud);
-}
-
-int TellStick::pid() const {
-	return d->pid;
-}
-
-int TellStick::vid() const {
-	return d->vid;
-}
-
-std::string TellStick::serial() const {
-	return d->serial;
-}
-
-bool TellStick::isOpen() const {
-	return d->open;
-}
-
-bool TellStick::isSameAsDescriptor(const TellStickDescriptor &td) const {
-	if (td.vid != d->vid) {
-		return false;
-	}
-	if (td.pid != d->pid) {
-		return false;
-	}
-	if (td.serial != d->serial) {
-		return false;
-	}
-	return true;
-}
-
-void TellStick::processData( const std::string &data ) {
-	for (unsigned int i = 0; i < data.length(); ++i) {
-		if (data[i] == 13) {  // Skip \r
-			continue;
-		} else if (data[i] == 10) {  // \n found
-			if (d->message.substr(0, 2).compare("+V") == 0) {
-				setFirmwareVersion(TelldusCore::charToInteger(d->message.substr(2).c_str()));
-			} else if (d->message.substr(0, 2).compare("+R") == 0) {
-				this->publishData(d->message.substr(2));
-			} else if(d->message.substr(0, 2).compare("+W") == 0) {
-				this->decodePublishData(d->message.substr(2));
-			}
-			d->message.clear();
-		} else {  // Append the character
-			d->message.append( 1, data[i] );
-		}
-	}
-}
-
-int TellStick::reset() {
-#ifndef _WINDOWS
-	return TELLSTICK_SUCCESS;  // nothing to be done on other platforms
-#else
-	int success = FT_CyclePort( d->ftHandle );
-	if(success == FT_OK) {
-		return TELLSTICK_SUCCESS;
-	}
-	return TELLSTICK_ERROR_UNKNOWN;
-#endif
-}
-
-void TellStick::run() {
-	d->running = true;
-	DWORD dwBytesInQueue = 0;
-	DWORD dwBytesRead = 0;
-	char *buf = 0;
-
-	// Send a firmware version request
-	char msg[] = "V+";
-	FT_Write(d->ftHandle, msg, (DWORD)strlen(msg), &dwBytesRead);
-
-	while(1) {
-#ifdef _WINDOWS
-		FT_SetEventNotification(d->ftHandle, FT_EVENT_RXCHAR, d->eh);
-		WaitForSingleObject(d->eh, INFINITE);
-#else
-		FT_SetEventNotification(d->ftHandle, FT_EVENT_RXCHAR, (PVOID)&d->eh);
-		pthread_mutex_lock(&d->eh.eMutex);
-		pthread_cond_wait(&d->eh.eCondVar, &d->eh.eMutex);
-		pthread_mutex_unlock(&d->eh.eMutex);
-#endif
-
-		TelldusCore::MutexLocker locker(&d->mutex);
-		if (!d->running) {
-			break;
-		}
-		FT_GetQueueStatus(d->ftHandle, &dwBytesInQueue);
-		if (dwBytesInQueue < 1) {
-			continue;
-		}
-		buf = reinterpret_cast(malloc(sizeof(buf) * (dwBytesInQueue+1)));
-		memset(buf, 0, dwBytesInQueue+1);
-		FT_Read(d->ftHandle, buf, dwBytesInQueue, &dwBytesRead);
-		processData( buf );
-		free(buf);
-	}
-}
-
-int TellStick::send( const std::string &strMessage ) {
-	if (!d->open) {
-		return TELLSTICK_ERROR_NOT_FOUND;
-	}
-
-	// This lock does two things
-	//  1 Prevents two calls from different threads to this function
-	//  2 Prevents our running thread from receiving the data we are interested in here
-	TelldusCore::MutexLocker locker(&d->mutex);
-
-	char *tempMessage = reinterpret_cast(malloc(sizeof(std::string::value_type) * (strMessage.size()+1)));
-#ifdef _WINDOWS
-	strcpy_s(tempMessage, strMessage.size()+1, strMessage.c_str());
-#else
-	snprintf(tempMessage, strMessage.size()+1, "%s", strMessage.c_str());
-#endif
-
-	ULONG bytesWritten, bytesRead;
-	char in;
-	FT_STATUS ftStatus;
-	ftStatus = FT_Write(d->ftHandle, tempMessage, (DWORD)strMessage.length(), &bytesWritten);
-	free(tempMessage);
-
-	if(ftStatus != FT_OK) {
-		Log::debug("Broken pipe on send");
-		return TELLSTICK_ERROR_BROKEN_PIPE;
-	}
-
-	if(strMessage.compare("N+") == 0 && ((pid() == 0x0C31 && firmwareVersion() < 5) || (pid() == 0x0C30 && firmwareVersion() < 6))) {
-		// these firmware versions doesn't implement ack to noop, just check that the noop can be sent correctly
-		return TELLSTICK_SUCCESS;
-	}
-	if(d->ignoreControllerConfirmation) {
-		// wait for TellStick to finish its air-sending
-		msleep(1000);
-		return TELLSTICK_SUCCESS;
-	}
-
-	while(1) {
-		ftStatus = FT_Read(d->ftHandle, &in, 1, &bytesRead);
-		if (ftStatus == FT_OK) {
-			if (bytesRead == 1) {
-				if (in == '\n') {
-					return TELLSTICK_SUCCESS;
-				} else {
-					continue;
-				}
-			} else {  // Timeout
-				return TELLSTICK_ERROR_COMMUNICATION;
-			}
-		} else {  // Error
-			Log::debug("Broken pipe on read");
-			return TELLSTICK_ERROR_BROKEN_PIPE;
-		}
-	}
-}
-
-bool TellStick::stillConnected() const {
-	FT_STATUS ftStatus;
-	DWORD numDevs;
-	// create the device information list
-	ftStatus = FT_CreateDeviceInfoList(&numDevs);
-	if (ftStatus != FT_OK) {
-		return false;
-	}
-	if (numDevs <= 0) {
-		return false;
-	}
-	for (int i = 0; i < static_cast(numDevs); i++) {
-		FT_HANDLE ftHandleTemp;
-		DWORD flags;
-		DWORD id;
-		DWORD type;
-		DWORD locId;
-		char serialNumber[16];
-		char description[64];
-		// get information for device i
-		ftStatus = FT_GetDeviceInfoDetail(i, &flags, &type, &id, &locId, serialNumber, description, &ftHandleTemp);
-		if (ftStatus != FT_OK) {
-			continue;
-		}
-		if (d->serial.compare(serialNumber) == 0) {
-			return true;
-		}
-	}
-	return false;
-}
-
-std::list TellStick::findAll() {
-	std::list tellstick = findAllByVIDPID(0x1781, 0x0C30);
-
-	std::list duo = findAllByVIDPID(0x1781, 0x0C31);
-	for(std::list::const_iterator it = duo.begin(); it != duo.end(); ++it) {
-		tellstick.push_back(*it);
-	}
-
-	return tellstick;
-}
-
-std::list TellStick::findAllByVIDPID( int vid, int pid ) {
-	std::list retval;
-
-	FT_STATUS ftStatus = FT_OK;
-	DWORD dwNumberOfDevices = 0;
-
-#ifndef _WINDOWS
-	FT_SetVIDPID(vid, pid);
-#endif
-
-	ftStatus = FT_CreateDeviceInfoList(&dwNumberOfDevices);
-	if (ftStatus != FT_OK) {
-		return retval;
-	}
-	if (dwNumberOfDevices > 0) {
-		FT_DEVICE_LIST_INFO_NODE *devInfo;
-		// allocate storage for list based on dwNumberOfDevices
-		devInfo = reinterpret_cast(malloc(sizeof(FT_DEVICE_LIST_INFO_NODE)*dwNumberOfDevices));  // get the device information list
-		ftStatus = FT_GetDeviceInfoList(devInfo, &dwNumberOfDevices);
-		if (ftStatus == FT_OK) {
-			unsigned int id = (vid << 16) | pid;
-			for (unsigned int i = 0; i < dwNumberOfDevices; i++) {
-				if (devInfo[i].ID != id) {
-					continue;
-				}
-				TellStickDescriptor td;
-				td.vid = vid;
-				td.pid = pid;
-				td.serial = devInfo[i].SerialNumber;
-				retval.push_back(td);
-			}
-		}
-		free(devInfo);
-	}
-	return retval;
-}
diff --git a/telldus-core/service/TellStick_libftdi.cpp b/telldus-core/service/TellStick_libftdi.cpp
deleted file mode 100644
index 8ce36700..00000000
--- a/telldus-core/service/TellStick_libftdi.cpp
+++ /dev/null
@@ -1,327 +0,0 @@
-//
-// Copyright (C) 2012 Telldus Technologies AB. All rights reserved.
-//
-// Copyright: See COPYING file that comes with this distribution
-//
-//
-#include 
-#include 
-#include 
-#include 
-#include 
-#include 
-#include 
-
-#include "service/TellStick.h"
-#include "service/Log.h"
-#include "service/Settings.h"
-#include "client/telldus-core.h"
-#include "common/Thread.h"
-#include "common/Mutex.h"
-#include "common/Strings.h"
-#include "common/common.h"
-
-typedef struct _EVENT_HANDLE {
-	pthread_cond_t eCondVar;
-	pthread_mutex_t eMutex;
-} EVENT_HANDLE;
-typedef int DWORD;
-
-class TellStick::PrivateData {
-public:
-	bool open, ignoreControllerConfirmation;
-	int vid, pid;
-	std::string serial, message;
-	ftdi_context ftHandle;
-	EVENT_HANDLE eh;
-	bool running;
-	TelldusCore::Mutex mutex;
-};
-
-TellStick::TellStick(int controllerId, TelldusCore::EventRef event, TelldusCore::EventRef updateEvent, const TellStickDescriptor &td )
-	:Controller(controllerId, event, updateEvent) {
-	d = new PrivateData;
-	d->open = false;
-	d->vid = td.vid;
-	d->pid = td.pid;
-	d->serial = td.serial;
-	d->running = false;
-
-	Settings set;
-	d->ignoreControllerConfirmation = set.getSetting(L"ignoreControllerConfirmation") == L"true";
-
-	ftdi_init(&d->ftHandle);
-	ftdi_set_interface(&d->ftHandle, INTERFACE_ANY);
-
-	Log::notice("Connecting to TellStick (%X/%X) with serial %s", d->vid, d->pid, d->serial.c_str());
-	int ret = ftdi_usb_open_desc(&d->ftHandle, td.vid, td.pid, NULL, td.serial.c_str());
-	if (ret < 0) {
-		ftdi_deinit(&d->ftHandle);
-		return;
-	}
-	d->open = true;
-	ftdi_usb_reset( &d->ftHandle );
-	ftdi_disable_bitbang( &d->ftHandle );
-	ftdi_set_latency_timer(&d->ftHandle, 16);
-
-	if (d->open) {
-		if (td.pid == 0x0C31) {
-			this->setBaud(9600);
-		} else {
-			this->setBaud(4800);
-		}
-		this->start();
-	} else {
-		Log::warning("Failed to open TellStick");
-	}
-}
-
-TellStick::~TellStick() {
-	Log::warning("Disconnected TellStick (%X/%X) with serial %s", d->vid, d->pid, d->serial.c_str());
-	if (d->running) {
-		stop();
-	}
-
-	if (d->open) {
-		ftdi_usb_close(&d->ftHandle);
-		ftdi_deinit(&d->ftHandle);
-	}
-	delete d;
-}
-
-int TellStick::pid() const {
-	return d->pid;
-}
-
-int TellStick::vid() const {
-	return d->vid;
-}
-
-std::string TellStick::serial() const {
-	return d->serial;
-}
-
-bool TellStick::isOpen() const {
-	return d->open;
-}
-
-bool TellStick::isSameAsDescriptor(const TellStickDescriptor &td) const {
-	if (td.vid != d->vid) {
-		return false;
-	}
-	if (td.pid != d->pid) {
-		return false;
-	}
-	if (td.serial != d->serial) {
-		return false;
-	}
-	return true;
-}
-
-void TellStick::processData( const std::string &data ) {
-	for (unsigned int i = 0; i < data.length(); ++i) {
-		if (data[i] == 13) {  // Skip \r
-			continue;
-		} else if (data[i] == 10) {  // \n found
-			if (d->message.substr(0, 2).compare("+V") == 0) {
-				setFirmwareVersion(TelldusCore::charToInteger(d->message.substr(2).c_str()));
-			} else if (d->message.substr(0, 2).compare("+R") == 0) {
-				this->publishData(d->message.substr(2));
-			} else if(d->message.substr(0, 2).compare("+W") == 0) {
-				this->decodePublishData(d->message.substr(2));
-			}
-			d->message.clear();
-		} else {  // Append the character
-			d->message.append( 1, data[i] );
-		}
-	}
-}
-
-int TellStick::reset() {
-	int success = ftdi_usb_reset( &d->ftHandle );
-	if(success < 0) {
-		return TELLSTICK_ERROR_UNKNOWN;  // -1 = FTDI reset failed, -2 = USB device unavailable
-	}
-	return TELLSTICK_SUCCESS;
-}
-
-void TellStick::run() {
-	int dwBytesRead = 0;
-	unsigned char buf[1024];     // = 0;
-
-	pthread_mutex_init(&d->eh.eMutex, NULL);
-	pthread_cond_init(&d->eh.eCondVar, NULL);
-
-	{
-		TelldusCore::MutexLocker locker(&d->mutex);
-		d->running = true;
-	}
-
-	// Send a firmware version request
-	unsigned char msg[] = "V+";
-	ftdi_write_data( &d->ftHandle, msg, 2 );
-
-	while(1) {
-		// Is there any better way then sleeping between reads?
-		msleep(100);
-		TelldusCore::MutexLocker locker(&d->mutex);
-		if (!d->running) {
-			break;
-		}
-		memset(buf, 0, sizeof(buf));
-		dwBytesRead = ftdi_read_data(&d->ftHandle, buf, sizeof(buf));
-		if (dwBytesRead < 0) {
-			// An error occured, avoid flooding by sleeping longer
-			// Hopefully if will start working again
-			msleep(1000);  // 1s
-		}
-		if (dwBytesRead < 1) {
-			continue;
-		}
-		processData( reinterpret_cast(&buf) );
-	}
-}
-
-int TellStick::send( const std::string &strMessage ) {
-	if (!d->open) {
-		return TELLSTICK_ERROR_NOT_FOUND;
-	}
-
-	bool c = true;
-	unsigned char *tempMessage = new unsigned char[strMessage.size()];
-	memcpy(tempMessage, strMessage.c_str(), strMessage.size());
-
-	// This lock does two things
-	//  1 Prevents two calls from different threads to this function
-	//  2 Prevents our running thread from receiving the data we are interested in here
-	TelldusCore::MutexLocker locker(&d->mutex);
-
-	int ret;
-	ret = ftdi_write_data( &d->ftHandle, tempMessage, strMessage.length() );
-	if(ret < 0) {
-		c = false;
-	} else if(ret != strMessage.length()) {
-		Log::debug("Weird send length? retval %i instead of %d\n", ret, static_cast(strMessage.length()));
-	}
-
-	delete[] tempMessage;
-
-	if(!c) {
-		Log::debug("Broken pipe on send");
-		return TELLSTICK_ERROR_BROKEN_PIPE;
-	}
-
-	if(strMessage.compare("N+") == 0 && ((pid() == 0x0C31 && firmwareVersion() < 5) || (pid() == 0x0C30 && firmwareVersion() < 6))) {
-		// these firmware versions doesn't implement ack to noop, just check that the noop can be sent correctly
-		return TELLSTICK_SUCCESS;
-	}
-
-	if(d->ignoreControllerConfirmation) {
-		// allow TellStick to finish its air-sending
-		msleep(1000);
-		return TELLSTICK_SUCCESS;
-	}
-
-	int retrycnt = 250;
-	unsigned char in;
-	while(--retrycnt) {
-		ret = ftdi_read_data( &d->ftHandle, &in, 1);
-		if (ret > 0) {
-			if (in == '\n') {
-				return TELLSTICK_SUCCESS;
-			}
-		} else if(ret == 0) {  // No data available
-			usleep(100);
-		} else {  // Error
-			Log::debug("Broken pipe on read");
-			return TELLSTICK_ERROR_BROKEN_PIPE;
-		}
-	}
-
-	return TELLSTICK_ERROR_COMMUNICATION;
-}
-
-void TellStick::setBaud(int baud) {
-	int ret = ftdi_set_baudrate(&d->ftHandle, baud);
-	if(ret != 0) {
-		fprintf(stderr, "set Baud failed, retval %i\n", ret);
-	}
-}
-
-std::list TellStick::findAll() {
-	std::list tellstick = findAllByVIDPID(0x1781, 0x0C30);
-
-	std::list duo = findAllByVIDPID(0x1781, 0x0C31);
-	for(std::list::const_iterator it = duo.begin(); it != duo.end(); ++it) {
-		tellstick.push_back(*it);
-	}
-
-	return tellstick;
-}
-
-bool TellStick::stillConnected() const {
-	ftdi_context ftdic;
-	struct ftdi_device_list *devlist, *curdev;
-	char serialBuffer[10];
-	ftdi_init(&ftdic);
-	bool found = false;
-
-	int ret = ftdi_usb_find_all(&ftdic, &devlist, d->vid, d->pid);
-	if (ret > 0) {
-		for (curdev = devlist; curdev != NULL; curdev = curdev->next) {
-			ret = ftdi_usb_get_strings(&ftdic, curdev->dev, NULL, 0, NULL, 0, serialBuffer, 10);
-			if (ret != 0) {
-				continue;
-			}
-			if (d->serial.compare(serialBuffer) == 0) {
-				found = true;
-				break;
-			}
-		}
-	}
-
-	ftdi_list_free(&devlist);
-	ftdi_deinit(&ftdic);
-	return found;
-}
-
-std::list TellStick::findAllByVIDPID( int vid, int pid ) {
-	std::list retval;
-
-	ftdi_context ftdic;
-	struct ftdi_device_list *devlist, *curdev;
-	char serialBuffer[10];
-	ftdi_init(&ftdic);
-
-	int ret = ftdi_usb_find_all(&ftdic, &devlist, vid, pid);
-	if (ret > 0) {
-		for (curdev = devlist; curdev != NULL; curdev = curdev->next) {
-			ret = ftdi_usb_get_strings(&ftdic, curdev->dev, NULL, 0, NULL, 0, serialBuffer, 10);
-			if (ret != 0) {
-				continue;
-			}
-			TellStickDescriptor td;
-			td.vid = vid;
-			td.pid = pid;
-			td.serial = serialBuffer;
-			retval.push_back(td);
-		}
-	}
-	ftdi_list_free(&devlist);
-	ftdi_deinit(&ftdic);
-
-	return retval;
-}
-
-void TellStick::stop() {
-	if (d->running) {
-		{
-			TelldusCore::MutexLocker locker(&d->mutex);
-				d->running = false;
-		}
-		// Unlock the wait-condition
-
-		pthread_cond_broadcast(&d->eh.eCondVar);
-	}
-	this->wait();
-}
diff --git a/telldus-core/service/TelldusMain.cpp b/telldus-core/service/TelldusMain.cpp
deleted file mode 100644
index 5d9aa642..00000000
--- a/telldus-core/service/TelldusMain.cpp
+++ /dev/null
@@ -1,154 +0,0 @@
-//
-// Copyright (C) 2012 Telldus Technologies AB. All rights reserved.
-//
-// Copyright: See COPYING file that comes with this distribution
-//
-//
-#include "service/TelldusMain.h"
-#include 
-#include 
-#include 
-
-#include "common/EventHandler.h"
-#include "service/ClientCommunicationHandler.h"
-#include "service/ConnectionListener.h"
-#include "service/ControllerListener.h"
-#include "service/ControllerManager.h"
-#include "service/DeviceManager.h"
-#include "service/EventUpdateManager.h"
-#include "service/Log.h"
-#include "service/Timer.h"
-
-class TelldusMain::PrivateData {
-public:
-	TelldusCore::EventHandler eventHandler;
-	TelldusCore::EventRef stopEvent, controllerChangeEvent;
-};
-
-TelldusMain::TelldusMain(void) {
-	d = new PrivateData;
-	d->stopEvent = d->eventHandler.addEvent();
-	d->controllerChangeEvent = d->eventHandler.addEvent();
-}
-
-TelldusMain::~TelldusMain(void) {
-	delete d;
-}
-
-void TelldusMain::deviceInsertedOrRemoved(int vid, int pid, bool inserted) {
-	ControllerChangeEventData *data = new ControllerChangeEventData;
-	data->vid = vid;
-	data->pid = pid;
-	data->inserted = inserted;
-	d->controllerChangeEvent->signal(data);
-}
-
-void TelldusMain::resume() {
-	Log::notice("Came back from suspend");
-	ControllerChangeEventData *data = new ControllerChangeEventData;
-	data->vid = 0x0;
-	data->pid = 0x0;
-	data->inserted = true;
-	d->controllerChangeEvent->signal(data);
-}
-
-void TelldusMain::suspend() {
-	Log::notice("Preparing for suspend");
-	ControllerChangeEventData *data = new ControllerChangeEventData;
-	data->vid = 0x0;
-	data->pid = 0x0;
-	data->inserted = false;
-	d->controllerChangeEvent->signal(data);
-}
-
-void TelldusMain::start(void) {
-	TelldusCore::EventRef clientEvent = d->eventHandler.addEvent();
-	TelldusCore::EventRef dataEvent = d->eventHandler.addEvent();
-	TelldusCore::EventRef executeActionEvent = d->eventHandler.addEvent();
-	TelldusCore::EventRef janitor = d->eventHandler.addEvent();  // Used for regular cleanups
-	Timer supervisor(janitor);  // Tells the janitor to go back to work
-	supervisor.setInterval(60);  // Once every minute
-	supervisor.start();
-
-	EventUpdateManager eventUpdateManager;
-	TelldusCore::EventRef deviceUpdateEvent = eventUpdateManager.retrieveUpdateEvent();
-	eventUpdateManager.start();
-	ControllerManager controllerManager(dataEvent, deviceUpdateEvent);
-	DeviceManager deviceManager(&controllerManager, deviceUpdateEvent);
-	deviceManager.setExecuteActionEvent(executeActionEvent);
-
-	ConnectionListener clientListener(L"TelldusClient", clientEvent);
-
-	std::list clientCommunicationHandlerList;
-
-	TelldusCore::EventRef handlerEvent = d->eventHandler.addEvent();
-
-#ifdef _MACOSX
-	// This is only needed on OS X
-	ControllerListener controllerListener(d->controllerChangeEvent);
-#endif
-
-
-	while(!d->stopEvent->isSignaled()) {
-		if (!d->eventHandler.waitForAny()) {
-			continue;
-		}
-		if (clientEvent->isSignaled()) {
-			// New client connection
-			TelldusCore::EventDataRef eventDataRef = clientEvent->takeSignal();
-			ConnectionListenerEventData *data = dynamic_cast(eventDataRef.get());
-			if (data) {
-				ClientCommunicationHandler *clientCommunication = new ClientCommunicationHandler(data->socket, handlerEvent, &deviceManager, deviceUpdateEvent, &controllerManager);
-				clientCommunication->start();
-				clientCommunicationHandlerList.push_back(clientCommunication);
-			}
-		}
-
-		if (d->controllerChangeEvent->isSignaled()) {
-			TelldusCore::EventDataRef eventDataRef = d->controllerChangeEvent->takeSignal();
-			ControllerChangeEventData *data = dynamic_cast(eventDataRef.get());
-			if (data) {
-				controllerManager.deviceInsertedOrRemoved(data->vid, data->pid, "", data->inserted);
-			}
-		}
-
-		if (dataEvent->isSignaled()) {
-			TelldusCore::EventDataRef eventData = dataEvent->takeSignal();
-			ControllerEventData *data = dynamic_cast(eventData.get());
-			if (data) {
-				deviceManager.handleControllerMessage(*data);
-			}
-		}
-
-		if (handlerEvent->isSignaled()) {
-			handlerEvent->popSignal();
-			for ( std::list::iterator it = clientCommunicationHandlerList.begin(); it != clientCommunicationHandlerList.end(); ) {
-				if ((*it)->isDone()) {
-					delete *it;
-					it = clientCommunicationHandlerList.erase(it);
-
-				} else {
-					++it;
-				}
-			}
-		}
-		if (executeActionEvent->isSignaled()) {
-			deviceManager.executeActionEvent();
-		}
-		if (janitor->isSignaled()) {
-			// Clear all of them if there is more than one
-			while(janitor->isSignaled()) {
-				janitor->popSignal();
-			}
-#ifndef _MACOSX
-			controllerManager.queryControllerStatus();
-#endif
-		}
-	}
-
-	supervisor.stop();
-}
-
-void TelldusMain::stop(void) {
-	d->stopEvent->signal();
-}
diff --git a/telldus-core/service/TelldusMain.h b/telldus-core/service/TelldusMain.h
deleted file mode 100644
index 388f933a..00000000
--- a/telldus-core/service/TelldusMain.h
+++ /dev/null
@@ -1,28 +0,0 @@
-//
-// Copyright (C) 2012 Telldus Technologies AB. All rights reserved.
-//
-// Copyright: See COPYING file that comes with this distribution
-//
-//
-#ifndef TELLDUS_CORE_SERVICE_TELLDUSMAIN_H_
-#define TELLDUS_CORE_SERVICE_TELLDUSMAIN_H_
-
-class TelldusMain {
-public:
-	TelldusMain(void);
-	~TelldusMain(void);
-
-	void start();
-	void stop();
-
-	// Thread safe!
-	void deviceInsertedOrRemoved(int vid, int pid, bool inserted);
-	void resume();
-	void suspend();
-
-private:
-	class PrivateData;
-	PrivateData *d;
-};
-
-#endif  // TELLDUS_CORE_SERVICE_TELLDUSMAIN_H_
diff --git a/telldus-core/service/TelldusWinService_win.cpp b/telldus-core/service/TelldusWinService_win.cpp
deleted file mode 100644
index dd405d9b..00000000
--- a/telldus-core/service/TelldusWinService_win.cpp
+++ /dev/null
@@ -1,181 +0,0 @@
-//
-// Copyright (C) 2012 Telldus Technologies AB. All rights reserved.
-//
-// Copyright: See COPYING file that comes with this distribution
-//
-//
-#include "service/TelldusWinService_win.h"
-
-#include 
-#include 
-#include 
-
-#include "service/Log.h"
-#include "service/TelldusMain.h"
-
-int g_argc;
-char **g_argv;
-
-
-static const GUID GUID_DEVINTERFACE_USBRAW = { 0xA5DCBF10L, 0x6530, 0x11D2, { 0x90, 0x1F, 0x00, 0xC0, 0x4F, 0xB9, 0x51, 0xED } };
-
-TelldusWinService::TelldusWinService()
-	:tm(0) {
-	tm = new TelldusMain();
-}
-
-TelldusWinService::~TelldusWinService() {
-	delete tm;
-}
-
-void TelldusWinService::stop() {
-	tm->stop();
-}
-
-DWORD WINAPI TelldusWinService::serviceControlHandler( DWORD controlCode, DWORD dwEventType, LPVOID lpEventData ) {
-	switch ( controlCode ) {
-		case SERVICE_CONTROL_INTERROGATE:
-			SetServiceStatus( serviceStatusHandle, &serviceStatus );
-			return NO_ERROR;
-
-		case SERVICE_CONTROL_SHUTDOWN:
-		case SERVICE_CONTROL_STOP:
-			stop();
-			serviceStatus.dwCurrentState = SERVICE_STOP_PENDING;
-			SetServiceStatus( serviceStatusHandle, &serviceStatus );
-
-			return NO_ERROR;
-		case SERVICE_CONTROL_POWEREVENT:
-			if (dwEventType == PBT_APMSUSPEND) {
-				tm->suspend();
-			} else if (dwEventType == PBT_APMRESUMEAUTOMATIC) {
-				tm->resume();
-			}
-			return NO_ERROR;
-	}
-	return ERROR_CALL_NOT_IMPLEMENTED;
-}
-
-DWORD WINAPI TelldusWinService::deviceNotificationHandler( DWORD controlCode, DWORD dwEventType, LPVOID lpEventData ) {
-	if (controlCode != SERVICE_CONTROL_DEVICEEVENT) {
-		return ERROR_CALL_NOT_IMPLEMENTED;
-	}
-
-	if (dwEventType != DBT_DEVICEARRIVAL && dwEventType != DBT_DEVICEREMOVECOMPLETE) {
-		return ERROR_CALL_NOT_IMPLEMENTED;
-	}
-
-	PDEV_BROADCAST_DEVICEINTERFACE pDevInf = reinterpret_cast(lpEventData);
-	if (!pDevInf) {
-		return ERROR_CALL_NOT_IMPLEMENTED;
-	}
-
-	std::wstring name(pDevInf->dbcc_name);
-	transform(name.begin(), name.end(), name.begin(), toupper);
-
-	// Parse VID
-	size_t posStart = name.find(L"VID_");
-	if (posStart == std::wstring::npos) {
-		return ERROR_CALL_NOT_IMPLEMENTED;
-	}
-	posStart += 4;
-	size_t posEnd = name.find(L'&', posStart);
-	if (posEnd == std::wstring::npos) {
-		return ERROR_CALL_NOT_IMPLEMENTED;
-	}
-	std::wstring strVID = name.substr(posStart, posEnd-posStart);
-
-	// Parse PID
-	posStart = name.find(L"PID_");
-	if (posStart == std::wstring::npos) {
-		return ERROR_CALL_NOT_IMPLEMENTED;
-	}
-	posStart += 4;
-	posEnd = name.find(L'#', posStart);
-	if (posEnd == std::wstring::npos) {
-		return ERROR_CALL_NOT_IMPLEMENTED;
-	}
-	std::wstring strPID = name.substr(posStart, posEnd-posStart);
-
-	int vid = static_cast(strtol(std::string(strVID.begin(), strVID.end()).c_str(), NULL, 16));
-	int pid = static_cast(strtol(std::string(strPID.begin(), strPID.end()).c_str(), NULL, 16));
-
-	if (dwEventType == DBT_DEVICEARRIVAL) {
-		tm->deviceInsertedOrRemoved(vid, pid, true);
-	} else {
-		tm->deviceInsertedOrRemoved(vid, pid, false);
-	}
-
-	return NO_ERROR;
-}
-
-DWORD WINAPI TelldusWinService::serviceControlHandler( DWORD controlCode, DWORD dwEventType, LPVOID lpEventData, LPVOID lpContext ) {
-	TelldusWinService *instance = reinterpret_cast(lpContext);
-	if (!instance) {
-		return ERROR_CALL_NOT_IMPLEMENTED;
-	}
-	if (controlCode == SERVICE_CONTROL_DEVICEEVENT) {
-		return instance->deviceNotificationHandler(controlCode, dwEventType, lpEventData);
-	}
-	return instance->serviceControlHandler(controlCode, dwEventType, lpEventData);
-}
-
-void WINAPI TelldusWinService::serviceMain( DWORD argc, TCHAR* argv[] ) {
-	TelldusWinService instance;
-
-	// Enable debug if we hade this supplied
-	for(unsigned int i = 1; i < argc; ++i) {
-		if (wcscmp(argv[i], L"--debug") == 0) {
-			Log::setDebug();
-		}
-	}
-
-	// initialise service status
-	instance.serviceStatus.dwServiceType = SERVICE_WIN32;
-	instance.serviceStatus.dwCurrentState = SERVICE_STOPPED;
-	instance.serviceStatus.dwControlsAccepted = 0;
-	instance.serviceStatus.dwWin32ExitCode = NO_ERROR;
-	instance.serviceStatus.dwServiceSpecificExitCode = NO_ERROR;
-	instance.serviceStatus.dwCheckPoint = 0;
-	instance.serviceStatus.dwWaitHint = 0;
-
-	instance.serviceStatusHandle = RegisterServiceCtrlHandlerEx( serviceName, TelldusWinService::serviceControlHandler, &instance );
-
-	if ( instance.serviceStatusHandle ) {
-		// service is starting
-		instance.serviceStatus.dwCurrentState = SERVICE_START_PENDING;
-		SetServiceStatus( instance.serviceStatusHandle, &instance.serviceStatus );
-
-		// running
-		instance.serviceStatus.dwControlsAccepted |= (SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN);
-		// Register for power management notification
-		instance.serviceStatus.dwControlsAccepted |= SERVICE_ACCEPT_POWEREVENT;
-		instance.serviceStatus.dwCurrentState = SERVICE_RUNNING;
-		SetServiceStatus( instance.serviceStatusHandle, &instance.serviceStatus );
-
-		// Register for device notification
-		DEV_BROADCAST_DEVICEINTERFACE devInterface;
-		ZeroMemory( &devInterface, sizeof(devInterface) );
-		devInterface.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE);
-		devInterface.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
-		devInterface.dbcc_classguid = GUID_DEVINTERFACE_USBRAW;
-		HDEVNOTIFY deviceNotificationHandle = RegisterDeviceNotificationW(instance.serviceStatusHandle, &devInterface, DEVICE_NOTIFY_SERVICE_HANDLE);
-
-		Log::notice("TelldusService started");
-
-		// Start our main-loop
-		instance.tm->start();
-
-		Log::notice("TelldusService stopping");
-		Log::destroy();
-
-		// service was stopped
-		instance.serviceStatus.dwCurrentState = SERVICE_STOP_PENDING;
-		SetServiceStatus( instance.serviceStatusHandle, &instance.serviceStatus );
-
-		// service is now stopped
-		instance.serviceStatus.dwControlsAccepted &= ~(SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN);
-		instance.serviceStatus.dwCurrentState = SERVICE_STOPPED;
-		SetServiceStatus( instance.serviceStatusHandle, &instance.serviceStatus );
-	}
-}
diff --git a/telldus-core/service/TelldusWinService_win.h b/telldus-core/service/TelldusWinService_win.h
deleted file mode 100644
index 213cc1f0..00000000
--- a/telldus-core/service/TelldusWinService_win.h
+++ /dev/null
@@ -1,39 +0,0 @@
-//
-// Copyright (C) 2012 Telldus Technologies AB. All rights reserved.
-//
-// Copyright: See COPYING file that comes with this distribution
-//
-//
-#ifndef TELLDUS_CORE_SERVICE_TELLDUSWINSERVICE_WIN_H_
-#define TELLDUS_CORE_SERVICE_TELLDUSWINSERVICE_WIN_H_
-
-#include 
-
-extern int g_argc;
-extern char **g_argv;
-
-class TelldusMain;
-
-#define serviceName TEXT("TelldusCore")
-
-class TelldusWinService {
-public:
-	TelldusWinService();
-	~TelldusWinService();
-
-	static void WINAPI serviceMain( DWORD /*argc*/, TCHAR* /*argv*/[] );
-
-protected:
-	void stop();
-
-	DWORD WINAPI serviceControlHandler( DWORD controlCode, DWORD dwEventType, LPVOID lpEventData );
-	DWORD WINAPI deviceNotificationHandler( DWORD controlCode, DWORD dwEventType, LPVOID lpEventData );
-
-private:
-	TelldusMain *tm;
-	SERVICE_STATUS serviceStatus;
-	SERVICE_STATUS_HANDLE serviceStatusHandle;
-
-	static DWORD WINAPI serviceControlHandler( DWORD controlCode, DWORD dwEventType, LPVOID lpEventData, LPVOID lpContext );
-};
-#endif  // TELLDUS_CORE_SERVICE_TELLDUSWINSERVICE_WIN_H_
diff --git a/telldus-core/service/Timer.cpp b/telldus-core/service/Timer.cpp
deleted file mode 100644
index bcce9b17..00000000
--- a/telldus-core/service/Timer.cpp
+++ /dev/null
@@ -1,120 +0,0 @@
-//
-// Copyright (C) 2012 Telldus Technologies AB. All rights reserved.
-//
-// Copyright: See COPYING file that comes with this distribution
-//
-//
-#include "service/Timer.h"
-#ifdef _WINDOWS
-#else
-#include 
-#include 
-#endif
-#include "common/Mutex.h"
-
-class Timer::PrivateData {
-public:
-	PrivateData() : interval(0), running(false) {}
-	TelldusCore::EventRef event;
-	int interval;
-	bool running;
-#ifdef _WINDOWS
-	HANDLE cond;
-	TelldusCore::Mutex mutex;
-#else
-	pthread_mutex_t waitMutex;
-	pthread_cond_t cond;
-#endif
-};
-
-Timer::Timer(TelldusCore::EventRef event)
-	:TelldusCore::Thread(), d(new PrivateData) {
-	d->event = event;
-#ifdef _WINDOWS
-	d->cond = CreateEventW(NULL, false, false, NULL);
-#else
-	pthread_cond_init(&d->cond, NULL);
-	pthread_mutex_init(&d->waitMutex, NULL);
-#endif
-}
-
-Timer::~Timer() {
-	this->stop();
-	this->wait();
-
-#ifdef _WINDOWS
-#else
-	pthread_mutex_destroy(&d->waitMutex);
-	pthread_cond_destroy(&d->cond);
-	delete d;
-#endif
-}
-
-void Timer::setInterval(int sec) {
-	d->interval = sec;
-}
-
-void Timer::stop() {
-#ifdef _WINDOWS
-	TelldusCore::MutexLocker(&d->mutex);
-	d->running = false;
-	SetEvent(d->cond);
-#else
-	// Signal event
-	pthread_mutex_lock(&d->waitMutex);
-	if (d->running) {
-		d->running = false;
-		pthread_cond_signal(&d->cond);
-	}
-	pthread_mutex_unlock(&d->waitMutex);
-#endif
-}
-
-void Timer::run() {
-#ifdef _WINDOWS
-	int interval = 0;
-	{
-		TelldusCore::MutexLocker(&d->mutex);
-		d->running = true;
-		interval = d->interval*1000;
-	}
-	while(1) {
-		DWORD retval = WaitForSingleObject(d->cond, interval);
-		if (retval == WAIT_TIMEOUT) {
-			d->event->signal();
-		}
-		TelldusCore::MutexLocker(&d->mutex);
-		if (!d->running) {
-			break;
-		}
-	}
-#else
-	struct timespec ts;
-	struct timeval tp;
-
-	pthread_mutex_lock(&d->waitMutex);
-	d->running = true;
-	pthread_mutex_unlock(&d->waitMutex);
-
-	while(1) {
-		int rc = 0;
-		gettimeofday(&tp, NULL);
-
-		ts.tv_sec  = tp.tv_sec;
-		ts.tv_nsec = tp.tv_usec * 1000;
-		ts.tv_sec += d->interval;
-
-		pthread_mutex_lock( &d->waitMutex );
-		if (d->running) {
-			rc = pthread_cond_timedwait(&d->cond, &d->waitMutex, &ts);
-		} else {
-			pthread_mutex_unlock( &d->waitMutex );
-			break;
-		}
-		pthread_mutex_unlock( &d->waitMutex );
-		if (rc == ETIMEDOUT) {
-			d->event->signal();
-		}
-	}
-#endif
-}
diff --git a/telldus-core/service/Timer.h b/telldus-core/service/Timer.h
deleted file mode 100644
index f5f51942..00000000
--- a/telldus-core/service/Timer.h
+++ /dev/null
@@ -1,30 +0,0 @@
-//
-// Copyright (C) 2012 Telldus Technologies AB. All rights reserved.
-//
-// Copyright: See COPYING file that comes with this distribution
-//
-//
-#ifndef TELLDUS_CORE_SERVICE_TIMER_H_
-#define TELLDUS_CORE_SERVICE_TIMER_H_
-
-#include "common/Event.h"
-#include "common/Thread.h"
-
-class Timer : public TelldusCore::Thread {
-public:
-	explicit Timer(TelldusCore::EventRef event);
-	virtual ~Timer();
-
-	void setInterval(int sec);
-	void stop();
-
-protected:
-	void run();
-
-private:
-	class PrivateData;
-	PrivateData *d;
-};
-
-
-#endif  // TELLDUS_CORE_SERVICE_TIMER_H_
diff --git a/telldus-core/service/com.telldus.service.plist b/telldus-core/service/com.telldus.service.plist
deleted file mode 100644
index eb07a78b..00000000
--- a/telldus-core/service/com.telldus.service.plist
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
-
-
-	Label
-	com.telldus.service
-	OnDemand
-	
-	ProgramArguments
-	
-		/Library/Telldus/TelldusService
-	
-
-
diff --git a/telldus-core/service/config.h.in b/telldus-core/service/config.h.in
deleted file mode 100644
index 211c884d..00000000
--- a/telldus-core/service/config.h.in
+++ /dev/null
@@ -1,11 +0,0 @@
-#ifndef CONFIG_H
-#define CONFIG_H
-
-#define CONFIG_PATH "@SYSCONF_INSTALL_DIR@"
-#define VAR_CONFIG_PATH "@STATE_INSTALL_DIR@"
-
-#ifdef _LINUX
-#define SCRIPT_PATH "@SCRIPT_PATH@"
-#endif  // _LINUX
-
-#endif  // CONFIG_H
diff --git a/telldus-core/service/ftd2xx.h b/telldus-core/service/ftd2xx.h
deleted file mode 100644
index 020aff93..00000000
--- a/telldus-core/service/ftd2xx.h
+++ /dev/null
@@ -1,15 +0,0 @@
-
-
-#ifdef LIBFTD2XX
-	#ifdef _WINDOWS
-		#include 
-		#include "win\ftd2xx.h"
-	#else
-		#include "osx/WinTypes.h"
-		#include "osx/ftd2xx.h"
-	#endif
-#endif
-
-#ifdef LIBFTDI
-	#include 
-#endif
diff --git a/telldus-core/service/main_mac.cpp b/telldus-core/service/main_mac.cpp
deleted file mode 100644
index 1976891c..00000000
--- a/telldus-core/service/main_mac.cpp
+++ /dev/null
@@ -1,34 +0,0 @@
-//
-// Copyright (C) 2012 Telldus Technologies AB. All rights reserved.
-//
-// Copyright: See COPYING file that comes with this distribution
-//
-//
-#include 
-#include "service/TelldusMain.h"
-#include "service/Log.h"
-
-TelldusMain tm;
-
-void shutdownHandler(int onSignal) {
-	Log::notice("Shutting down");
-	tm.stop();
-}
-
-void sigpipeHandler(int onSignal) {
-	Log::notice("SIGPIPE received");
-}
-
-int main(int argc, char **argv) {
-	/* Install signal traps for proper shutdown */
-	signal(SIGTERM, shutdownHandler);
-	signal(SIGINT, shutdownHandler);
-	signal(SIGPIPE, sigpipeHandler);
-
-	Log::notice("telldusd started");
-	tm.start();
-	Log::notice("telldusd stopped gracefully");
-
-	Log::destroy();
-	return 0;
-}
diff --git a/telldus-core/service/main_unix.cpp b/telldus-core/service/main_unix.cpp
deleted file mode 100644
index 67d64f7d..00000000
--- a/telldus-core/service/main_unix.cpp
+++ /dev/null
@@ -1,166 +0,0 @@
-//
-// Copyright (C) 2012 Telldus Technologies AB. All rights reserved.
-//
-// Copyright: See COPYING file that comes with this distribution
-//
-//
-#include 
-#include 
-#include 
-#include 
-#include 
-#include 
-#include 
-#include 
-#include 
-#include 
-
-#include "service/TelldusMain.h"
-#include "service/Settings.h"
-#include "common/Strings.h"
-#include "service/Log.h"
-
-#define DAEMON_NAME "telldusd"
-#define PID_FILE "/var/run/" DAEMON_NAME ".pid"
-
-TelldusMain tm;
-
-void signalHandler(int sig) {
-	switch(sig) {
-		case SIGHUP:
-			Log::warning("Received SIGHUP signal.");
-			break;
-		case SIGTERM:
-		case SIGINT:
-			Log::warning("Received SIGTERM or SIGINT signal.");
-			Log::warning("Shutting down");
-			tm.stop();
-			break;
-		case SIGPIPE:
-			break;
-		default:
-			Log::warning("Unhandled signal (%d) %s", sig, strsignal(sig));
-			break;
-	}
-}
-
-int main(int argc, char **argv) {
-	pid_t pid, sid;
-	FILE *fd;
-	bool deamonize = true;
-
-	for (int i = 1; i < argc; ++i) {
-		if (strcmp(argv[i], "--nodaemon") == 0) {
-			deamonize = false;
-			Log::setLogOutput(Log::StdOut);
-		} else if (strcmp(argv[i], "--debug") == 0) {
-			Log::setDebug();
-		} else if (strcmp(argv[i], "--help") == 0) {
-			printf("Telldus TellStick background service\n\nStart with --nodaemon to not run as daemon\n\n");
-			printf("Report bugs to \n");
-			exit(EXIT_SUCCESS);
-		} else if (strcmp(argv[i], "--version") == 0) {
-			printf("telldusd " VERSION "\n\n");
-			printf("Copyright (C) 2011 Telldus Technologies AB\n\n");
-			printf("Written by Micke Prag \n");
-			exit(EXIT_SUCCESS);
-		} else {
-			printf("Unknown option %s\n", argv[i]);
-			exit(EXIT_FAILURE);
-		}
-	}
-
-	if (deamonize) {
-		pid = fork();
-		if (pid < 0) {
-			exit(EXIT_FAILURE);
-		}
-		if (pid > 0) {
-			// We are the parent
-			// Let the parent store the clients pid,
-			// This way anyone starting the daemon can read the pidfile immediately
-
-			// Record the pid
-			fd = fopen(PID_FILE, "w");
-			if (fd) {
-				fprintf(fd, "%d\n", pid);
-				fclose(fd);
-			} else {
-				Log::error("Could not open pid file %s: %s", PID_FILE, strerror(errno));
-				exit(EXIT_FAILURE);
-			}
-			exit(EXIT_SUCCESS);
-		}
-	}
-
-	Log::notice("%s daemon starting up", DAEMON_NAME);
-
-	if (deamonize) {
-		/* Change the file mode mask */
-		umask(0);
-
-		sid = setsid();
-
-		if (sid < 0) {
-			// Something went wrong
-			printf("Could not set sid\n");
-			exit(EXIT_FAILURE);
-		}
-
-		close(STDIN_FILENO);
-		close(STDOUT_FILENO);
-		close(STDERR_FILENO);
-	}
-
-	/* Reduce our permissions (change user and group) */
-	if (getuid() == 0 || geteuid() == 0) {
-		Settings settings;
-		std::string user = TelldusCore::wideToString(settings.getSetting(L"user"));
-		std::string group = TelldusCore::wideToString(settings.getSetting(L"group"));
-
-		// We use the non threadsafe function getgrnam() here. Since this is startup code
-		// and no other threads have been started yet.
-		struct group *grp = getgrnam(group.c_str());  // NOLINT(runtime/threadsafe_fn)
-		if (grp) {
-			setgid(grp->gr_gid);
-		} else {
-			Log::warning("Group %s could not be found", group.c_str());
-			exit(EXIT_FAILURE);
-		}
-		// We use the non threadsafe function getpwnam() here. Since this is startup code
-		// and no other threads have been started yet.
-		struct passwd *pw = getpwnam(user.c_str());  // NOLINT(runtime/threadsafe_fn)
-		if (pw) {
-			setuid( pw->pw_uid );
-		} else {
-			Log::warning("User %s could not be found", user.c_str());
-			exit(EXIT_FAILURE);
-		}
-	}
-
-	/* Change the current working directory */
-	if ((chdir("/")) < 0) {
-		exit(EXIT_FAILURE);
-	}
-
-	/* Install signal traps for proper shutdown */
-	signal(SIGTERM, signalHandler);
-	signal(SIGINT,  signalHandler);
-	signal(SIGPIPE, signalHandler);
-
-	// Change so we do not need to call wait() for children processes
-	struct sigaction sa;
-	sa.sa_handler = SIG_IGN;
-	sa.sa_flags = SA_NOCLDWAIT;
-	sigemptyset(&sa.sa_mask);
-	if (sigaction(SIGCHLD, &sa, NULL) == -1) {
-		Log::error("Could not set the SA_NOCLDWAIT flag. We will be creating zombie processes!");
-	}
-
-	tm.start();
-
-	Log::notice("%s daemon exited", DAEMON_NAME);
-	// Cleanup
-	Log::destroy();
-	exit(EXIT_SUCCESS);
-}
diff --git a/telldus-core/service/main_win.cpp b/telldus-core/service/main_win.cpp
deleted file mode 100644
index eac33a46..00000000
--- a/telldus-core/service/main_win.cpp
+++ /dev/null
@@ -1,25 +0,0 @@
-//
-// Copyright (C) 2012 Telldus Technologies AB. All rights reserved.
-//
-// Copyright: See COPYING file that comes with this distribution
-//
-//
-#include 
-#include 
-
-#include "service/TelldusWinService_win.h"
-// #include 
-
-int main(int argc, char **argv) {
-	g_argc = argc;
-	g_argv = argv;
-
-	SERVICE_TABLE_ENTRY serviceTable[] = {
-		{serviceName, TelldusWinService::serviceMain },
-		{ 0, 0 }
-	};
-
-	StartServiceCtrlDispatcher( serviceTable );
-
-	return 0;
-}
diff --git a/telldus-core/service/telldus-core.conf b/telldus-core/service/telldus-core.conf
deleted file mode 100644
index 8b137891..00000000
--- a/telldus-core/service/telldus-core.conf
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/telldus-core/service/win/ftd2xx.h b/telldus-core/service/win/ftd2xx.h
deleted file mode 100644
index d5bc3bff..00000000
--- a/telldus-core/service/win/ftd2xx.h
+++ /dev/null
@@ -1,963 +0,0 @@
-/*++
-
-Copyright (c) 2001-2007  Future Technology Devices International Ltd.
-
-Module Name:
-
-    ftd2xx.h
-
-Abstract:
-
-    Native USB device driver for FTDI FT8U232/245
-    FTD2XX library definitions
-
-Environment:
-
-    kernel & user mode
-
-Revision History:
-
-    13/03/01    awm     Created.
-	13/01/03	awm		Added device information support.
-	19/03/03	awm		Added FT_W32_CancelIo.
-	12/06/03	awm		Added FT_StopInTask and FT_RestartInTask.
-	18/09/03	awm		Added FT_SetResetPipeRetryCount.
-	10/10/03	awm		Added FT_ResetPort.
-	23/01/04	awm		Added support for open-by-location.
-	16/03/04	awm		Added support for FT2232C.
-	23/09/04	awm		Added support for FT232R.
-	20/10/04	awm		Added FT_CyclePort.
-	18/01/05	awm		Added FT_DEVICE_LIST_INFO_NODE type.
-	11/02/05	awm		Added LocId to FT_DEVICE_LIST_INFO_NODE.
-	25/08/05	awm		Added FT_SetDeadmanTimeout.
-	02/12/05	awm		Removed obsolete references.
-	05/12/05	awm		Added FT_GetVersion, FT_GetVersionEx.
-	08/09/06	awm		Added FT_W32_GetCommMask.
-	11/09/06	awm		Added FT_Rescan.
-	11/07/07	awm		Added support for FT2232H and FT4232H.
-	10/08/07	awm		Added flags definitions.
-	21/11/07	mja		Added FT_GetComPortNumber.
-	05/06/08	mja		Added EEPROM extensions for FT2232H.
-	
-	
---*/
-
-
-#ifndef FTD2XX_H
-#define FTD2XX_H
-
-// The following ifdef block is the standard way of creating macros
-// which make exporting from a DLL simpler.  All files within this DLL
-// are compiled with the FTD2XX_EXPORTS symbol defined on the command line.
-// This symbol should not be defined on any project that uses this DLL.
-// This way any other project whose source files include this file see
-// FTD2XX_API functions as being imported from a DLL, whereas this DLL
-// sees symbols defined with this macro as being exported.
-
-#ifdef FTD2XX_EXPORTS
-#define FTD2XX_API __declspec(dllexport)
-#else
-#define FTD2XX_API __declspec(dllimport)
-#endif
-
-
-typedef PVOID	FT_HANDLE;
-typedef ULONG	FT_STATUS;
-
-//
-// Device status
-//
-enum {
-    FT_OK,
-    FT_INVALID_HANDLE,
-    FT_DEVICE_NOT_FOUND,
-    FT_DEVICE_NOT_OPENED,
-    FT_IO_ERROR,
-    FT_INSUFFICIENT_RESOURCES,
-    FT_INVALID_PARAMETER,
-    FT_INVALID_BAUD_RATE,
-
-    FT_DEVICE_NOT_OPENED_FOR_ERASE,
-    FT_DEVICE_NOT_OPENED_FOR_WRITE,
-    FT_FAILED_TO_WRITE_DEVICE,
-    FT_EEPROM_READ_FAILED,
-    FT_EEPROM_WRITE_FAILED,
-    FT_EEPROM_ERASE_FAILED,
-	FT_EEPROM_NOT_PRESENT,
-	FT_EEPROM_NOT_PROGRAMMED,
-	FT_INVALID_ARGS,
-	FT_NOT_SUPPORTED,
-	FT_OTHER_ERROR,
-	FT_DEVICE_LIST_NOT_READY,
-};
-
-
-#define FT_SUCCESS(status) ((status) == FT_OK)
-
-//
-// FT_OpenEx Flags
-//
-
-#define FT_OPEN_BY_SERIAL_NUMBER    1
-#define FT_OPEN_BY_DESCRIPTION      2
-#define FT_OPEN_BY_LOCATION			4
-
-//
-// FT_ListDevices Flags (used in conjunction with FT_OpenEx Flags
-//
-
-#define FT_LIST_NUMBER_ONLY			0x80000000
-#define FT_LIST_BY_INDEX			0x40000000
-#define FT_LIST_ALL					0x20000000
-
-#define FT_LIST_MASK (FT_LIST_NUMBER_ONLY|FT_LIST_BY_INDEX|FT_LIST_ALL)
-
-//
-// Baud Rates
-//
-
-#define FT_BAUD_300			300
-#define FT_BAUD_600			600
-#define FT_BAUD_1200		1200
-#define FT_BAUD_2400		2400
-#define FT_BAUD_4800		4800
-#define FT_BAUD_9600		9600
-#define FT_BAUD_14400		14400
-#define FT_BAUD_19200		19200
-#define FT_BAUD_38400		38400
-#define FT_BAUD_57600		57600
-#define FT_BAUD_115200		115200
-#define FT_BAUD_230400		230400
-#define FT_BAUD_460800		460800
-#define FT_BAUD_921600		921600
-
-//
-// Word Lengths
-//
-
-#define FT_BITS_8			(UCHAR) 8
-#define FT_BITS_7			(UCHAR) 7
-#define FT_BITS_6			(UCHAR) 6
-#define FT_BITS_5			(UCHAR) 5
-
-//
-// Stop Bits
-//
-
-#define FT_STOP_BITS_1		(UCHAR) 0
-#define FT_STOP_BITS_1_5	(UCHAR) 1
-#define FT_STOP_BITS_2		(UCHAR) 2
-
-//
-// Parity
-//
-
-#define FT_PARITY_NONE		(UCHAR) 0
-#define FT_PARITY_ODD		(UCHAR) 1
-#define FT_PARITY_EVEN		(UCHAR) 2
-#define FT_PARITY_MARK		(UCHAR) 3
-#define FT_PARITY_SPACE		(UCHAR) 4
-
-//
-// Flow Control
-//
-
-#define FT_FLOW_NONE        0x0000
-#define FT_FLOW_RTS_CTS     0x0100
-#define FT_FLOW_DTR_DSR     0x0200
-#define FT_FLOW_XON_XOFF    0x0400
-
-//
-// Purge rx and tx buffers
-//
-#define FT_PURGE_RX         1
-#define FT_PURGE_TX         2
-
-//
-// Events
-//
-
-typedef void (*PFT_EVENT_HANDLER)(DWORD,DWORD);
-
-#define FT_EVENT_RXCHAR		    1
-#define FT_EVENT_MODEM_STATUS   2
-#define FT_EVENT_LINE_STATUS   4
-
-//
-// Timeouts
-//
-
-#define FT_DEFAULT_RX_TIMEOUT   300
-#define FT_DEFAULT_TX_TIMEOUT   300
-
-//
-// Device types
-//
-
-typedef ULONG	FT_DEVICE;
-
-enum {
-    FT_DEVICE_BM,
-    FT_DEVICE_AM,
-    FT_DEVICE_100AX,
-    FT_DEVICE_UNKNOWN,
-    FT_DEVICE_2232C,
-    FT_DEVICE_232R,
-	FT_DEVICE_2232H,
-	FT_DEVICE_4232H
-};
-
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-
-FTD2XX_API
-FT_STATUS WINAPI FT_Open(
-	int deviceNumber,
-	FT_HANDLE *pHandle
-	);
-
-FTD2XX_API
-FT_STATUS WINAPI FT_OpenEx(
-    PVOID pArg1,
-    DWORD Flags,
-    FT_HANDLE *pHandle
-    );
-
-FTD2XX_API 
-FT_STATUS WINAPI FT_ListDevices(
-	PVOID pArg1,
-	PVOID pArg2,
-	DWORD Flags
-	);
-
-FTD2XX_API
-FT_STATUS WINAPI FT_Close(
-    FT_HANDLE ftHandle
-    );
-
-FTD2XX_API
-FT_STATUS WINAPI FT_Read(
-    FT_HANDLE ftHandle,
-    LPVOID lpBuffer,
-    DWORD dwBytesToRead,
-    LPDWORD lpBytesReturned
-    );
-
-FTD2XX_API 
-FT_STATUS WINAPI FT_Write(
-    FT_HANDLE ftHandle,
-    LPVOID lpBuffer,
-    DWORD dwBytesToWrite,
-    LPDWORD lpBytesWritten
-    );
-
-FTD2XX_API 
-FT_STATUS WINAPI FT_IoCtl(
-    FT_HANDLE ftHandle,
-    DWORD dwIoControlCode,
-    LPVOID lpInBuf,
-    DWORD nInBufSize,
-    LPVOID lpOutBuf,
-    DWORD nOutBufSize,
-    LPDWORD lpBytesReturned,
-    LPOVERLAPPED lpOverlapped
-    );
-
-FTD2XX_API
-FT_STATUS WINAPI FT_SetBaudRate(
-    FT_HANDLE ftHandle,
-	ULONG BaudRate
-	);
-
-FTD2XX_API
-FT_STATUS WINAPI FT_SetDivisor(
-    FT_HANDLE ftHandle,
-	USHORT Divisor
-	);
-
-FTD2XX_API
-FT_STATUS WINAPI FT_SetDataCharacteristics(
-    FT_HANDLE ftHandle,
-	UCHAR WordLength,
-	UCHAR StopBits,
-	UCHAR Parity
-	);
-
-FTD2XX_API
-FT_STATUS WINAPI FT_SetFlowControl(
-    FT_HANDLE ftHandle,
-    USHORT FlowControl,
-    UCHAR XonChar,
-    UCHAR XoffChar
-	);
-
-FTD2XX_API
-FT_STATUS WINAPI FT_ResetDevice(
-    FT_HANDLE ftHandle
-	);
-
-FTD2XX_API
-FT_STATUS WINAPI FT_SetDtr(
-    FT_HANDLE ftHandle
-	);
-
-FTD2XX_API
-FT_STATUS WINAPI FT_ClrDtr(
-    FT_HANDLE ftHandle
-	);
-
-FTD2XX_API
-FT_STATUS WINAPI FT_SetRts(
-    FT_HANDLE ftHandle
-	);
-
-FTD2XX_API
-FT_STATUS WINAPI FT_ClrRts(
-    FT_HANDLE ftHandle
-	);
-
-FTD2XX_API
-FT_STATUS WINAPI FT_GetModemStatus(
-    FT_HANDLE ftHandle,
-	ULONG *pModemStatus
-	);
-
-FTD2XX_API
-FT_STATUS WINAPI FT_SetChars(
-    FT_HANDLE ftHandle,
-	UCHAR EventChar,
-	UCHAR EventCharEnabled,
-	UCHAR ErrorChar,
-	UCHAR ErrorCharEnabled
-    );
-
-FTD2XX_API
-FT_STATUS WINAPI FT_Purge(
-    FT_HANDLE ftHandle,
-	ULONG Mask
-	);
-
-FTD2XX_API
-FT_STATUS WINAPI FT_SetTimeouts(
-    FT_HANDLE ftHandle,
-	ULONG ReadTimeout,
-	ULONG WriteTimeout
-	);
-
-FTD2XX_API
-FT_STATUS WINAPI FT_GetQueueStatus(
-    FT_HANDLE ftHandle,
-	DWORD *dwRxBytes
-	);
-
-FTD2XX_API
-FT_STATUS WINAPI FT_SetEventNotification(
-    FT_HANDLE ftHandle,
-	DWORD Mask,
-	PVOID Param
-	);
-
-FTD2XX_API
-FT_STATUS WINAPI FT_GetStatus(
-    FT_HANDLE ftHandle,
-    DWORD *dwRxBytes,
-    DWORD *dwTxBytes,
-    DWORD *dwEventDWord
-	);
-
-FTD2XX_API
-FT_STATUS WINAPI FT_SetBreakOn(
-    FT_HANDLE ftHandle
-    );
-
-FTD2XX_API
-FT_STATUS WINAPI FT_SetBreakOff(
-    FT_HANDLE ftHandle
-    );
-
-FTD2XX_API
-FT_STATUS WINAPI FT_SetWaitMask(
-    FT_HANDLE ftHandle,
-    DWORD Mask
-    );
-
-FTD2XX_API
-FT_STATUS WINAPI FT_WaitOnMask(
-    FT_HANDLE ftHandle,
-    DWORD *Mask
-    );
-
-FTD2XX_API
-FT_STATUS WINAPI FT_GetEventStatus(
-    FT_HANDLE ftHandle,
-    DWORD *dwEventDWord
-    );
-
-FTD2XX_API
-FT_STATUS WINAPI FT_ReadEE(
-    FT_HANDLE ftHandle,
-	DWORD dwWordOffset,
-    LPWORD lpwValue
-	);
-
-FTD2XX_API
-FT_STATUS WINAPI FT_WriteEE(
-    FT_HANDLE ftHandle,
-	DWORD dwWordOffset,
-    WORD wValue
-	);
-
-FTD2XX_API
-FT_STATUS WINAPI FT_EraseEE(
-    FT_HANDLE ftHandle
-	);
-
-//
-// structure to hold program data for FT_Program function
-//
-typedef struct ft_program_data {
-
-	DWORD Signature1;			// Header - must be 0x00000000 
-	DWORD Signature2;			// Header - must be 0xffffffff
-	DWORD Version;				// Header - FT_PROGRAM_DATA version
-								//          0 = original
-	                            //          1 = FT2232C extensions
-								//			2 = FT232R extensions
-								//			3 = FT2232H extensions
-								//			4 = FT4232H extensions
-
-	WORD VendorId;				// 0x0403
-	WORD ProductId;				// 0x6001
-	char *Manufacturer;			// "FTDI"
-	char *ManufacturerId;		// "FT"
-	char *Description;			// "USB HS Serial Converter"
-	char *SerialNumber;			// "FT000001" if fixed, or NULL
-	WORD MaxPower;				// 0 < MaxPower <= 500
-	WORD PnP;					// 0 = disabled, 1 = enabled
-	WORD SelfPowered;			// 0 = bus powered, 1 = self powered
-	WORD RemoteWakeup;			// 0 = not capable, 1 = capable
-	//
-	// Rev4 (FT232B) extensions
-	//
-	UCHAR Rev4;					// non-zero if Rev4 chip, zero otherwise
-	UCHAR IsoIn;				// non-zero if in endpoint is isochronous
-	UCHAR IsoOut;				// non-zero if out endpoint is isochronous
-	UCHAR PullDownEnable;		// non-zero if pull down enabled
-	UCHAR SerNumEnable;			// non-zero if serial number to be used
-	UCHAR USBVersionEnable;		// non-zero if chip uses USBVersion
-	WORD USBVersion;			// BCD (0x0200 => USB2)
-	//
-	// Rev 5 (FT2232) extensions
-	//
-	UCHAR Rev5;					// non-zero if Rev5 chip, zero otherwise
-	UCHAR IsoInA;				// non-zero if in endpoint is isochronous
-	UCHAR IsoInB;				// non-zero if in endpoint is isochronous
-	UCHAR IsoOutA;				// non-zero if out endpoint is isochronous
-	UCHAR IsoOutB;				// non-zero if out endpoint is isochronous
-	UCHAR PullDownEnable5;		// non-zero if pull down enabled
-	UCHAR SerNumEnable5;		// non-zero if serial number to be used
-	UCHAR USBVersionEnable5;	// non-zero if chip uses USBVersion
-	WORD USBVersion5;			// BCD (0x0200 => USB2)
-	UCHAR AIsHighCurrent;		// non-zero if interface is high current
-	UCHAR BIsHighCurrent;		// non-zero if interface is high current
-	UCHAR IFAIsFifo;			// non-zero if interface is 245 FIFO
-	UCHAR IFAIsFifoTar;			// non-zero if interface is 245 FIFO CPU target
-	UCHAR IFAIsFastSer;			// non-zero if interface is Fast serial
-	UCHAR AIsVCP;				// non-zero if interface is to use VCP drivers
-	UCHAR IFBIsFifo;			// non-zero if interface is 245 FIFO
-	UCHAR IFBIsFifoTar;			// non-zero if interface is 245 FIFO CPU target
-	UCHAR IFBIsFastSer;			// non-zero if interface is Fast serial
-	UCHAR BIsVCP;				// non-zero if interface is to use VCP drivers
-	//
-	// Rev 6 (FT232R) extensions
-	//
-	UCHAR UseExtOsc;			// Use External Oscillator
-	UCHAR HighDriveIOs;			// High Drive I/Os
-	UCHAR EndpointSize;			// Endpoint size
-	UCHAR PullDownEnableR;		// non-zero if pull down enabled
-	UCHAR SerNumEnableR;		// non-zero if serial number to be used
-	UCHAR InvertTXD;			// non-zero if invert TXD
-	UCHAR InvertRXD;			// non-zero if invert RXD
-	UCHAR InvertRTS;			// non-zero if invert RTS
-	UCHAR InvertCTS;			// non-zero if invert CTS
-	UCHAR InvertDTR;			// non-zero if invert DTR
-	UCHAR InvertDSR;			// non-zero if invert DSR
-	UCHAR InvertDCD;			// non-zero if invert DCD
-	UCHAR InvertRI;				// non-zero if invert RI
-	UCHAR Cbus0;				// Cbus Mux control
-	UCHAR Cbus1;				// Cbus Mux control
-	UCHAR Cbus2;				// Cbus Mux control
-	UCHAR Cbus3;				// Cbus Mux control
-	UCHAR Cbus4;				// Cbus Mux control
-	UCHAR RIsD2XX;				// non-zero if using D2XX driver
-	//
-	// Rev 7 (FT2232H) Extensions
-	//
-	UCHAR PullDownEnable7;		// non-zero if pull down enabled
-	UCHAR SerNumEnable7;		// non-zero if serial number to be used
-	UCHAR ALSlowSlew;			// non-zero if AL pins have slow slew
-	UCHAR ALSchmittInput;		// non-zero if AL pins are Schmitt input
-	UCHAR ALDriveCurrent;		// valid values are 4mA, 8mA, 12mA, 16mA
-	UCHAR AHSlowSlew;			// non-zero if AH pins have slow slew
-	UCHAR AHSchmittInput;		// non-zero if AH pins are Schmitt input
-	UCHAR AHDriveCurrent;		// valid values are 4mA, 8mA, 12mA, 16mA
-	UCHAR BLSlowSlew;			// non-zero if BL pins have slow slew
-	UCHAR BLSchmittInput;		// non-zero if BL pins are Schmitt input
-	UCHAR BLDriveCurrent;		// valid values are 4mA, 8mA, 12mA, 16mA
-	UCHAR BHSlowSlew;			// non-zero if BH pins have slow slew
-	UCHAR BHSchmittInput;		// non-zero if BH pins are Schmitt input
-	UCHAR BHDriveCurrent;		// valid values are 4mA, 8mA, 12mA, 16mA
-	UCHAR IFAIsFifo7;			// non-zero if interface is 245 FIFO
-	UCHAR IFAIsFifoTar7;		// non-zero if interface is 245 FIFO CPU target
-	UCHAR IFAIsFastSer7;		// non-zero if interface is Fast serial
-	UCHAR AIsVCP7;				// non-zero if interface is to use VCP drivers
-	UCHAR IFBIsFifo7;			// non-zero if interface is 245 FIFO
-	UCHAR IFBIsFifoTar7;		// non-zero if interface is 245 FIFO CPU target
-	UCHAR IFBIsFastSer7;		// non-zero if interface is Fast serial
-	UCHAR BIsVCP7;				// non-zero if interface is to use VCP drivers
-	UCHAR PowerSaveEnable;		// non-zero if using BCBUS7 to save power for self-powered designs
-	//
-	// Rev 8 (FT4232H) Extensions
-	//
-	UCHAR PullDownEnable8;		// non-zero if pull down enabled
-	UCHAR SerNumEnable8;		// non-zero if serial number to be used
-	UCHAR ASlowSlew;			// non-zero if AL pins have slow slew
-	UCHAR ASchmittInput;		// non-zero if AL pins are Schmitt input
-	UCHAR ADriveCurrent;		// valid values are 4mA, 8mA, 12mA, 16mA
-	UCHAR BSlowSlew;			// non-zero if AH pins have slow slew
-	UCHAR BSchmittInput;		// non-zero if AH pins are Schmitt input
-	UCHAR BDriveCurrent;		// valid values are 4mA, 8mA, 12mA, 16mA
-	UCHAR CSlowSlew;			// non-zero if BL pins have slow slew
-	UCHAR CSchmittInput;		// non-zero if BL pins are Schmitt input
-	UCHAR CDriveCurrent;		// valid values are 4mA, 8mA, 12mA, 16mA
-	UCHAR DSlowSlew;			// non-zero if BH pins have slow slew
-	UCHAR DSchmittInput;		// non-zero if BH pins are Schmitt input
-	UCHAR DDriveCurrent;		// valid values are 4mA, 8mA, 12mA, 16mA
-	UCHAR ARIIsTXDEN;			// non-zero if port A uses RI as RS485 TXDEN
-	UCHAR BRIIsTXDEN;			// non-zero if port B uses RI as RS485 TXDEN
-	UCHAR CRIIsTXDEN;			// non-zero if port C uses RI as RS485 TXDEN
-	UCHAR DRIIsTXDEN;			// non-zero if port D uses RI as RS485 TXDEN
-	UCHAR AIsVCP8;				// non-zero if interface is to use VCP drivers
-	UCHAR BIsVCP8;				// non-zero if interface is to use VCP drivers
-	UCHAR CIsVCP8;				// non-zero if interface is to use VCP drivers
-	UCHAR DIsVCP8;				// non-zero if interface is to use VCP drivers
-
-} FT_PROGRAM_DATA, *PFT_PROGRAM_DATA;
-
-FTD2XX_API
-FT_STATUS WINAPI FT_EE_Program(
-    FT_HANDLE ftHandle,
-	PFT_PROGRAM_DATA pData
-	);
-
-FTD2XX_API
-FT_STATUS WINAPI FT_EE_ProgramEx(
-    FT_HANDLE ftHandle,
-	PFT_PROGRAM_DATA pData,
-	char *Manufacturer,
-	char *ManufacturerId,
-	char *Description,
-	char *SerialNumber
-	);
-
-FTD2XX_API
-FT_STATUS WINAPI FT_EE_Read(
-    FT_HANDLE ftHandle,
-	PFT_PROGRAM_DATA pData
-	);
-
-FTD2XX_API
-FT_STATUS WINAPI FT_EE_ReadEx(
-    FT_HANDLE ftHandle,
-	PFT_PROGRAM_DATA pData,
-	char *Manufacturer,
-	char *ManufacturerId,
-	char *Description,
-	char *SerialNumber
-	);
-
-FTD2XX_API
-FT_STATUS WINAPI FT_EE_UASize(
-    FT_HANDLE ftHandle,
-	LPDWORD lpdwSize
-	);
-
-FTD2XX_API
-FT_STATUS WINAPI FT_EE_UAWrite(
-    FT_HANDLE ftHandle,
-	PUCHAR pucData,
-	DWORD dwDataLen
-	);
-
-FTD2XX_API
-FT_STATUS WINAPI FT_EE_UARead(
-    FT_HANDLE ftHandle,
-	PUCHAR pucData,
-	DWORD dwDataLen,
-	LPDWORD lpdwBytesRead
-	);
-
-FTD2XX_API
-FT_STATUS WINAPI FT_SetLatencyTimer(
-    FT_HANDLE ftHandle,
-    UCHAR ucLatency
-    );
-
-FTD2XX_API
-FT_STATUS WINAPI FT_GetLatencyTimer(
-    FT_HANDLE ftHandle,
-    PUCHAR pucLatency
-    );
-
-FTD2XX_API
-FT_STATUS WINAPI FT_SetBitMode(
-    FT_HANDLE ftHandle,
-    UCHAR ucMask,
-	UCHAR ucEnable
-    );
-
-FTD2XX_API
-FT_STATUS WINAPI FT_GetBitMode(
-    FT_HANDLE ftHandle,
-    PUCHAR pucMode
-    );
-
-FTD2XX_API
-FT_STATUS WINAPI FT_SetUSBParameters(
-    FT_HANDLE ftHandle,
-    ULONG ulInTransferSize,
-    ULONG ulOutTransferSize
-	);
-
-FTD2XX_API
-FT_STATUS WINAPI FT_SetDeadmanTimeout(
-    FT_HANDLE ftHandle,
-	ULONG ulDeadmanTimeout
-    );
-
-FTD2XX_API
-FT_STATUS WINAPI FT_GetDeviceInfo(
-    FT_HANDLE ftHandle,
-    FT_DEVICE *lpftDevice,
-	LPDWORD lpdwID,
-	PCHAR SerialNumber,
-	PCHAR Description,
-	LPVOID Dummy
-    );
-
-FTD2XX_API
-FT_STATUS WINAPI FT_StopInTask(
-    FT_HANDLE ftHandle
-    );
-
-FTD2XX_API
-FT_STATUS WINAPI FT_RestartInTask(
-    FT_HANDLE ftHandle
-    );
-
-FTD2XX_API
-FT_STATUS WINAPI FT_SetResetPipeRetryCount(
-    FT_HANDLE ftHandle,
-	DWORD dwCount
-    );
-
-FTD2XX_API
-FT_STATUS WINAPI FT_ResetPort(
-    FT_HANDLE ftHandle
-    );
-
-FTD2XX_API
-FT_STATUS WINAPI FT_CyclePort(
-    FT_HANDLE ftHandle
-    );
-
-
-//
-// Win32-type functions
-//
-
-FTD2XX_API
-FT_HANDLE WINAPI FT_W32_CreateFile(
-	LPCTSTR					lpszName,
-	DWORD					dwAccess,
-	DWORD					dwShareMode,
-	LPSECURITY_ATTRIBUTES	lpSecurityAttributes,
-	DWORD					dwCreate,
-	DWORD					dwAttrsAndFlags,
-	HANDLE					hTemplate
-	);
-
-FTD2XX_API
-BOOL WINAPI FT_W32_CloseHandle(
-    FT_HANDLE ftHandle
-	);
-
-FTD2XX_API
-BOOL WINAPI FT_W32_ReadFile(
-    FT_HANDLE ftHandle,
-    LPVOID lpBuffer,
-    DWORD nBufferSize,
-    LPDWORD lpBytesReturned,
-	LPOVERLAPPED lpOverlapped
-    );
-
-FTD2XX_API
-BOOL WINAPI FT_W32_WriteFile(
-    FT_HANDLE ftHandle,
-    LPVOID lpBuffer,
-    DWORD nBufferSize,
-    LPDWORD lpBytesWritten,
-	LPOVERLAPPED lpOverlapped
-    );
-
-FTD2XX_API
-DWORD WINAPI FT_W32_GetLastError(
-    FT_HANDLE ftHandle
-    );
-
-FTD2XX_API
-BOOL WINAPI FT_W32_GetOverlappedResult(
-    FT_HANDLE ftHandle,
-	LPOVERLAPPED lpOverlapped,
-    LPDWORD lpdwBytesTransferred,
-	BOOL bWait
-    );
-
-FTD2XX_API
-BOOL WINAPI FT_W32_CancelIo(
-    FT_HANDLE ftHandle
-    );
-
-
-//
-// Win32 COMM API type functions
-//
-typedef struct _FTCOMSTAT {
-    DWORD fCtsHold : 1;
-    DWORD fDsrHold : 1;
-    DWORD fRlsdHold : 1;
-    DWORD fXoffHold : 1;
-    DWORD fXoffSent : 1;
-    DWORD fEof : 1;
-    DWORD fTxim : 1;
-    DWORD fReserved : 25;
-    DWORD cbInQue;
-    DWORD cbOutQue;
-} FTCOMSTAT, *LPFTCOMSTAT;
-
-typedef struct _FTDCB {
-    DWORD DCBlength;      /* sizeof(FTDCB)                   */
-    DWORD BaudRate;       /* Baudrate at which running       */
-    DWORD fBinary: 1;     /* Binary Mode (skip EOF check)    */
-    DWORD fParity: 1;     /* Enable parity checking          */
-    DWORD fOutxCtsFlow:1; /* CTS handshaking on output       */
-    DWORD fOutxDsrFlow:1; /* DSR handshaking on output       */
-    DWORD fDtrControl:2;  /* DTR Flow control                */
-    DWORD fDsrSensitivity:1; /* DSR Sensitivity              */
-    DWORD fTXContinueOnXoff: 1; /* Continue TX when Xoff sent */
-    DWORD fOutX: 1;       /* Enable output X-ON/X-OFF        */
-    DWORD fInX: 1;        /* Enable input X-ON/X-OFF         */
-    DWORD fErrorChar: 1;  /* Enable Err Replacement          */
-    DWORD fNull: 1;       /* Enable Null stripping           */
-    DWORD fRtsControl:2;  /* Rts Flow control                */
-    DWORD fAbortOnError:1; /* Abort all reads and writes on Error */
-    DWORD fDummy2:17;     /* Reserved                        */
-    WORD wReserved;       /* Not currently used              */
-    WORD XonLim;          /* Transmit X-ON threshold         */
-    WORD XoffLim;         /* Transmit X-OFF threshold        */
-    BYTE ByteSize;        /* Number of bits/byte, 4-8        */
-    BYTE Parity;          /* 0-4=None,Odd,Even,Mark,Space    */
-    BYTE StopBits;        /* 0,1,2 = 1, 1.5, 2               */
-    char XonChar;         /* Tx and Rx X-ON character        */
-    char XoffChar;        /* Tx and Rx X-OFF character       */
-    char ErrorChar;       /* Error replacement char          */
-    char EofChar;         /* End of Input character          */
-    char EvtChar;         /* Received Event character        */
-    WORD wReserved1;      /* Fill for now.                   */
-} FTDCB, *LPFTDCB;
-
-typedef struct _FTTIMEOUTS {
-    DWORD ReadIntervalTimeout;          /* Maximum time between read chars. */
-    DWORD ReadTotalTimeoutMultiplier;   /* Multiplier of characters.        */
-    DWORD ReadTotalTimeoutConstant;     /* Constant in milliseconds.        */
-    DWORD WriteTotalTimeoutMultiplier;  /* Multiplier of characters.        */
-    DWORD WriteTotalTimeoutConstant;    /* Constant in milliseconds.        */
-} FTTIMEOUTS,*LPFTTIMEOUTS;
-
-
-FTD2XX_API
-BOOL WINAPI FT_W32_ClearCommBreak(
-    FT_HANDLE ftHandle
-	);
-
-FTD2XX_API
-BOOL WINAPI FT_W32_ClearCommError(
-    FT_HANDLE ftHandle,
-	LPDWORD lpdwErrors,
-    LPFTCOMSTAT lpftComstat
-	);
-
-FTD2XX_API
-BOOL WINAPI FT_W32_EscapeCommFunction(
-    FT_HANDLE ftHandle,
-	DWORD dwFunc
-	);
-
-FTD2XX_API
-BOOL WINAPI FT_W32_GetCommModemStatus(
-    FT_HANDLE ftHandle,
-	LPDWORD lpdwModemStatus
-	);
-
-FTD2XX_API
-BOOL WINAPI FT_W32_GetCommState(
-    FT_HANDLE ftHandle,
-    LPFTDCB lpftDcb
-	);
-
-FTD2XX_API
-BOOL WINAPI FT_W32_GetCommTimeouts(
-    FT_HANDLE ftHandle,
-    FTTIMEOUTS *pTimeouts
-	);
-
-FTD2XX_API
-BOOL WINAPI FT_W32_PurgeComm(
-    FT_HANDLE ftHandle,
-	DWORD dwMask
-	);
-
-FTD2XX_API
-BOOL WINAPI FT_W32_SetCommBreak(
-    FT_HANDLE ftHandle
-	);
-
-FTD2XX_API
-BOOL WINAPI FT_W32_SetCommMask(
-    FT_HANDLE ftHandle,
-    ULONG ulEventMask
-    );
-
-FTD2XX_API
-BOOL WINAPI FT_W32_GetCommMask(
-    FT_HANDLE ftHandle,
-    LPDWORD lpdwEventMask
-    );
-
-FTD2XX_API
-BOOL WINAPI FT_W32_SetCommState(
-    FT_HANDLE ftHandle,
-    LPFTDCB lpftDcb
-	);
-
-FTD2XX_API
-BOOL WINAPI FT_W32_SetCommTimeouts(
-    FT_HANDLE ftHandle,
-    FTTIMEOUTS *pTimeouts
-	);
-
-FTD2XX_API
-BOOL WINAPI FT_W32_SetupComm(
-    FT_HANDLE ftHandle,
-	DWORD dwReadBufferSize,
-	DWORD dwWriteBufferSize
-	);
-
-FTD2XX_API
-BOOL WINAPI FT_W32_WaitCommEvent(
-    FT_HANDLE ftHandle,
-    PULONG pulEvent,
-	LPOVERLAPPED lpOverlapped
-    );
-
-
-//
-// Device information
-//
-
-typedef struct _ft_device_list_info_node {
-	ULONG Flags;
-    ULONG Type;
-	ULONG ID;
-	DWORD LocId;
-	char SerialNumber[16];
-	char Description[64];
-	FT_HANDLE ftHandle;
-} FT_DEVICE_LIST_INFO_NODE;
-
-// Device information flags
-enum {
-	FT_FLAGS_OPENED = 1,
-	FT_FLAGS_HISPEED = 2
-};
-
-
-FTD2XX_API
-FT_STATUS WINAPI FT_CreateDeviceInfoList(
-	LPDWORD lpdwNumDevs
-	);
-
-FTD2XX_API
-FT_STATUS WINAPI FT_GetDeviceInfoList(
-	FT_DEVICE_LIST_INFO_NODE *pDest,
-	LPDWORD lpdwNumDevs
-	);
-
-FTD2XX_API
-FT_STATUS WINAPI FT_GetDeviceInfoDetail(
-	DWORD dwIndex,
-	LPDWORD lpdwFlags,
-	LPDWORD lpdwType,
-	LPDWORD lpdwID,
-	LPDWORD lpdwLocId,
-	LPVOID lpSerialNumber,
-	LPVOID lpDescription,
-	FT_HANDLE *pftHandle
-	);
-
-
-//
-// Version information
-//
-
-FTD2XX_API
-FT_STATUS WINAPI FT_GetDriverVersion(
-    FT_HANDLE ftHandle,
-	LPDWORD lpdwVersion
-	);
-
-FTD2XX_API
-FT_STATUS WINAPI FT_GetLibraryVersion(
-	LPDWORD lpdwVersion
-	);
-
-
-FTD2XX_API
-FT_STATUS WINAPI FT_Rescan(
-	void
-	);
-
-FTD2XX_API
-FT_STATUS WINAPI FT_Reload(
-	WORD wVid,
-	WORD wPid
-	);
-
-FTD2XX_API
-FT_STATUS WINAPI FT_GetComPortNumber(
-    FT_HANDLE ftHandle,
-	LPLONG	lpdwComPortNumber
-	);
-
-
-
-#ifdef __cplusplus
-}
-#endif
-
-
-#endif  /* FTD2XX_H */
-
diff --git a/telldus-core/tdadmin/05-tellstick.rules b/telldus-core/tdadmin/05-tellstick.rules
deleted file mode 100644
index b450b35f..00000000
--- a/telldus-core/tdadmin/05-tellstick.rules
+++ /dev/null
@@ -1,3 +0,0 @@
-ATTRS{idVendor}=="1781", SUBSYSTEM=="usb", ACTION=="add", MODE="664", GROUP="plugdev", ENV{ID_VENDOR_ID}="$attr{idVendor}", ENV{ID_MODEL_ID}="$attr{idProduct}", ENV{ID_SERIAL_SHORT}="$attr{serial}", RUN+="@CMAKE_INSTALL_PREFIX@/share/telldus-core/helpers/udev.sh"
-ENV{ID_VENDOR_ID}=="1781", SUBSYSTEM=="usb", ACTION=="remove", ENV{ID_VENDOR_ID}="$attr{idVendor}", ENV{ID_MODEL_ID}="$attr{idProduct}", ENV{ID_SERIAL_SHORT}="$attr{serial}", RUN+="@CMAKE_INSTALL_PREFIX@/share/telldus-core/helpers/udev.sh"
-
diff --git a/telldus-core/tdadmin/CMakeLists.txt b/telldus-core/tdadmin/CMakeLists.txt
deleted file mode 100644
index 7c72b26b..00000000
--- a/telldus-core/tdadmin/CMakeLists.txt
+++ /dev/null
@@ -1,79 +0,0 @@
-PROJECT(tdadmin)
-
-cmake_policy(SET CMP0005 NEW)
-
-SET (tdadmin_DESCRIPTION
-	"a command line utility to edit devices and controllers for Telldus TellStick"
-)
-
-SET(tdadmin_SRCS
-	main.cpp
-)
-
-ADD_EXECUTABLE(tdadmin
-	${tdadmin_SRCS}
-)
-
-INCLUDE_DIRECTORIES(
-	${CMAKE_CURRENT_BINARY_DIR}
-	${CMAKE_SOURCE_DIR}/driver
-)
-
-ADD_DEFINITIONS( -DVERSION="${DISPLAYED_VERSION}" )
-
-IF (WIN32)
-	FIND_LIBRARY(TELLDUSCORE_LIBRARY TelldusCore)
-	TARGET_LINK_LIBRARIES(tdadmin
-		${TELLDUSCORE_LIBRARY}
-	)
-ELSEIF (APPLE)
-	TARGET_LINK_LIBRARIES(tdadmin
-		TelldusCore
-	)
-ELSEIF (CMAKE_SYSTEM_NAME MATCHES "FreeBSD")
-	# FreeBSD does not have argp in base libc; port devel/argp-standalone is required.
-	FIND_LIBRARY(ARGP_LIBRARY argp)
-	TARGET_LINK_LIBRARIES(tdadmin
-		${CMAKE_BINARY_DIR}/client/libtelldus-core.so
-		${ARGP_LIBRARY}
-	)
-ELSE (WIN32)
-	TARGET_LINK_LIBRARIES(tdadmin
-		${CMAKE_BINARY_DIR}/client/libtelldus-core.so
-	)
-ENDIF (WIN32)
-
-IF (UNIX)
-	IF (GENERATE_MAN)
-		ADD_CUSTOM_COMMAND(
-			TARGET tdadmin
-			POST_BUILD
-			COMMAND help2man -n ${tdadmin_DESCRIPTION} ./tdadmin > tdadmin.1
-			WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
-			COMMENT "Generating man file tdadmin.1"
-		)
-		INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/tdadmin.1 DESTINATION share/man/man1)
-	ENDIF (GENERATE_MAN)
-ENDIF (UNIX)
-
-INSTALL(TARGETS tdadmin RUNTIME DESTINATION sbin)
-
-IF (UNIX AND NOT APPLE)
-	SET(UDEV_RULES_DIR	"/etc/udev/rules.d" CACHE PATH "The directory where udev store its rules" )
-	CONFIGURE_FILE(
-		${CMAKE_CURRENT_SOURCE_DIR}/05-tellstick.rules
-		${CMAKE_BINARY_DIR}/parsed/05-tellstick.rules
-		@ONLY
-	)
-	CONFIGURE_FILE(
-		${CMAKE_CURRENT_SOURCE_DIR}/udev.sh
-		${CMAKE_BINARY_DIR}/parsed/udev.sh
-		@ONLY
-	)
-	INSTALL(FILES ${CMAKE_BINARY_DIR}/parsed/05-tellstick.rules
-		DESTINATION ${UDEV_RULES_DIR}
-	)
-	INSTALL(PROGRAMS ${CMAKE_BINARY_DIR}/parsed/udev.sh
-		DESTINATION share/telldus-core/helpers/
-	)
-ENDIF (UNIX AND NOT APPLE)
diff --git a/telldus-core/tdadmin/main.cpp b/telldus-core/tdadmin/main.cpp
deleted file mode 100644
index 66f7fcb0..00000000
--- a/telldus-core/tdadmin/main.cpp
+++ /dev/null
@@ -1,88 +0,0 @@
-#include "../client/telldus-core.h"
-#include 
-#include 
-#include 
-#include 
-
-const char *argp_program_version = "tdadmin " VERSION ;
-const char *argp_program_bug_address = "";
-
-static char args_doc[] = "COMMAND ACTION";
-
-static char doc[] = "TellStick admin tool -- a command line utility to edit devices and controllers for Telldus TellStick";
-
-const int VID = 1;
-const int PID = 2;
-const int SERIAL = 3;
-
-static struct argp_option options[] = {
-	{0,0,0,0,
-		"COMMAND: controller, ACTION: connect/disconnect\n"
-		"Tells the daemon to add or remove a TellStick (duo)"
-	},
-	{"vid",VID,"VID",0, "The vendor id (1781)" },
-	{"pid",PID,"PID",0,"The product id (0c30 or 0c31)" },
-	{"serial",SERIAL,"SERIAL",0,"The usb serial number" },
-	{ 0 }
-};
-
-static std::string command, action;
-
-int vid, pid;
-static std::string serial;
-
-static error_t parse_opt (int key, char *arg, struct argp_state *state) {
-	switch (key) {
-		case PID:
-			pid = strtol(arg, NULL, 16);
-			break;
-		case SERIAL:
-			serial = arg;
-			break;
-		case VID:
-			vid = strtol(arg, NULL, 16);
-			break;
-
-		case ARGP_KEY_NO_ARGS:
-			argp_usage (state);
-
-		case ARGP_KEY_ARG:
-			if (state->next == state->argc) {
-				argp_usage (state);
-			}
-			command = arg;
-			action = state->argv[state->next];
-			state->next = state->argc;
-
-			break;
-
-	default:
-		return ARGP_ERR_UNKNOWN;
-	 }
-	return 0;
-}
-
-static struct argp argp = { options, parse_opt, args_doc, doc };
-
-void handle_controller(void) {
-	if (vid == 0 || pid == 0) {
-		fprintf(stderr, "Missing parameter vid or pid\n");
-	}
-	if (action.compare("connect") == 0) {
-		tdConnectTellStickController(vid,pid,serial.c_str());
-
-	} else if (action.compare("disconnect") == 0) {
-		tdDisconnectTellStickController(vid,pid,serial.c_str());
-	}
-}
-
-int main(int argc, char **argv) {
-
-	argp_parse (&argp, argc, argv, 0, 0, 0);
-
-	if (command.compare("controller") == 0) {
-		handle_controller();
-	}
-
-	return 0;
-}
diff --git a/telldus-core/tdadmin/udev.sh b/telldus-core/tdadmin/udev.sh
deleted file mode 100755
index 3b935d78..00000000
--- a/telldus-core/tdadmin/udev.sh
+++ /dev/null
@@ -1,9 +0,0 @@
-#!/bin/sh
-
-if [ "${ID_VENDOR_ID}" = "1781" ]; then
-	if [ "${ACTION}" = "add" ]; then
-		@CMAKE_INSTALL_PREFIX@/sbin/tdadmin controller connect --pid=${ID_MODEL_ID} --vid=${ID_VENDOR_ID} --serial=${ID_SERIAL_SHORT}
-	elif [ "${ACTION}" = "remove" ]; then
-		@CMAKE_INSTALL_PREFIX@/sbin/tdadmin controller disconnect --pid=${ID_MODEL_ID} --vid=${ID_VENDOR_ID} --serial=${ID_SERIAL_SHORT}
-	fi
-fi
diff --git a/telldus-core/tdtool/main.cpp b/telldus-core/tdtool/main.cpp
deleted file mode 100644
index b75d281b..00000000
--- a/telldus-core/tdtool/main.cpp
+++ /dev/null
@@ -1,623 +0,0 @@
-#include 
-#include 
-#include 
-#include 
-#include 
-#include 
-#include "../client/telldus-core.h"
-
-#ifdef _WINDOWS
-#define strcasecmp _stricmp
-#define DEGREE " "
-#else
-#define DEGREE "°"
-#endif
-
-const int SUPPORTED_METHODS =
-	TELLSTICK_TURNON |
-	TELLSTICK_TURNOFF |
-	TELLSTICK_BELL |
-	TELLSTICK_DIM;
-
-const int DATA_LENGTH = 20;
-
-void print_usage( char *name ) {
-	printf("Usage: %s [ options ]\n", name);
-	printf("\n");
-	printf("Options:\n");
-	printf("         -[bdefhlnrv] [ --list ] [ --help ]\n");
-	printf("                      [ --list-sensors ] [ --list-devices ]\n");
-	printf("                      [ --on device ] [ --off device ] [ --bell device ]\n");
-	printf("                      [ --learn device ]\n");
-	printf("                      [ --dimlevel level --dim device ]\n");
-	printf("                      [ --raw input ]\n");
-	printf("\n");
-	printf("       --list (-l short option)\n");
-	printf("             List currently configured devices and all discovered sensors.\n");
-	printf("\n");
-	printf("       --list-sensors\n");
-	printf("       --list-devices\n");
-	printf("             Alternative devices/sensors listing:\n");
-	printf("             Shows devices and/or sensors using key=value format (with tabs as\n");
-	printf("             separators, one device/sensor per line, no header lines.)\n");
-	printf("\n");
-	printf("       --help (-h short option)\n");
-	printf("             Shows this screen.\n");
-	printf("\n");
-	printf("       --on device (-n short option)\n");
-	printf("             Turns on device. 'device' could either be an integer of the\n");
-	printf("             device-id, or the name of the device.\n");
-	printf("             Both device-id and name is outputed with the --list option\n");
-	printf("\n");
-	printf("       --off device (-f short option)\n");
-	printf("             Turns off device. 'device' could either be an integer of the\n");
-	printf("             device-id, or the name of the device.\n");
-	printf("             Both device-id and name is outputed with the --list option\n");
-	printf("\n");
-	printf("       --dim device (-d short option)\n");
-	printf("             Dims device. 'device' could either be an integer of the device-id,\n");
-	printf("             or the name of the device.\n");
-	printf("             Both device-id and name is outputed with the --list option\n");
-	printf("             Note: The dimlevel parameter must be set before using this option.\n");
-	printf("\n");
-	printf("       --dimlevel level (-v short option)\n");
-	printf("             Set dim level. 'level' should an integer, 0-255.\n");
-	printf("             Note: This parameter must be set before using dim.\n");
-	printf("\n");
-	printf("       --bell device (-b short option)\n");
-	printf("             Sends bell command to devices supporting this. 'device' could\n");
-	printf("             either be an integer of the device-id, or the name of the device.\n");
-	printf("             Both device-id and name is outputed with the --list option\n");
-	printf("\n");
-	printf("       --learn device (-e short option)\n");
-	printf("             Sends a special learn command to devices supporting this. This is normaly\n");
-	printf("             devices of 'selflearning' type. 'device' could either be an integer\n");
-	printf("             of the device-id, or the name of the device.\n");
-	printf("             Both device-id and name is outputed with the --list option\n");
-	printf("\n");
-	printf("       --raw input (-r short option)\n");
-	printf("             This command sends a raw command to TellStick.\n");
-	printf("             input can be either - or a filename. If input is - the data is\n");
-	printf("             taken from stdin, otherwise the data is taken from the supplied filename.\n");
-	printf("\n");
-	printf("             Example to turn on an ArcTech codeswitch A1:\n");
-	printf("             echo 'S$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$k$kk$$kk$$kk$$}+' | tdtool --raw -\n");
-	printf("\n");
-	printf("Report bugs to \n");
-}
-
-void print_version() {
-	printf("tdtool " VERSION "\n");
-	printf("\n");
-	printf("Copyright (C) 2011 Telldus Technologies AB\n");
-	printf("\n");
-	printf("Written by Micke Prag \n");
-}
-
-void print_device( int index ) {
-	tdInit();
-	int intId = tdGetDeviceId(index);
-	char *name = tdGetName(intId);
-	printf("%i\t%s\t", intId, name);
-	tdReleaseString(name);
-	int lastSentCommand = tdLastSentCommand(intId, SUPPORTED_METHODS);
-	char *level = 0;
-	switch(lastSentCommand) {
-		case TELLSTICK_TURNON:
-			printf("ON");
-			break;
-		case TELLSTICK_TURNOFF:
-			printf("OFF");
-			break;
-		case TELLSTICK_DIM:
-			level = tdLastSentValue(intId);
-			printf("DIMMED:%s", level);
-			tdReleaseString(level);
-			break;
-		default:
-			printf("Unknown state");
-	}
-	printf("\n");
-}
-
-int list_devices() {
-	tdInit();
-	int intNum = tdGetNumberOfDevices();
-	if (intNum < 0) {
-		char *errorString = tdGetErrorString(intNum);
-		fprintf(stderr, "Error fetching devices: %s\n", errorString);
-		tdReleaseString(errorString);
-		return intNum;
-	}
-	printf("Number of devices: %i\n", intNum);
-	int i = 0;
-	while (i < intNum) {
-		print_device( i );
-		i++;
-	}
-
-	char protocol[DATA_LENGTH], model[DATA_LENGTH];
-	int sensorId = 0, dataTypes = 0;
-
-	int sensorStatus = tdSensor(protocol, DATA_LENGTH, model, DATA_LENGTH, &sensorId, &dataTypes);
-	if(sensorStatus == 0){
-		printf("\n\nSENSORS:\n\n%-20s\t%-20s\t%-5s\t%-5s\t%-8s\t%-20s\t%-20s\t%-20s\n", "PROTOCOL", "MODEL", "ID", "TEMP", "HUMIDITY", "RAIN", "WIND", "LAST UPDATED");
-	}
-	while(sensorStatus == 0){
-		char tempvalue[DATA_LENGTH];
-		tempvalue[0] = 0;
-		char humidityvalue[DATA_LENGTH];
-		humidityvalue[0] = 0;
-		char windvalue[DATA_LENGTH];
-		windvalue[0] = 0;
-		char winddirectionvalue[DATA_LENGTH];
-		winddirectionvalue[0] = 0;
-		char windaveragevalue[DATA_LENGTH];
-		windaveragevalue[0] = 0;
-		char windgustvalue[DATA_LENGTH];
-		windgustvalue[0] = 0;
-		char rainvalue[DATA_LENGTH];
-		rainvalue[0] = 0;
-		char raintotvalue[DATA_LENGTH];
-		raintotvalue[0] = 0;
-		char rainratevalue[DATA_LENGTH];
-		rainratevalue[0] = 0;
-		char timeBuf[80];
-		timeBuf[0] = 0;
-		time_t timestamp = 0;
-
-		if (dataTypes & TELLSTICK_TEMPERATURE) {
-			tdSensorValue(protocol, model, sensorId, TELLSTICK_TEMPERATURE, tempvalue, DATA_LENGTH, (int *)×tamp);
-			strcat(tempvalue, DEGREE);
-			strftime(timeBuf, sizeof(timeBuf), "%Y-%m-%d %H:%M:%S", localtime(×tamp));
-		}
-
-		if (dataTypes & TELLSTICK_HUMIDITY) {
-			tdSensorValue(protocol, model, sensorId, TELLSTICK_HUMIDITY, humidityvalue, DATA_LENGTH, (int *)×tamp);
-			strcat(humidityvalue, "%");
-			strftime(timeBuf, sizeof(timeBuf), "%Y-%m-%d %H:%M:%S", localtime(×tamp));
-		}
-
-		if (dataTypes & TELLSTICK_RAINRATE) {
-			tdSensorValue(protocol, model, sensorId, TELLSTICK_RAINRATE, rainratevalue, DATA_LENGTH, (int *)×tamp);
-			strcat(rainratevalue, " mm/h, ");
-			strcat(rainvalue, rainratevalue);
-			strftime(timeBuf, sizeof(timeBuf), "%Y-%m-%d %H:%M:%S", localtime(×tamp));
-		}
-
-		if (dataTypes & TELLSTICK_RAINTOTAL) {
-			tdSensorValue(protocol, model, sensorId, TELLSTICK_RAINTOTAL, raintotvalue, DATA_LENGTH, (int *)×tamp);
-			//TODO detta blir väl fel, kan väl hamna i andra ordningar, eller hur?
-			strcat(raintotvalue, " mm");
-			strcat(rainvalue, raintotvalue);
-			strftime(timeBuf, sizeof(timeBuf), "%Y-%m-%d %H:%M:%S", localtime(×tamp));
-		}
-
-		if (dataTypes & TELLSTICK_WINDDIRECTION) {
-			tdSensorValue(protocol, model, sensorId, TELLSTICK_WINDDIRECTION, winddirectionvalue, DATA_LENGTH, (int *)×tamp);
-			//TODO or use charToInteger in common?
-			std::stringstream inputstream;
-			inputstream << winddirectionvalue;
-			int direction;
-			inputstream >> direction;
-			direction = direction / 22.5;
-			std::string directionabbrev = "N";
-			switch (direction) {
-				case 1:
-					directionabbrev = "NNE";
-					break;
-				case 2:
-					directionabbrev = "NE";
-					break;
-				case 3:
-					directionabbrev = "ENE";
-					break;
-				case 4:
-					directionabbrev = "E";
-					break;
-				case 5:
-					directionabbrev = "ESE";
-					break;
-				case 6:
-					directionabbrev = "SE";
-					break;
-				case 7:
-					directionabbrev = "SSE";
-					break;
-				case 8:
-					directionabbrev = "S";
-					break;
-				case 9:
-					directionabbrev = "SSW";
-					break;
-				case 10:
-					directionabbrev = "SW";
-					break;
-				case 11:
-					directionabbrev = "WSW";
-					break;
-				case 12:
-					directionabbrev = "W";
-					break;
-				case 13:
-					directionabbrev = "WNW";
-					break;
-				case 14:
-					directionabbrev = "NW";
-					break;
-				case 15:
-					directionabbrev = "NNW";
-					break;
-			}
-			strcat(windvalue, directionabbrev.c_str());
-			strcat(windvalue, ", ");
-			strftime(timeBuf, sizeof(timeBuf), "%Y-%m-%d %H:%M:%S", localtime(×tamp));
-		}
-
-		if (dataTypes & TELLSTICK_WINDAVERAGE) {
-			tdSensorValue(protocol, model, sensorId, TELLSTICK_WINDAVERAGE, windaveragevalue, DATA_LENGTH, (int *)×tamp);
-			strcat(windaveragevalue, " m/s (");
-			strcat(windvalue, windaveragevalue);
-			strftime(timeBuf, sizeof(timeBuf), "%Y-%m-%d %H:%M:%S", localtime(×tamp));
-		}
-
-		if (dataTypes & TELLSTICK_WINDGUST) {
-			tdSensorValue(protocol, model, sensorId, TELLSTICK_WINDGUST, windgustvalue, DATA_LENGTH, (int *)×tamp);
-			strcat(windgustvalue, " m/s) ");
-			strcat(windvalue, windgustvalue);
-			strftime(timeBuf, sizeof(timeBuf), "%Y-%m-%d %H:%M:%S", localtime(×tamp));
-		}
-
-		printf("%-20s\t%-20s\t%-5i\t%-5s\t%-8s\t%-20s\t%-20s\t%-20s\n", protocol, model, sensorId, tempvalue, humidityvalue, rainvalue, windvalue, timeBuf);
-
-		sensorStatus = tdSensor(protocol, DATA_LENGTH, model, DATA_LENGTH, &sensorId, &dataTypes);
-	}
-	printf("\n");
-	if(sensorStatus != TELLSTICK_ERROR_DEVICE_NOT_FOUND){
-		char *errorString = tdGetErrorString(sensorStatus);
-		fprintf(stderr, "Error fetching sensors: %s\n", errorString);
-		tdReleaseString(errorString);
-		return sensorStatus;
-	}
-	return TELLSTICK_SUCCESS;
-}
-
-/* list sensors using key=value format, one sensor/line, no header lines
- * and no degree or percent signs attached to the numbers - just
- * plain values. */
-int list_kv_sensors() {
-	char protocol[DATA_LENGTH], model[DATA_LENGTH];
-
-	tdInit();
-	int sensorId = 0, dataTypes = 0;
-	time_t now = 0;
-	int sensorStatus;
-
-	time(&now);
-	while(1) {
-		sensorStatus = tdSensor(protocol, DATA_LENGTH, model, DATA_LENGTH, &sensorId, &dataTypes);
-		if (sensorStatus != 0) break;
-
-		printf("type=sensor\tprotocol=%s\tmodel=%s\tid=%d",
-			protocol, model, sensorId);
-
-		time_t timestamp = 0;
-
-		if (dataTypes & TELLSTICK_TEMPERATURE) {
-			char tempvalue[DATA_LENGTH];
-			tdSensorValue(protocol, model, sensorId, TELLSTICK_TEMPERATURE, tempvalue, DATA_LENGTH, (int *)×tamp);
-			printf("\ttemperature=%s", tempvalue);
-		}
-
-		if (dataTypes & TELLSTICK_HUMIDITY) {
-			char humidityvalue[DATA_LENGTH];
-			tdSensorValue(protocol, model, sensorId, TELLSTICK_HUMIDITY, humidityvalue, DATA_LENGTH, (int *)×tamp);
-			printf("\thumidity=%s", humidityvalue);
-		}
-
-		if (dataTypes & TELLSTICK_WINDDIRECTION) {
-			char winddirectionvalue[DATA_LENGTH];
-			tdSensorValue(protocol, model, sensorId, TELLSTICK_WINDDIRECTION, winddirectionvalue, DATA_LENGTH, (int *)×tamp);
-			printf("\twinddirection=%s", winddirectionvalue);
-		}
-
-		if (dataTypes & TELLSTICK_WINDAVERAGE) {
-			char windaveragevalue[DATA_LENGTH];
-			tdSensorValue(protocol, model, sensorId, TELLSTICK_WINDAVERAGE, windaveragevalue, DATA_LENGTH, (int *)×tamp);
-			printf("\twindaverage=%s", windaveragevalue);
-		}
-
-		if (dataTypes & TELLSTICK_WINDGUST) {
-			char windgustvalue[DATA_LENGTH];
-			tdSensorValue(protocol, model, sensorId, TELLSTICK_WINDGUST, windgustvalue, DATA_LENGTH, (int *)×tamp);
-			printf("\twindgust=%s", windgustvalue);
-		}
-
-		if (dataTypes & TELLSTICK_RAINRATE) {
-			char rainratevalue[DATA_LENGTH];
-			tdSensorValue(protocol, model, sensorId, TELLSTICK_RAINRATE, rainratevalue, DATA_LENGTH, (int *)×tamp);
-			printf("\trainrate=%s", rainratevalue);
-		}
-
-		if (dataTypes & TELLSTICK_RAINTOTAL) {
-			char raintotalvalue[DATA_LENGTH];
-			tdSensorValue(protocol, model, sensorId, TELLSTICK_RAINTOTAL, raintotalvalue, DATA_LENGTH, (int *)×tamp);
-			printf("\traintotal=%s", raintotalvalue);
-		}
-
-		if (dataTypes & (TELLSTICK_TEMPERATURE | TELLSTICK_HUMIDITY)) {
-			/* timestamp has been set, print time & age */
-			/* (age is more useful on e.g. embedded systems
-			 * which may not have real-time clock chips =>
-			 * time is useful only as a relative value) */
-			char timeBuf[80];
-			strftime(timeBuf, sizeof(timeBuf), "%Y-%m-%d %H:%M:%S", localtime(×tamp));
-			printf("\ttime=%s\tage=%d", timeBuf, (int)(now - timestamp));
-		}
-		printf("\n");
-
-	}
-	if(sensorStatus != TELLSTICK_ERROR_DEVICE_NOT_FOUND){
-		char *errorString = tdGetErrorString(sensorStatus);
-		fprintf(stderr, "Error fetching sensors: %s\n", errorString);
-		tdReleaseString(errorString);
-		return sensorStatus;
-	}
-	return TELLSTICK_SUCCESS;
-}
-
-/* list devices using key=value format, one device/line, no header lines */
-int list_kv_devices() {
-	tdInit();
-	int intNum = tdGetNumberOfDevices();
-	if (intNum < 0) {
-		char *errorString = tdGetErrorString(intNum);
-		fprintf(stderr, "Error fetching devices: %s\n", errorString);
-		tdReleaseString(errorString);
-		return intNum;
-	}
-	int index = 0;
-	while (index < intNum) {
-		tdInit();
-		int intId = tdGetDeviceId(index);
-		char *name = tdGetName(intId);
-		printf("type=device\tid=%i\tname=%s", intId, name);
-		tdReleaseString(name);
-
-		int lastSentCommand = tdLastSentCommand(intId, SUPPORTED_METHODS);
-		char *level = 0;
-		switch(lastSentCommand) {
-			case TELLSTICK_TURNON:
-				printf("\tlastsentcommand=ON");
-				break;
-			case TELLSTICK_TURNOFF:
-				printf("\tlastsentcommand=OFF");
-				break;
-			case TELLSTICK_DIM:
-				level = tdLastSentValue(intId);
-				printf("\tlastsentcommand=DIMMED\tdimlevel=%s", level);
-				tdReleaseString(level);
-				break;
-			/* default: state is unknown, print nothing. */
-		}
-		printf("\n");
-		index++;
-	}
-	return TELLSTICK_SUCCESS;
-}
-
-
-int find_device( char *device ) {
-	tdInit();
-	int deviceId = atoi(device);
-	if (deviceId == 0) { //Try to find the id from the name
-		int intNum = tdGetNumberOfDevices();
-		int index = 0;
-		while (index < intNum) {
-			int id = tdGetDeviceId(index);
-			char *name = tdGetName( id );
-			if (strcasecmp(name, device) == 0) {
-				deviceId = id;
- 				tdReleaseString(name);
-				break;
-			}
-			tdReleaseString(name);
-			index++;
-		}
-	}
-	return deviceId;
-}
-
-int switch_device( bool turnOn, char *device ) {
-	tdInit();
-	int deviceId = find_device( device );
-	if (deviceId == 0) {
-		printf("Device '%s', not found!\n", device);
-		return TELLSTICK_ERROR_DEVICE_NOT_FOUND;
-	}
-
-	char *name = tdGetName( deviceId );
-	int deviceType = tdGetDeviceType( deviceId );
-	printf("Turning %s %s %i, %s",
-					(turnOn ? "on" : "off"),
-					(deviceType == TELLSTICK_TYPE_DEVICE ? "device" : "group"),
-					deviceId,
-					name);
-	tdReleaseString(name);
-
-	int retval = (turnOn ? tdTurnOn( deviceId ) : tdTurnOff( deviceId ));
-	char *errorString = tdGetErrorString(retval);
-	
-	printf(" - %s\n", errorString);
-	tdReleaseString(errorString);
-	return retval;
-}
-
-int dim_device( char *device, int level ) {
-	tdInit();
-	int deviceId = find_device( device );
-	if (deviceId == 0) {
-		printf("Device '%s', not found!\n", device);
-		return TELLSTICK_ERROR_DEVICE_NOT_FOUND;
-	}
-	if (level < 0 || level > 255) {
-		printf("Level %i out of range!\n", level);
-		return TELLSTICK_ERROR_SYNTAX;
-	}
-
-	char *name = tdGetName( deviceId );
-	int retval = tdDim( deviceId, (unsigned char)level );
-	char *errorString = tdGetErrorString(retval);
-	printf("Dimming device: %i %s to %i - %s\n", deviceId, name, level, errorString);
-	tdReleaseString(name);
-	tdReleaseString(errorString);
-	return retval;
-}
-
-int bell_device( char *device ) {
-	tdInit();
-	int deviceId = find_device( device );
-	if (deviceId == 0) {
-		printf("Device '%s', not found!\n", device);
-		return TELLSTICK_ERROR_DEVICE_NOT_FOUND;
-	}
-
-	char *name = tdGetName( deviceId );
-	int retval = tdBell( deviceId );
-	char *errorString = tdGetErrorString(retval);
-	printf("Sending bell to: %i %s - %s\n", deviceId, name, errorString);
-	tdReleaseString(name);
-	tdReleaseString(errorString);
-	return retval;
-}
-
-int learn_device( char *device ) {
-	tdInit();
-	int deviceId = find_device( device );
-	if (deviceId == 0) {
-		printf("Device '%s', not found!\n", device);
-		return TELLSTICK_ERROR_DEVICE_NOT_FOUND;
-	}
-
-	char *name = tdGetName( deviceId );
-	int retval = tdLearn( deviceId );
-	char *errorString = tdGetErrorString(retval);
-	printf("Learning device: %i %s - %s\n", deviceId, name, errorString);
-	tdReleaseString(name);
-	tdReleaseString(errorString);
-	return retval;
-}
-
-int send_raw_command( char *command ) {
-	tdInit();
-	const int MAX_LENGTH = 100;
-	char msg[MAX_LENGTH];
-	
-	if (strcmp(command, "-") == 0) {
-		fgets(msg, MAX_LENGTH, stdin);
-	} else {
-		FILE *fd;
-		
-		fd = fopen(command, "r");
-		if (fd == NULL) {
-			printf("Error opening file %s\n", command);
-			return TELLSTICK_ERROR_UNKNOWN;
-		}
-		fgets(msg, MAX_LENGTH, fd);
-		fclose(fd);
-	}
-	
-	int retval = tdSendRawCommand( msg, 0 );	
-	char *errorString = tdGetErrorString(retval);
-	printf("Sending raw command: %s\n", errorString);
-	tdReleaseString(errorString);
-	return retval;
-}
-
-#define LIST_KV_SENSORS 1
-#define LIST_KV_DEVICES 2
-
-int main(int argc, char **argv)
-{
-	int optch, longindex;
-	static char optstring[] = "ln:f:d:b:v:e:r:hi";
-	static struct option long_opts[] = {
-		{ "list", 0, 0, 'l' },
-		{ "list-sensors", 0, 0, LIST_KV_SENSORS },
-		{ "list-devices", 0, 0, LIST_KV_DEVICES },
-		{ "on", 1, 0, 'n' },
-		{ "off", 1, 0, 'f' },
-		{ "dim", 1, 0, 'd' },
-		{ "bell", 1, 0, 'b' },
-		{ "dimlevel", 1, 0, 'v' },
-		{ "learn", 1, 0, 'e' },
-		{ "raw", 1, 0, 'r' },
-		{ "help", 0, 0, 'h' },
-		{ "version", 0, 0, 'i'},
-		{ 0, 0, 0, 0}
-	};
-	int level = -1;
-
-	if (argc < 2) {
-		print_usage( argv[0] );
-		return -TELLSTICK_ERROR_SYNTAX;
-	}
-
-	int returnSuccess = 0;
-	while ( (optch = getopt_long(argc,argv,optstring,long_opts,&longindex)) != -1 ){
-		int success = 0;
-		switch (optch) {
-			case 'b' :
-				success = bell_device( &optarg[0] );
-				break;
-			case 'd' :
-				if (level >= 0) {
-					success = dim_device( &optarg[0], level );
-					break;
-				}
-				printf("Dim level missing or incorrect value.\n");
-				success = TELLSTICK_ERROR_SYNTAX;
-				break;
-			case 'f' :
-				success = switch_device(false, &optarg[0]);
-				break;
-			case 'h' :
-				print_usage( argv[0] );
-				success = TELLSTICK_SUCCESS;
-				break;
-			case 'i' :
-				print_version( );
-				success = TELLSTICK_SUCCESS;
-				break;
-			case 'l' :
-				success = list_devices();
-				break;
-			case LIST_KV_SENSORS:
-				success = list_kv_sensors();
-				break;
-			case LIST_KV_DEVICES:
-				success = list_kv_devices();
-				break;
-			case 'n' :
-				success = switch_device(true, &optarg[0]);
-				break;
-			case 'e' :
-				success = learn_device(&optarg[0]);
-				break;
-			case 'r' :
-				success = send_raw_command(&optarg[0]);
-				break;
-			case 'v' :
-				level = atoi( &optarg[0] );
-				break;
-			default :
-				print_usage( argv[0] );
-				success = TELLSTICK_ERROR_SYNTAX;
-		}
-		if(success != TELLSTICK_SUCCESS){
-			returnSuccess = success;  //return last error message
-		}
-	}
-	tdClose(); //Cleaning up
-	return -returnSuccess;
-}
diff --git a/telldus-core/tests/CMakeLists.txt b/telldus-core/tests/CMakeLists.txt
deleted file mode 100644
index 8cdc4cf7..00000000
--- a/telldus-core/tests/CMakeLists.txt
+++ /dev/null
@@ -1,51 +0,0 @@
-SET(ENABLE_TESTING	FALSE	CACHE BOOL "Enable unit tests")
-
-#We have disabled some of the default tests in the google style guidelines
-# whitespace/tab
-#  We are using tabs for indentation, not spaces, in our code
-#
-# whitespace/parens
-#  We believe grouping of parameters with spaces in some functions could ease the readability
-#
-# whitespace/line_length
-#  Although you should try to keep the lines short it should not be a requirement (at least for now)
-#
-# whitespace/labels
-#  Since we use tabs instead of spaces for indentation, this test makes no sense
-#
-# runtime/rtti
-#  We are using dynamic_cast for the events. We use this to be able to send arbitrary data
-#  trought the events.
-#
-SET(cpplint_filters
-	+whitespace/use_tab_for_indentation,-whitespace/tab,-whitespace/parens,-whitespace/line_length,-whitespace/labels,-runtime/rtti
-)
-
-FUNCTION(ADD_SOURCES TARGET PATH)
-	GET_TARGET_PROPERTY(SOURCES ${TARGET} SOURCES)
-	FOREACH(SOURCE ${SOURCES})
-		LIST(APPEND L ${PATH}/${SOURCE})
-	ENDFOREACH()
-	ADD_TEST(StyleGuidelines-${TARGET} ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/cpplint.py --filter=${cpplint_filters} ${L})
-ENDFUNCTION()
-
-IF(ENABLE_TESTING)
-	INCLUDE(FindPythonInterp)
-	FIND_LIBRARY(CPPUNIT cppunit)
-	ADD_SUBDIRECTORY(common)
-	ADD_SUBDIRECTORY(service)
-
-	ADD_EXECUTABLE(TestRunner cppunit.cpp)
-	TARGET_LINK_LIBRARIES(TestRunner cppunit TelldusCommonTests TelldusServiceTests)
-	ADD_DEPENDENCIES(TestRunner TelldusCommonTests TelldusServiceTests)
-
-	ADD_SOURCES(TelldusCommon ${CMAKE_SOURCE_DIR}/common)
-	ADD_SOURCES(${telldus-core_TARGET} ${CMAKE_SOURCE_DIR}/client)
-	ADD_SOURCES(${telldus-service_TARGET} ${CMAKE_SOURCE_DIR}/service)
-
-	ADD_TEST(cppunit ${CMAKE_CURRENT_BINARY_DIR}/TestRunner)
-	IF (UNIX)
-		ADD_TEST(cppcheck cppcheck --quiet --error-exitcode=2 ${CMAKE_SOURCE_DIR})
-	ENDIF()
-ENDIF()
-
diff --git a/telldus-core/tests/common/CMakeLists.txt b/telldus-core/tests/common/CMakeLists.txt
deleted file mode 100644
index eec397fb..00000000
--- a/telldus-core/tests/common/CMakeLists.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-FILE(GLOB SRCS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "*Test.cpp" )
-
-INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/common)
-
-ADD_LIBRARY(TelldusCommonTests STATIC ${SRCS} )
-
-TARGET_LINK_LIBRARIES( TelldusCommonTests TelldusCommon ${CPPUNIT} )
-ADD_DEPENDENCIES( TelldusCommonTests TelldusCommon )
-
diff --git a/telldus-core/tests/common/CommonTests.h b/telldus-core/tests/common/CommonTests.h
deleted file mode 100644
index 805b51ee..00000000
--- a/telldus-core/tests/common/CommonTests.h
+++ /dev/null
@@ -1,11 +0,0 @@
-#ifndef COMMONTESTS_H
-#define COMMONTESTS_H
-
-#include "StringsTest.h"
-
-namespace CommonTests {
-	inline void setup() {
-		CPPUNIT_TEST_SUITE_REGISTRATION (StringsTest);
-	}
-}
-#endif // COMMONTESTS_H
diff --git a/telldus-core/tests/common/StringsTest.cpp b/telldus-core/tests/common/StringsTest.cpp
deleted file mode 100644
index 251d4a39..00000000
--- a/telldus-core/tests/common/StringsTest.cpp
+++ /dev/null
@@ -1,16 +0,0 @@
-#include "StringsTest.h"
-#include "Strings.h"
-
-void StringsTest :: setUp (void)
-{
-}
-
-void StringsTest :: tearDown (void)
-{
-}
-
-void StringsTest :: formatfTest (void) {
-	CPPUNIT_ASSERT_EQUAL(std::string("42"), TelldusCore::formatf("%u", 42));
-	CPPUNIT_ASSERT_EQUAL(std::string("2A"), TelldusCore::formatf("%X", 42));
-	CPPUNIT_ASSERT_EQUAL(std::string("42"), TelldusCore::formatf("%s", "42"));
-}
diff --git a/telldus-core/tests/common/StringsTest.h b/telldus-core/tests/common/StringsTest.h
deleted file mode 100644
index 4c5642c7..00000000
--- a/telldus-core/tests/common/StringsTest.h
+++ /dev/null
@@ -1,21 +0,0 @@
-#ifndef STRINGSTEST_H
-#define STRINGSTEST_H
-
-#include 
-#include 
-
-class StringsTest : public CPPUNIT_NS :: TestFixture
-{
-	CPPUNIT_TEST_SUITE (StringsTest);
-	CPPUNIT_TEST (formatfTest);
-	CPPUNIT_TEST_SUITE_END ();
-
-public:
-	void setUp (void);
-	void tearDown (void);
-
-protected:
-	void formatfTest(void);
-};
-
-#endif //STRINGSTEST_H
diff --git a/telldus-core/tests/cpplint.py b/telldus-core/tests/cpplint.py
deleted file mode 100755
index 5c88df49..00000000
--- a/telldus-core/tests/cpplint.py
+++ /dev/null
@@ -1,3369 +0,0 @@
-#!/usr/bin/python
-#
-# Copyright (c) 2009 Google Inc. All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions are
-# met:
-#
-#    * Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-#    * Redistributions in binary form must reproduce the above
-# copyright notice, this list of conditions and the following disclaimer
-# in the documentation and/or other materials provided with the
-# distribution.
-#    * Neither the name of Google Inc. nor the names of its
-# contributors may be used to endorse or promote products derived from
-# this software without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-# Here are some issues that I've had people identify in my code during reviews,
-# that I think are possible to flag automatically in a lint tool.  If these were
-# caught by lint, it would save time both for myself and that of my reviewers.
-# Most likely, some of these are beyond the scope of the current lint framework,
-# but I think it is valuable to retain these wish-list items even if they cannot
-# be immediately implemented.
-#
-#  Suggestions
-#  -----------
-#  - Check for no 'explicit' for multi-arg ctor
-#  - Check for boolean assign RHS in parens
-#  - Check for ctor initializer-list colon position and spacing
-#  - Check that if there's a ctor, there should be a dtor
-#  - Check accessors that return non-pointer member variables are
-#    declared const
-#  - Check accessors that return non-const pointer member vars are
-#    *not* declared const
-#  - Check for using public includes for testing
-#  - Check for spaces between brackets in one-line inline method
-#  - Check for no assert()
-#  - Check for spaces surrounding operators
-#  - Check for 0 in pointer context (should be NULL)
-#  - Check for 0 in char context (should be '\0')
-#  - Check for camel-case method name conventions for methods
-#    that are not simple inline getters and setters
-#  - Check that base classes have virtual destructors
-#    put "  // namespace" after } that closes a namespace, with
-#    namespace's name after 'namespace' if it is named.
-#  - Do not indent namespace contents
-#  - Avoid inlining non-trivial constructors in header files
-#    include base/basictypes.h if DISALLOW_EVIL_CONSTRUCTORS is used
-#  - Check for old-school (void) cast for call-sites of functions
-#    ignored return value
-#  - Check gUnit usage of anonymous namespace
-#  - Check for class declaration order (typedefs, consts, enums,
-#    ctor(s?), dtor, friend declarations, methods, member vars)
-#
-
-"""Does google-lint on c++ files.
-
-The goal of this script is to identify places in the code that *may*
-be in non-compliance with google style.  It does not attempt to fix
-up these problems -- the point is to educate.  It does also not
-attempt to find all problems, or to ensure that everything it does
-find is legitimately a problem.
-
-In particular, we can get very confused by /* and // inside strings!
-We do a small hack, which is to ignore //'s with "'s after them on the
-same line, but it is far from perfect (in either direction).
-"""
-
-import codecs
-import getopt
-import math  # for log
-import os
-import re
-import sre_compile
-import string
-import sys
-import unicodedata
-
-
-_USAGE = """
-Syntax: cpplint.py [--verbose=#] [--output=vs7] [--filter=-x,+y,...]
-                   [--counting=total|toplevel|detailed]
-         [file] ...
-
-  The style guidelines this tries to follow are those in
-    http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml
-
-  Every problem is given a confidence score from 1-5, with 5 meaning we are
-  certain of the problem, and 1 meaning it could be a legitimate construct.
-  This will miss some errors, and is not a substitute for a code review.
-
-  To suppress false-positive errors of a certain category, add a
-  'NOLINT(category)' comment to the line.  NOLINT or NOLINT(*)
-  suppresses errors of all categories on that line.
-
-  The files passed in will be linted; at least one file must be provided.
-  Linted extensions are .cc, .cpp, and .h.  Other file types will be ignored.
-
-  Flags:
-
-    output=vs7
-      By default, the output is formatted to ease emacs parsing.  Visual Studio
-      compatible output (vs7) may also be used.  Other formats are unsupported.
-
-    verbose=#
-      Specify a number 0-5 to restrict errors to certain verbosity levels.
-
-    filter=-x,+y,...
-      Specify a comma-separated list of category-filters to apply: only
-      error messages whose category names pass the filters will be printed.
-      (Category names are printed with the message and look like
-      "[whitespace/indent]".)  Filters are evaluated left to right.
-      "-FOO" and "FOO" means "do not print categories that start with FOO".
-      "+FOO" means "do print categories that start with FOO".
-
-      Examples: --filter=-whitespace,+whitespace/braces
-                --filter=whitespace,runtime/printf,+runtime/printf_format
-                --filter=-,+build/include_what_you_use
-
-      To see a list of all the categories used in cpplint, pass no arg:
-         --filter=
-
-    counting=total|toplevel|detailed
-      The total number of errors found is always printed. If
-      'toplevel' is provided, then the count of errors in each of
-      the top-level categories like 'build' and 'whitespace' will
-      also be printed. If 'detailed' is provided, then a count
-      is provided for each category like 'build/class'.
-"""
-
-# We categorize each error message we print.  Here are the categories.
-# We want an explicit list so we can list them all in cpplint --filter=.
-# If you add a new error message with a new category, add it to the list
-# here!  cpplint_unittest.py should tell you if you forget to do this.
-# \ used for clearer layout -- pylint: disable-msg=C6013
-_ERROR_CATEGORIES = [
-  'build/class',
-  'build/deprecated',
-  'build/endif_comment',
-  'build/explicit_make_pair',
-  'build/forward_decl',
-  'build/header_guard',
-  'build/include',
-  'build/include_alpha',
-  'build/include_order',
-  'build/include_what_you_use',
-  'build/namespaces',
-  'build/printf_format',
-  'build/storage_class',
-  'legal/copyright',
-  'readability/braces',
-  'readability/casting',
-  'readability/check',
-  'readability/constructors',
-  'readability/fn_size',
-  'readability/function',
-  'readability/multiline_comment',
-  'readability/multiline_string',
-  'readability/nolint',
-  'readability/streams',
-  'readability/todo',
-  'readability/utf8',
-  'runtime/arrays',
-  'runtime/casting',
-  'runtime/explicit',
-  'runtime/int',
-  'runtime/init',
-  'runtime/invalid_increment',
-  'runtime/member_string_references',
-  'runtime/memset',
-  'runtime/operator',
-  'runtime/printf',
-  'runtime/printf_format',
-  'runtime/references',
-  'runtime/rtti',
-  'runtime/sizeof',
-  'runtime/string',
-  'runtime/threadsafe_fn',
-  'runtime/virtual',
-  'whitespace/blank_line',
-  'whitespace/braces',
-  'whitespace/comma',
-  'whitespace/comments',
-  'whitespace/end_of_line',
-  'whitespace/ending_newline',
-  'whitespace/indent',
-  'whitespace/labels',
-  'whitespace/line_length',
-  'whitespace/newline',
-  'whitespace/operators',
-  'whitespace/parens',
-  'whitespace/semicolon',
-  'whitespace/tab',
-  'whitespace/todo',
-  'whitespace/use_tab_for_indentation'
-  ]
-
-# The default state of the category filter. This is overrided by the --filter=
-# flag. By default all errors are on, so only add here categories that should be
-# off by default (i.e., categories that must be enabled by the --filter= flags).
-# All entries here should start with a '-' or '+', as in the --filter= flag.
-_DEFAULT_FILTERS = [
-  '-build/include_alpha',
-  '-whitespace/use_tab_for_indentation'
-]
-
-# We used to check for high-bit characters, but after much discussion we
-# decided those were OK, as long as they were in UTF-8 and didn't represent
-# hard-coded international strings, which belong in a separate i18n file.
-
-# Headers that we consider STL headers.
-_STL_HEADERS = frozenset([
-    'algobase.h', 'algorithm', 'alloc.h', 'bitset', 'deque', 'exception',
-    'function.h', 'functional', 'hash_map', 'hash_map.h', 'hash_set',
-    'hash_set.h', 'iterator', 'list', 'list.h', 'map', 'memory', 'new',
-    'pair.h', 'pthread_alloc', 'queue', 'set', 'set.h', 'sstream', 'stack',
-    'stl_alloc.h', 'stl_relops.h', 'type_traits.h',
-    'utility', 'vector', 'vector.h',
-    ])
-
-
-# Non-STL C++ system headers.
-_CPP_HEADERS = frozenset([
-    'algo.h', 'builtinbuf.h', 'bvector.h', 'cassert', 'cctype',
-    'cerrno', 'cfloat', 'ciso646', 'climits', 'clocale', 'cmath',
-    'complex', 'complex.h', 'csetjmp', 'csignal', 'cstdarg', 'cstddef',
-    'cstdio', 'cstdlib', 'cstring', 'ctime', 'cwchar', 'cwctype',
-    'defalloc.h', 'deque.h', 'editbuf.h', 'exception', 'fstream',
-    'fstream.h', 'hashtable.h', 'heap.h', 'indstream.h', 'iomanip',
-    'iomanip.h', 'ios', 'iosfwd', 'iostream', 'iostream.h', 'istream',
-    'istream.h', 'iterator.h', 'limits', 'map.h', 'multimap.h', 'multiset.h',
-    'numeric', 'ostream', 'ostream.h', 'parsestream.h', 'pfstream.h',
-    'PlotFile.h', 'procbuf.h', 'pthread_alloc.h', 'rope', 'rope.h',
-    'ropeimpl.h', 'SFile.h', 'slist', 'slist.h', 'stack.h', 'stdexcept',
-    'stdiostream.h', 'streambuf.h', 'stream.h', 'strfile.h', 'string',
-    'strstream', 'strstream.h', 'tempbuf.h', 'tree.h', 'typeinfo', 'valarray',
-    ])
-
-
-# Assertion macros.  These are defined in base/logging.h and
-# testing/base/gunit.h.  Note that the _M versions need to come first
-# for substring matching to work.
-_CHECK_MACROS = [
-    'DCHECK', 'CHECK',
-    'EXPECT_TRUE_M', 'EXPECT_TRUE',
-    'ASSERT_TRUE_M', 'ASSERT_TRUE',
-    'EXPECT_FALSE_M', 'EXPECT_FALSE',
-    'ASSERT_FALSE_M', 'ASSERT_FALSE',
-    ]
-
-# Replacement macros for CHECK/DCHECK/EXPECT_TRUE/EXPECT_FALSE
-_CHECK_REPLACEMENT = dict([(m, {}) for m in _CHECK_MACROS])
-
-for op, replacement in [('==', 'EQ'), ('!=', 'NE'),
-                        ('>=', 'GE'), ('>', 'GT'),
-                        ('<=', 'LE'), ('<', 'LT')]:
-  _CHECK_REPLACEMENT['DCHECK'][op] = 'DCHECK_%s' % replacement
-  _CHECK_REPLACEMENT['CHECK'][op] = 'CHECK_%s' % replacement
-  _CHECK_REPLACEMENT['EXPECT_TRUE'][op] = 'EXPECT_%s' % replacement
-  _CHECK_REPLACEMENT['ASSERT_TRUE'][op] = 'ASSERT_%s' % replacement
-  _CHECK_REPLACEMENT['EXPECT_TRUE_M'][op] = 'EXPECT_%s_M' % replacement
-  _CHECK_REPLACEMENT['ASSERT_TRUE_M'][op] = 'ASSERT_%s_M' % replacement
-
-for op, inv_replacement in [('==', 'NE'), ('!=', 'EQ'),
-                            ('>=', 'LT'), ('>', 'LE'),
-                            ('<=', 'GT'), ('<', 'GE')]:
-  _CHECK_REPLACEMENT['EXPECT_FALSE'][op] = 'EXPECT_%s' % inv_replacement
-  _CHECK_REPLACEMENT['ASSERT_FALSE'][op] = 'ASSERT_%s' % inv_replacement
-  _CHECK_REPLACEMENT['EXPECT_FALSE_M'][op] = 'EXPECT_%s_M' % inv_replacement
-  _CHECK_REPLACEMENT['ASSERT_FALSE_M'][op] = 'ASSERT_%s_M' % inv_replacement
-
-
-# These constants define types of headers for use with
-# _IncludeState.CheckNextIncludeOrder().
-_C_SYS_HEADER = 1
-_CPP_SYS_HEADER = 2
-_LIKELY_MY_HEADER = 3
-_POSSIBLE_MY_HEADER = 4
-_OTHER_HEADER = 5
-
-
-_regexp_compile_cache = {}
-
-# Finds occurrences of NOLINT or NOLINT(...).
-_RE_SUPPRESSION = re.compile(r'\bNOLINT\b(\([^)]*\))?')
-
-# {str, set(int)}: a map from error categories to sets of linenumbers
-# on which those errors are expected and should be suppressed.
-_error_suppressions = {}
-
-def ParseNolintSuppressions(filename, raw_line, linenum, error):
-  """Updates the global list of error-suppressions.
-
-  Parses any NOLINT comments on the current line, updating the global
-  error_suppressions store.  Reports an error if the NOLINT comment
-  was malformed.
-
-  Args:
-    filename: str, the name of the input file.
-    raw_line: str, the line of input text, with comments.
-    linenum: int, the number of the current line.
-    error: function, an error handler.
-  """
-  # FIXME(adonovan): "NOLINT(" is misparsed as NOLINT(*).
-  matched = _RE_SUPPRESSION.search(raw_line)
-  if matched:
-    category = matched.group(1)
-    if category in (None, '(*)'):  # => "suppress all"
-      _error_suppressions.setdefault(None, set()).add(linenum)
-    else:
-      if category.startswith('(') and category.endswith(')'):
-        category = category[1:-1]
-        if category in _ERROR_CATEGORIES:
-          _error_suppressions.setdefault(category, set()).add(linenum)
-        else:
-          error(filename, linenum, 'readability/nolint', 5,
-                'Unknown NOLINT error category: %s' % category)
-
-
-def ResetNolintSuppressions():
-  "Resets the set of NOLINT suppressions to empty."
-  _error_suppressions.clear()
-
-
-def IsErrorSuppressedByNolint(category, linenum):
-  """Returns true if the specified error category is suppressed on this line.
-
-  Consults the global error_suppressions map populated by
-  ParseNolintSuppressions/ResetNolintSuppressions.
-
-  Args:
-    category: str, the category of the error.
-    linenum: int, the current line number.
-  Returns:
-    bool, True iff the error should be suppressed due to a NOLINT comment.
-  """
-  return (linenum in _error_suppressions.get(category, set()) or
-          linenum in _error_suppressions.get(None, set()))
-
-def Match(pattern, s):
-  """Matches the string with the pattern, caching the compiled regexp."""
-  # The regexp compilation caching is inlined in both Match and Search for
-  # performance reasons; factoring it out into a separate function turns out
-  # to be noticeably expensive.
-  if not pattern in _regexp_compile_cache:
-    _regexp_compile_cache[pattern] = sre_compile.compile(pattern)
-  return _regexp_compile_cache[pattern].match(s)
-
-
-def Search(pattern, s):
-  """Searches the string for the pattern, caching the compiled regexp."""
-  if not pattern in _regexp_compile_cache:
-    _regexp_compile_cache[pattern] = sre_compile.compile(pattern)
-  return _regexp_compile_cache[pattern].search(s)
-
-
-class _IncludeState(dict):
-  """Tracks line numbers for includes, and the order in which includes appear.
-
-  As a dict, an _IncludeState object serves as a mapping between include
-  filename and line number on which that file was included.
-
-  Call CheckNextIncludeOrder() once for each header in the file, passing
-  in the type constants defined above. Calls in an illegal order will
-  raise an _IncludeError with an appropriate error message.
-
-  """
-  # self._section will move monotonically through this set. If it ever
-  # needs to move backwards, CheckNextIncludeOrder will raise an error.
-  _INITIAL_SECTION = 0
-  _MY_H_SECTION = 1
-  _C_SECTION = 2
-  _CPP_SECTION = 3
-  _OTHER_H_SECTION = 4
-
-  _TYPE_NAMES = {
-      _C_SYS_HEADER: 'C system header',
-      _CPP_SYS_HEADER: 'C++ system header',
-      _LIKELY_MY_HEADER: 'header this file implements',
-      _POSSIBLE_MY_HEADER: 'header this file may implement',
-      _OTHER_HEADER: 'other header',
-      }
-  _SECTION_NAMES = {
-      _INITIAL_SECTION: "... nothing. (This can't be an error.)",
-      _MY_H_SECTION: 'a header this file implements',
-      _C_SECTION: 'C system header',
-      _CPP_SECTION: 'C++ system header',
-      _OTHER_H_SECTION: 'other header',
-      }
-
-  def __init__(self):
-    dict.__init__(self)
-    # The name of the current section.
-    self._section = self._INITIAL_SECTION
-    # The path of last found header.
-    self._last_header = ''
-
-  def CanonicalizeAlphabeticalOrder(self, header_path):
-    """Returns a path canonicalized for alphabetical comparison.
-
-    - replaces "-" with "_" so they both cmp the same.
-    - removes '-inl' since we don't require them to be after the main header.
-    - lowercase everything, just in case.
-
-    Args:
-      header_path: Path to be canonicalized.
-
-    Returns:
-      Canonicalized path.
-    """
-    return header_path.replace('-inl.h', '.h').replace('-', '_').lower()
-
-  def IsInAlphabeticalOrder(self, header_path):
-    """Check if a header is in alphabetical order with the previous header.
-
-    Args:
-      header_path: Header to be checked.
-
-    Returns:
-      Returns true if the header is in alphabetical order.
-    """
-    canonical_header = self.CanonicalizeAlphabeticalOrder(header_path)
-    if self._last_header > canonical_header:
-      return False
-    self._last_header = canonical_header
-    return True
-
-  def CheckNextIncludeOrder(self, header_type):
-    """Returns a non-empty error message if the next header is out of order.
-
-    This function also updates the internal state to be ready to check
-    the next include.
-
-    Args:
-      header_type: One of the _XXX_HEADER constants defined above.
-
-    Returns:
-      The empty string if the header is in the right order, or an
-      error message describing what's wrong.
-
-    """
-    error_message = ('Found %s after %s' %
-                     (self._TYPE_NAMES[header_type],
-                      self._SECTION_NAMES[self._section]))
-
-    last_section = self._section
-
-    if header_type == _C_SYS_HEADER:
-      if self._section <= self._C_SECTION:
-        self._section = self._C_SECTION
-      else:
-        self._last_header = ''
-        return error_message
-    elif header_type == _CPP_SYS_HEADER:
-      if self._section <= self._CPP_SECTION:
-        self._section = self._CPP_SECTION
-      else:
-        self._last_header = ''
-        return error_message
-    elif header_type == _LIKELY_MY_HEADER:
-      if self._section <= self._MY_H_SECTION:
-        self._section = self._MY_H_SECTION
-      else:
-        self._section = self._OTHER_H_SECTION
-    elif header_type == _POSSIBLE_MY_HEADER:
-      if self._section <= self._MY_H_SECTION:
-        self._section = self._MY_H_SECTION
-      else:
-        # This will always be the fallback because we're not sure
-        # enough that the header is associated with this file.
-        self._section = self._OTHER_H_SECTION
-    else:
-      assert header_type == _OTHER_HEADER
-      self._section = self._OTHER_H_SECTION
-
-    if last_section != self._section:
-      self._last_header = ''
-
-    return ''
-
-
-class _CppLintState(object):
-  """Maintains module-wide state.."""
-
-  def __init__(self):
-    self.verbose_level = 1  # global setting.
-    self.error_count = 0    # global count of reported errors
-    # filters to apply when emitting error messages
-    self.filters = _DEFAULT_FILTERS[:]
-    self.counting = 'total'  # In what way are we counting errors?
-    self.errors_by_category = {}  # string to int dict storing error counts
-
-    # output format:
-    # "emacs" - format that emacs can parse (default)
-    # "vs7" - format that Microsoft Visual Studio 7 can parse
-    self.output_format = 'emacs'
-
-  def SetOutputFormat(self, output_format):
-    """Sets the output format for errors."""
-    self.output_format = output_format
-
-  def SetVerboseLevel(self, level):
-    """Sets the module's verbosity, and returns the previous setting."""
-    last_verbose_level = self.verbose_level
-    self.verbose_level = level
-    return last_verbose_level
-
-  def SetCountingStyle(self, counting_style):
-    """Sets the module's counting options."""
-    self.counting = counting_style
-
-  def SetFilters(self, filters):
-    """Sets the error-message filters.
-
-    These filters are applied when deciding whether to emit a given
-    error message.
-
-    Args:
-      filters: A string of comma-separated filters (eg "+whitespace/indent").
-               Each filter should start with + or -; else we die.
-
-    Raises:
-      ValueError: The comma-separated filters did not all start with '+' or '-'.
-                  E.g. "-,+whitespace,-whitespace/indent,whitespace/badfilter"
-    """
-    # Default filters always have less priority than the flag ones.
-    self.filters = _DEFAULT_FILTERS[:]
-    for filt in filters.split(','):
-      clean_filt = filt.strip()
-      if clean_filt:
-        self.filters.append(clean_filt)
-    for filt in self.filters:
-      if not (filt.startswith('+') or filt.startswith('-')):
-        raise ValueError('Every filter in --filters must start with + or -'
-                         ' (%s does not)' % filt)
-
-  def ResetErrorCounts(self):
-    """Sets the module's error statistic back to zero."""
-    self.error_count = 0
-    self.errors_by_category = {}
-
-  def IncrementErrorCount(self, category):
-    """Bumps the module's error statistic."""
-    self.error_count += 1
-    if self.counting in ('toplevel', 'detailed'):
-      if self.counting != 'detailed':
-        category = category.split('/')[0]
-      if category not in self.errors_by_category:
-        self.errors_by_category[category] = 0
-      self.errors_by_category[category] += 1
-
-  def PrintErrorCounts(self):
-    """Print a summary of errors by category, and the total."""
-    for category, count in self.errors_by_category.iteritems():
-      sys.stderr.write('Category \'%s\' errors found: %d\n' %
-                       (category, count))
-    sys.stderr.write('Total errors found: %d\n' % self.error_count)
-
-_cpplint_state = _CppLintState()
-
-
-def _OutputFormat():
-  """Gets the module's output format."""
-  return _cpplint_state.output_format
-
-
-def _SetOutputFormat(output_format):
-  """Sets the module's output format."""
-  _cpplint_state.SetOutputFormat(output_format)
-
-
-def _VerboseLevel():
-  """Returns the module's verbosity setting."""
-  return _cpplint_state.verbose_level
-
-
-def _SetVerboseLevel(level):
-  """Sets the module's verbosity, and returns the previous setting."""
-  return _cpplint_state.SetVerboseLevel(level)
-
-
-def _SetCountingStyle(level):
-  """Sets the module's counting options."""
-  _cpplint_state.SetCountingStyle(level)
-
-
-def _Filters():
-  """Returns the module's list of output filters, as a list."""
-  return _cpplint_state.filters
-
-
-def _SetFilters(filters):
-  """Sets the module's error-message filters.
-
-  These filters are applied when deciding whether to emit a given
-  error message.
-
-  Args:
-    filters: A string of comma-separated filters (eg "whitespace/indent").
-             Each filter should start with + or -; else we die.
-  """
-  _cpplint_state.SetFilters(filters)
-
-
-class _FunctionState(object):
-  """Tracks current function name and the number of lines in its body."""
-
-  _NORMAL_TRIGGER = 250  # for --v=0, 500 for --v=1, etc.
-  _TEST_TRIGGER = 400    # about 50% more than _NORMAL_TRIGGER.
-
-  def __init__(self):
-    self.in_a_function = False
-    self.lines_in_function = 0
-    self.current_function = ''
-
-  def Begin(self, function_name):
-    """Start analyzing function body.
-
-    Args:
-      function_name: The name of the function being tracked.
-    """
-    self.in_a_function = True
-    self.lines_in_function = 0
-    self.current_function = function_name
-
-  def Count(self):
-    """Count line in current function body."""
-    if self.in_a_function:
-      self.lines_in_function += 1
-
-  def Check(self, error, filename, linenum):
-    """Report if too many lines in function body.
-
-    Args:
-      error: The function to call with any errors found.
-      filename: The name of the current file.
-      linenum: The number of the line to check.
-    """
-    if Match(r'T(EST|est)', self.current_function):
-      base_trigger = self._TEST_TRIGGER
-    else:
-      base_trigger = self._NORMAL_TRIGGER
-    trigger = base_trigger * 2**_VerboseLevel()
-
-    if self.lines_in_function > trigger:
-      error_level = int(math.log(self.lines_in_function / base_trigger, 2))
-      # 50 => 0, 100 => 1, 200 => 2, 400 => 3, 800 => 4, 1600 => 5, ...
-      if error_level > 5:
-        error_level = 5
-      error(filename, linenum, 'readability/fn_size', error_level,
-            'Small and focused functions are preferred:'
-            ' %s has %d non-comment lines'
-            ' (error triggered by exceeding %d lines).'  % (
-                self.current_function, self.lines_in_function, trigger))
-
-  def End(self):
-    """Stop analyzing function body."""
-    self.in_a_function = False
-
-
-class _IncludeError(Exception):
-  """Indicates a problem with the include order in a file."""
-  pass
-
-
-class FileInfo:
-  """Provides utility functions for filenames.
-
-  FileInfo provides easy access to the components of a file's path
-  relative to the project root.
-  """
-
-  def __init__(self, filename):
-    self._filename = filename
-
-  def FullName(self):
-    """Make Windows paths like Unix."""
-    return os.path.abspath(self._filename).replace('\\', '/')
-
-  def RepositoryName(self):
-    """FullName after removing the local path to the repository.
-
-    If we have a real absolute path name here we can try to do something smart:
-    detecting the root of the checkout and truncating /path/to/checkout from
-    the name so that we get header guards that don't include things like
-    "C:\Documents and Settings\..." or "/home/username/..." in them and thus
-    people on different computers who have checked the source out to different
-    locations won't see bogus errors.
-    """
-    fullname = self.FullName()
-
-    if os.path.exists(fullname):
-      project_dir = os.path.dirname(fullname)
-
-      if os.path.exists(os.path.join(project_dir, ".svn")):
-        # If there's a .svn file in the current directory, we recursively look
-        # up the directory tree for the top of the SVN checkout
-        root_dir = project_dir
-        one_up_dir = os.path.dirname(root_dir)
-        while os.path.exists(os.path.join(one_up_dir, ".svn")):
-          root_dir = os.path.dirname(root_dir)
-          one_up_dir = os.path.dirname(one_up_dir)
-
-        prefix = os.path.commonprefix([root_dir, project_dir])
-        return fullname[len(prefix) + 1:]
-
-      # Not SVN <= 1.6? Try to find a git, hg, or svn top level directory by
-      # searching up from the current path.
-      root_dir = os.path.dirname(fullname)
-      while (root_dir != os.path.dirname(root_dir) and
-             not os.path.exists(os.path.join(root_dir, ".git")) and
-             not os.path.exists(os.path.join(root_dir, ".hg")) and
-             not os.path.exists(os.path.join(root_dir, ".svn"))):
-        root_dir = os.path.dirname(root_dir)
-
-      if (os.path.exists(os.path.join(root_dir, ".git")) or
-          os.path.exists(os.path.join(root_dir, ".hg")) or
-          os.path.exists(os.path.join(root_dir, ".svn"))):
-        prefix = os.path.commonprefix([root_dir, project_dir])
-        return fullname[len(prefix) + 1:]
-
-    # Don't know what to do; header guard warnings may be wrong...
-    return fullname
-
-  def Split(self):
-    """Splits the file into the directory, basename, and extension.
-
-    For 'chrome/browser/browser.cc', Split() would
-    return ('chrome/browser', 'browser', '.cc')
-
-    Returns:
-      A tuple of (directory, basename, extension).
-    """
-
-    googlename = self.RepositoryName()
-    project, rest = os.path.split(googlename)
-    return (project,) + os.path.splitext(rest)
-
-  def BaseName(self):
-    """File base name - text after the final slash, before the final period."""
-    return self.Split()[1]
-
-  def Extension(self):
-    """File extension - text following the final period."""
-    return self.Split()[2]
-
-  def NoExtension(self):
-    """File has no source file extension."""
-    return '/'.join(self.Split()[0:2])
-
-  def IsSource(self):
-    """File has a source file extension."""
-    return self.Extension()[1:] in ('c', 'cc', 'cpp', 'cxx')
-
-
-def _ShouldPrintError(category, confidence, linenum):
-  """If confidence >= verbose, category passes filter and is not suppressed."""
-
-  # There are three ways we might decide not to print an error message:
-  # a "NOLINT(category)" comment appears in the source,
-  # the verbosity level isn't high enough, or the filters filter it out.
-  if IsErrorSuppressedByNolint(category, linenum):
-    return False
-  if confidence < _cpplint_state.verbose_level:
-    return False
-
-  is_filtered = False
-  for one_filter in _Filters():
-    if one_filter.startswith('-'):
-      if category.startswith(one_filter[1:]):
-        is_filtered = True
-    elif one_filter.startswith('+'):
-      if category.startswith(one_filter[1:]):
-        is_filtered = False
-    else:
-      assert False  # should have been checked for in SetFilter.
-  if is_filtered:
-    return False
-
-  return True
-
-
-def Error(filename, linenum, category, confidence, message):
-  """Logs the fact we've found a lint error.
-
-  We log where the error was found, and also our confidence in the error,
-  that is, how certain we are this is a legitimate style regression, and
-  not a misidentification or a use that's sometimes justified.
-
-  False positives can be suppressed by the use of
-  "cpplint(category)"  comments on the offending line.  These are
-  parsed into _error_suppressions.
-
-  Args:
-    filename: The name of the file containing the error.
-    linenum: The number of the line containing the error.
-    category: A string used to describe the "category" this bug
-      falls under: "whitespace", say, or "runtime".  Categories
-      may have a hierarchy separated by slashes: "whitespace/indent".
-    confidence: A number from 1-5 representing a confidence score for
-      the error, with 5 meaning that we are certain of the problem,
-      and 1 meaning that it could be a legitimate construct.
-    message: The error message.
-  """
-  if _ShouldPrintError(category, confidence, linenum):
-    _cpplint_state.IncrementErrorCount(category)
-    if _cpplint_state.output_format == 'vs7':
-      sys.stderr.write('%s(%s):  %s  [%s] [%d]\n' % (
-          filename, linenum, message, category, confidence))
-    else:
-      sys.stderr.write('%s:%s:  %s  [%s] [%d]\n' % (
-          filename, linenum, message, category, confidence))
-
-
-# Matches standard C++ escape esequences per 2.13.2.3 of the C++ standard.
-_RE_PATTERN_CLEANSE_LINE_ESCAPES = re.compile(
-    r'\\([abfnrtv?"\\\']|\d+|x[0-9a-fA-F]+)')
-# Matches strings.  Escape codes should already be removed by ESCAPES.
-_RE_PATTERN_CLEANSE_LINE_DOUBLE_QUOTES = re.compile(r'"[^"]*"')
-# Matches characters.  Escape codes should already be removed by ESCAPES.
-_RE_PATTERN_CLEANSE_LINE_SINGLE_QUOTES = re.compile(r"'.'")
-# Matches multi-line C++ comments.
-# This RE is a little bit more complicated than one might expect, because we
-# have to take care of space removals tools so we can handle comments inside
-# statements better.
-# The current rule is: We only clear spaces from both sides when we're at the
-# end of the line. Otherwise, we try to remove spaces from the right side,
-# if this doesn't work we try on left side but only if there's a non-character
-# on the right.
-_RE_PATTERN_CLEANSE_LINE_C_COMMENTS = re.compile(
-    r"""(\s*/\*.*\*/\s*$|
-            /\*.*\*/\s+|
-         \s+/\*.*\*/(?=\W)|
-            /\*.*\*/)""", re.VERBOSE)
-
-
-def IsCppString(line):
-  """Does line terminate so, that the next symbol is in string constant.
-
-  This function does not consider single-line nor multi-line comments.
-
-  Args:
-    line: is a partial line of code starting from the 0..n.
-
-  Returns:
-    True, if next character appended to 'line' is inside a
-    string constant.
-  """
-
-  line = line.replace(r'\\', 'XX')  # after this, \\" does not match to \"
-  return ((line.count('"') - line.count(r'\"') - line.count("'\"'")) & 1) == 1
-
-
-def FindNextMultiLineCommentStart(lines, lineix):
-  """Find the beginning marker for a multiline comment."""
-  while lineix < len(lines):
-    if lines[lineix].strip().startswith('/*'):
-      # Only return this marker if the comment goes beyond this line
-      if lines[lineix].strip().find('*/', 2) < 0:
-        return lineix
-    lineix += 1
-  return len(lines)
-
-
-def FindNextMultiLineCommentEnd(lines, lineix):
-  """We are inside a comment, find the end marker."""
-  while lineix < len(lines):
-    if lines[lineix].strip().endswith('*/'):
-      return lineix
-    lineix += 1
-  return len(lines)
-
-
-def RemoveMultiLineCommentsFromRange(lines, begin, end):
-  """Clears a range of lines for multi-line comments."""
-  # Having // dummy comments makes the lines non-empty, so we will not get
-  # unnecessary blank line warnings later in the code.
-  for i in range(begin, end):
-    lines[i] = '// dummy'
-
-
-def RemoveMultiLineComments(filename, lines, error):
-  """Removes multiline (c-style) comments from lines."""
-  lineix = 0
-  while lineix < len(lines):
-    lineix_begin = FindNextMultiLineCommentStart(lines, lineix)
-    if lineix_begin >= len(lines):
-      return
-    lineix_end = FindNextMultiLineCommentEnd(lines, lineix_begin)
-    if lineix_end >= len(lines):
-      error(filename, lineix_begin + 1, 'readability/multiline_comment', 5,
-            'Could not find end of multi-line comment')
-      return
-    RemoveMultiLineCommentsFromRange(lines, lineix_begin, lineix_end + 1)
-    lineix = lineix_end + 1
-
-
-def CleanseComments(line):
-  """Removes //-comments and single-line C-style /* */ comments.
-
-  Args:
-    line: A line of C++ source.
-
-  Returns:
-    The line with single-line comments removed.
-  """
-  commentpos = line.find('//')
-  if commentpos != -1 and not IsCppString(line[:commentpos]):
-    line = line[:commentpos].rstrip()
-  # get rid of /* ... */
-  return _RE_PATTERN_CLEANSE_LINE_C_COMMENTS.sub('', line)
-
-
-class CleansedLines(object):
-  """Holds 3 copies of all lines with different preprocessing applied to them.
-
-  1) elided member contains lines without strings and comments,
-  2) lines member contains lines without comments, and
-  3) raw member contains all the lines without processing.
-  All these three members are of , and of the same length.
-  """
-
-  def __init__(self, lines):
-    self.elided = []
-    self.lines = []
-    self.raw_lines = lines
-    self.num_lines = len(lines)
-    for linenum in range(len(lines)):
-      self.lines.append(CleanseComments(lines[linenum]))
-      elided = self._CollapseStrings(lines[linenum])
-      self.elided.append(CleanseComments(elided))
-
-  def NumLines(self):
-    """Returns the number of lines represented."""
-    return self.num_lines
-
-  @staticmethod
-  def _CollapseStrings(elided):
-    """Collapses strings and chars on a line to simple "" or '' blocks.
-
-    We nix strings first so we're not fooled by text like '"http://"'
-
-    Args:
-      elided: The line being processed.
-
-    Returns:
-      The line with collapsed strings.
-    """
-    if not _RE_PATTERN_INCLUDE.match(elided):
-      # Remove escaped characters first to make quote/single quote collapsing
-      # basic.  Things that look like escaped characters shouldn't occur
-      # outside of strings and chars.
-      elided = _RE_PATTERN_CLEANSE_LINE_ESCAPES.sub('', elided)
-      elided = _RE_PATTERN_CLEANSE_LINE_SINGLE_QUOTES.sub("''", elided)
-      elided = _RE_PATTERN_CLEANSE_LINE_DOUBLE_QUOTES.sub('""', elided)
-    return elided
-
-
-def CloseExpression(clean_lines, linenum, pos):
-  """If input points to ( or { or [, finds the position that closes it.
-
-  If lines[linenum][pos] points to a '(' or '{' or '[', finds the
-  linenum/pos that correspond to the closing of the expression.
-
-  Args:
-    clean_lines: A CleansedLines instance containing the file.
-    linenum: The number of the line to check.
-    pos: A position on the line.
-
-  Returns:
-    A tuple (line, linenum, pos) pointer *past* the closing brace, or
-    (line, len(lines), -1) if we never find a close.  Note we ignore
-    strings and comments when matching; and the line we return is the
-    'cleansed' line at linenum.
-  """
-
-  line = clean_lines.elided[linenum]
-  startchar = line[pos]
-  if startchar not in '({[':
-    return (line, clean_lines.NumLines(), -1)
-  if startchar == '(': endchar = ')'
-  if startchar == '[': endchar = ']'
-  if startchar == '{': endchar = '}'
-
-  num_open = line.count(startchar) - line.count(endchar)
-  while linenum < clean_lines.NumLines() and num_open > 0:
-    linenum += 1
-    line = clean_lines.elided[linenum]
-    num_open += line.count(startchar) - line.count(endchar)
-  # OK, now find the endchar that actually got us back to even
-  endpos = len(line)
-  while num_open >= 0:
-    endpos = line.rfind(')', 0, endpos)
-    num_open -= 1                 # chopped off another )
-  return (line, linenum, endpos + 1)
-
-
-def CheckForCopyright(filename, lines, error):
-  """Logs an error if no Copyright message appears at the top of the file."""
-
-  # We'll say it should occur by line 10. Don't forget there's a
-  # dummy line at the front.
-  for line in xrange(1, min(len(lines), 11)):
-    if re.search(r'Copyright', lines[line], re.I): break
-  else:                       # means no copyright line was found
-    error(filename, 0, 'legal/copyright', 5,
-          'No copyright message found.  '
-          'You should have a line: "Copyright [year] "')
-
-
-def GetHeaderGuardCPPVariable(filename):
-  """Returns the CPP variable that should be used as a header guard.
-
-  Args:
-    filename: The name of a C++ header file.
-
-  Returns:
-    The CPP variable that should be used as a header guard in the
-    named file.
-
-  """
-
-  # Restores original filename in case that cpplint is invoked from Emacs's
-  # flymake.
-  filename = re.sub(r'_flymake\.h$', '.h', filename)
-
-  fileinfo = FileInfo(filename)
-  return re.sub(r'[-./\s]', '_', fileinfo.RepositoryName()).upper() + '_'
-
-
-def CheckForHeaderGuard(filename, lines, error):
-  """Checks that the file contains a header guard.
-
-  Logs an error if no #ifndef header guard is present.  For other
-  headers, checks that the full pathname is used.
-
-  Args:
-    filename: The name of the C++ header file.
-    lines: An array of strings, each representing a line of the file.
-    error: The function to call with any errors found.
-  """
-
-  cppvar = GetHeaderGuardCPPVariable(filename)
-
-  ifndef = None
-  ifndef_linenum = 0
-  define = None
-  endif = None
-  endif_linenum = 0
-  for linenum, line in enumerate(lines):
-    linesplit = line.split()
-    if len(linesplit) >= 2:
-      # find the first occurrence of #ifndef and #define, save arg
-      if not ifndef and linesplit[0] == '#ifndef':
-        # set ifndef to the header guard presented on the #ifndef line.
-        ifndef = linesplit[1]
-        ifndef_linenum = linenum
-      if not define and linesplit[0] == '#define':
-        define = linesplit[1]
-    # find the last occurrence of #endif, save entire line
-    if line.startswith('#endif'):
-      endif = line
-      endif_linenum = linenum
-
-  if not ifndef:
-    error(filename, 0, 'build/header_guard', 5,
-          'No #ifndef header guard found, suggested CPP variable is: %s' %
-          cppvar)
-    return
-
-  if not define:
-    error(filename, 0, 'build/header_guard', 5,
-          'No #define header guard found, suggested CPP variable is: %s' %
-          cppvar)
-    return
-
-  # The guard should be PATH_FILE_H_, but we also allow PATH_FILE_H__
-  # for backward compatibility.
-  if ifndef != cppvar:
-    error_level = 0
-    if ifndef != cppvar + '_':
-      error_level = 5
-
-    ParseNolintSuppressions(filename, lines[ifndef_linenum], ifndef_linenum,
-                            error)
-    error(filename, ifndef_linenum, 'build/header_guard', error_level,
-          '#ifndef header guard has wrong style, please use: %s' % cppvar)
-
-  if define != ifndef:
-    error(filename, 0, 'build/header_guard', 5,
-          '#ifndef and #define don\'t match, suggested CPP variable is: %s' %
-          cppvar)
-    return
-
-  if endif != ('#endif  // %s' % cppvar):
-    error_level = 0
-    if endif != ('#endif  // %s' % (cppvar + '_')):
-      error_level = 5
-
-    ParseNolintSuppressions(filename, lines[endif_linenum], endif_linenum,
-                            error)
-    error(filename, endif_linenum, 'build/header_guard', error_level,
-          '#endif line should be "#endif  // %s"' % cppvar)
-
-
-def CheckForUnicodeReplacementCharacters(filename, lines, error):
-  """Logs an error for each line containing Unicode replacement characters.
-
-  These indicate that either the file contained invalid UTF-8 (likely)
-  or Unicode replacement characters (which it shouldn't).  Note that
-  it's possible for this to throw off line numbering if the invalid
-  UTF-8 occurred adjacent to a newline.
-
-  Args:
-    filename: The name of the current file.
-    lines: An array of strings, each representing a line of the file.
-    error: The function to call with any errors found.
-  """
-  for linenum, line in enumerate(lines):
-    if u'\ufffd' in line:
-      error(filename, linenum, 'readability/utf8', 5,
-            'Line contains invalid UTF-8 (or Unicode replacement character).')
-
-
-def CheckForNewlineAtEOF(filename, lines, error):
-  """Logs an error if there is no newline char at the end of the file.
-
-  Args:
-    filename: The name of the current file.
-    lines: An array of strings, each representing a line of the file.
-    error: The function to call with any errors found.
-  """
-
-  # The array lines() was created by adding two newlines to the
-  # original file (go figure), then splitting on \n.
-  # To verify that the file ends in \n, we just have to make sure the
-  # last-but-two element of lines() exists and is empty.
-  if len(lines) < 3 or lines[-2]:
-    error(filename, len(lines) - 2, 'whitespace/ending_newline', 5,
-          'Could not find a newline character at the end of the file.')
-
-
-def CheckForMultilineCommentsAndStrings(filename, clean_lines, linenum, error):
-  """Logs an error if we see /* ... */ or "..." that extend past one line.
-
-  /* ... */ comments are legit inside macros, for one line.
-  Otherwise, we prefer // comments, so it's ok to warn about the
-  other.  Likewise, it's ok for strings to extend across multiple
-  lines, as long as a line continuation character (backslash)
-  terminates each line. Although not currently prohibited by the C++
-  style guide, it's ugly and unnecessary. We don't do well with either
-  in this lint program, so we warn about both.
-
-  Args:
-    filename: The name of the current file.
-    clean_lines: A CleansedLines instance containing the file.
-    linenum: The number of the line to check.
-    error: The function to call with any errors found.
-  """
-  line = clean_lines.elided[linenum]
-
-  # Remove all \\ (escaped backslashes) from the line. They are OK, and the
-  # second (escaped) slash may trigger later \" detection erroneously.
-  line = line.replace('\\\\', '')
-
-  if line.count('/*') > line.count('*/'):
-    error(filename, linenum, 'readability/multiline_comment', 5,
-          'Complex multi-line /*...*/-style comment found. '
-          'Lint may give bogus warnings.  '
-          'Consider replacing these with //-style comments, '
-          'with #if 0...#endif, '
-          'or with more clearly structured multi-line comments.')
-
-  if (line.count('"') - line.count('\\"')) % 2:
-    error(filename, linenum, 'readability/multiline_string', 5,
-          'Multi-line string ("...") found.  This lint script doesn\'t '
-          'do well with such strings, and may give bogus warnings.  They\'re '
-          'ugly and unnecessary, and you should use concatenation instead".')
-
-
-threading_list = (
-    ('asctime(', 'asctime_r('),
-    ('ctime(', 'ctime_r('),
-    ('getgrgid(', 'getgrgid_r('),
-    ('getgrnam(', 'getgrnam_r('),
-    ('getlogin(', 'getlogin_r('),
-    ('getpwnam(', 'getpwnam_r('),
-    ('getpwuid(', 'getpwuid_r('),
-    ('gmtime(', 'gmtime_r('),
-    ('localtime(', 'localtime_r('),
-    ('rand(', 'rand_r('),
-    ('readdir(', 'readdir_r('),
-    ('strtok(', 'strtok_r('),
-    ('ttyname(', 'ttyname_r('),
-    )
-
-
-def CheckPosixThreading(filename, clean_lines, linenum, error):
-  """Checks for calls to thread-unsafe functions.
-
-  Much code has been originally written without consideration of
-  multi-threading. Also, engineers are relying on their old experience;
-  they have learned posix before threading extensions were added. These
-  tests guide the engineers to use thread-safe functions (when using
-  posix directly).
-
-  Args:
-    filename: The name of the current file.
-    clean_lines: A CleansedLines instance containing the file.
-    linenum: The number of the line to check.
-    error: The function to call with any errors found.
-  """
-  line = clean_lines.elided[linenum]
-  for single_thread_function, multithread_safe_function in threading_list:
-    ix = line.find(single_thread_function)
-    # Comparisons made explicit for clarity -- pylint: disable-msg=C6403
-    if ix >= 0 and (ix == 0 or (not line[ix - 1].isalnum() and
-                                line[ix - 1] not in ('_', '.', '>'))):
-      error(filename, linenum, 'runtime/threadsafe_fn', 2,
-            'Consider using ' + multithread_safe_function +
-            '...) instead of ' + single_thread_function +
-            '...) for improved thread safety.')
-
-
-# Matches invalid increment: *count++, which moves pointer instead of
-# incrementing a value.
-_RE_PATTERN_INVALID_INCREMENT = re.compile(
-    r'^\s*\*\w+(\+\+|--);')
-
-
-def CheckInvalidIncrement(filename, clean_lines, linenum, error):
-  """Checks for invalid increment *count++.
-
-  For example following function:
-  void increment_counter(int* count) {
-    *count++;
-  }
-  is invalid, because it effectively does count++, moving pointer, and should
-  be replaced with ++*count, (*count)++ or *count += 1.
-
-  Args:
-    filename: The name of the current file.
-    clean_lines: A CleansedLines instance containing the file.
-    linenum: The number of the line to check.
-    error: The function to call with any errors found.
-  """
-  line = clean_lines.elided[linenum]
-  if _RE_PATTERN_INVALID_INCREMENT.match(line):
-    error(filename, linenum, 'runtime/invalid_increment', 5,
-          'Changing pointer instead of value (or unused value of operator*).')
-
-
-class _ClassInfo(object):
-  """Stores information about a class."""
-
-  def __init__(self, name, clean_lines, linenum):
-    self.name = name
-    self.linenum = linenum
-    self.seen_open_brace = False
-    self.is_derived = False
-    self.virtual_method_linenumber = None
-    self.has_virtual_destructor = False
-    self.brace_depth = 0
-
-    # Try to find the end of the class.  This will be confused by things like:
-    #   class A {
-    #   } *x = { ...
-    #
-    # But it's still good enough for CheckSectionSpacing.
-    self.last_line = 0
-    depth = 0
-    for i in range(linenum, clean_lines.NumLines()):
-      line = clean_lines.lines[i]
-      depth += line.count('{') - line.count('}')
-      if not depth:
-        self.last_line = i
-        break
-
-
-class _ClassState(object):
-  """Holds the current state of the parse relating to class declarations.
-
-  It maintains a stack of _ClassInfos representing the parser's guess
-  as to the current nesting of class declarations. The innermost class
-  is at the top (back) of the stack. Typically, the stack will either
-  be empty or have exactly one entry.
-  """
-
-  def __init__(self):
-    self.classinfo_stack = []
-
-  def CheckFinished(self, filename, error):
-    """Checks that all classes have been completely parsed.
-
-    Call this when all lines in a file have been processed.
-    Args:
-      filename: The name of the current file.
-      error: The function to call with any errors found.
-    """
-    if self.classinfo_stack:
-      # Note: This test can result in false positives if #ifdef constructs
-      # get in the way of brace matching. See the testBuildClass test in
-      # cpplint_unittest.py for an example of this.
-      error(filename, self.classinfo_stack[0].linenum, 'build/class', 5,
-            'Failed to find complete declaration of class %s' %
-            self.classinfo_stack[0].name)
-
-
-def CheckForNonStandardConstructs(filename, clean_lines, linenum,
-                                  class_state, error):
-  """Logs an error if we see certain non-ANSI constructs ignored by gcc-2.
-
-  Complain about several constructs which gcc-2 accepts, but which are
-  not standard C++.  Warning about these in lint is one way to ease the
-  transition to new compilers.
-  - put storage class first (e.g. "static const" instead of "const static").
-  - "%lld" instead of %qd" in printf-type functions.
-  - "%1$d" is non-standard in printf-type functions.
-  - "\%" is an undefined character escape sequence.
-  - text after #endif is not allowed.
-  - invalid inner-style forward declaration.
-  - >? and ?= and )\?=?\s*(\w+|[+-]?\d+)(\.\d*)?',
-            line):
-    error(filename, linenum, 'build/deprecated', 3,
-          '>? and ))?'
-    # r'\s*const\s*' + type_name + '\s*&\s*\w+\s*;'
-    error(filename, linenum, 'runtime/member_string_references', 2,
-          'const string& members are dangerous. It is much better to use '
-          'alternatives, such as pointers or simple constants.')
-
-  # Track class entry and exit, and attempt to find cases within the
-  # class declaration that don't meet the C++ style
-  # guidelines. Tracking is very dependent on the code matching Google
-  # style guidelines, but it seems to perform well enough in testing
-  # to be a worthwhile addition to the checks.
-  classinfo_stack = class_state.classinfo_stack
-  # Look for a class declaration. The regexp accounts for decorated classes
-  # such as in:
-  # class LOCKABLE API Object {
-  # };
-  class_decl_match = Match(
-      r'\s*(template\s*<[\w\s<>,:]*>\s*)?'
-      '(class|struct)\s+([A-Z_]+\s+)*(\w+(::\w+)*)', line)
-  if class_decl_match:
-    classinfo_stack.append(_ClassInfo(
-        class_decl_match.group(4), clean_lines, linenum))
-
-  # Everything else in this function uses the top of the stack if it's
-  # not empty.
-  if not classinfo_stack:
-    return
-
-  classinfo = classinfo_stack[-1]
-
-  # If the opening brace hasn't been seen look for it and also
-  # parent class declarations.
-  if not classinfo.seen_open_brace:
-    # If the line has a ';' in it, assume it's a forward declaration or
-    # a single-line class declaration, which we won't process.
-    if line.find(';') != -1:
-      classinfo_stack.pop()
-      return
-    classinfo.seen_open_brace = (line.find('{') != -1)
-    # Look for a bare ':'
-    if Search('(^|[^:]):($|[^:])', line):
-      classinfo.is_derived = True
-    if not classinfo.seen_open_brace:
-      return  # Everything else in this function is for after open brace
-
-  # The class may have been declared with namespace or classname qualifiers.
-  # The constructor and destructor will not have those qualifiers.
-  base_classname = classinfo.name.split('::')[-1]
-
-  # Look for single-argument constructors that aren't marked explicit.
-  # Technically a valid construct, but against style.
-  args = Match(r'\s+(?:inline\s+)?%s\s*\(([^,()]+)\)'
-               % re.escape(base_classname),
-               line)
-  if (args and
-      args.group(1) != 'void' and
-      not Match(r'(const\s+)?%s\s*(?:<\w+>\s*)?&' % re.escape(base_classname),
-                args.group(1).strip())):
-    error(filename, linenum, 'runtime/explicit', 5,
-          'Single-argument constructors should be marked explicit.')
-
-  # Look for methods declared virtual.
-  if Search(r'\bvirtual\b', line):
-    classinfo.virtual_method_linenumber = linenum
-    # Only look for a destructor declaration on the same line. It would
-    # be extremely unlikely for the destructor declaration to occupy
-    # more than one line.
-    if Search(r'~%s\s*\(' % base_classname, line):
-      classinfo.has_virtual_destructor = True
-
-  # Look for class end.
-  brace_depth = classinfo.brace_depth
-  brace_depth = brace_depth + line.count('{') - line.count('}')
-  if brace_depth <= 0:
-    classinfo = classinfo_stack.pop()
-    # Try to detect missing virtual destructor declarations.
-    # For now, only warn if a non-derived class with virtual methods lacks
-    # a virtual destructor. This is to make it less likely that people will
-    # declare derived virtual destructors without declaring the base
-    # destructor virtual.
-    if ((classinfo.virtual_method_linenumber is not None) and
-        (not classinfo.has_virtual_destructor) and
-        (not classinfo.is_derived)):  # Only warn for base classes
-      error(filename, classinfo.linenum, 'runtime/virtual', 4,
-            'The class %s probably needs a virtual destructor due to '
-            'having virtual method(s), one declared at line %d.'
-            % (classinfo.name, classinfo.virtual_method_linenumber))
-  else:
-    classinfo.brace_depth = brace_depth
-
-
-def CheckSpacingForFunctionCall(filename, line, linenum, error):
-  """Checks for the correctness of various spacing around function calls.
-
-  Args:
-    filename: The name of the current file.
-    line: The text of the line to check.
-    linenum: The number of the line to check.
-    error: The function to call with any errors found.
-  """
-
-  # Since function calls often occur inside if/for/while/switch
-  # expressions - which have their own, more liberal conventions - we
-  # first see if we should be looking inside such an expression for a
-  # function call, to which we can apply more strict standards.
-  fncall = line    # if there's no control flow construct, look at whole line
-  for pattern in (r'\bif\s*\((.*)\)\s*{',
-                  r'\bfor\s*\((.*)\)\s*{',
-                  r'\bwhile\s*\((.*)\)\s*[{;]',
-                  r'\bswitch\s*\((.*)\)\s*{'):
-    match = Search(pattern, line)
-    if match:
-      fncall = match.group(1)    # look inside the parens for function calls
-      break
-
-  # Except in if/for/while/switch, there should never be space
-  # immediately inside parens (eg "f( 3, 4 )").  We make an exception
-  # for nested parens ( (a+b) + c ).  Likewise, there should never be
-  # a space before a ( when it's a function argument.  I assume it's a
-  # function argument when the char before the whitespace is legal in
-  # a function name (alnum + _) and we're not starting a macro. Also ignore
-  # pointers and references to arrays and functions coz they're too tricky:
-  # we use a very simple way to recognize these:
-  # " (something)(maybe-something)" or
-  # " (something)(maybe-something," or
-  # " (something)[something]"
-  # Note that we assume the contents of [] to be short enough that
-  # they'll never need to wrap.
-  if (  # Ignore control structures.
-      not Search(r'\b(if|for|while|switch|return|delete)\b', fncall) and
-      # Ignore pointers/references to functions.
-      not Search(r' \([^)]+\)\([^)]*(\)|,$)', fncall) and
-      # Ignore pointers/references to arrays.
-      not Search(r' \([^)]+\)\[[^\]]+\]', fncall)):
-    if Search(r'\w\s*\(\s(?!\s*\\$)', fncall):      # a ( used for a fn call
-      error(filename, linenum, 'whitespace/parens', 4,
-            'Extra space after ( in function call')
-    elif Search(r'\(\s+(?!(\s*\\)|\()', fncall):
-      error(filename, linenum, 'whitespace/parens', 2,
-            'Extra space after (')
-    if (Search(r'\w\s+\(', fncall) and
-        not Search(r'#\s*define|typedef', fncall)):
-      error(filename, linenum, 'whitespace/parens', 4,
-            'Extra space before ( in function call')
-    # If the ) is followed only by a newline or a { + newline, assume it's
-    # part of a control statement (if/while/etc), and don't complain
-    if Search(r'[^)]\s+\)\s*[^{\s]', fncall):
-      # If the closing parenthesis is preceded by only whitespaces,
-      # try to give a more descriptive error message.
-      if Search(r'^\s+\)', fncall):
-        error(filename, linenum, 'whitespace/parens', 2,
-              'Closing ) should be moved to the previous line')
-      else:
-        error(filename, linenum, 'whitespace/parens', 2,
-              'Extra space before )')
-
-
-def IsBlankLine(line):
-  """Returns true if the given line is blank.
-
-  We consider a line to be blank if the line is empty or consists of
-  only white spaces.
-
-  Args:
-    line: A line of a string.
-
-  Returns:
-    True, if the given line is blank.
-  """
-  return not line or line.isspace()
-
-
-def CheckForFunctionLengths(filename, clean_lines, linenum,
-                            function_state, error):
-  """Reports for long function bodies.
-
-  For an overview why this is done, see:
-  http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml#Write_Short_Functions
-
-  Uses a simplistic algorithm assuming other style guidelines
-  (especially spacing) are followed.
-  Only checks unindented functions, so class members are unchecked.
-  Trivial bodies are unchecked, so constructors with huge initializer lists
-  may be missed.
-  Blank/comment lines are not counted so as to avoid encouraging the removal
-  of vertical space and comments just to get through a lint check.
-  NOLINT *on the last line of a function* disables this check.
-
-  Args:
-    filename: The name of the current file.
-    clean_lines: A CleansedLines instance containing the file.
-    linenum: The number of the line to check.
-    function_state: Current function name and lines in body so far.
-    error: The function to call with any errors found.
-  """
-  lines = clean_lines.lines
-  line = lines[linenum]
-  raw = clean_lines.raw_lines
-  raw_line = raw[linenum]
-  joined_line = ''
-
-  starting_func = False
-  regexp = r'(\w(\w|::|\*|\&|\s)*)\('  # decls * & space::name( ...
-  match_result = Match(regexp, line)
-  if match_result:
-    # If the name is all caps and underscores, figure it's a macro and
-    # ignore it, unless it's TEST or TEST_F.
-    function_name = match_result.group(1).split()[-1]
-    if function_name == 'TEST' or function_name == 'TEST_F' or (
-        not Match(r'[A-Z_]+$', function_name)):
-      starting_func = True
-
-  if starting_func:
-    body_found = False
-    for start_linenum in xrange(linenum, clean_lines.NumLines()):
-      start_line = lines[start_linenum]
-      joined_line += ' ' + start_line.lstrip()
-      if Search(r'(;|})', start_line):  # Declarations and trivial functions
-        body_found = True
-        break                              # ... ignore
-      elif Search(r'{', start_line):
-        body_found = True
-        function = Search(r'((\w|:)*)\(', line).group(1)
-        if Match(r'TEST', function):    # Handle TEST... macros
-          parameter_regexp = Search(r'(\(.*\))', joined_line)
-          if parameter_regexp:             # Ignore bad syntax
-            function += parameter_regexp.group(1)
-        else:
-          function += '()'
-        function_state.Begin(function)
-        break
-    if not body_found:
-      # No body for the function (or evidence of a non-function) was found.
-      error(filename, linenum, 'readability/fn_size', 5,
-            'Lint failed to find start of function body.')
-  elif Match(r'^\}\s*$', line):  # function end
-    function_state.Check(error, filename, linenum)
-    function_state.End()
-  elif not Match(r'^\s*$', line):
-    function_state.Count()  # Count non-blank/non-comment lines.
-
-
-_RE_PATTERN_TODO = re.compile(r'^//(\s*)TODO(\(.+?\))?:?(\s|$)?')
-
-
-def CheckComment(comment, filename, linenum, error):
-  """Checks for common mistakes in TODO comments.
-
-  Args:
-    comment: The text of the comment from the line in question.
-    filename: The name of the current file.
-    linenum: The number of the line to check.
-    error: The function to call with any errors found.
-  """
-  match = _RE_PATTERN_TODO.match(comment)
-  if match:
-    # One whitespace is correct; zero whitespace is handled elsewhere.
-    leading_whitespace = match.group(1)
-    if len(leading_whitespace) > 1:
-      error(filename, linenum, 'whitespace/todo', 2,
-            'Too many spaces before TODO')
-
-    username = match.group(2)
-    if not username:
-      error(filename, linenum, 'readability/todo', 2,
-            'Missing username in TODO; it should look like '
-            '"// TODO(my_username): Stuff."')
-
-    middle_whitespace = match.group(3)
-    # Comparisons made explicit for correctness -- pylint: disable-msg=C6403
-    if middle_whitespace != ' ' and middle_whitespace != '':
-      error(filename, linenum, 'whitespace/todo', 2,
-            'TODO(my_username) should be followed by a space')
-
-
-def CheckSpacing(filename, clean_lines, linenum, error):
-  """Checks for the correctness of various spacing issues in the code.
-
-  Things we check for: spaces around operators, spaces after
-  if/for/while/switch, no spaces around parens in function calls, two
-  spaces between code and comment, don't start a block with a blank
-  line, don't end a function with a blank line, don't add a blank line
-  after public/protected/private, don't have too many blank lines in a row.
-
-  Args:
-    filename: The name of the current file.
-    clean_lines: A CleansedLines instance containing the file.
-    linenum: The number of the line to check.
-    error: The function to call with any errors found.
-  """
-
-  raw = clean_lines.raw_lines
-  line = raw[linenum]
-
-  # Before nixing comments, check if the line is blank for no good
-  # reason.  This includes the first line after a block is opened, and
-  # blank lines at the end of a function (ie, right before a line like '}'
-  if IsBlankLine(line):
-    elided = clean_lines.elided
-    prev_line = elided[linenum - 1]
-    prevbrace = prev_line.rfind('{')
-    # TODO(unknown): Don't complain if line before blank line, and line after,
-    #                both start with alnums and are indented the same amount.
-    #                This ignores whitespace at the start of a namespace block
-    #                because those are not usually indented.
-    if (prevbrace != -1 and prev_line[prevbrace:].find('}') == -1
-        and prev_line[:prevbrace].find('namespace') == -1):
-      # OK, we have a blank line at the start of a code block.  Before we
-      # complain, we check if it is an exception to the rule: The previous
-      # non-empty line has the parameters of a function header that are indented
-      # 4 spaces (because they did not fit in a 80 column line when placed on
-      # the same line as the function name).  We also check for the case where
-      # the previous line is indented 6 spaces, which may happen when the
-      # initializers of a constructor do not fit into a 80 column line.
-      exception = False
-      if Match(r' {6}\w', prev_line):  # Initializer list?
-        # We are looking for the opening column of initializer list, which
-        # should be indented 4 spaces to cause 6 space indentation afterwards.
-        search_position = linenum-2
-        while (search_position >= 0
-               and Match(r' {6}\w', elided[search_position])):
-          search_position -= 1
-        exception = (search_position >= 0
-                     and elided[search_position][:5] == '    :')
-      else:
-        # Search for the function arguments or an initializer list.  We use a
-        # simple heuristic here: If the line is indented 4 spaces; and we have a
-        # closing paren, without the opening paren, followed by an opening brace
-        # or colon (for initializer lists) we assume that it is the last line of
-        # a function header.  If we have a colon indented 4 spaces, it is an
-        # initializer list.
-        exception = (Match(r' {4}\w[^\(]*\)\s*(const\s*)?(\{\s*$|:)',
-                           prev_line)
-                     or Match(r' {4}:', prev_line))
-
-      if not exception:
-        error(filename, linenum, 'whitespace/blank_line', 2,
-              'Blank line at the start of a code block.  Is this needed?')
-    # This doesn't ignore whitespace at the end of a namespace block
-    # because that is too hard without pairing open/close braces;
-    # however, a special exception is made for namespace closing
-    # brackets which have a comment containing "namespace".
-    #
-    # Also, ignore blank lines at the end of a block in a long if-else
-    # chain, like this:
-    #   if (condition1) {
-    #     // Something followed by a blank line
-    #
-    #   } else if (condition2) {
-    #     // Something else
-    #   }
-    if linenum + 1 < clean_lines.NumLines():
-      next_line = raw[linenum + 1]
-      if (next_line
-          and Match(r'\s*}', next_line)
-          and next_line.find('namespace') == -1
-          and next_line.find('} else ') == -1):
-        error(filename, linenum, 'whitespace/blank_line', 3,
-              'Blank line at the end of a code block.  Is this needed?')
-
-    matched = Match(r'\s*(public|protected|private):', prev_line)
-    if matched:
-      error(filename, linenum, 'whitespace/blank_line', 3,
-            'Do not leave a blank line after "%s:"' % matched.group(1))
-
-  # Next, we complain if there's a comment too near the text
-  commentpos = line.find('//')
-  if commentpos != -1:
-    # Check if the // may be in quotes.  If so, ignore it
-    # Comparisons made explicit for clarity -- pylint: disable-msg=C6403
-    if (line.count('"', 0, commentpos) -
-        line.count('\\"', 0, commentpos)) % 2 == 0:   # not in quotes
-      # Allow one space for new scopes, two spaces otherwise:
-      if (not Match(r'^\s*{ //', line) and
-          ((commentpos >= 1 and
-            line[commentpos-1] not in string.whitespace) or
-           (commentpos >= 2 and
-            line[commentpos-2] not in string.whitespace))):
-        error(filename, linenum, 'whitespace/comments', 2,
-              'At least two spaces is best between code and comments')
-      # There should always be a space between the // and the comment
-      commentend = commentpos + 2
-      if commentend < len(line) and not line[commentend] == ' ':
-        # but some lines are exceptions -- e.g. if they're big
-        # comment delimiters like:
-        # //----------------------------------------------------------
-        # or are an empty C++ style Doxygen comment, like:
-        # ///
-        # or they begin with multiple slashes followed by a space:
-        # //////// Header comment
-        match = (Search(r'[=/-]{4,}\s*$', line[commentend:]) or
-                 Search(r'^/$', line[commentend:]) or
-                 Search(r'^/+ ', line[commentend:]))
-        if not match:
-          error(filename, linenum, 'whitespace/comments', 4,
-                'Should have a space between // and comment')
-      CheckComment(line[commentpos:], filename, linenum, error)
-
-  line = clean_lines.elided[linenum]  # get rid of comments and strings
-
-  # Don't try to do spacing checks for operator methods
-  line = re.sub(r'operator(==|!=|<|<<|<=|>=|>>|>)\(', 'operator\(', line)
-
-  # We allow no-spaces around = within an if: "if ( (a=Foo()) == 0 )".
-  # Otherwise not.  Note we only check for non-spaces on *both* sides;
-  # sometimes people put non-spaces on one side when aligning ='s among
-  # many lines (not that this is behavior that I approve of...)
-  if Search(r'[\w.]=[\w.]', line) and not Search(r'\b(if|while) ', line):
-    error(filename, linenum, 'whitespace/operators', 4,
-          'Missing spaces around =')
-
-  # It's ok not to have spaces around binary operators like + - * /, but if
-  # there's too little whitespace, we get concerned.  It's hard to tell,
-  # though, so we punt on this one for now.  TODO.
-
-  # You should always have whitespace around binary operators.
-  # Alas, we can't test < or > because they're legitimately used sans spaces
-  # (a->b, vector a).  The only time we can tell is a < with no >, and
-  # only if it's not template params list spilling into the next line.
-  match = Search(r'[^<>=!\s](==|!=|<=|>=)[^<>=!\s]', line)
-  if not match:
-    # Note that while it seems that the '<[^<]*' term in the following
-    # regexp could be simplified to '<.*', which would indeed match
-    # the same class of strings, the [^<] means that searching for the
-    # regexp takes linear rather than quadratic time.
-    if not Search(r'<[^<]*,\s*$', line):  # template params spill
-      match = Search(r'[^<>=!\s](<)[^<>=!\s]([^>]|->)*$', line)
-  if match:
-    error(filename, linenum, 'whitespace/operators', 3,
-          'Missing spaces around %s' % match.group(1))
-  # We allow no-spaces around << and >> when used like this: 10<<20, but
-  # not otherwise (particularly, not when used as streams)
-  match = Search(r'[^0-9\s](<<|>>)[^0-9\s]', line)
-  if match:
-    error(filename, linenum, 'whitespace/operators', 3,
-          'Missing spaces around %s' % match.group(1))
-
-  # There shouldn't be space around unary operators
-  match = Search(r'(!\s|~\s|[\s]--[\s;]|[\s]\+\+[\s;])', line)
-  if match:
-    error(filename, linenum, 'whitespace/operators', 4,
-          'Extra space for operator %s' % match.group(1))
-
-  # A pet peeve of mine: no spaces after an if, while, switch, or for
-  match = Search(r' (if\(|for\(|while\(|switch\()', line)
-  if match:
-    error(filename, linenum, 'whitespace/parens', 5,
-          'Missing space before ( in %s' % match.group(1))
-
-  # For if/for/while/switch, the left and right parens should be
-  # consistent about how many spaces are inside the parens, and
-  # there should either be zero or one spaces inside the parens.
-  # We don't want: "if ( foo)" or "if ( foo   )".
-  # Exception: "for ( ; foo; bar)" and "for (foo; bar; )" are allowed.
-  match = Search(r'\b(if|for|while|switch)\s*'
-                 r'\(([ ]*)(.).*[^ ]+([ ]*)\)\s*{\s*$',
-                 line)
-  if match:
-    if len(match.group(2)) != len(match.group(4)):
-      if not (match.group(3) == ';' and
-              len(match.group(2)) == 1 + len(match.group(4)) or
-              not match.group(2) and Search(r'\bfor\s*\(.*; \)', line)):
-        error(filename, linenum, 'whitespace/parens', 5,
-              'Mismatching spaces inside () in %s' % match.group(1))
-    if not len(match.group(2)) in [0, 1]:
-      error(filename, linenum, 'whitespace/parens', 5,
-            'Should have zero or one spaces inside ( and ) in %s' %
-            match.group(1))
-
-  # You should always have a space after a comma (either as fn arg or operator)
-  if Search(r',[^\s]', line):
-    error(filename, linenum, 'whitespace/comma', 3,
-          'Missing space after ,')
-
-  # You should always have a space after a semicolon
-  # except for few corner cases
-  # TODO(unknown): clarify if 'if (1) { return 1;}' is requires one more
-  # space after ;
-  if Search(r';[^\s};\\)/]', line):
-    error(filename, linenum, 'whitespace/semicolon', 3,
-          'Missing space after ;')
-
-  # Next we will look for issues with function calls.
-  CheckSpacingForFunctionCall(filename, line, linenum, error)
-
-  # Except after an opening paren, or after another opening brace (in case of
-  # an initializer list, for instance), you should have spaces before your
-  # braces. And since you should never have braces at the beginning of a line,
-  # this is an easy test.
-  if Search(r'[^ \t({]{', line):  # The check for tab was added by Telldus
-    error(filename, linenum, 'whitespace/braces', 5,
-          'Missing whitespace before {')
-
-  # Make sure '} else {' has spaces.
-  if Search(r'}else', line):
-    error(filename, linenum, 'whitespace/braces', 5,
-          'Missing space before else')
-
-  # You shouldn't have spaces before your brackets, except maybe after
-  # 'delete []' or 'new char * []'.
-  if Search(r'\w\s+\[', line) and not Search(r'delete\s+\[', line):
-    error(filename, linenum, 'whitespace/braces', 5,
-          'Extra space before [')
-
-  # You shouldn't have a space before a semicolon at the end of the line.
-  # There's a special case for "for" since the style guide allows space before
-  # the semicolon there.
-  if Search(r':\s*;\s*$', line):
-    error(filename, linenum, 'whitespace/semicolon', 5,
-          'Semicolon defining empty statement. Use { } instead.')
-  elif Search(r'^\s*;\s*$', line):
-    error(filename, linenum, 'whitespace/semicolon', 5,
-          'Line contains only semicolon. If this should be an empty statement, '
-          'use { } instead.')
-  elif (Search(r'\s+;\s*$', line) and
-        not Search(r'\bfor\b', line)):
-    error(filename, linenum, 'whitespace/semicolon', 5,
-          'Extra space before last semicolon. If this should be an empty '
-          'statement, use { } instead.')
-
-
-def CheckSectionSpacing(filename, clean_lines, class_info, linenum, error):
-  """Checks for additional blank line issues related to sections.
-
-  Currently the only thing checked here is blank line before protected/private.
-
-  Args:
-    filename: The name of the current file.
-    clean_lines: A CleansedLines instance containing the file.
-    class_info: A _ClassInfo objects.
-    linenum: The number of the line to check.
-    error: The function to call with any errors found.
-  """
-  # Skip checks if the class is small, where small means 25 lines or less.
-  # 25 lines seems like a good cutoff since that's the usual height of
-  # terminals, and any class that can't fit in one screen can't really
-  # be considered "small".
-  #
-  # Also skip checks if we are on the first line.  This accounts for
-  # classes that look like
-  #   class Foo { public: ... };
-  #
-  # If we didn't find the end of the class, last_line would be zero,
-  # and the check will be skipped by the first condition.
-  if (class_info.last_line - class_info.linenum <= 24 or
-      linenum <= class_info.linenum):
-    return
-
-  matched = Match(r'\s*(public|protected|private):', clean_lines.lines[linenum])
-  if matched:
-    # Issue warning if the line before public/protected/private was
-    # not a blank line, but don't do this if the previous line contains
-    # "class" or "struct".  This can happen two ways:
-    #  - We are at the beginning of the class.
-    #  - We are forward-declaring an inner class that is semantically
-    #    private, but needed to be public for implementation reasons.
-    prev_line = clean_lines.lines[linenum - 1]
-    if (not IsBlankLine(prev_line) and
-        not Search(r'\b(class|struct)\b', prev_line)):
-      # Try a bit harder to find the beginning of the class.  This is to
-      # account for multi-line base-specifier lists, e.g.:
-      #   class Derived
-      #       : public Base {
-      end_class_head = class_info.linenum
-      for i in range(class_info.linenum, linenum):
-        if Search(r'\{\s*$', clean_lines.lines[i]):
-          end_class_head = i
-          break
-      if end_class_head < linenum - 1:
-        error(filename, linenum, 'whitespace/blank_line', 3,
-              '"%s:" should be preceded by a blank line' % matched.group(1))
-
-
-def GetPreviousNonBlankLine(clean_lines, linenum):
-  """Return the most recent non-blank line and its line number.
-
-  Args:
-    clean_lines: A CleansedLines instance containing the file contents.
-    linenum: The number of the line to check.
-
-  Returns:
-    A tuple with two elements.  The first element is the contents of the last
-    non-blank line before the current line, or the empty string if this is the
-    first non-blank line.  The second is the line number of that line, or -1
-    if this is the first non-blank line.
-  """
-
-  prevlinenum = linenum - 1
-  while prevlinenum >= 0:
-    prevline = clean_lines.elided[prevlinenum]
-    if not IsBlankLine(prevline):     # if not a blank line...
-      return (prevline, prevlinenum)
-    prevlinenum -= 1
-  return ('', -1)
-
-
-def CheckBraces(filename, clean_lines, linenum, error):
-  """Looks for misplaced braces (e.g. at the end of line).
-
-  Args:
-    filename: The name of the current file.
-    clean_lines: A CleansedLines instance containing the file.
-    linenum: The number of the line to check.
-    error: The function to call with any errors found.
-  """
-
-  line = clean_lines.elided[linenum]        # get rid of comments and strings
-
-  if Match(r'\s*{\s*$', line):
-    # We allow an open brace to start a line in the case where someone
-    # is using braces in a block to explicitly create a new scope,
-    # which is commonly used to control the lifetime of
-    # stack-allocated variables.  We don't detect this perfectly: we
-    # just don't complain if the last non-whitespace character on the
-    # previous non-blank line is ';', ':', '{', or '}'.
-    prevline = GetPreviousNonBlankLine(clean_lines, linenum)[0]
-    if not Search(r'[;:}{]\s*$', prevline):
-      error(filename, linenum, 'whitespace/braces', 4,
-            '{ should almost always be at the end of the previous line')
-
-  # An else clause should be on the same line as the preceding closing brace.
-  if Match(r'\s*else\s*', line):
-    prevline = GetPreviousNonBlankLine(clean_lines, linenum)[0]
-    if Match(r'\s*}\s*$', prevline):
-      error(filename, linenum, 'whitespace/newline', 4,
-            'An else should appear on the same line as the preceding }')
-
-  # If braces come on one side of an else, they should be on both.
-  # However, we have to worry about "else if" that spans multiple lines!
-  if Search(r'}\s*else[^{]*$', line) or Match(r'[^}]*else\s*{', line):
-    if Search(r'}\s*else if([^{]*)$', line):       # could be multi-line if
-      # find the ( after the if
-      pos = line.find('else if')
-      pos = line.find('(', pos)
-      if pos > 0:
-        (endline, _, endpos) = CloseExpression(clean_lines, linenum, pos)
-        if endline[endpos:].find('{') == -1:    # must be brace after if
-          error(filename, linenum, 'readability/braces', 5,
-                'If an else has a brace on one side, it should have it on both')
-    else:            # common case: else not followed by a multi-line if
-      error(filename, linenum, 'readability/braces', 5,
-            'If an else has a brace on one side, it should have it on both')
-
-  # Likewise, an else should never have the else clause on the same line
-  if Search(r'\belse [^\s{]', line) and not Search(r'\belse if\b', line):
-    error(filename, linenum, 'whitespace/newline', 4,
-          'Else clause should never be on same line as else (use 2 lines)')
-
-  # In the same way, a do/while should never be on one line
-  if Match(r'\s*do [^\s{]', line):
-    error(filename, linenum, 'whitespace/newline', 4,
-          'do/while clauses should not be on a single line')
-
-  # Braces shouldn't be followed by a ; unless they're defining a struct
-  # or initializing an array.
-  # We can't tell in general, but we can for some common cases.
-  prevlinenum = linenum
-  while True:
-    (prevline, prevlinenum) = GetPreviousNonBlankLine(clean_lines, prevlinenum)
-    if Match(r'\s+{.*}\s*;', line) and not prevline.count(';'):
-      line = prevline + line
-    else:
-      break
-  if (Search(r'{.*}\s*;', line) and
-      line.count('{') == line.count('}') and
-      not Search(r'struct|class|enum|\s*=\s*{', line)):
-    error(filename, linenum, 'readability/braces', 4,
-          "You don't need a ; after a }")
-
-
-def ReplaceableCheck(operator, macro, line):
-  """Determine whether a basic CHECK can be replaced with a more specific one.
-
-  For example suggest using CHECK_EQ instead of CHECK(a == b) and
-  similarly for CHECK_GE, CHECK_GT, CHECK_LE, CHECK_LT, CHECK_NE.
-
-  Args:
-    operator: The C++ operator used in the CHECK.
-    macro: The CHECK or EXPECT macro being called.
-    line: The current source line.
-
-  Returns:
-    True if the CHECK can be replaced with a more specific one.
-  """
-
-  # This matches decimal and hex integers, strings, and chars (in that order).
-  match_constant = r'([-+]?(\d+|0[xX][0-9a-fA-F]+)[lLuU]{0,3}|".*"|\'.*\')'
-
-  # Expression to match two sides of the operator with something that
-  # looks like a literal, since CHECK(x == iterator) won't compile.
-  # This means we can't catch all the cases where a more specific
-  # CHECK is possible, but it's less annoying than dealing with
-  # extraneous warnings.
-  match_this = (r'\s*' + macro + r'\((\s*' +
-                match_constant + r'\s*' + operator + r'[^<>].*|'
-                r'.*[^<>]' + operator + r'\s*' + match_constant +
-                r'\s*\))')
-
-  # Don't complain about CHECK(x == NULL) or similar because
-  # CHECK_EQ(x, NULL) won't compile (requires a cast).
-  # Also, don't complain about more complex boolean expressions
-  # involving && or || such as CHECK(a == b || c == d).
-  return Match(match_this, line) and not Search(r'NULL|&&|\|\|', line)
-
-
-def CheckCheck(filename, clean_lines, linenum, error):
-  """Checks the use of CHECK and EXPECT macros.
-
-  Args:
-    filename: The name of the current file.
-    clean_lines: A CleansedLines instance containing the file.
-    linenum: The number of the line to check.
-    error: The function to call with any errors found.
-  """
-
-  # Decide the set of replacement macros that should be suggested
-  raw_lines = clean_lines.raw_lines
-  current_macro = ''
-  for macro in _CHECK_MACROS:
-    if raw_lines[linenum].find(macro) >= 0:
-      current_macro = macro
-      break
-  if not current_macro:
-    # Don't waste time here if line doesn't contain 'CHECK' or 'EXPECT'
-    return
-
-  line = clean_lines.elided[linenum]        # get rid of comments and strings
-
-  # Encourage replacing plain CHECKs with CHECK_EQ/CHECK_NE/etc.
-  for operator in ['==', '!=', '>=', '>', '<=', '<']:
-    if ReplaceableCheck(operator, current_macro, line):
-      error(filename, linenum, 'readability/check', 2,
-            'Consider using %s instead of %s(a %s b)' % (
-                _CHECK_REPLACEMENT[current_macro][operator],
-                current_macro, operator))
-      break
-
-
-def GetLineWidth(line):
-  """Determines the width of the line in column positions.
-
-  Args:
-    line: A string, which may be a Unicode string.
-
-  Returns:
-    The width of the line in column positions, accounting for Unicode
-    combining characters and wide characters.
-  """
-  if isinstance(line, unicode):
-    width = 0
-    for uc in unicodedata.normalize('NFC', line):
-      if unicodedata.east_asian_width(uc) in ('W', 'F'):
-        width += 2
-      elif not unicodedata.combining(uc):
-        width += 1
-    return width
-  else:
-    return len(line)
-
-
-def CheckStyle(filename, clean_lines, linenum, file_extension, class_state,
-               error):
-  """Checks rules from the 'C++ style rules' section of cppguide.html.
-
-  Most of these rules are hard to test (naming, comment style), but we
-  do what we can.  In particular we check for 2-space indents, line lengths,
-  tab usage, spaces inside code, etc.
-
-  Args:
-    filename: The name of the current file.
-    clean_lines: A CleansedLines instance containing the file.
-    linenum: The number of the line to check.
-    file_extension: The extension (without the dot) of the filename.
-    error: The function to call with any errors found.
-  """
-
-  raw_lines = clean_lines.raw_lines
-  line = raw_lines[linenum]
-
-  if line.find('\t') != -1:
-    error(filename, linenum, 'whitespace/tab', 1,
-          'Tab found; better to use spaces')
-
-  if line and line[0] == ' ':
-    error(filename, linenum, 'whitespace/use_tab_for_indentation', 1,
-          'Space found; use tabs for indentation')
-
-  # One or three blank spaces at the beginning of the line is weird; it's
-  # hard to reconcile that with 2-space indents.
-  # NOTE: here are the conditions rob pike used for his tests.  Mine aren't
-  # as sophisticated, but it may be worth becoming so:  RLENGTH==initial_spaces
-  # if(RLENGTH > 20) complain = 0;
-  # if(match($0, " +(error|private|public|protected):")) complain = 0;
-  # if(match(prev, "&& *$")) complain = 0;
-  # if(match(prev, "\\|\\| *$")) complain = 0;
-  # if(match(prev, "[\",=><] *$")) complain = 0;
-  # if(match($0, " <<")) complain = 0;
-  # if(match(prev, " +for \\(")) complain = 0;
-  # if(prevodd && match(prevprev, " +for \\(")) complain = 0;
-  initial_spaces = 0
-  cleansed_line = clean_lines.elided[linenum]
-  while initial_spaces < len(line) and line[initial_spaces] == ' ':
-    initial_spaces += 1
-  if line and line[-1].isspace():
-    error(filename, linenum, 'whitespace/end_of_line', 4,
-          'Line ends in whitespace.  Consider deleting these extra spaces.')
-  # There are certain situations we allow one space, notably for labels
-  elif ((initial_spaces == 1 or initial_spaces == 3) and
-        not Match(r'\s*\w+\s*:\s*$', cleansed_line)):
-    error(filename, linenum, 'whitespace/indent', 3,
-          'Weird number of spaces at line-start.  '
-          'Are you using a 2-space indent?')
-  # Labels should always be indented at least one space.
-  elif not initial_spaces and line[:2] != '//' and Search(r'[^:]:\s*$',
-                                                          line):
-    error(filename, linenum, 'whitespace/labels', 4,
-          'Labels should always be indented at least one space.  '
-          'If this is a member-initializer list in a constructor or '
-          'the base class list in a class definition, the colon should '
-          'be on the following line.')
-
-
-  # Check if the line is a header guard.
-  is_header_guard = False
-  if file_extension == 'h':
-    cppvar = GetHeaderGuardCPPVariable(filename)
-    if (line.startswith('#ifndef %s' % cppvar) or
-        line.startswith('#define %s' % cppvar) or
-        line.startswith('#endif  // %s' % cppvar)):
-      is_header_guard = True
-  # #include lines and header guards can be long, since there's no clean way to
-  # split them.
-  #
-  # URLs can be long too.  It's possible to split these, but it makes them
-  # harder to cut&paste.
-  #
-  # The "$Id:...$" comment may also get very long without it being the
-  # developers fault.
-  if (not line.startswith('#include') and not is_header_guard and
-      not Match(r'^\s*//.*http(s?)://\S*$', line) and
-      not Match(r'^// \$Id:.*#[0-9]+ \$$', line)):
-    line_width = GetLineWidth(line)
-    if line_width > 100:
-      error(filename, linenum, 'whitespace/line_length', 4,
-            'Lines should very rarely be longer than 100 characters')
-    elif line_width > 80:
-      error(filename, linenum, 'whitespace/line_length', 2,
-            'Lines should be <= 80 characters long')
-
-  if (cleansed_line.count(';') > 1 and
-      # for loops are allowed two ;'s (and may run over two lines).
-      cleansed_line.find('for') == -1 and
-      (GetPreviousNonBlankLine(clean_lines, linenum)[0].find('for') == -1 or
-       GetPreviousNonBlankLine(clean_lines, linenum)[0].find(';') != -1) and
-      # It's ok to have many commands in a switch case that fits in 1 line
-      not ((cleansed_line.find('case ') != -1 or
-            cleansed_line.find('default:') != -1) and
-           cleansed_line.find('break;') != -1)):
-    error(filename, linenum, 'whitespace/newline', 4,
-          'More than one command on the same line')
-
-  # Some more style checks
-  CheckBraces(filename, clean_lines, linenum, error)
-  CheckSpacing(filename, clean_lines, linenum, error)
-  CheckCheck(filename, clean_lines, linenum, error)
-  if class_state and class_state.classinfo_stack:
-    CheckSectionSpacing(filename, clean_lines,
-                        class_state.classinfo_stack[-1], linenum, error)
-
-
-_RE_PATTERN_INCLUDE_NEW_STYLE = re.compile(r'#include +"[^/]+\.h"')
-_RE_PATTERN_INCLUDE = re.compile(r'^\s*#\s*include\s*([<"])([^>"]*)[>"].*$')
-# Matches the first component of a filename delimited by -s and _s. That is:
-#  _RE_FIRST_COMPONENT.match('foo').group(0) == 'foo'
-#  _RE_FIRST_COMPONENT.match('foo.cc').group(0) == 'foo'
-#  _RE_FIRST_COMPONENT.match('foo-bar_baz.cc').group(0) == 'foo'
-#  _RE_FIRST_COMPONENT.match('foo_bar-baz.cc').group(0) == 'foo'
-_RE_FIRST_COMPONENT = re.compile(r'^[^-_.]+')
-
-
-def _DropCommonSuffixes(filename):
-  """Drops common suffixes like _test.cc or -inl.h from filename.
-
-  For example:
-    >>> _DropCommonSuffixes('foo/foo-inl.h')
-    'foo/foo'
-    >>> _DropCommonSuffixes('foo/bar/foo.cc')
-    'foo/bar/foo'
-    >>> _DropCommonSuffixes('foo/foo_internal.h')
-    'foo/foo'
-    >>> _DropCommonSuffixes('foo/foo_unusualinternal.h')
-    'foo/foo_unusualinternal'
-
-  Args:
-    filename: The input filename.
-
-  Returns:
-    The filename with the common suffix removed.
-  """
-  for suffix in ('test.cc', 'regtest.cc', 'unittest.cc',
-                 'inl.h', 'impl.h', 'internal.h'):
-    if (filename.endswith(suffix) and len(filename) > len(suffix) and
-        filename[-len(suffix) - 1] in ('-', '_')):
-      return filename[:-len(suffix) - 1]
-  return os.path.splitext(filename)[0]
-
-
-def _IsTestFilename(filename):
-  """Determines if the given filename has a suffix that identifies it as a test.
-
-  Args:
-    filename: The input filename.
-
-  Returns:
-    True if 'filename' looks like a test, False otherwise.
-  """
-  if (filename.endswith('_test.cc') or
-      filename.endswith('_unittest.cc') or
-      filename.endswith('_regtest.cc')):
-    return True
-  else:
-    return False
-
-
-def _ClassifyInclude(fileinfo, include, is_system):
-  """Figures out what kind of header 'include' is.
-
-  Args:
-    fileinfo: The current file cpplint is running over. A FileInfo instance.
-    include: The path to a #included file.
-    is_system: True if the #include used <> rather than "".
-
-  Returns:
-    One of the _XXX_HEADER constants.
-
-  For example:
-    >>> _ClassifyInclude(FileInfo('foo/foo.cc'), 'stdio.h', True)
-    _C_SYS_HEADER
-    >>> _ClassifyInclude(FileInfo('foo/foo.cc'), 'string', True)
-    _CPP_SYS_HEADER
-    >>> _ClassifyInclude(FileInfo('foo/foo.cc'), 'foo/foo.h', False)
-    _LIKELY_MY_HEADER
-    >>> _ClassifyInclude(FileInfo('foo/foo_unknown_extension.cc'),
-    ...                  'bar/foo_other_ext.h', False)
-    _POSSIBLE_MY_HEADER
-    >>> _ClassifyInclude(FileInfo('foo/foo.cc'), 'foo/bar.h', False)
-    _OTHER_HEADER
-  """
-  # This is a list of all standard c++ header files, except
-  # those already checked for above.
-  is_stl_h = include in _STL_HEADERS
-  is_cpp_h = is_stl_h or include in _CPP_HEADERS
-
-  if is_system:
-    if is_cpp_h:
-      return _CPP_SYS_HEADER
-    else:
-      return _C_SYS_HEADER
-
-  # If the target file and the include we're checking share a
-  # basename when we drop common extensions, and the include
-  # lives in . , then it's likely to be owned by the target file.
-  target_dir, target_base = (
-      os.path.split(_DropCommonSuffixes(fileinfo.RepositoryName())))
-  include_dir, include_base = os.path.split(_DropCommonSuffixes(include))
-  if target_base == include_base and (
-      include_dir == target_dir or
-      include_dir == os.path.normpath(target_dir + '/../public')):
-    return _LIKELY_MY_HEADER
-
-  # If the target and include share some initial basename
-  # component, it's possible the target is implementing the
-  # include, so it's allowed to be first, but we'll never
-  # complain if it's not there.
-  target_first_component = _RE_FIRST_COMPONENT.match(target_base)
-  include_first_component = _RE_FIRST_COMPONENT.match(include_base)
-  if (target_first_component and include_first_component and
-      target_first_component.group(0) ==
-      include_first_component.group(0)):
-    return _POSSIBLE_MY_HEADER
-
-  return _OTHER_HEADER
-
-
-
-def CheckIncludeLine(filename, clean_lines, linenum, include_state, error):
-  """Check rules that are applicable to #include lines.
-
-  Strings on #include lines are NOT removed from elided line, to make
-  certain tasks easier. However, to prevent false positives, checks
-  applicable to #include lines in CheckLanguage must be put here.
-
-  Args:
-    filename: The name of the current file.
-    clean_lines: A CleansedLines instance containing the file.
-    linenum: The number of the line to check.
-    include_state: An _IncludeState instance in which the headers are inserted.
-    error: The function to call with any errors found.
-  """
-  fileinfo = FileInfo(filename)
-
-  line = clean_lines.lines[linenum]
-
-  # "include" should use the new style "foo/bar.h" instead of just "bar.h"
-  if _RE_PATTERN_INCLUDE_NEW_STYLE.search(line):
-    error(filename, linenum, 'build/include', 4,
-          'Include the directory when naming .h files')
-
-  # we shouldn't include a file more than once. actually, there are a
-  # handful of instances where doing so is okay, but in general it's
-  # not.
-  match = _RE_PATTERN_INCLUDE.search(line)
-  if match:
-    include = match.group(2)
-    is_system = (match.group(1) == '<')
-    if include in include_state:
-      error(filename, linenum, 'build/include', 4,
-            '"%s" already included at %s:%s' %
-            (include, filename, include_state[include]))
-    else:
-      include_state[include] = linenum
-
-      # We want to ensure that headers appear in the right order:
-      # 1) for foo.cc, foo.h  (preferred location)
-      # 2) c system files
-      # 3) cpp system files
-      # 4) for foo.cc, foo.h  (deprecated location)
-      # 5) other google headers
-      #
-      # We classify each include statement as one of those 5 types
-      # using a number of techniques. The include_state object keeps
-      # track of the highest type seen, and complains if we see a
-      # lower type after that.
-      error_message = include_state.CheckNextIncludeOrder(
-          _ClassifyInclude(fileinfo, include, is_system))
-      if error_message:
-        error(filename, linenum, 'build/include_order', 4,
-              '%s. Should be: %s.h, c system, c++ system, other.' %
-              (error_message, fileinfo.BaseName()))
-      if not include_state.IsInAlphabeticalOrder(include):
-        error(filename, linenum, 'build/include_alpha', 4,
-              'Include "%s" not in alphabetical order' % include)
-
-  # Look for any of the stream classes that are part of standard C++.
-  match = _RE_PATTERN_INCLUDE.match(line)
-  if match:
-    include = match.group(2)
-    if Match(r'(f|ind|io|i|o|parse|pf|stdio|str|)?stream$', include):
-      # Many unit tests use cout, so we exempt them.
-      if not _IsTestFilename(filename):
-        error(filename, linenum, 'readability/streams', 3,
-              'Streams are highly discouraged.')
-
-
-def _GetTextInside(text, start_pattern):
-  """Retrieves all the text between matching open and close parentheses.
-
-  Given a string of lines and a regular expression string, retrieve all the text
-  following the expression and between opening punctuation symbols like
-  (, [, or {, and the matching close-punctuation symbol. This properly nested
-  occurrences of the punctuations, so for the text like
-    printf(a(), b(c()));
-  a call to _GetTextInside(text, r'printf\(') will return 'a(), b(c())'.
-  start_pattern must match string having an open punctuation symbol at the end.
-
-  Args:
-    text: The lines to extract text. Its comments and strings must be elided.
-           It can be single line and can span multiple lines.
-    start_pattern: The regexp string indicating where to start extracting
-                   the text.
-  Returns:
-    The extracted text.
-    None if either the opening string or ending punctuation could not be found.
-  """
-  # TODO(sugawarayu): Audit cpplint.py to see what places could be profitably
-  # rewritten to use _GetTextInside (and use inferior regexp matching today).
-
-  # Give opening punctuations to get the matching close-punctuations.
-  matching_punctuation = {'(': ')', '{': '}', '[': ']'}
-  closing_punctuation = set(matching_punctuation.itervalues())
-
-  # Find the position to start extracting text.
-  match = re.search(start_pattern, text, re.M)
-  if not match:  # start_pattern not found in text.
-    return None
-  start_position = match.end(0)
-
-  assert start_position > 0, (
-      'start_pattern must ends with an opening punctuation.')
-  assert text[start_position - 1] in matching_punctuation, (
-      'start_pattern must ends with an opening punctuation.')
-  # Stack of closing punctuations we expect to have in text after position.
-  punctuation_stack = [matching_punctuation[text[start_position - 1]]]
-  position = start_position
-  while punctuation_stack and position < len(text):
-    if text[position] == punctuation_stack[-1]:
-      punctuation_stack.pop()
-    elif text[position] in closing_punctuation:
-      # A closing punctuation without matching opening punctuations.
-      return None
-    elif text[position] in matching_punctuation:
-      punctuation_stack.append(matching_punctuation[text[position]])
-    position += 1
-  if punctuation_stack:
-    # Opening punctuations left without matching close-punctuations.
-    return None
-  # punctuations match.
-  return text[start_position:position - 1]
-
-
-def CheckLanguage(filename, clean_lines, linenum, file_extension, include_state,
-                  error):
-  """Checks rules from the 'C++ language rules' section of cppguide.html.
-
-  Some of these rules are hard to test (function overloading, using
-  uint32 inappropriately), but we do the best we can.
-
-  Args:
-    filename: The name of the current file.
-    clean_lines: A CleansedLines instance containing the file.
-    linenum: The number of the line to check.
-    file_extension: The extension (without the dot) of the filename.
-    include_state: An _IncludeState instance in which the headers are inserted.
-    error: The function to call with any errors found.
-  """
-  # If the line is empty or consists of entirely a comment, no need to
-  # check it.
-  line = clean_lines.elided[linenum]
-  if not line:
-    return
-
-  match = _RE_PATTERN_INCLUDE.search(line)
-  if match:
-    CheckIncludeLine(filename, clean_lines, linenum, include_state, error)
-    return
-
-  # Create an extended_line, which is the concatenation of the current and
-  # next lines, for more effective checking of code that may span more than one
-  # line.
-  if linenum + 1 < clean_lines.NumLines():
-    extended_line = line + clean_lines.elided[linenum + 1]
-  else:
-    extended_line = line
-
-  # Make Windows paths like Unix.
-  fullname = os.path.abspath(filename).replace('\\', '/')
-
-  # TODO(unknown): figure out if they're using default arguments in fn proto.
-
-  # Check for non-const references in functions.  This is tricky because &
-  # is also used to take the address of something.  We allow <> for templates,
-  # (ignoring whatever is between the braces) and : for classes.
-  # These are complicated re's.  They try to capture the following:
-  # paren (for fn-prototype start), typename, &, varname.  For the const
-  # version, we're willing for const to be before typename or after
-  # Don't check the implementation on same line.
-  fnline = line.split('{', 1)[0]
-  if (len(re.findall(r'\([^()]*\b(?:[\w:]|<[^()]*>)+(\s?&|&\s?)\w+', fnline)) >
-      len(re.findall(r'\([^()]*\bconst\s+(?:typename\s+)?(?:struct\s+)?'
-                     r'(?:[\w:]|<[^()]*>)+(\s?&|&\s?)\w+', fnline)) +
-      len(re.findall(r'\([^()]*\b(?:[\w:]|<[^()]*>)+\s+const(\s?&|&\s?)[\w]+',
-                     fnline))):
-
-    # We allow non-const references in a few standard places, like functions
-    # called "swap()" or iostream operators like "<<" or ">>".
-    if not Search(
-        r'(swap|Swap|operator[<>][<>])\s*\(\s*(?:[\w:]|<.*>)+\s*&',
-        fnline):
-      error(filename, linenum, 'runtime/references', 2,
-            'Is this a non-const reference? '
-            'If so, make const or use a pointer.')
-
-  # Check to see if they're using an conversion function cast.
-  # I just try to capture the most common basic types, though there are more.
-  # Parameterless conversion functions, such as bool(), are allowed as they are
-  # probably a member operator declaration or default constructor.
-  match = Search(
-      r'(\bnew\s+)?\b'  # Grab 'new' operator, if it's there
-      r'(int|float|double|bool|char|int32|uint32|int64|uint64)\([^)]', line)
-  if match:
-    # gMock methods are defined using some variant of MOCK_METHODx(name, type)
-    # where type may be float(), int(string), etc.  Without context they are
-    # virtually indistinguishable from int(x) casts. Likewise, gMock's
-    # MockCallback takes a template parameter of the form return_type(arg_type),
-    # which looks much like the cast we're trying to detect.
-    if (match.group(1) is None and  # If new operator, then this isn't a cast
-        not (Match(r'^\s*MOCK_(CONST_)?METHOD\d+(_T)?\(', line) or
-             Match(r'^\s*MockCallback<.*>', line))):
-      error(filename, linenum, 'readability/casting', 4,
-            'Using deprecated casting style.  '
-            'Use static_cast<%s>(...) instead' %
-            match.group(2))
-
-  CheckCStyleCast(filename, linenum, line, clean_lines.raw_lines[linenum],
-                  'static_cast',
-                  r'\((int|float|double|bool|char|u?int(16|32|64))\)', error)
-
-  # This doesn't catch all cases. Consider (const char * const)"hello".
-  #
-  # (char *) "foo" should always be a const_cast (reinterpret_cast won't
-  # compile).
-  if CheckCStyleCast(filename, linenum, line, clean_lines.raw_lines[linenum],
-                     'const_cast', r'\((char\s?\*+\s?)\)\s*"', error):
-    pass
-  else:
-    # Check pointer casts for other than string constants
-    CheckCStyleCast(filename, linenum, line, clean_lines.raw_lines[linenum],
-                    'reinterpret_cast', r'\((\w+\s?\*+\s?)\)', error)
-
-  # In addition, we look for people taking the address of a cast.  This
-  # is dangerous -- casts can assign to temporaries, so the pointer doesn't
-  # point where you think.
-  if Search(
-      r'(&\([^)]+\)[\w(])|(&(static|dynamic|reinterpret)_cast\b)', line):
-    error(filename, linenum, 'runtime/casting', 4,
-          ('Are you taking an address of a cast?  '
-           'This is dangerous: could be a temp var.  '
-           'Take the address before doing the cast, rather than after'))
-
-  # Check for people declaring static/global STL strings at the top level.
-  # This is dangerous because the C++ language does not guarantee that
-  # globals with constructors are initialized before the first access.
-  match = Match(
-      r'((?:|static +)(?:|const +))string +([a-zA-Z0-9_:]+)\b(.*)',
-      line)
-  # Make sure it's not a function.
-  # Function template specialization looks like: "string foo(...".
-  # Class template definitions look like: "string Foo::Method(...".
-  if match and not Match(r'\s*(<.*>)?(::[a-zA-Z0-9_]+)?\s*\(([^"]|$)',
-                         match.group(3)):
-    error(filename, linenum, 'runtime/string', 4,
-          'For a static/global string constant, use a C style string instead: '
-          '"%schar %s[]".' %
-          (match.group(1), match.group(2)))
-
-  # Check that we're not using RTTI outside of testing code.
-  if Search(r'\bdynamic_cast<', line) and not _IsTestFilename(filename):
-    error(filename, linenum, 'runtime/rtti', 5,
-          'Do not use dynamic_cast<>.  If you need to cast within a class '
-          "hierarchy, use static_cast<> to upcast.  Google doesn't support "
-          'RTTI.')
-
-  if Search(r'\b([A-Za-z0-9_]*_)\(\1\)', line):
-    error(filename, linenum, 'runtime/init', 4,
-          'You seem to be initializing a member variable with itself.')
-
-  if file_extension == 'h':
-    # TODO(unknown): check that 1-arg constructors are explicit.
-    #                How to tell it's a constructor?
-    #                (handled in CheckForNonStandardConstructs for now)
-    # TODO(unknown): check that classes have DISALLOW_EVIL_CONSTRUCTORS
-    #                (level 1 error)
-    pass
-
-  # Check if people are using the verboten C basic types.  The only exception
-  # we regularly allow is "unsigned short port" for port.
-  if Search(r'\bshort port\b', line):
-    if not Search(r'\bunsigned short port\b', line):
-      error(filename, linenum, 'runtime/int', 4,
-            'Use "unsigned short" for ports, not "short"')
-  else:
-    match = Search(r'\b(short|long(?! +double)|long long)\b', line)
-    if match:
-      error(filename, linenum, 'runtime/int', 4,
-            'Use int16/int64/etc, rather than the C type %s' % match.group(1))
-
-  # When snprintf is used, the second argument shouldn't be a literal.
-  match = Search(r'snprintf\s*\(([^,]*),\s*([0-9]*)\s*,', line)
-  if match and match.group(2) != '0':
-    # If 2nd arg is zero, snprintf is used to calculate size.
-    error(filename, linenum, 'runtime/printf', 3,
-          'If you can, use sizeof(%s) instead of %s as the 2nd arg '
-          'to snprintf.' % (match.group(1), match.group(2)))
-
-  # Check if some verboten C functions are being used.
-  if Search(r'\bsprintf\b', line):
-    error(filename, linenum, 'runtime/printf', 5,
-          'Never use sprintf.  Use snprintf instead.')
-  match = Search(r'\b(strcpy|strcat)\b', line)
-  if match:
-    error(filename, linenum, 'runtime/printf', 4,
-          'Almost always, snprintf is better than %s' % match.group(1))
-
-  if Search(r'\bsscanf\b', line):
-    error(filename, linenum, 'runtime/printf', 1,
-          'sscanf can be ok, but is slow and can overflow buffers.')
-
-  # Check if some verboten operator overloading is going on
-  # TODO(unknown): catch out-of-line unary operator&:
-  #   class X {};
-  #   int operator&(const X& x) { return 42; }  // unary operator&
-  # The trick is it's hard to tell apart from binary operator&:
-  #   class Y { int operator&(const Y& x) { return 23; } }; // binary operator&
-  if Search(r'\boperator\s*&\s*\(\s*\)', line):
-    error(filename, linenum, 'runtime/operator', 4,
-          'Unary operator& is dangerous.  Do not use it.')
-
-  # Check for suspicious usage of "if" like
-  # } if (a == b) {
-  if Search(r'\}\s*if\s*\(', line):
-    error(filename, linenum, 'readability/braces', 4,
-          'Did you mean "else if"? If not, start a new line for "if".')
-
-  # Check for potential format string bugs like printf(foo).
-  # We constrain the pattern not to pick things like DocidForPrintf(foo).
-  # Not perfect but it can catch printf(foo.c_str()) and printf(foo->c_str())
-  # TODO(sugawarayu): Catch the following case. Need to change the calling
-  # convention of the whole function to process multiple line to handle it.
-  #   printf(
-  #       boy_this_is_a_really_long_variable_that_cannot_fit_on_the_prev_line);
-  printf_args = _GetTextInside(line, r'(?i)\b(string)?printf\s*\(')
-  if printf_args:
-    match = Match(r'([\w.\->()]+)$', printf_args)
-    if match:
-      function_name = re.search(r'\b((?:string)?printf)\s*\(',
-                                line, re.I).group(1)
-      error(filename, linenum, 'runtime/printf', 4,
-            'Potential format string bug. Do %s("%%s", %s) instead.'
-            % (function_name, match.group(1)))
-
-  # Check for potential memset bugs like memset(buf, sizeof(buf), 0).
-  match = Search(r'memset\s*\(([^,]*),\s*([^,]*),\s*0\s*\)', line)
-  if match and not Match(r"^''|-?[0-9]+|0x[0-9A-Fa-f]$", match.group(2)):
-    error(filename, linenum, 'runtime/memset', 4,
-          'Did you mean "memset(%s, 0, %s)"?'
-          % (match.group(1), match.group(2)))
-
-  if Search(r'\busing namespace\b', line):
-    error(filename, linenum, 'build/namespaces', 5,
-          'Do not use namespace using-directives.  '
-          'Use using-declarations instead.')
-
-  # Detect variable-length arrays.
-  match = Match(r'\s*(.+::)?(\w+) [a-z]\w*\[(.+)];', line)
-  if (match and match.group(2) != 'return' and match.group(2) != 'delete' and
-      match.group(3).find(']') == -1):
-    # Split the size using space and arithmetic operators as delimiters.
-    # If any of the resulting tokens are not compile time constants then
-    # report the error.
-    tokens = re.split(r'\s|\+|\-|\*|\/|<<|>>]', match.group(3))
-    is_const = True
-    skip_next = False
-    for tok in tokens:
-      if skip_next:
-        skip_next = False
-        continue
-
-      if Search(r'sizeof\(.+\)', tok): continue
-      if Search(r'arraysize\(\w+\)', tok): continue
-
-      tok = tok.lstrip('(')
-      tok = tok.rstrip(')')
-      if not tok: continue
-      if Match(r'\d+', tok): continue
-      if Match(r'0[xX][0-9a-fA-F]+', tok): continue
-      if Match(r'k[A-Z0-9]\w*', tok): continue
-      if Match(r'(.+::)?k[A-Z0-9]\w*', tok): continue
-      if Match(r'(.+::)?[A-Z][A-Z0-9_]*', tok): continue
-      # A catch all for tricky sizeof cases, including 'sizeof expression',
-      # 'sizeof(*type)', 'sizeof(const type)', 'sizeof(struct StructName)'
-      # requires skipping the next token because we split on ' ' and '*'.
-      if tok.startswith('sizeof'):
-        skip_next = True
-        continue
-      is_const = False
-      break
-    if not is_const:
-      error(filename, linenum, 'runtime/arrays', 1,
-            'Do not use variable-length arrays.  Use an appropriately named '
-            "('k' followed by CamelCase) compile-time constant for the size.")
-
-  # If DISALLOW_EVIL_CONSTRUCTORS, DISALLOW_COPY_AND_ASSIGN, or
-  # DISALLOW_IMPLICIT_CONSTRUCTORS is present, then it should be the last thing
-  # in the class declaration.
-  match = Match(
-      (r'\s*'
-       r'(DISALLOW_(EVIL_CONSTRUCTORS|COPY_AND_ASSIGN|IMPLICIT_CONSTRUCTORS))'
-       r'\(.*\);$'),
-      line)
-  if match and linenum + 1 < clean_lines.NumLines():
-    next_line = clean_lines.elided[linenum + 1]
-    # We allow some, but not all, declarations of variables to be present
-    # in the statement that defines the class.  The [\w\*,\s]* fragment of
-    # the regular expression below allows users to declare instances of
-    # the class or pointers to instances, but not less common types such
-    # as function pointers or arrays.  It's a tradeoff between allowing
-    # reasonable code and avoiding trying to parse more C++ using regexps.
-    if not Search(r'^\s*}[\w\*,\s]*;', next_line):
-      error(filename, linenum, 'readability/constructors', 3,
-            match.group(1) + ' should be the last thing in the class')
-
-  # Check for use of unnamed namespaces in header files.  Registration
-  # macros are typically OK, so we allow use of "namespace {" on lines
-  # that end with backslashes.
-  if (file_extension == 'h'
-      and Search(r'\bnamespace\s*{', line)
-      and line[-1] != '\\'):
-    error(filename, linenum, 'build/namespaces', 4,
-          'Do not use unnamed namespaces in header files.  See '
-          'http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml#Namespaces'
-          ' for more information.')
-
-
-def CheckCStyleCast(filename, linenum, line, raw_line, cast_type, pattern,
-                    error):
-  """Checks for a C-style cast by looking for the pattern.
-
-  This also handles sizeof(type) warnings, due to similarity of content.
-
-  Args:
-    filename: The name of the current file.
-    linenum: The number of the line to check.
-    line: The line of code to check.
-    raw_line: The raw line of code to check, with comments.
-    cast_type: The string for the C++ cast to recommend.  This is either
-      reinterpret_cast, static_cast, or const_cast, depending.
-    pattern: The regular expression used to find C-style casts.
-    error: The function to call with any errors found.
-
-  Returns:
-    True if an error was emitted.
-    False otherwise.
-  """
-  match = Search(pattern, line)
-  if not match:
-    return False
-
-  # e.g., sizeof(int)
-  sizeof_match = Match(r'.*sizeof\s*$', line[0:match.start(1) - 1])
-  if sizeof_match:
-    error(filename, linenum, 'runtime/sizeof', 1,
-          'Using sizeof(type).  Use sizeof(varname) instead if possible')
-    return True
-
-  remainder = line[match.end(0):]
-
-  # The close paren is for function pointers as arguments to a function.
-  # eg, void foo(void (*bar)(int));
-  # The semicolon check is a more basic function check; also possibly a
-  # function pointer typedef.
-  # eg, void foo(int); or void foo(int) const;
-  # The equals check is for function pointer assignment.
-  # eg, void *(*foo)(int) = ...
-  # The > is for MockCallback<...> ...
-  #
-  # Right now, this will only catch cases where there's a single argument, and
-  # it's unnamed.  It should probably be expanded to check for multiple
-  # arguments with some unnamed.
-  function_match = Match(r'\s*(\)|=|(const)?\s*(;|\{|throw\(\)|>))', remainder)
-  if function_match:
-    if (not function_match.group(3) or
-        function_match.group(3) == ';' or
-        ('MockCallback<' not in raw_line and
-         '/*' not in raw_line)):
-      error(filename, linenum, 'readability/function', 3,
-            'All parameters should be named in a function')
-    return True
-
-  # At this point, all that should be left is actual casts.
-  error(filename, linenum, 'readability/casting', 4,
-        'Using C-style cast.  Use %s<%s>(...) instead' %
-        (cast_type, match.group(1)))
-
-  return True
-
-
-_HEADERS_CONTAINING_TEMPLATES = (
-    ('', ('deque',)),
-    ('', ('unary_function', 'binary_function',
-                      'plus', 'minus', 'multiplies', 'divides', 'modulus',
-                      'negate',
-                      'equal_to', 'not_equal_to', 'greater', 'less',
-                      'greater_equal', 'less_equal',
-                      'logical_and', 'logical_or', 'logical_not',
-                      'unary_negate', 'not1', 'binary_negate', 'not2',
-                      'bind1st', 'bind2nd',
-                      'pointer_to_unary_function',
-                      'pointer_to_binary_function',
-                      'ptr_fun',
-                      'mem_fun_t', 'mem_fun', 'mem_fun1_t', 'mem_fun1_ref_t',
-                      'mem_fun_ref_t',
-                      'const_mem_fun_t', 'const_mem_fun1_t',
-                      'const_mem_fun_ref_t', 'const_mem_fun1_ref_t',
-                      'mem_fun_ref',
-                     )),
-    ('', ('numeric_limits',)),
-    ('', ('list',)),
-    ('', ('map', 'multimap',)),
-    ('', ('allocator',)),
-    ('', ('queue', 'priority_queue',)),
-    ('', ('set', 'multiset',)),
-    ('', ('stack',)),
-    ('', ('char_traits', 'basic_string',)),
-    ('', ('pair',)),
-    ('', ('vector',)),
-
-    # gcc extensions.
-    # Note: std::hash is their hash, ::hash is our hash
-    ('', ('hash_map', 'hash_multimap',)),
-    ('', ('hash_set', 'hash_multiset',)),
-    ('', ('slist',)),
-    )
-
-_RE_PATTERN_STRING = re.compile(r'\bstring\b')
-
-_re_pattern_algorithm_header = []
-for _template in ('copy', 'max', 'min', 'min_element', 'sort', 'swap',
-                  'transform'):
-  # Match max(..., ...), max(..., ...), but not foo->max, foo.max or
-  # type::max().
-  _re_pattern_algorithm_header.append(
-      (re.compile(r'[^>.]\b' + _template + r'(<.*?>)?\([^\)]'),
-       _template,
-       ''))
-
-_re_pattern_templates = []
-for _header, _templates in _HEADERS_CONTAINING_TEMPLATES:
-  for _template in _templates:
-    _re_pattern_templates.append(
-        (re.compile(r'(\<|\b)' + _template + r'\s*\<'),
-         _template + '<>',
-         _header))
-
-
-def FilesBelongToSameModule(filename_cc, filename_h):
-  """Check if these two filenames belong to the same module.
-
-  The concept of a 'module' here is a as follows:
-  foo.h, foo-inl.h, foo.cc, foo_test.cc and foo_unittest.cc belong to the
-  same 'module' if they are in the same directory.
-  some/path/public/xyzzy and some/path/internal/xyzzy are also considered
-  to belong to the same module here.
-
-  If the filename_cc contains a longer path than the filename_h, for example,
-  '/absolute/path/to/base/sysinfo.cc', and this file would include
-  'base/sysinfo.h', this function also produces the prefix needed to open the
-  header. This is used by the caller of this function to more robustly open the
-  header file. We don't have access to the real include paths in this context,
-  so we need this guesswork here.
-
-  Known bugs: tools/base/bar.cc and base/bar.h belong to the same module
-  according to this implementation. Because of this, this function gives
-  some false positives. This should be sufficiently rare in practice.
-
-  Args:
-    filename_cc: is the path for the .cc file
-    filename_h: is the path for the header path
-
-  Returns:
-    Tuple with a bool and a string:
-    bool: True if filename_cc and filename_h belong to the same module.
-    string: the additional prefix needed to open the header file.
-  """
-
-  if not filename_cc.endswith('.cc'):
-    return (False, '')
-  filename_cc = filename_cc[:-len('.cc')]
-  if filename_cc.endswith('_unittest'):
-    filename_cc = filename_cc[:-len('_unittest')]
-  elif filename_cc.endswith('_test'):
-    filename_cc = filename_cc[:-len('_test')]
-  filename_cc = filename_cc.replace('/public/', '/')
-  filename_cc = filename_cc.replace('/internal/', '/')
-
-  if not filename_h.endswith('.h'):
-    return (False, '')
-  filename_h = filename_h[:-len('.h')]
-  if filename_h.endswith('-inl'):
-    filename_h = filename_h[:-len('-inl')]
-  filename_h = filename_h.replace('/public/', '/')
-  filename_h = filename_h.replace('/internal/', '/')
-
-  files_belong_to_same_module = filename_cc.endswith(filename_h)
-  common_path = ''
-  if files_belong_to_same_module:
-    common_path = filename_cc[:-len(filename_h)]
-  return files_belong_to_same_module, common_path
-
-
-def UpdateIncludeState(filename, include_state, io=codecs):
-  """Fill up the include_state with new includes found from the file.
-
-  Args:
-    filename: the name of the header to read.
-    include_state: an _IncludeState instance in which the headers are inserted.
-    io: The io factory to use to read the file. Provided for testability.
-
-  Returns:
-    True if a header was succesfully added. False otherwise.
-  """
-  headerfile = None
-  try:
-    headerfile = io.open(filename, 'r', 'utf8', 'replace')
-  except IOError:
-    return False
-  linenum = 0
-  for line in headerfile:
-    linenum += 1
-    clean_line = CleanseComments(line)
-    match = _RE_PATTERN_INCLUDE.search(clean_line)
-    if match:
-      include = match.group(2)
-      # The value formatting is cute, but not really used right now.
-      # What matters here is that the key is in include_state.
-      include_state.setdefault(include, '%s:%d' % (filename, linenum))
-  return True
-
-
-def CheckForIncludeWhatYouUse(filename, clean_lines, include_state, error,
-                              io=codecs):
-  """Reports for missing stl includes.
-
-  This function will output warnings to make sure you are including the headers
-  necessary for the stl containers and functions that you use. We only give one
-  reason to include a header. For example, if you use both equal_to<> and
-  less<> in a .h file, only one (the latter in the file) of these will be
-  reported as a reason to include the .
-
-  Args:
-    filename: The name of the current file.
-    clean_lines: A CleansedLines instance containing the file.
-    include_state: An _IncludeState instance.
-    error: The function to call with any errors found.
-    io: The IO factory to use to read the header file. Provided for unittest
-        injection.
-  """
-  required = {}  # A map of header name to linenumber and the template entity.
-                 # Example of required: { '': (1219, 'less<>') }
-
-  for linenum in xrange(clean_lines.NumLines()):
-    line = clean_lines.elided[linenum]
-    if not line or line[0] == '#':
-      continue
-
-    # String is special -- it is a non-templatized type in STL.
-    matched = _RE_PATTERN_STRING.search(line)
-    if matched:
-      # Don't warn about strings in non-STL namespaces:
-      # (We check only the first match per line; good enough.)
-      prefix = line[:matched.start()]
-      if prefix.endswith('std::') or not prefix.endswith('::'):
-        required[''] = (linenum, 'string')
-
-    for pattern, template, header in _re_pattern_algorithm_header:
-      if pattern.search(line):
-        required[header] = (linenum, template)
-
-    # The following function is just a speed up, no semantics are changed.
-    if not '<' in line:  # Reduces the cpu time usage by skipping lines.
-      continue
-
-    for pattern, template, header in _re_pattern_templates:
-      if pattern.search(line):
-        required[header] = (linenum, template)
-
-  # The policy is that if you #include something in foo.h you don't need to
-  # include it again in foo.cc. Here, we will look at possible includes.
-  # Let's copy the include_state so it is only messed up within this function.
-  include_state = include_state.copy()
-
-  # Did we find the header for this file (if any) and succesfully load it?
-  header_found = False
-
-  # Use the absolute path so that matching works properly.
-  abs_filename = FileInfo(filename).FullName()
-
-  # For Emacs's flymake.
-  # If cpplint is invoked from Emacs's flymake, a temporary file is generated
-  # by flymake and that file name might end with '_flymake.cc'. In that case,
-  # restore original file name here so that the corresponding header file can be
-  # found.
-  # e.g. If the file name is 'foo_flymake.cc', we should search for 'foo.h'
-  # instead of 'foo_flymake.h'
-  abs_filename = re.sub(r'_flymake\.cc$', '.cc', abs_filename)
-
-  # include_state is modified during iteration, so we iterate over a copy of
-  # the keys.
-  header_keys = include_state.keys()
-  for header in header_keys:
-    (same_module, common_path) = FilesBelongToSameModule(abs_filename, header)
-    fullpath = common_path + header
-    if same_module and UpdateIncludeState(fullpath, include_state, io):
-      header_found = True
-
-  # If we can't find the header file for a .cc, assume it's because we don't
-  # know where to look. In that case we'll give up as we're not sure they
-  # didn't include it in the .h file.
-  # TODO(unknown): Do a better job of finding .h files so we are confident that
-  # not having the .h file means there isn't one.
-  if filename.endswith('.cc') and not header_found:
-    return
-
-  # All the lines have been processed, report the errors found.
-  for required_header_unstripped in required:
-    template = required[required_header_unstripped][1]
-    if required_header_unstripped.strip('<>"') not in include_state:
-      error(filename, required[required_header_unstripped][0],
-            'build/include_what_you_use', 4,
-            'Add #include ' + required_header_unstripped + ' for ' + template)
-
-
-_RE_PATTERN_EXPLICIT_MAKEPAIR = re.compile(r'\bmake_pair\s*<')
-
-
-def CheckMakePairUsesDeduction(filename, clean_lines, linenum, error):
-  """Check that make_pair's template arguments are deduced.
-
-  G++ 4.6 in C++0x mode fails badly if make_pair's template arguments are
-  specified explicitly, and such use isn't intended in any case.
-
-  Args:
-    filename: The name of the current file.
-    clean_lines: A CleansedLines instance containing the file.
-    linenum: The number of the line to check.
-    error: The function to call with any errors found.
-  """
-  raw = clean_lines.raw_lines
-  line = raw[linenum]
-  match = _RE_PATTERN_EXPLICIT_MAKEPAIR.search(line)
-  if match:
-    error(filename, linenum, 'build/explicit_make_pair',
-          4,  # 4 = high confidence
-          'Omit template arguments from make_pair OR use pair directly OR'
-          ' if appropriate, construct a pair directly')
-
-
-def ProcessLine(filename, file_extension,
-                clean_lines, line, include_state, function_state,
-                class_state, error, extra_check_functions=[]):
-  """Processes a single line in the file.
-
-  Args:
-    filename: Filename of the file that is being processed.
-    file_extension: The extension (dot not included) of the file.
-    clean_lines: An array of strings, each representing a line of the file,
-                 with comments stripped.
-    line: Number of line being processed.
-    include_state: An _IncludeState instance in which the headers are inserted.
-    function_state: A _FunctionState instance which counts function lines, etc.
-    class_state: A _ClassState instance which maintains information about
-                 the current stack of nested class declarations being parsed.
-    error: A callable to which errors are reported, which takes 4 arguments:
-           filename, line number, error level, and message
-    extra_check_functions: An array of additional check functions that will be
-                           run on each source line. Each function takes 4
-                           arguments: filename, clean_lines, line, error
-  """
-  raw_lines = clean_lines.raw_lines
-  ParseNolintSuppressions(filename, raw_lines[line], line, error)
-  CheckForFunctionLengths(filename, clean_lines, line, function_state, error)
-  CheckForMultilineCommentsAndStrings(filename, clean_lines, line, error)
-  CheckStyle(filename, clean_lines, line, file_extension, class_state, error)
-  CheckLanguage(filename, clean_lines, line, file_extension, include_state,
-                error)
-  CheckForNonStandardConstructs(filename, clean_lines, line,
-                                class_state, error)
-  CheckPosixThreading(filename, clean_lines, line, error)
-  CheckInvalidIncrement(filename, clean_lines, line, error)
-  CheckMakePairUsesDeduction(filename, clean_lines, line, error)
-  for check_fn in extra_check_functions:
-    check_fn(filename, clean_lines, line, error)
-
-def ProcessFileData(filename, file_extension, lines, error,
-                    extra_check_functions=[]):
-  """Performs lint checks and reports any errors to the given error function.
-
-  Args:
-    filename: Filename of the file that is being processed.
-    file_extension: The extension (dot not included) of the file.
-    lines: An array of strings, each representing a line of the file, with the
-           last element being empty if the file is terminated with a newline.
-    error: A callable to which errors are reported, which takes 4 arguments:
-           filename, line number, error level, and message
-    extra_check_functions: An array of additional check functions that will be
-                           run on each source line. Each function takes 4
-                           arguments: filename, clean_lines, line, error
-  """
-  lines = (['// marker so line numbers and indices both start at 1'] + lines +
-           ['// marker so line numbers end in a known way'])
-
-  include_state = _IncludeState()
-  function_state = _FunctionState()
-  class_state = _ClassState()
-
-  ResetNolintSuppressions()
-
-  CheckForCopyright(filename, lines, error)
-
-  if file_extension == 'h':
-    CheckForHeaderGuard(filename, lines, error)
-
-  RemoveMultiLineComments(filename, lines, error)
-  clean_lines = CleansedLines(lines)
-  for line in xrange(clean_lines.NumLines()):
-    ProcessLine(filename, file_extension, clean_lines, line,
-                include_state, function_state, class_state, error,
-                extra_check_functions)
-  class_state.CheckFinished(filename, error)
-
-  CheckForIncludeWhatYouUse(filename, clean_lines, include_state, error)
-
-  # We check here rather than inside ProcessLine so that we see raw
-  # lines rather than "cleaned" lines.
-  CheckForUnicodeReplacementCharacters(filename, lines, error)
-
-  CheckForNewlineAtEOF(filename, lines, error)
-
-def ProcessFile(filename, vlevel, extra_check_functions=[]):
-  """Does google-lint on a single file.
-
-  Args:
-    filename: The name of the file to parse.
-
-    vlevel: The level of errors to report.  Every error of confidence
-    >= verbose_level will be reported.  0 is a good default.
-
-    extra_check_functions: An array of additional check functions that will be
-                           run on each source line. Each function takes 4
-                           arguments: filename, clean_lines, line, error
-  """
-
-  _SetVerboseLevel(vlevel)
-
-  try:
-    # Support the UNIX convention of using "-" for stdin.  Note that
-    # we are not opening the file with universal newline support
-    # (which codecs doesn't support anyway), so the resulting lines do
-    # contain trailing '\r' characters if we are reading a file that
-    # has CRLF endings.
-    # If after the split a trailing '\r' is present, it is removed
-    # below. If it is not expected to be present (i.e. os.linesep !=
-    # '\r\n' as in Windows), a warning is issued below if this file
-    # is processed.
-
-    if filename == '-':
-      lines = codecs.StreamReaderWriter(sys.stdin,
-                                        codecs.getreader('utf8'),
-                                        codecs.getwriter('utf8'),
-                                        'replace').read().split('\n')
-    else:
-      lines = codecs.open(filename, 'r', 'utf8', 'replace').read().split('\n')
-
-    carriage_return_found = False
-    # Remove trailing '\r'.
-    for linenum in range(len(lines)):
-      if lines[linenum].endswith('\r'):
-        lines[linenum] = lines[linenum].rstrip('\r')
-        carriage_return_found = True
-
-  except IOError:
-    sys.stderr.write(
-        "Skipping input '%s': Can't open for reading\n" % filename)
-    return
-
-  # Note, if no dot is found, this will give the entire filename as the ext.
-  file_extension = filename[filename.rfind('.') + 1:]
-
-  # When reading from stdin, the extension is unknown, so no cpplint tests
-  # should rely on the extension.
-  if (filename != '-' and file_extension != 'cc' and file_extension != 'h'
-      and file_extension != 'cpp'):
-    sys.stderr.write('Ignoring %s; not a .cc or .h file\n' % filename)
-  else:
-    ProcessFileData(filename, file_extension, lines, Error,
-                    extra_check_functions)
-    if carriage_return_found and os.linesep != '\r\n':
-      # Use 0 for linenum since outputting only one error for potentially
-      # several lines.
-      Error(filename, 0, 'whitespace/newline', 1,
-            'One or more unexpected \\r (^M) found;'
-            'better to use only a \\n')
-
-  sys.stderr.write('Done processing %s\n' % filename)
-
-
-def PrintUsage(message):
-  """Prints a brief usage string and exits, optionally with an error message.
-
-  Args:
-    message: The optional error message.
-  """
-  sys.stderr.write(_USAGE)
-  if message:
-    sys.exit('\nFATAL ERROR: ' + message)
-  else:
-    sys.exit(1)
-
-
-def PrintCategories():
-  """Prints a list of all the error-categories used by error messages.
-
-  These are the categories used to filter messages via --filter.
-  """
-  sys.stderr.write(''.join('  %s\n' % cat for cat in _ERROR_CATEGORIES))
-  sys.exit(0)
-
-
-def ParseArguments(args):
-  """Parses the command line arguments.
-
-  This may set the output format and verbosity level as side-effects.
-
-  Args:
-    args: The command line arguments:
-
-  Returns:
-    The list of filenames to lint.
-  """
-  try:
-    (opts, filenames) = getopt.getopt(args, '', ['help', 'output=', 'verbose=',
-                                                 'counting=',
-                                                 'filter='])
-  except getopt.GetoptError:
-    PrintUsage('Invalid arguments.')
-
-  verbosity = _VerboseLevel()
-  output_format = _OutputFormat()
-  filters = ''
-  counting_style = ''
-
-  for (opt, val) in opts:
-    if opt == '--help':
-      PrintUsage(None)
-    elif opt == '--output':
-      if not val in ('emacs', 'vs7'):
-        PrintUsage('The only allowed output formats are emacs and vs7.')
-      output_format = val
-    elif opt == '--verbose':
-      verbosity = int(val)
-    elif opt == '--filter':
-      filters = val
-      if not filters:
-        PrintCategories()
-    elif opt == '--counting':
-      if val not in ('total', 'toplevel', 'detailed'):
-        PrintUsage('Valid counting options are total, toplevel, and detailed')
-      counting_style = val
-
-  if not filenames:
-    PrintUsage('No files were specified.')
-
-  _SetOutputFormat(output_format)
-  _SetVerboseLevel(verbosity)
-  _SetFilters(filters)
-  _SetCountingStyle(counting_style)
-
-  return filenames
-
-
-def main():
-  filenames = ParseArguments(sys.argv[1:])
-
-  # Change stderr to write with replacement characters so we don't die
-  # if we try to print something containing non-ASCII characters.
-  sys.stderr = codecs.StreamReaderWriter(sys.stderr,
-                                         codecs.getreader('utf8'),
-                                         codecs.getwriter('utf8'),
-                                         'replace')
-
-  _cpplint_state.ResetErrorCounts()
-  for filename in filenames:
-    ProcessFile(filename, _cpplint_state.verbose_level)
-  _cpplint_state.PrintErrorCounts()
-
-  sys.exit(_cpplint_state.error_count > 0)
-
-
-if __name__ == '__main__':
-  main()
diff --git a/telldus-core/tests/cppunit.cpp b/telldus-core/tests/cppunit.cpp
deleted file mode 100644
index 8a05906f..00000000
--- a/telldus-core/tests/cppunit.cpp
+++ /dev/null
@@ -1,46 +0,0 @@
-#include 
-#include 
-#include 
-#include 
-#include 
-#include 
-#include 
-
-#include 
-
-#include "common/CommonTests.h"
-#include "service/ServiceTests.h"
-
-int main (int argc, char* argv[])
-{
-	// Setup our tests
-	CommonTests::setup();
-	ServiceTests::setup();
-
-	// informs test-listener about testresults
-	CPPUNIT_NS :: TestResult testresult;
-
-	// register listener for collecting the test-results
-	CPPUNIT_NS :: TestResultCollector collectedresults;
-	testresult.addListener (&collectedresults);
-
-	// register listener for per-test progress output
-	CPPUNIT_NS :: BriefTestProgressListener progress;
-	testresult.addListener (&progress);
-
-	// insert test-suite at test-runner by registry
-	CPPUNIT_NS :: TestRunner testrunner;
-	testrunner.addTest (CPPUNIT_NS :: TestFactoryRegistry :: getRegistry ().makeTest ());
-	testrunner.run (testresult);
-
-	// output results in compiler-format
-	CPPUNIT_NS :: CompilerOutputter compileroutputter (&collectedresults, std::cerr);
-	compileroutputter.write ();
-
-	std::ofstream xmlFileOut("cpptestresults.xml");
-	CPPUNIT_NS :: XmlOutputter xmlOut(&collectedresults, xmlFileOut);
-	xmlOut.write();
-
-	// return 0 if tests were successful
-	return collectedresults.wasSuccessful () ? 0 : 1;
-}
diff --git a/telldus-core/tests/service/CMakeLists.txt b/telldus-core/tests/service/CMakeLists.txt
deleted file mode 100644
index 057f609c..00000000
--- a/telldus-core/tests/service/CMakeLists.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-FILE(GLOB SRCS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "*Test.cpp" )
-
-INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR})
-
-ADD_LIBRARY(TelldusServiceTests STATIC ${SRCS} )
-
-TARGET_LINK_LIBRARIES( TelldusServiceTests TelldusServiceStatic ${CPPUNIT} )
-ADD_DEPENDENCIES( TelldusServiceTests ${telldus-service_TARGET} )
-
diff --git a/telldus-core/tests/service/ProtocolEverflourishTest.cpp b/telldus-core/tests/service/ProtocolEverflourishTest.cpp
deleted file mode 100644
index 2d9ec66d..00000000
--- a/telldus-core/tests/service/ProtocolEverflourishTest.cpp
+++ /dev/null
@@ -1,30 +0,0 @@
-#include "ProtocolEverflourishTest.h"
-#include "service/ProtocolEverflourish.h"
-
-class ProtocolEverflourishTest::PrivateData {
-public:
-	ProtocolEverflourish *protocol;
-};
-
-void ProtocolEverflourishTest :: setUp (void) {
-	d = new PrivateData;
-	d->protocol = new ProtocolEverflourish();
-}
-
-void ProtocolEverflourishTest :: tearDown (void) {
-	delete d->protocol;
-	delete d;
-}
-
-void ProtocolEverflourishTest :: decodeDataTest (void) {
-	CPPUNIT_ASSERT_EQUAL_MESSAGE(
-		"Everflourish 4242:3 ON",
-		std::string("class:command;protocol:everflourish;model:selflearning;house:4242;unit:3;method:turnon;"),
-		d->protocol->decodeData(ControllerMessage("protocol:everflourish;data:0x424A6F;"))
-	);
-	CPPUNIT_ASSERT_EQUAL_MESSAGE(
-		"Everflourish 5353:4 OFF",
-		std::string("class:command;protocol:everflourish;model:selflearning;house:5353;unit:4;method:turnoff;"),
-		d->protocol->decodeData(ControllerMessage("protocol:everflourish;data:0x53A7E0;"))
-	);
-}
diff --git a/telldus-core/tests/service/ProtocolEverflourishTest.h b/telldus-core/tests/service/ProtocolEverflourishTest.h
deleted file mode 100644
index 22612208..00000000
--- a/telldus-core/tests/service/ProtocolEverflourishTest.h
+++ /dev/null
@@ -1,25 +0,0 @@
-#ifndef PROTOCOLEVERFLOURISHTEST_H
-#define PROTOCOLEVERFLOURISHTEST_H
-
-#include 
-#include 
-
-class ProtocolEverflourishTest : public CPPUNIT_NS :: TestFixture
-{
-	CPPUNIT_TEST_SUITE (ProtocolEverflourishTest);
-	CPPUNIT_TEST (decodeDataTest);
-	CPPUNIT_TEST_SUITE_END ();
-
-public:
-	void setUp (void);
-	void tearDown (void);
-
-protected:
-	void decodeDataTest(void);
-
-private:
-	class PrivateData;
-	PrivateData *d;
-};
-
-#endif  // PROTOCOLEVERFLOURISHTEST_H
diff --git a/telldus-core/tests/service/ProtocolHastaTest.cpp b/telldus-core/tests/service/ProtocolHastaTest.cpp
deleted file mode 100644
index 4b118664..00000000
--- a/telldus-core/tests/service/ProtocolHastaTest.cpp
+++ /dev/null
@@ -1,40 +0,0 @@
-#include "ProtocolHastaTest.h"
-#include "service/ProtocolHasta.h"
-
-class ProtocolHastaTest::PrivateData {
-public:
-	ProtocolHasta *protocol;
-};
-
-void ProtocolHastaTest :: setUp (void) {
-	d = new PrivateData;
-	d->protocol = new ProtocolHasta();
-}
-
-void ProtocolHastaTest :: tearDown (void) {
-	delete d->protocol;
-	delete d;
-}
-
-void ProtocolHastaTest :: decodeDataTest (void) {
-	CPPUNIT_ASSERT_EQUAL_MESSAGE(
-		"Hasta Version 1 26380 1 DOWN",
-		std::string("class:command;protocol:hasta;model:selflearning;house:26380;unit:1;method:down;"),
-		d->protocol->decodeData(ControllerMessage("protocol:hasta;model:selflearning;data:0xC671100;"))
-	);
-	CPPUNIT_ASSERT_EQUAL_MESSAGE(
-		"Hasta Version 1 26380 1 UP",
-		std::string("class:command;protocol:hasta;model:selflearning;house:26380;unit:1;method:up;"),
-		d->protocol->decodeData(ControllerMessage("protocol:arctech;model:selflearning;data:0xC670100;"))
-	);
-	CPPUNIT_ASSERT_EQUAL_MESSAGE(
-		"Hasta Version 2 19337 15 DOWN",
-		std::string("class:command;protocol:hasta;model:selflearningv2;house:19337;unit:15;method:down;"),
-		d->protocol->decodeData(ControllerMessage("protocol:hasta;model:selflearningv2;data:0x4B891F01;"))
-	);
-	CPPUNIT_ASSERT_EQUAL_MESSAGE(
-		"Hasta Version 2 19337 15 UP",
-		std::string("class:command;protocol:hasta;model:selflearningv2;house:19337;unit:15;method:up;"),
-		d->protocol->decodeData(ControllerMessage("protocol:hasta;model:selflearningv2;data:0x4B89CF01;"))
-	);
-}
diff --git a/telldus-core/tests/service/ProtocolHastaTest.h b/telldus-core/tests/service/ProtocolHastaTest.h
deleted file mode 100644
index 8c7b9edc..00000000
--- a/telldus-core/tests/service/ProtocolHastaTest.h
+++ /dev/null
@@ -1,25 +0,0 @@
-#ifndef PROTOCOLHASTATEST_H
-#define PROTOCOLHASTATEST_H
-
-#include 
-#include 
-
-class ProtocolHastaTest : public CPPUNIT_NS :: TestFixture
-{
-	CPPUNIT_TEST_SUITE (ProtocolHastaTest);
-	CPPUNIT_TEST (decodeDataTest);
-	CPPUNIT_TEST_SUITE_END ();
-
-public:
-	void setUp (void);
-	void tearDown (void);
-
-protected:
-	void decodeDataTest(void);
-
-private:
-	class PrivateData;
-	PrivateData *d;
-};
-
-#endif //PROTOCOLHASTATEST_H
diff --git a/telldus-core/tests/service/ProtocolNexaTest.cpp b/telldus-core/tests/service/ProtocolNexaTest.cpp
deleted file mode 100644
index e2c9f8ec..00000000
--- a/telldus-core/tests/service/ProtocolNexaTest.cpp
+++ /dev/null
@@ -1,40 +0,0 @@
-#include "ProtocolNexaTest.h"
-#include "service/ProtocolNexa.h"
-
-class ProtocolNexaTest::PrivateData {
-public:
-	ProtocolNexa *protocol;
-};
-
-void ProtocolNexaTest :: setUp (void) {
-	d = new PrivateData;
-	d->protocol = new ProtocolNexa();
-}
-
-void ProtocolNexaTest :: tearDown (void) {
-	delete d->protocol;
-	delete d;
-}
-
-void ProtocolNexaTest :: decodeDataTest (void) {
-	CPPUNIT_ASSERT_EQUAL_MESSAGE(
-		"Arctech Codeswitch A1 ON",
-		std::string("class:command;protocol:arctech;model:codeswitch;house:A;unit:1;method:turnon;"),
-		d->protocol->decodeData(ControllerMessage("protocol:arctech;model:codeswitch;data:0xE00;"))
-	);
-	CPPUNIT_ASSERT_EQUAL_MESSAGE(
-		"Arctech Codeswitch A1 OFF",
-		std::string("class:command;protocol:arctech;model:codeswitch;house:A;unit:1;method:turnoff;"),
-		d->protocol->decodeData(ControllerMessage("protocol:arctech;model:codeswitch;data:0x600;"))
-	);
-	CPPUNIT_ASSERT_EQUAL_MESSAGE(
-		"Arctech Selflearning 1329110 1 ON",
-		std::string("class:command;protocol:arctech;model:selflearning;house:1329110;unit:1;group:0;method:turnon;"),
-		d->protocol->decodeData(ControllerMessage("protocol:arctech;model:selflearning;data:0x511F590;"))
-	);
-	CPPUNIT_ASSERT_EQUAL_MESSAGE(
-		"Arctech Selflearning 1329110 1 OFF",
-		std::string("class:command;protocol:arctech;model:selflearning;house:1329110;unit:1;group:0;method:turnoff;"),
-		d->protocol->decodeData(ControllerMessage("protocol:arctech;model:selflearning;data:0x511F580;"))
-	);
-}
diff --git a/telldus-core/tests/service/ProtocolNexaTest.h b/telldus-core/tests/service/ProtocolNexaTest.h
deleted file mode 100644
index 74c0377b..00000000
--- a/telldus-core/tests/service/ProtocolNexaTest.h
+++ /dev/null
@@ -1,25 +0,0 @@
-#ifndef PROTOCOLNEXATEST_H
-#define PROTOCOLNEXATEST_H
-
-#include 
-#include 
-
-class ProtocolNexaTest : public CPPUNIT_NS :: TestFixture
-{
-	CPPUNIT_TEST_SUITE (ProtocolNexaTest);
-	CPPUNIT_TEST (decodeDataTest);
-	CPPUNIT_TEST_SUITE_END ();
-
-public:
-	void setUp (void);
-	void tearDown (void);
-
-protected:
-	void decodeDataTest(void);
-
-private:
-	class PrivateData;
-	PrivateData *d;
-};
-
-#endif //PROTOCOLNEXATEST_H
diff --git a/telldus-core/tests/service/ProtocolOregonTest.cpp b/telldus-core/tests/service/ProtocolOregonTest.cpp
deleted file mode 100644
index 2d5fd0fb..00000000
--- a/telldus-core/tests/service/ProtocolOregonTest.cpp
+++ /dev/null
@@ -1,67 +0,0 @@
-#include "ProtocolOregonTest.h"
-#include "service/ProtocolOregon.h"
-
-class ProtocolOregonTest::PrivateData {
-public:
-};
-
-void ProtocolOregonTest :: setUp (void) {
-	d = new PrivateData;
-}
-
-void ProtocolOregonTest :: tearDown (void) {
-	delete d;
-}
-
-void ProtocolOregonTest :: decodeDataTest (void) {
-	CPPUNIT_ASSERT_EQUAL_MESSAGE(
-		"Oregon, id: 119, temp: 77.3",
-		std::string("class:sensor;protocol:oregon;model:EA4C;id:119;temp:77.3;"),
-		ProtocolOregon::decodeData(ControllerMessage("class:sensor;protocol:oregon;model:0xEA4C;data:2177307700E4;"))
-	);
-	CPPUNIT_ASSERT_EQUAL_MESSAGE(
-		"Oregon, id: 119, temp: 74.7",
-		std::string("class:sensor;protocol:oregon;model:EA4C;id:119;temp:74.7;"),
-		ProtocolOregon::decodeData(ControllerMessage("class:sensor;protocol:oregon;model:0xEA4C;data:2177707410A4;"))
-	);
-	CPPUNIT_ASSERT_EQUAL_MESSAGE(
-		"Oregon, id: 119, temp: 77.7",
-		std::string("class:sensor;protocol:oregon;model:EA4C;id:119;temp:77.7;"),
-		ProtocolOregon::decodeData(ControllerMessage("class:sensor;protocol:oregon;model:0xEA4C;data:217770774054;"))
-	);
-	CPPUNIT_ASSERT_EQUAL_MESSAGE(
-		"Oregon, id: 119, temp: 66.5",
-		std::string("class:sensor;protocol:oregon;model:EA4C;id:119;temp:66.5;"),
-		ProtocolOregon::decodeData(ControllerMessage("class:sensor;protocol:oregon;model:0xEA4C;data:2177506600E4;"))
-	);
-	CPPUNIT_ASSERT_EQUAL_MESSAGE(
-		"Oregon, id: 119, temp: 122.5",
-		std::string("class:sensor;protocol:oregon;model:EA4C;id:119;temp:122.5;"),
-		ProtocolOregon::decodeData(ControllerMessage("class:sensor;protocol:oregon;model:0xEA4C;data:2177502291A3;"))
-	);
-	CPPUNIT_ASSERT_EQUAL_MESSAGE(
-		"Oregon, id: 119, temp: 120.1",
-		std::string("class:sensor;protocol:oregon;model:EA4C;id:119;temp:120.1;"),
-		ProtocolOregon::decodeData(ControllerMessage("class:sensor;protocol:oregon;model:0xEA4C;data:2177102031B3;"))
-	);
-	CPPUNIT_ASSERT_EQUAL_MESSAGE(
-		"Oregon, id: 119, temp: 120.6",
-		std::string("class:sensor;protocol:oregon;model:EA4C;id:119;temp:120.6;"),
-		ProtocolOregon::decodeData(ControllerMessage("class:sensor;protocol:oregon;model:0xEA4C;data:217760208193;"))
-	);
-	CPPUNIT_ASSERT_EQUAL_MESSAGE(
-		"Oregon, id: 23, temp: 202.7",
-		std::string("class:sensor;protocol:oregon;model:EA4C;id:23;temp:202.7;"),
-		ProtocolOregon::decodeData(ControllerMessage("class:sensor;protocol:oregon;model:0xEA4C;data:2177702A2D3;"))
-	);
-	CPPUNIT_ASSERT_EQUAL_MESSAGE(
-		"Oregon, id: 119, temp: 202.7",
-		std::string("class:sensor;protocol:oregon;model:EA4C;id:119;temp:202.7;"),
-		ProtocolOregon::decodeData(ControllerMessage("class:sensor;protocol:oregon;model:0xEA4C;data:21777002A2D3;"))
-	);
-	CPPUNIT_ASSERT_EQUAL_MESSAGE(
-		"Oregon, id: 119, temp: -23.1",
-		std::string("class:sensor;protocol:oregon;model:EA4C;id:119;temp:-23.1;"),
-		ProtocolOregon::decodeData(ControllerMessage("class:sensor;protocol:oregon;model:0xEA4C;data:21771023D8B3;"))
-	);
-}
diff --git a/telldus-core/tests/service/ProtocolOregonTest.h b/telldus-core/tests/service/ProtocolOregonTest.h
deleted file mode 100644
index a2965990..00000000
--- a/telldus-core/tests/service/ProtocolOregonTest.h
+++ /dev/null
@@ -1,25 +0,0 @@
-#ifndef PROTOCOLOREGONTEST_H
-#define PROTOCOLOREGONTEST_H
-
-#include 
-#include 
-
-class ProtocolOregonTest : public CPPUNIT_NS :: TestFixture
-{
-	CPPUNIT_TEST_SUITE (ProtocolOregonTest);
-	CPPUNIT_TEST (decodeDataTest);
-	CPPUNIT_TEST_SUITE_END ();
-
-public:
-	void setUp (void);
-	void tearDown (void);
-
-protected:
-	void decodeDataTest(void);
-
-private:
-	class PrivateData;
-	PrivateData *d;
-};
-
-#endif // PROTOCOLOREGONTEST_H
diff --git a/telldus-core/tests/service/ProtocolSartanoTest.cpp b/telldus-core/tests/service/ProtocolSartanoTest.cpp
deleted file mode 100644
index 655dbb59..00000000
--- a/telldus-core/tests/service/ProtocolSartanoTest.cpp
+++ /dev/null
@@ -1,25 +0,0 @@
-#include "ProtocolSartanoTest.h"
-#include "service/ProtocolSartano.h"
-
-class ProtocolSartanoTest::PrivateData {
-public:
-	ProtocolSartano *protocol;
-};
-
-void ProtocolSartanoTest :: setUp (void) {
-	d = new PrivateData;
-	d->protocol = new ProtocolSartano();
-}
-
-void ProtocolSartanoTest :: tearDown (void) {
-	delete d->protocol;
-	delete d;
-}
-
-void ProtocolSartanoTest :: decodeDataTest (void) {
-	CPPUNIT_ASSERT_EQUAL_MESSAGE(
-		"Sartano 0101010101 ON",
-		std::string("class:command;protocol:sartano;model:codeswitch;code:0101010101;method:turnon;"),
-		d->protocol->decodeData(ControllerMessage("protocol:arctech;model:codeswitch;data:0x955;"))
-	);
-}
diff --git a/telldus-core/tests/service/ProtocolSartanoTest.h b/telldus-core/tests/service/ProtocolSartanoTest.h
deleted file mode 100644
index 04ad2323..00000000
--- a/telldus-core/tests/service/ProtocolSartanoTest.h
+++ /dev/null
@@ -1,25 +0,0 @@
-#ifndef PROTOCOLSARTANOTEST_H
-#define PROTOCOLSARTANOTEST_H
-
-#include 
-#include 
-
-class ProtocolSartanoTest : public CPPUNIT_NS :: TestFixture
-{
-	CPPUNIT_TEST_SUITE (ProtocolSartanoTest);
-	CPPUNIT_TEST (decodeDataTest);
-	CPPUNIT_TEST_SUITE_END ();
-
-public:
-	void setUp (void);
-	void tearDown (void);
-
-protected:
-	void decodeDataTest(void);
-
-private:
-	class PrivateData;
-	PrivateData *d;
-};
-
-#endif //PROTOCOLSARTANOTEST_H
diff --git a/telldus-core/tests/service/ProtocolX10Test.cpp b/telldus-core/tests/service/ProtocolX10Test.cpp
deleted file mode 100644
index 572608f6..00000000
--- a/telldus-core/tests/service/ProtocolX10Test.cpp
+++ /dev/null
@@ -1,30 +0,0 @@
-#include "ProtocolX10Test.h"
-#include "service/ProtocolX10.h"
-
-class ProtocolX10Test::PrivateData {
-public:
-	ProtocolX10 *protocol;
-};
-
-void ProtocolX10Test :: setUp (void) {
-	d = new PrivateData;
-	d->protocol = new ProtocolX10();
-}
-
-void ProtocolX10Test :: tearDown (void) {
-	delete d->protocol;
-	delete d;
-}
-
-void ProtocolX10Test :: decodeDataTest (void) {
-	CPPUNIT_ASSERT_EQUAL_MESSAGE(
-		"X10 A1 ON",
-		std::string("class:command;protocol:x10;model:codeswitch;house:A;unit:1;method:turnon;"),
-		d->protocol->decodeData(ControllerMessage("protocol:x10;data:0x609F00FF;"))
-	);
-	CPPUNIT_ASSERT_EQUAL_MESSAGE(
-		"X10 E11 OFF",
-		std::string("class:command;protocol:x10;model:codeswitch;house:E;unit:11;method:turnoff;"),
-		d->protocol->decodeData(ControllerMessage("protocol:x10;data:0x847B28D7;"))
-	);
-}
diff --git a/telldus-core/tests/service/ProtocolX10Test.h b/telldus-core/tests/service/ProtocolX10Test.h
deleted file mode 100644
index e490e53e..00000000
--- a/telldus-core/tests/service/ProtocolX10Test.h
+++ /dev/null
@@ -1,25 +0,0 @@
-#ifndef PROTOCOLX10TEST_H
-#define PROTOCOLX10TEST_H
-
-#include 
-#include 
-
-class ProtocolX10Test : public CPPUNIT_NS :: TestFixture
-{
-	CPPUNIT_TEST_SUITE (ProtocolX10Test);
-	CPPUNIT_TEST (decodeDataTest);
-	CPPUNIT_TEST_SUITE_END ();
-
-public:
-	void setUp (void);
-	void tearDown (void);
-
-protected:
-	void decodeDataTest(void);
-
-private:
-	class PrivateData;
-	PrivateData *d;
-};
-
-#endif //PROTOCOLX10TEST_H
diff --git a/telldus-core/tests/service/ServiceTests.h b/telldus-core/tests/service/ServiceTests.h
deleted file mode 100644
index 7dde4e83..00000000
--- a/telldus-core/tests/service/ServiceTests.h
+++ /dev/null
@@ -1,21 +0,0 @@
-#ifndef SERVICETESTS_H
-#define SERVICETESTS_H
-
-#include "ProtocolEverflourishTest.h"
-#include "ProtocolHastaTest.h"
-#include "ProtocolNexaTest.h"
-#include "ProtocolOregonTest.h"
-#include "ProtocolSartanoTest.h"
-#include "ProtocolX10Test.h"
-
-namespace ServiceTests {
-	inline void setup() {
-		CPPUNIT_TEST_SUITE_REGISTRATION (ProtocolEverflourishTest);
-		CPPUNIT_TEST_SUITE_REGISTRATION (ProtocolHastaTest);
-		CPPUNIT_TEST_SUITE_REGISTRATION (ProtocolNexaTest);
-		CPPUNIT_TEST_SUITE_REGISTRATION (ProtocolOregonTest);
-		CPPUNIT_TEST_SUITE_REGISTRATION (ProtocolSartanoTest);
-		CPPUNIT_TEST_SUITE_REGISTRATION (ProtocolX10Test);
-	}
-}
-#endif // SERVICETESTS_H
diff --git a/telldus-core/valgrind.supp b/telldus-core/valgrind.supp
deleted file mode 100644
index c8118927..00000000
--- a/telldus-core/valgrind.supp
+++ /dev/null
@@ -1,57 +0,0 @@
-{
-   Glibc
-   Memcheck:Cond
-   fun:_dl_relocate_object
-   fun:dl_main
-   fun:_dl_sysdep_start
-   fun:_dl_start
-   obj:/lib64/ld-2.11.2.so
-}
-{
-   LibUSB problems
-   Memcheck:Leak
-   fun:malloc
-   fun:usb_parse_configuration
-   fun:usb_os_find_devices
-   fun:usb_find_devices
-}
-{
-   libUSB
-   Memcheck:Leak
-   fun:malloc
-   fun:usb_os_determine_children
-   fun:usb_find_devices
-}
-{
-   libUSB
-   Memcheck:Leak
-   fun:malloc
-   fun:usb_os_find_devices
-   fun:usb_find_devices
-}
-{
-   libUSB
-   Memcheck:Leak
-   fun:malloc
-   fun:realloc
-   fun:usb_parse_configuration
-   fun:usb_os_find_devices
-   fun:usb_find_devices
-}
-{
-   libUSB
-   Memcheck:Leak
-   fun:malloc
-   fun:usb_os_find_busses
-   fun:usb_find_busses
-}
-{
-   libConfuse
-   Memcheck:Leak
-   fun:realloc
-   fun:cfg_yyensure_buffer_stack
-   fun:cfg_yy_switch_to_buffer
-   fun:cfg_parse_fp
-   fun:cfg_parse
-}
-
diff --git a/telldus-gui/3rdparty/qt-components-desktop b/telldus-gui/3rdparty/qt-components-desktop
deleted file mode 160000
index 563fdbc4..00000000
--- a/telldus-gui/3rdparty/qt-components-desktop
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 563fdbc4d7805c9d9c1d2abde1d52b39e58b4329
diff --git a/telldus-gui/3rdparty/qt-components-desktop.cmake b/telldus-gui/3rdparty/qt-components-desktop.cmake
deleted file mode 100644
index 6c4f6eda..00000000
--- a/telldus-gui/3rdparty/qt-components-desktop.cmake
+++ /dev/null
@@ -1,98 +0,0 @@
-FIND_PACKAGE( Qt4 REQUIRED )
-
-SET(BASE_PATH "${CMAKE_SOURCE_DIR}/3rdparty/qt-components-desktop")
-FILE(GLOB SRCS ${BASE_PATH}/src/*.cpp)
-FILE(GLOB HDRS ${BASE_PATH}/src/*.h)
-
-FILE(GLOB_RECURSE QML ${BASE_PATH}/components/*.qml)
-FILE(GLOB_RECURSE JS ${BASE_PATH}/components/*.js)
-FILE(GLOB_RECURSE PNG ${BASE_PATH}/components/*.png)
-FILE(GLOB_RECURSE QMLDIR ${BASE_PATH}/components/qmldir)
-SET(EXTRA_FILES ${QML} ${JS} ${PNG} ${QMLDIR})
-
-IF (QT_COMPONENTS_OUTPUT_DIR)
-	SET(QT_COMPONENTS_OUTPUT_DIR "${QT_COMPONENTS_OUTPUT_DIR}/QtDesktop")
-ELSE()
-	SET(QT_COMPONENTS_OUTPUT_DIR "QtDesktop")
-ENDIF()
-
-STRING(LENGTH "${BASE_PATH}/components" BASE_LENGTH)
-FOREACH(_FILE ${EXTRA_FILES})
-	STRING(LENGTH ${_FILE} _FILE_LENGTH)
-	MATH(EXPR _TOP_LENGTH "${_FILE_LENGTH}-${BASE_LENGTH}")
-	STRING(SUBSTRING ${_FILE} ${BASE_LENGTH} ${_TOP_LENGTH} _OUT_FILE)
-	GET_FILENAME_COMPONENT(_FILENAME ${_FILE} NAME)
-	SET(_OUTFILEPATH ${QT_COMPONENTS_OUTPUT_DIR}${_OUT_FILE})
-	LIST(APPEND SRCS ${_OUTFILEPATH})
-	ADD_CUSTOM_COMMAND(
-		OUTPUT ${_OUTFILEPATH}
-		DEPENDS ${_FILE}
-		COMMAND ${CMAKE_COMMAND} -E copy ${_FILE} ${_OUTFILEPATH}
-		COMMENT "Copy ${_FILENAME} to destination"
-	)
-ENDFOREACH(_FILE)
-
-QT4_WRAP_CPP( MOC_SRCS  ${HDRS} )
-QT4_AUTOMOC ( ${SRCS} )
-
-SET(LIBRARIES ${QT_LIBRARIES})
-
-IF (APPLE)
-	FIND_LIBRARY(CARBON_LIBRARY Carbon)
-	LIST(APPEND LIBRARIES ${CARBON_LIBRARY})
-ENDIF ()
-
-ADD_LIBRARY(styleplugin SHARED
-	${SRCS}
-	${MOC_SRCS}
-)
-TARGET_LINK_LIBRARIES( styleplugin ${LIBRARIES} )
-
-IF (WIN32)
-	SET_TARGET_PROPERTIES(styleplugin PROPERTIES
-		PREFIX "Plugins/declarative/QtDesktop/plugin/"
-	)
-ELSEIF(APPLE)
-	ADD_CUSTOM_COMMAND(TARGET styleplugin POST_BUILD
-		COMMAND ${CMAKE_COMMAND} -E make_directory ${QT_COMPONENTS_OUTPUT_DIR}/plugin/
-		COMMAND ${CMAKE_COMMAND} -E copy
-			${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/libstyleplugin.dylib
-			${QT_COMPONENTS_OUTPUT_DIR}/plugin/
-		COMMENT "Copy plugin to destination bundle"
-	)
-	INSTALL(CODE "
-		GET_FILENAME_COMPONENT(DESTDIR \"\$ENV{DESTDIR}\" ABSOLUTE)
-		SET(app \"\${DESTDIR}/Applications/TelldusCenter.app\")
-		GET_BUNDLE_AND_EXECUTABLE(\"\${app}\" bundle exe valid)
-		GET_FILENAME_COMPONENT(exedir \"\${exe}\" PATH)
-		SET(plugin \"\${bundle}/Contents/Plugins/declarative/QtDesktop/plugin/libstyleplugin${CMAKE_SHARED_LIBRARY_SUFFIX}\")
-
-		GET_ITEM_KEY(\"\${plugin}\" pkey)
-		SET(prereqs \"\")
-		GET_PREREQUISITES(\${plugin} prereqs 1 0 \"\${exe}\" \"\${bundle}/Contents/Frameworks/\")
-		FOREACH(pr \${prereqs})
-			GET_ITEM_KEY(\"\${pr}\" rkey)
-
-			#Check to see if this is ourself
-			IF (NOT \${pkey} STREQUAL \${rkey})
-				SET(kv \"\")
-				SET_BUNDLE_KEY_VALUES(kv \"\${pr}\" \"\${pr}\" \"\${exedir}\" \"\${bundle}/Contents/Frameworks/\" 1)
-				IF (NOT EXISTS \"\${\${kv}_RESOLVED_EMBEDDED_ITEM}\")
-					COPY_RESOLVED_FRAMEWORK_INTO_BUNDLE(\"\${\${kv}_RESOLVED_ITEM}\" \"\${\${kv}_RESOLVED_EMBEDDED_ITEM}\")
-				ENDIF ()
-				EXECUTE_PROCESS(COMMAND install_name_tool
-					-change \"\${pr}\" \"\${\${rkey}_EMBEDDED_ITEM}\" \"\${plugin}\"
-				)
-			ENDIF ()
-
-		ENDFOREACH()
-	")
-ELSE()
-	SET_TARGET_PROPERTIES(styleplugin PROPERTIES
-		LIBRARY_OUTPUT_DIRECTORY ${QT_COMPONENTS_OUTPUT_DIR}/plugin
-	)
-ENDIF()
-
-IF(UNIX AND NOT APPLE)
-	INSTALL(DIRECTORY "${CMAKE_BINARY_DIR}/TelldusCenter/Plugins/declarative" DESTINATION "${PLUGIN_LIB_FULL_PATH}")
-ENDIF()
diff --git a/telldus-gui/3rdparty/qtsingleapplication.cmake b/telldus-gui/3rdparty/qtsingleapplication.cmake
deleted file mode 100644
index b2b2fd45..00000000
--- a/telldus-gui/3rdparty/qtsingleapplication.cmake
+++ /dev/null
@@ -1,19 +0,0 @@
-
-SET( qtsingleapplication_MOC_HDRS
-	${CMAKE_HOME_DIRECTORY}/3rdparty/qtsingleapplication/src/qtsingleapplication.h
-	${CMAKE_HOME_DIRECTORY}/3rdparty/qtsingleapplication/src/qtlocalpeer.h
-)
-
-QT4_WRAP_CPP(  qtsingleapplication_MOC_SRCS  ${qtsingleapplication_MOC_HDRS} )
-QT4_AUTOMOC (  ${qtsingleapplication_SRCS} )
-
-SET( qtsingleapplication_SRCS
-	${CMAKE_HOME_DIRECTORY}/3rdparty/qtsingleapplication/src/qtsingleapplication.cpp
-	${CMAKE_HOME_DIRECTORY}/3rdparty/qtsingleapplication/src/qtlocalpeer.cpp
-# 	${CMAKE_HOME_DIRECTORY}/3rdparty/qtsingleapplication/src/qtlocalserver.cpp
-	${qtsingleapplication_MOC_SRCS}
-)
-
-INCLUDE_DIRECTORIES(
-	${CMAKE_HOME_DIRECTORY}/3rdparty/qtsingleapplication/src/
-)
diff --git a/telldus-gui/3rdparty/qtsingleapplication/INSTALL.TXT b/telldus-gui/3rdparty/qtsingleapplication/INSTALL.TXT
deleted file mode 100644
index bbb74a9d..00000000
--- a/telldus-gui/3rdparty/qtsingleapplication/INSTALL.TXT
+++ /dev/null
@@ -1,254 +0,0 @@
-INSTALLATION INSTRUCTIONS
-
-These instructions refer to the package you are installing as
-some-package.tar.gz or some-package.zip. The .zip file is intended for use
-on Windows.
-
-The directory you choose for the installation will be referred to as
-your-install-dir.
-
-Note to Qt Visual Studio Integration users: In the instructions below,
-instead of building from command line with nmake, you can use the menu
-command 'Qt->Open Solution from .pro file' on the .pro files in the
-example and plugin directories, and then build from within Visual
-Studio.
-
-Unpacking and installation
---------------------------
-
-1.  Unpacking the archive (if you have not done so already).
-
-    On Unix and Mac OS X (in a terminal window):
-
-	cd your-install-dir
-	gunzip some-package.tar.gz
-	tar xvf some-package.tar
-
-    This creates the subdirectory some-package containing the files.
-
-    On Windows:
-
-    Unpack the .zip archive by right-clicking it in explorer and
-    choosing "Extract All...". If your version of Windows does not
-    have zip support, you can use the infozip tools available
-    from www.info-zip.org.
-
-    If you are using the infozip tools (in a command prompt window):
-	cd your-install-dir
-	unzip some-package.zip
-
-2.  Configuring the package.
-
-    The configure script is called "configure" on unix/mac and
-    "configure.bat" on Windows. It should be run from a command line
-    after cd'ing to the package directory. 
-
-    You can choose whether you want to use the component by including
-    its source code directly into your project, or build the component
-    as a dynamic shared library (DLL) that is loaded into the
-    application at run-time. The latter may be preferable for
-    technical or licensing (LGPL) reasons. If you want to build a DLL,
-    run the configure script with the argument "-library". Also see
-    the note about usage below.
-
-    (Components that are Qt plugins, e.g. styles and image formats,
-    are by default built as a plugin DLL.)
-
-    The configure script will prompt you in some cases for further
-    information. Answer these questions and carefully read the license text
-    before accepting the license conditions. The package cannot be used if
-    you do not accept the license conditions.
-
-3.  Building the component and examples (when required).
-
-    If a DLL is to be built, or if you would like to build the
-    examples, next give the commands
-
-        qmake
-        make          [or nmake if your are using Microsoft Visual C++]
-
-    The example program(s) can be found in the directory called
-    "examples" or "example".
-
-    Components that are Qt plugins, e.g. styles and image formats, are
-    ready to be used as soon as they are built, so the rest of this
-    installation instruction can be skipped.
-
-4.  Building the Qt Designer plugin (optional).
-
-    Some of the widget components are provided with plugins for Qt
-    Designer. To build and install the plugin, cd into the
-    some-package/plugin directory and give the commands
-
-	qmake
-	make           [or nmake if your are using Microsoft Visual C++]
-
-    Restart Qt Designer to make it load the new widget plugin.
-
-    Note: If you are using the built-in Qt Designer from the Qt Visual
-    Studio Integration, you will need to manually copy the plugin DLL
-    file, i.e. copy
-	%QTDIR%\plugins\designer\some-component.dll 
-    to the Qt Visual Studio Integration plugin path, typically:
-	C:\Program Files\Trolltech\Qt VS Integration\plugins
-
-    Note: If you for some reason are using a Qt Designer that is built
-    in debug mode, you will need to build the plugin in debug mode
-    also. Edit the file plugin.pro in the plugin directory, changing
-    'release' to 'debug' in the CONFIG line, before running qmake.
-
-
-
-Solutions components are intended to be used directly from the package
-directory during development, so there is no 'make install' procedure.
-
-
-Using a component in your project
----------------------------------
-
-To use this component in your project, add the following line to the
-project's .pro file (or do the equivalent in your IDE):
-
-    include(your-install-dir/some-package/src/some-package.pri)
-
-This adds the package's sources and headers to the SOURCES and HEADERS
-project variables respectively (or, if the component has been
-configured as a DLL, it adds that library to the LIBS variable), and
-updates INCLUDEPATH to contain the package's src
-directory. Additionally, the .pri file may include some dependencies
-needed by the package.
-
-To include a header file from the package in your sources, you can now
-simply use:
-
-    #include 
-
-or alternatively, in pre-Qt 4 style:
-
-    #include 
-
-Refer to the documentation to see the classes and headers this
-components provides.
-
-
-
-Install documentation (optional)
---------------------------------
-
-The HTML documentation for the package's classes is located in the
-your-install-dir/some-package/doc/html/index.html. You can open this
-file and read the documentation with any web browser.
-
-To install the documentation into Qt Assistant (for Qt version 4.4 and
-later):
-
-1.  In Assistant, open the Edit->Preferences dialog and choose the
-    Documentation tab. Click the Add... button and select the file
-       your-install-dir/some-package/doc/html/some-package.qch
-    
-For Qt versions prior to 4.4, do instead the following:
-
-1.  The directory your-install-dir/some-package/doc/html contains a
-    file called some-package.dcf. Execute the following commands in a
-    shell, command prompt or terminal window:
-
-	cd your-install-dir/some-package/doc/html/
-	assistant -addContentFile some-package.dcf
-
-The next time you start Qt Assistant, you can access the package's
-documentation.
-
-
-Removing the documentation from assistant
------------------------------------------
-
-If you have installed the documentation into Qt Assistant, and want to uninstall it, do as follows, for Qt version 4.4 and later:
-
-1.  In Assistant, open the Edit->Preferences dialog and choose the
-    Documentation tab. In the list of Registered Documentation, select
-    the item com.nokia.qtsolutions.some-package_version, and click
-    the Remove button.
-
-For Qt versions prior to 4.4, do instead the following:
-
-1.  The directory your-install-dir/some-package/doc/html contains a
-    file called some-package.dcf. Execute the following commands in a
-    shell, command prompt or terminal window:
-
-	cd your-install-dir/some-package/doc/html/
-	assistant -removeContentFile some-package.dcf
-
-
-
-Using the component as a DLL
-----------------------------
-
-1. Normal components
-
-    The shared library (DLL) is built and placed in the
-    some-package/lib directory. It is intended to be used directly
-    from there during development. When appropriate, both debug and
-    release versions are built, since the run-time linker will in some
-    cases refuse to load a debug-built DLL into a release-built
-    application or vice versa.
-
-    The following steps are taken by default to help the dynamic
-    linker to locate the DLL at run-time (during development):
-
-    Unix: The some-package.pri file will add linker instructions to
-    add the some-package/lib directory to the rpath of the
-    executable. (When distributing, or if your system does not support
-    rpath, you can copy the shared library to another place that is
-    searched by the dynamic linker, e.g. the "lib" directory of your
-    Qt installation.)
-
-    Mac: The full path to the library is hardcoded into the library
-    itself, from where it is copied into the executable at link time,
-    and ready by the dynamic linker at run-time. (When distributing,
-    you will want to edit these hardcoded paths in the same way as for
-    the Qt DLLs. Refer to the document "Deploying an Application on
-    Mac OS X" in the Qt Reference Documentation.)
-
-    Windows: the .dll file(s) are copied into the "bin" directory of
-    your Qt installation. The Qt installation will already have set up
-    that directory to be searched by the dynamic linker.
-
-
-2. Plugins
-
-    For Qt Solutions plugins (e.g. image formats), both debug and
-    release versions of the plugin are built by default when
-    appropriate, since in some cases the release Qt library will not
-    load a debug plugin, and vice versa. The plugins are automatically
-    copied into the plugins directory of your Qt installation when
-    built, so no further setup is required.
-
-    Plugins may also be built statically, i.e. as a library that will be
-    linked into your application executable, and so will not need to
-    be redistributed as a separate plugin DLL to end users. Static
-    building is required if Qt itself is built statically. To do it,
-    just add "static" to the CONFIG variable in the plugin/plugin.pro
-    file before building. Refer to the "Static Plugins" section in the
-    chapter "How to Create Qt Plugins" for explanation of how to use a
-    static plugin in your application. The source code of the example
-    program(s) will also typically contain the relevant instructions
-    as comments.
-
-
-
-Uninstalling
-------------
-
-    The following command will remove any fils that have been
-    automatically placed outside the package directory itself during
-    installation and building
-
-	make distclean [or nmake if your are using Microsoft Visual C++]
-
-    If Qt Assistant documentation or Qt Designer plugins have been
-    installed, they can be uninstalled manually, ref. above.
-
-
-Enjoy! :)
-
-- The Qt Solutions Team.
diff --git a/telldus-gui/3rdparty/qtsingleapplication/README.TXT b/telldus-gui/3rdparty/qtsingleapplication/README.TXT
deleted file mode 100644
index 06abb095..00000000
--- a/telldus-gui/3rdparty/qtsingleapplication/README.TXT
+++ /dev/null
@@ -1,33 +0,0 @@
-Qt Solutions Component: Single Application
-
-The QtSingleApplication component provides support for
-applications that can be only started once per user.
-
-
-
-Version history:
-
-2.0: - Version 1.3 ported to Qt 4.
-
-2.1: - Fix compilation problem on Mac.
-
-2.2: - Really fix the Mac compilation problem.
-     - Mac: fix crash due to wrong object releasing.
-     - Mac: Fix memory leak.
-
-2.3: - Windows: Force creation of internal widget to make it work
-     with Qt 4.2.
-
-2.4: - Fix the system for automatic window raising on message
-     reception. NOTE: minor API change.
-
-2.5: - Mac: Fix isRunning() to work and report correctly.
-
-2.6: - - initialize() is now obsolete, no longer necessary to call
-     it
-     - - Fixed race condition where multiple instances migth be started
-     - - QtSingleCoreApplication variant provided for non-GUI (console)
-     usage
-     - Complete reimplementation. Visible changes:
-     - LGPL release.
-
diff --git a/telldus-gui/3rdparty/qtsingleapplication/buildlib/buildlib.pro b/telldus-gui/3rdparty/qtsingleapplication/buildlib/buildlib.pro
deleted file mode 100644
index 37dddcda..00000000
--- a/telldus-gui/3rdparty/qtsingleapplication/buildlib/buildlib.pro
+++ /dev/null
@@ -1,13 +0,0 @@
-TEMPLATE=lib
-CONFIG += qt dll qtsingleapplication-buildlib
-mac:CONFIG += absolute_library_soname
-win32|mac:!wince*:!win32-msvc:!macx-xcode:CONFIG += debug_and_release build_all
-include(../src/qtsingleapplication.pri)
-TARGET = $$QTSINGLEAPPLICATION_LIBNAME
-DESTDIR = $$QTSINGLEAPPLICATION_LIBDIR
-win32 {
-    DLLDESTDIR = $$[QT_INSTALL_BINS]
-    QMAKE_DISTCLEAN += $$[QT_INSTALL_BINS]\\$${QTSINGLEAPPLICATION_LIBNAME}.dll
-}
-target.path = $$DESTDIR
-INSTALLS += target
diff --git a/telldus-gui/3rdparty/qtsingleapplication/common.pri b/telldus-gui/3rdparty/qtsingleapplication/common.pri
deleted file mode 100644
index bae27173..00000000
--- a/telldus-gui/3rdparty/qtsingleapplication/common.pri
+++ /dev/null
@@ -1,6 +0,0 @@
-exists(config.pri):infile(config.pri, SOLUTIONS_LIBRARY, yes): CONFIG += qtsingleapplication-uselib
-TEMPLATE += fakelib
-QTSINGLEAPPLICATION_LIBNAME = $$qtLibraryTarget(QtSolutions_SingleApplication-head)
-TEMPLATE -= fakelib
-QTSINGLEAPPLICATION_LIBDIR = $$PWD/lib
-unix:qtsingleapplication-uselib:!qtsingleapplication-buildlib:QMAKE_RPATHDIR += $$QTSINGLEAPPLICATION_LIBDIR
diff --git a/telldus-gui/3rdparty/qtsingleapplication/configure b/telldus-gui/3rdparty/qtsingleapplication/configure
deleted file mode 100755
index 3c4edfff..00000000
--- a/telldus-gui/3rdparty/qtsingleapplication/configure
+++ /dev/null
@@ -1,25 +0,0 @@
-#!/bin/sh
-
-if [ "x$1" != "x" -a "x$1" != "x-library" ]; then
-    echo "Usage: $0 [-library]"
-    echo 
-    echo "-library: Build the component as a dynamic library (DLL). Default is to"
-    echo "          include the component source code directly in the application."
-    echo 
-    exit 0
-fi
-
-rm -f config.pri
-if [ "x$1" = "x-library" ]; then
-    echo "Configuring to build this component as a dynamic library."
-    echo "SOLUTIONS_LIBRARY = yes" > config.pri
-fi
-
-echo
-echo "This component is now configured."
-echo
-echo "To build the component library (if requested) and example(s),"
-echo "run qmake and your make command."
-echo
-echo "To remove or reconfigure, run make distclean."
-echo
diff --git a/telldus-gui/3rdparty/qtsingleapplication/configure.bat b/telldus-gui/3rdparty/qtsingleapplication/configure.bat
deleted file mode 100644
index 9bf19870..00000000
--- a/telldus-gui/3rdparty/qtsingleapplication/configure.bat
+++ /dev/null
@@ -1,80 +0,0 @@
-:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
-::
-:: Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
-:: Contact: http://www.qt-project.org/legal
-::
-:: This file is part of the Qt Solutions component.
-::
-:: $QT_BEGIN_LICENSE:BSD$
-:: You may use this file under the terms of the BSD license as follows:
-::
-:: "Redistribution and use in source and binary forms, with or without
-:: modification, are permitted provided that the following conditions are
-:: met:
-::   * Redistributions of source code must retain the above copyright
-::     notice, this list of conditions and the following disclaimer.
-::   * Redistributions in binary form must reproduce the above copyright
-::     notice, this list of conditions and the following disclaimer in
-::     the documentation and/or other materials provided with the
-::     distribution.
-::   * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names
-::     of its contributors may be used to endorse or promote products derived
-::     from this software without specific prior written permission.
-::
-::
-:: THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-:: "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-:: LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-:: A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-:: OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-:: SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-:: LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-:: DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-:: THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-:: (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-:: OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
-::
-:: $QT_END_LICENSE$
-::
-:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
-
-@echo off
-
-rem
-rem "Main"
-rem
-
-if not "%1"=="" (
-    if not "%1"=="-library" (
-        call :PrintUsage
-        goto EOF
-    )
-)
-
-if exist config.pri. del config.pri
-if "%1"=="-library" (
-    echo Configuring to build this component as a dynamic library.
-    echo SOLUTIONS_LIBRARY = yes > config.pri
-)
-
-echo .
-echo This component is now configured.
-echo .
-echo To build the component library (if requested) and example(s),
-echo run qmake and your make or nmake command.
-echo .
-echo To remove or reconfigure, run make (nmake) distclean.
-echo .
-goto EOF
-
-:PrintUsage
-echo Usage: configure.bat [-library]
-echo .
-echo -library: Build the component as a dynamic library (DLL). Default is to
-echo           include the component source directly in the application.
-echo           A DLL may be preferable for technical or licensing (LGPL) reasons.
-echo .
-goto EOF
-
-
-:EOF
diff --git a/telldus-gui/3rdparty/qtsingleapplication/doc/html/classic.css b/telldus-gui/3rdparty/qtsingleapplication/doc/html/classic.css
deleted file mode 100644
index b8cae8e1..00000000
--- a/telldus-gui/3rdparty/qtsingleapplication/doc/html/classic.css
+++ /dev/null
@@ -1,284 +0,0 @@
-BODY,H1,H2,H3,H4,H5,H6,P,CENTER,TD,TH,UL,DL,DIV {
-  font-family: Arial, Geneva, Helvetica, sans-serif;
-}
-H1 {
-  text-align: center;
-  font-size: 160%;
-}
-H2 {
-  font-size: 120%;
-}
-H3 {
-  font-size: 100%;
-}
-
-h3.fn,span.fn
-{
-  background-color: #eee;
-  border-width: 1px;
-  border-style: solid;
-  border-color: #ddd;
-  font-weight: bold;
-  padding: 6px 0px 6px 10px;
-  margin: 42px 0px 0px 0px;
-}
-
-hr {
-  border: 0;
-  color: #a0a0a0;
-  background-color: #ccc;
-  height: 1px;
-  width: 100%;
-  text-align: left;
-  margin: 34px 0px 34px 0px;
-}
-
-table.valuelist {
-	border-width: 1px 1px 1px 1px;
-	border-style: solid;
-	border-color: #dddddd;
-	border-collapse: collapse;
-	background-color: #f0f0f0;
-}
-
-table.indextable {
-	border-width: 1px 1px 1px 1px;
-	border-style: solid;
-	border-collapse: collapse;
-	background-color: #f0f0f0;
-    border-color:#555;
-    font-size: 100%;
-}
-
-table td.largeindex {
-	border-width: 1px 1px 1px 1px;
-	border-collapse: collapse;
-	background-color: #f0f0f0;
-    border-color:#555;
-    font-size: 120%;
-}
-
-table.valuelist th {
-	border-width: 1px 1px 1px 2px;
-	padding: 4px;
-	border-style: solid;
-	border-color: #666;
-    color:white;
-    background-color:#666;
-}
-
-th.titleheader  {
-	border-width: 1px 0px 1px 0px;
-	padding: 2px;
-	border-style: solid;
-	border-color: #666;
-    color:white;
-    background-color:#555;
-    background-image:url('images/gradient.png')};
-    background-repeat: repeat-x;
-    font-size: 100%;
-}
-
-
-th.largeheader {
-	border-width: 1px 0px 1px 0px;
-	padding: 4px;
-	border-style: solid;
-	border-color: #444;
-    color:white;
-    background-color:#555555;
-    font-size: 120%;
-}
-
-p {
-
-  margin-left: 4px;
-  margin-top: 8px;
-  margin-bottom: 8px;
-}
-
-a:link
-{
-  color: #0046ad;
-  text-decoration: none
-}
-
-a:visited
-{
-  color: #672967;
-  text-decoration: none
-}
-
-a.obsolete
-{
-  color: #661100;
-  text-decoration: none
-}
-
-a.compat
-{
-  color: #661100;
-  text-decoration: none
-}
-
-a.obsolete:visited
-{
-  color: #995500;
-  text-decoration: none
-}
-
-a.compat:visited
-{
-  color: #995500;
-  text-decoration: none
-}
-
-body
-{
-  background: #ffffff;
-  color: black
-}
-
-table.generic, table.annotated
-{
-  border-width: 1px;
-  border-color:#bbb;
-  border-style:solid;  
-  border-collapse:collapse;
-}
-
-table td.memItemLeft {
-  width: 180px;
-  padding: 2px 0px 0px 8px;
-  margin: 4px;
-  border-width: 1px;
-  border-color: #E0E0E0;
-  border-style: none;
-  font-size: 100%;
-  white-space: nowrap
-}
-
-table td.memItemRight {
-  padding: 2px 8px 0px 8px;
-  margin: 4px;
-  border-width: 1px;
-  border-color: #E0E0E0;
-  border-style: none;
-  font-size: 100%;
-}
-
-table tr.odd {
-  background: #f0f0f0;
-  color: black;
-}
-
-table tr.even {
-  background: #e4e4e4;
-  color: black;
-}
-
-table.annotated th {
-  padding: 3px;
-  text-align: left
-}
-
-table.annotated td {
-  padding: 3px;
-}
-
-table tr pre
-{
-  padding-top: 0px;
-  padding-bottom: 0px;
-  padding-left: 0px;
-  padding-right: 0px;
-  border: none;
-  background: none
-}
-
-tr.qt-style
-{
-  background: #96E066;
-  color: black
-}
-
-body pre
-{
-  padding: 0.2em;
-  border: #e7e7e7 1px solid;
-  background: #f1f1f1;
-  color: black
-}
-
-table tr.qt-code pre
-{
-  padding: 0.2em;
-  border: #e7e7e7 1px solid;
-  background: #f1f1f1;
-  color: black
-}
-
-span.preprocessor, span.preprocessor a
-{
-  color: darkblue;
-}
-
-span.comment
-{
-  color: darkred;
-  font-style: italic
-}
-
-span.string,span.char
-{
-  color: darkgreen;
-}
-
-.title
-{
-    text-align: center
-}
-
-.subtitle
-{
-    font-size: 0.8em
-}
-
-.small-subtitle
-{
-    font-size: 0.65em
-}
-
-.qmlitem {
-    padding: 0;
-}
-
-.qmlname {
-    white-space: nowrap;
-}
-
-.qmltype {
-    text-align: center;
-    font-size: 160%;
-}
-
-.qmlproto {
-    background-color: #eee;
-    border-width: 1px;
-    border-style: solid;
-    border-color: #ddd;
-    font-weight: bold;
-    padding: 6px 10px 6px 10px;
-    margin: 42px 0px 0px 0px;
-}
-
-.qmlreadonly {
-    float: right;
-    color: red
-}
-
-.qmldoc {
-}
-
-*.qmlitem p {
-}
diff --git a/telldus-gui/3rdparty/qtsingleapplication/doc/html/images/qt-logo.png b/telldus-gui/3rdparty/qtsingleapplication/doc/html/images/qt-logo.png
deleted file mode 100644
index 794162f5..00000000
Binary files a/telldus-gui/3rdparty/qtsingleapplication/doc/html/images/qt-logo.png and /dev/null differ
diff --git a/telldus-gui/3rdparty/qtsingleapplication/doc/html/index.html b/telldus-gui/3rdparty/qtsingleapplication/doc/html/index.html
deleted file mode 100644
index af9dab10..00000000
--- a/telldus-gui/3rdparty/qtsingleapplication/doc/html/index.html
+++ /dev/null
@@ -1,48 +0,0 @@
-
-
-
-
-
-  Single Application
-  
-
-
-
-
-
-
-
  Home

Single Application
-

- -

Description

-

The QtSingleApplication component provides support for applications that can be only started once per user.

-

For some applications it is useful or even critical that they are started only once by any user. Future attempts to start the application should activate any already running instance, and possibly perform requested actions, e.g. loading a file, in that instance.

-

The QtSingleApplication class provides an interface to detect a running instance, and to send command strings to that instance. For console (non-GUI) applications, the QtSingleCoreApplication variant is provided, which avoids dependency on QtGui.

- -

Classes

- - -

Examples

- - -

Tested platforms

-
    -
  • Qt 4.4, 4.5 / Windows XP / MSVC.NET 2005
  • -
  • Qt 4.4, 4.5 / Linux / gcc
  • -
  • Qt 4.4, 4.5 / MacOS X 10.5 / gcc
  • -
-


- - - - -
Copyright © 2010 Nokia Corporation and/or its subsidiary(-ies)Trademarks
Qt Solutions
- diff --git a/telldus-gui/3rdparty/qtsingleapplication/doc/html/qtsingleapplication-example-loader.html b/telldus-gui/3rdparty/qtsingleapplication/doc/html/qtsingleapplication-example-loader.html deleted file mode 100644 index 6a366329..00000000 --- a/telldus-gui/3rdparty/qtsingleapplication/doc/html/qtsingleapplication-example-loader.html +++ /dev/null @@ -1,175 +0,0 @@ - - - - - - Loading Documents - - - - - - - -
  Home

Loading Documents
-

-

The application in this example loads or prints the documents passed as commandline parameters to further instances of this application.

-
 /****************************************************************************
- **
- ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
- ** Contact: http://www.qt-project.org/legal
- **
- ** This file is part of the Qt Solutions component.
- **
- ** You may use this file under the terms of the BSD license as follows:
- **
- ** "Redistribution and use in source and binary forms, with or without
- ** modification, are permitted provided that the following conditions are
- ** met:
- **   * Redistributions of source code must retain the above copyright
- **     notice, this list of conditions and the following disclaimer.
- **   * Redistributions in binary form must reproduce the above copyright
- **     notice, this list of conditions and the following disclaimer in
- **     the documentation and/or other materials provided with the
- **     distribution.
- **   * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
- **     the names of its contributors may be used to endorse or promote
- **     products derived from this software without specific prior written
- **     permission.
- **
- ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
- **
- ****************************************************************************/
-
- #include <qtsingleapplication.h>
- #include <QtCore/QFile>
- #include <QtGui/QMainWindow>
- #include <QtGui/QPrinter>
- #include <QtGui/QPainter>
- #include <QtGui/QTextEdit>
- #include <QtGui/QMdiArea>
- #include <QtCore/QTextStream>
-
- class MainWindow : public QMainWindow
- {
-     Q_OBJECT
- public:
-     MainWindow();
-
- public slots:
-     void handleMessage(const QString& message);
-
- signals:
-     void needToShow();
-
- private:
-     QMdiArea *workspace;
- };
-

The user interface in this application is a QMainWindow subclass with a QMdiArea as the central widget. It implements a slot handleMessage() that will be connected to the messageReceived() signal of the QtSingleApplication class.

-
 MainWindow::MainWindow()
- {
-     workspace = new QMdiArea(this);
-
-     setCentralWidget(workspace);
- }
-

The MainWindow constructor creates a minimal user interface.

-
 void MainWindow::handleMessage(const QString& message)
- {
-     enum Action {
-         Nothing,
-         Open,
-         Print
-     } action;
-
-     action = Nothing;
-     QString filename = message;
-     if (message.toLower().startsWith("/print ")) {
-         filename = filename.mid(7);
-         action = Print;
-     } else if (!message.isEmpty()) {
-         action = Open;
-     }
-     if (action == Nothing) {
-         emit needToShow();
-         return;
-     }
-
-     QFile file(filename);
-     QString contents;
-     if (file.open(QIODevice::ReadOnly))
-         contents = file.readAll();
-     else
-         contents = "[[Error: Could not load file " + filename + "]]";
-
-     QTextEdit *view = new QTextEdit;
-     view->setPlainText(contents);
-
-     switch(action) {
-

The handleMessage() slot interprets the message passed in as a filename that can be prepended with /print to indicate that the file should just be printed rather than loaded.

-
     case Print:
-         {
-             QPrinter printer;
-             view->print(&printer);
-             delete view;
-         }
-         break;
-
-     case Open:
-         {
-             workspace->addSubWindow(view);
-             view->setWindowTitle(message);
-             view->show();
-             emit needToShow();
-         }
-         break;
-     default:
-         break;
-     };
- }
-

Loading the file will also activate the window.

-
 #include "main.moc"
-
- int main(int argc, char **argv)
- {
-     QtSingleApplication instance("File loader QtSingleApplication example", argc, argv);
-     QString message;
-     for (int a = 1; a < argc; ++a) {
-         message += argv[a];
-         if (a < argc-1)
-             message += " ";
-     }
-
-     if (instance.sendMessage(message))
-         return 0;
-

The main entry point function creates a QtSingleApplication object, and creates a message to send to a running instance of the application. If the message was sent successfully the process exits immediately.

-
     MainWindow mw;
-     mw.handleMessage(message);
-     mw.show();
-
-     QObject::connect(&instance, SIGNAL(messageReceived(const QString&)),
-                      &mw, SLOT(handleMessage(const QString&)));
-
-     instance.setActivationWindow(&mw, false);
-     QObject::connect(&mw, SIGNAL(needToShow()), &instance, SLOT(activateWindow()));
-
-     return instance.exec();
- }
-

If the message could not be sent the application starts up. Note that false is passed to the call to setActivationWindow() to prevent automatic activation for every message received, e.g. when the application should just print a file. Instead, the message handling function determines whether activation is requested, and signals that by emitting the needToShow() signal. This is then simply connected directly to QtSingleApplication's activateWindow() slot.

-


- - - - -
Copyright © 2010 Nokia Corporation and/or its subsidiary(-ies)Trademarks
Qt Solutions
- diff --git a/telldus-gui/3rdparty/qtsingleapplication/doc/html/qtsingleapplication-example-trivial.html b/telldus-gui/3rdparty/qtsingleapplication/doc/html/qtsingleapplication-example-trivial.html deleted file mode 100644 index 5e60cfa4..00000000 --- a/telldus-gui/3rdparty/qtsingleapplication/doc/html/qtsingleapplication-example-trivial.html +++ /dev/null @@ -1,101 +0,0 @@ - - - - - - A Trivial Example - - - - - - - -
  Home

A Trivial Example
-

-

The application in this example has a log-view that displays messages sent by further instances of the same application.

-

The example demonstrates the use of the QtSingleApplication class to detect and communicate with a running instance of the application using the sendMessage() API. The messageReceived() signal is used to display received messages in a QTextEdit log.

-
 /****************************************************************************
- **
- ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
- ** Contact: http://www.qt-project.org/legal
- **
- ** This file is part of the Qt Solutions component.
- **
- ** You may use this file under the terms of the BSD license as follows:
- **
- ** "Redistribution and use in source and binary forms, with or without
- ** modification, are permitted provided that the following conditions are
- ** met:
- **   * Redistributions of source code must retain the above copyright
- **     notice, this list of conditions and the following disclaimer.
- **   * Redistributions in binary form must reproduce the above copyright
- **     notice, this list of conditions and the following disclaimer in
- **     the documentation and/or other materials provided with the
- **     distribution.
- **   * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
- **     the names of its contributors may be used to endorse or promote
- **     products derived from this software without specific prior written
- **     permission.
- **
- ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
- **
- ****************************************************************************/
-
- #include <qtsingleapplication.h>
- #include <QtGui/QTextEdit>
-
- class TextEdit : public QTextEdit
- {
-     Q_OBJECT
- public:
-     TextEdit(QWidget *parent = 0)
-         : QTextEdit(parent)
-     {}
- public slots:
-     void append(const QString &str)
-     {
-         QTextEdit::append(str);
-     }
- };
-
- #include "main.moc"
-
- int main(int argc, char **argv)
- {
-     QtSingleApplication instance(argc, argv);
-

The example has only the main entry point function. A QtSingleApplication object is created immediately.

-
     if (instance.sendMessage("Wake up!"))
-         return 0;
-

If another instance of this application is already running, sendMessage() will succeed, and this instance just exits immediately.

-
     TextEdit logview;
-     logview.setReadOnly(true);
-     logview.show();
-

Otherwise the instance continues as normal and creates the user interface.

-
     instance.setActivationWindow(&logview);
-
-     QObject::connect(&instance, SIGNAL(messageReceived(const QString&)),
-                      &logview, SLOT(append(const QString&)));
-
-     return instance.exec();
-

The logview object is also set as the application's activation window. Every time a message is received, the window will be raised and activated automatically.

-

The messageReceived() signal is also connected to the QTextEdit's append() slot. Every message received from further instances of this application will be displayed in the log.

-

Finally the event loop is entered.

-


- - - - -
Copyright © 2010 Nokia Corporation and/or its subsidiary(-ies)Trademarks
Qt Solutions
- diff --git a/telldus-gui/3rdparty/qtsingleapplication/doc/html/qtsingleapplication-members.html b/telldus-gui/3rdparty/qtsingleapplication/doc/html/qtsingleapplication-members.html deleted file mode 100644 index c995ce3f..00000000 --- a/telldus-gui/3rdparty/qtsingleapplication/doc/html/qtsingleapplication-members.html +++ /dev/null @@ -1,235 +0,0 @@ - - - - - - List of All Members for QtSingleApplication - - - - - - - -
  Home

List of All Members for QtSingleApplication

-

This is the complete list of members for QtSingleApplication, including inherited members.

-

- -
-

-


- - - - -
Copyright © 2010 Nokia Corporation and/or its subsidiary(-ies)Trademarks
Qt Solutions
- diff --git a/telldus-gui/3rdparty/qtsingleapplication/doc/html/qtsingleapplication-obsolete.html b/telldus-gui/3rdparty/qtsingleapplication/doc/html/qtsingleapplication-obsolete.html deleted file mode 100644 index 0d07dfae..00000000 --- a/telldus-gui/3rdparty/qtsingleapplication/doc/html/qtsingleapplication-obsolete.html +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - Obsolete Members for QtSingleApplication - - - - - - - -
  Home

Obsolete Members for QtSingleApplication

-

The following class members are obsolete. They are provided to keep old source code working. We strongly advise against using them in new code.

-

-

Public Functions

- - -
void initialize ( bool dummy = true )   (obsolete)
-
-

Member Function Documentation

-

void QtSingleApplication::initialize ( bool dummy = true )

-


- - - - -
Copyright © 2010 Nokia Corporation and/or its subsidiary(-ies)Trademarks
Qt Solutions
- diff --git a/telldus-gui/3rdparty/qtsingleapplication/doc/html/qtsingleapplication.dcf b/telldus-gui/3rdparty/qtsingleapplication/doc/html/qtsingleapplication.dcf deleted file mode 100644 index d81f87fb..00000000 --- a/telldus-gui/3rdparty/qtsingleapplication/doc/html/qtsingleapplication.dcf +++ /dev/null @@ -1,40 +0,0 @@ - - -
-
- QtSingleApplication - activateWindow - activationWindow - id - isRunning - messageReceived - sendMessage - setActivationWindow -
-
-
-
- QtSingleCoreApplication - id - isRunning - messageReceived - sendMessage -
-
-
-
-
- A non-GUI example -
-
- A Trivial Example -
-
- Loading Documents -
-
- Single Application -
-
-
- diff --git a/telldus-gui/3rdparty/qtsingleapplication/doc/html/qtsingleapplication.html b/telldus-gui/3rdparty/qtsingleapplication/doc/html/qtsingleapplication.html deleted file mode 100644 index 2754a3b9..00000000 --- a/telldus-gui/3rdparty/qtsingleapplication/doc/html/qtsingleapplication.html +++ /dev/null @@ -1,162 +0,0 @@ - - - - - - QtSingleApplication Class Reference - - - - - - - -
  Home

QtSingleApplication Class Reference

-

The QtSingleApplication class provides an API to detect and communicate with running instances of an application. More...

-
 #include <QtSingleApplication>

Inherits QApplication.

- -
- -

Public Functions

- - - - - - - - - - - -
QtSingleApplication ( int & argc, char ** argv, bool GUIenabled = true )
QtSingleApplication ( const QString & appId, int & argc, char ** argv )
QtSingleApplication ( int & argc, char ** argv, Type type )
QtSingleApplication ( Display * dpy, Qt::HANDLE visual = 0, Qt::HANDLE cmap = 0 )
QtSingleApplication ( Display * dpy, int & argc, char ** argv, Qt::HANDLE visual = 0, Qt::HANDLE cmap = 0 )
QtSingleApplication ( Display * dpy, const QString & appId, int argc, char ** argv, Qt::HANDLE visual = 0, Qt::HANDLE cmap = 0 )
QWidget * activationWindow () const
QString id () const
bool isRunning ()
void setActivationWindow ( QWidget * aw, bool activateOnMessage = true )
- -
- -

Public Slots

- - - -
void activateWindow ()
bool sendMessage ( const QString & message, int timeout = 5000 )
- -
- -

Signals

- - -
void messageReceived ( const QString & message )
- -

Additional Inherited Members

- - -
-

Detailed Description

-

The QtSingleApplication class provides an API to detect and communicate with running instances of an application.

-

This class allows you to create applications where only one instance should be running at a time. I.e., if the user tries to launch another instance, the already running instance will be activated instead. Another usecase is a client-server system, where the first started instance will assume the role of server, and the later instances will act as clients of that server.

-

By default, the full path of the executable file is used to determine whether two processes are instances of the same application. You can also provide an explicit identifier string that will be compared instead.

-

The application should create the QtSingleApplication object early in the startup phase, and call isRunning() to find out if another instance of this application is already running. If isRunning() returns false, it means that no other instance is running, and this instance has assumed the role as the running instance. In this case, the application should continue with the initialization of the application user interface before entering the event loop with exec(), as normal.

-

The messageReceived() signal will be emitted when the running application receives messages from another instance of the same application. When a message is received it might be helpful to the user to raise the application so that it becomes visible. To facilitate this, QtSingleApplication provides the setActivationWindow() function and the activateWindow() slot.

-

If isRunning() returns true, another instance is already running. It may be alerted to the fact that another instance has started by using the sendMessage() function. Also data such as startup parameters (e.g. the name of the file the user wanted this new instance to open) can be passed to the running instance with this function. Then, the application should terminate (or enter client mode).

-

If isRunning() returns true, but sendMessage() fails, that is an indication that the running instance is frozen.

-

Here's an example that shows how to convert an existing application to use QtSingleApplication. It is very simple and does not make use of all QtSingleApplication's functionality (see the examples for that).

-
 // Original
- int main(int argc, char **argv)
- {
-     QApplication app(argc, argv);
-
-     MyMainWidget mmw;
-     mmw.show();
-     return app.exec();
- }
-
- // Single instance
- int main(int argc, char **argv)
- {
-     QtSingleApplication app(argc, argv);
-
-     if (app.isRunning())
-         return !app.sendMessage(someDataString);
-
-     MyMainWidget mmw;
-     app.setActivationWindow(&mmw);
-     mmw.show();
-     return app.exec();
- }
-

Once this QtSingleApplication instance is destroyed (normally when the process exits or crashes), when the user next attempts to run the application this instance will not, of course, be encountered. The next instance to call isRunning() or sendMessage() will assume the role as the new running instance.

-

For console (non-GUI) applications, QtSingleCoreApplication may be used instead of this class, to avoid the dependency on the QtGui library.

-

See also QtSingleCoreApplication.

-
-

Member Function Documentation

-

QtSingleApplication::QtSingleApplication ( int & argc, char ** argv, bool GUIenabled = true )

-

Creates a QtSingleApplication object. The application identifier will be QCoreApplication::applicationFilePath(). argc, argv, and GUIenabled are passed on to the QAppliation constructor.

-

If you are creating a console application (i.e. setting GUIenabled to false), you may consider using QtSingleCoreApplication instead.

-

QtSingleApplication::QtSingleApplication ( const QString & appId, int & argc, char ** argv )

-

Creates a QtSingleApplication object with the application identifier appId. argc and argv are passed on to the QAppliation constructor.

-

QtSingleApplication::QtSingleApplication ( int & argc, char ** argv, Type type )

-

Creates a QtSingleApplication object. The application identifier will be QCoreApplication::applicationFilePath(). argc, argv, and type are passed on to the QAppliation constructor.

-

QtSingleApplication::QtSingleApplication ( Display * dpy, Qt::HANDLE visual = 0, Qt::HANDLE cmap = 0 )

-

Special constructor for X11, ref. the documentation of QApplication's corresponding constructor. The application identifier will be QCoreApplication::applicationFilePath(). dpy, visual, and cmap are passed on to the QApplication constructor.

-

QtSingleApplication::QtSingleApplication ( Display * dpy, int & argc, char ** argv, Qt::HANDLE visual = 0, Qt::HANDLE cmap = 0 )

-

Special constructor for X11, ref. the documentation of QApplication's corresponding constructor. The application identifier will be QCoreApplication::applicationFilePath(). dpy, argc, argv, visual, and cmap are passed on to the QApplication constructor.

-

QtSingleApplication::QtSingleApplication ( Display * dpy, const QString & appId, int argc, char ** argv, Qt::HANDLE visual = 0, Qt::HANDLE cmap = 0 )

-

Special constructor for X11, ref. the documentation of QApplication's corresponding constructor. The application identifier will be appId. dpy, argc, argv, visual, and cmap are passed on to the QApplication constructor.

-

void QtSingleApplication::activateWindow ()   [slot]

-

De-minimizes, raises, and activates this application's activation window. This function does nothing if no activation window has been set.

-

This is a convenience function to show the user that this application instance has been activated when he has tried to start another instance.

-

This function should typically be called in response to the messageReceived() signal. By default, that will happen automatically, if an activation window has been set.

-

See also setActivationWindow(), messageReceived(), and initialize().

-

QWidget * QtSingleApplication::activationWindow () const

-

Returns the applications activation window if one has been set by calling setActivationWindow(), otherwise returns 0.

-

See also setActivationWindow().

-

QString QtSingleApplication::id () const

-

Returns the application identifier. Two processes with the same identifier will be regarded as instances of the same application.

-

bool QtSingleApplication::isRunning ()

-

Returns true if another instance of this application is running; otherwise false.

-

This function does not find instances of this application that are being run by a different user (on Windows: that are running in another session).

-

See also sendMessage().

-

void QtSingleApplication::messageReceived ( const QString & message )   [signal]

-

This signal is emitted when the current instance receives a message from another instance of this application.

-

See also sendMessage(), setActivationWindow(), and activateWindow().

-

bool QtSingleApplication::sendMessage ( const QString & message, int timeout = 5000 )   [slot]

-

Tries to send the text message to the currently running instance. The QtSingleApplication object in the running instance will emit the messageReceived() signal when it receives the message.

-

This function returns true if the message has been sent to, and processed by, the current instance. If there is no instance currently running, or if the running instance fails to process the message within timeout milliseconds, this function return false.

-

See also isRunning() and messageReceived().

-

void QtSingleApplication::setActivationWindow ( QWidget * aw, bool activateOnMessage = true )

-

Sets the activation window of this application to aw. The activation window is the widget that will be activated by activateWindow(). This is typically the application's main window.

-

If activateOnMessage is true (the default), the window will be activated automatically every time a message is received, just prior to the messageReceived() signal being emitted.

-

See also activationWindow(), activateWindow(), and messageReceived().

-


- - - - -
Copyright © 2010 Nokia Corporation and/or its subsidiary(-ies)Trademarks
Qt Solutions
- diff --git a/telldus-gui/3rdparty/qtsingleapplication/doc/html/qtsingleapplication.index b/telldus-gui/3rdparty/qtsingleapplication/doc/html/qtsingleapplication.index deleted file mode 100644 index 56052c2a..00000000 --- a/telldus-gui/3rdparty/qtsingleapplication/doc/html/qtsingleapplication.index +++ /dev/null @@ -1,90 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/telldus-gui/3rdparty/qtsingleapplication/doc/html/qtsingleapplication.qhp b/telldus-gui/3rdparty/qtsingleapplication/doc/html/qtsingleapplication.qhp deleted file mode 100644 index ff42d9df..00000000 --- a/telldus-gui/3rdparty/qtsingleapplication/doc/html/qtsingleapplication.qhp +++ /dev/null @@ -1,53 +0,0 @@ - - - com.nokia.qtsolutions.qtsingleapplication_head - qdoc - - qt - solutions - qtsingleapplication - - - qt - solutions - qtsingleapplication - -
-
-
-
-
-
- - - - - - - - - - - - - - - - - - - - - - - qtsingleapplication.html - index.html - qtsingleapplication-example-trivial.html - qtsinglecoreapplication.html - qtsingleapplication-example-loader.html - qtsinglecoreapplication-example-console.html - classic.css - images/qt-logo.png - - - diff --git a/telldus-gui/3rdparty/qtsingleapplication/doc/html/qtsinglecoreapplication-example-console.html b/telldus-gui/3rdparty/qtsingleapplication/doc/html/qtsinglecoreapplication-example-console.html deleted file mode 100644 index 18a9ae89..00000000 --- a/telldus-gui/3rdparty/qtsingleapplication/doc/html/qtsinglecoreapplication-example-console.html +++ /dev/null @@ -1,118 +0,0 @@ - - - - - - A non-GUI example - - - - - - - -
  Home

A non-GUI example
-

-

This example shows how to use the single-application functionality in a console application. It does not require the QtGui library at all.

-

The only differences from the GUI application usage demonstrated in the other examples are:

-

1) The .pro file should include qtsinglecoreapplication.pri instead of qtsingleapplication.pri

-

2) The class name is QtSingleCoreApplication instead of QtSingleApplication.

-

3) No calls are made regarding window activation, for obvious reasons.

-

console.pro:

-
 TEMPLATE   = app
- CONFIG    += console
- SOURCES   += main.cpp
- include(../../src/qtsinglecoreapplication.pri)
- QT -= gui
-

main.cpp:

-
 /****************************************************************************
- **
- ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
- ** Contact: http://www.qt-project.org/legal
- **
- ** This file is part of the Qt Solutions component.
- **
- ** You may use this file under the terms of the BSD license as follows:
- **
- ** "Redistribution and use in source and binary forms, with or without
- ** modification, are permitted provided that the following conditions are
- ** met:
- **   * Redistributions of source code must retain the above copyright
- **     notice, this list of conditions and the following disclaimer.
- **   * Redistributions in binary form must reproduce the above copyright
- **     notice, this list of conditions and the following disclaimer in
- **     the documentation and/or other materials provided with the
- **     distribution.
- **   * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
- **     the names of its contributors may be used to endorse or promote
- **     products derived from this software without specific prior written
- **     permission.
- **
- ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
- **
- ****************************************************************************/
-
- #include "qtsinglecoreapplication.h"
- #include <QtCore/QDebug>
-
- void report(const QString& msg)
- {
-     qDebug("[%i] %s", (int)QCoreApplication::applicationPid(), qPrintable(msg));
- }
-
- class MainClass : public QObject
- {
-     Q_OBJECT
- public:
-     MainClass()
-         : QObject()
-         {}
-
- public slots:
-     void handleMessage(const QString& message)
-         {
-             report( "Message received: \"" + message + "\"");
-         }
- };
-
- int main(int argc, char **argv)
- {
-     report("Starting up");
-
-     QtSingleCoreApplication app(argc, argv);
-
-     if (app.isRunning()) {
-         QString msg(QString("Hi master, I am %1.").arg(QCoreApplication::applicationPid()));
-         bool sentok = app.sendMessage(msg, 2000);
-         QString rep("Another instance is running, so I will exit.");
-         rep += sentok ? " Message sent ok." : " Message sending failed; the other instance may be frozen.";
-         report(rep);
-         return 0;
-     } else {
-         report("No other instance is running; so I will.");
-         MainClass mainObj;
-         QObject::connect(&app, SIGNAL(messageReceived(const QString&)),
-                          &mainObj, SLOT(handleMessage(const QString&)));
-         return app.exec();
-     }
- }
-
- #include "main.moc"
-


- - - - -
Copyright © 2010 Nokia Corporation and/or its subsidiary(-ies)Trademarks
Qt Solutions
- diff --git a/telldus-gui/3rdparty/qtsingleapplication/doc/html/qtsinglecoreapplication-members.html b/telldus-gui/3rdparty/qtsingleapplication/doc/html/qtsinglecoreapplication-members.html deleted file mode 100644 index 69fb8581..00000000 --- a/telldus-gui/3rdparty/qtsingleapplication/doc/html/qtsinglecoreapplication-members.html +++ /dev/null @@ -1,126 +0,0 @@ - - - - - - List of All Members for QtSingleCoreApplication - - - - - - - -
  Home

List of All Members for QtSingleCoreApplication

-

This is the complete list of members for QtSingleCoreApplication, including inherited members.

-

- -
-

-


- - - - -
Copyright © 2010 Nokia Corporation and/or its subsidiary(-ies)Trademarks
Qt Solutions
- diff --git a/telldus-gui/3rdparty/qtsingleapplication/doc/html/qtsinglecoreapplication.html b/telldus-gui/3rdparty/qtsingleapplication/doc/html/qtsinglecoreapplication.html deleted file mode 100644 index a20cf2f4..00000000 --- a/telldus-gui/3rdparty/qtsingleapplication/doc/html/qtsinglecoreapplication.html +++ /dev/null @@ -1,98 +0,0 @@ - - - - - - QtSingleCoreApplication Class Reference - - - - - - - -
  Home

QtSingleCoreApplication Class Reference

-

A variant of the QtSingleApplication class for non-GUI applications. More...

-
 #include <QtSingleCoreApplication>

Inherits QCoreApplication.

- -
- -

Public Functions

- - - - - -
QtSingleCoreApplication ( int & argc, char ** argv )
QtSingleCoreApplication ( const QString & appId, int & argc, char ** argv )
QString id () const
bool isRunning ()
- -
- -

Public Slots

- - -
bool sendMessage ( const QString & message, int timeout = 5000 )
- -
- -

Signals

- - -
void messageReceived ( const QString & message )
- -

Additional Inherited Members

- - -
-

Detailed Description

-

A variant of the QtSingleApplication class for non-GUI applications.

-

This class is a variant of QtSingleApplication suited for use in console (non-GUI) applications. It is an extension of QCoreApplication (instead of QApplication). It does not require the QtGui library.

-

The API and usage is identical to QtSingleApplication, except that functions relating to the "activation window" are not present, for obvious reasons. Please refer to the QtSingleApplication documentation for explanation of the usage.

-

A QtSingleCoreApplication instance can communicate to a QtSingleApplication instance if they share the same application id. Hence, this class can be used to create a light-weight command-line tool that sends commands to a GUI application.

-

See also QtSingleApplication.

-
-

Member Function Documentation

-

QtSingleCoreApplication::QtSingleCoreApplication ( int & argc, char ** argv )

-

Creates a QtSingleCoreApplication object. The application identifier will be QCoreApplication::applicationFilePath(). argc and argv are passed on to the QCoreAppliation constructor.

-

QtSingleCoreApplication::QtSingleCoreApplication ( const QString & appId, int & argc, char ** argv )

-

Creates a QtSingleCoreApplication object with the application identifier appId. argc and argv are passed on to the QCoreAppliation constructor.

-

QString QtSingleCoreApplication::id () const

-

Returns the application identifier. Two processes with the same identifier will be regarded as instances of the same application.

-

bool QtSingleCoreApplication::isRunning ()

-

Returns true if another instance of this application is running; otherwise false.

-

This function does not find instances of this application that are being run by a different user (on Windows: that are running in another session).

-

See also sendMessage().

-

void QtSingleCoreApplication::messageReceived ( const QString & message )   [signal]

-

This signal is emitted when the current instance receives a message from another instance of this application.

-

See also sendMessage().

-

bool QtSingleCoreApplication::sendMessage ( const QString & message, int timeout = 5000 )   [slot]

-

Tries to send the text message to the currently running instance. The QtSingleCoreApplication object in the running instance will emit the messageReceived() signal when it receives the message.

-

This function returns true if the message has been sent to, and processed by, the current instance. If there is no instance currently running, or if the running instance fails to process the message within timeout milliseconds, this function return false.

-

See also isRunning() and messageReceived().

-


- - - - -
Copyright © 2010 Nokia Corporation and/or its subsidiary(-ies)Trademarks
Qt Solutions
- diff --git a/telldus-gui/3rdparty/qtsingleapplication/doc/images/qt-logo.png b/telldus-gui/3rdparty/qtsingleapplication/doc/images/qt-logo.png deleted file mode 100644 index 794162f5..00000000 Binary files a/telldus-gui/3rdparty/qtsingleapplication/doc/images/qt-logo.png and /dev/null differ diff --git a/telldus-gui/3rdparty/qtsingleapplication/doc/index.qdoc b/telldus-gui/3rdparty/qtsingleapplication/doc/index.qdoc deleted file mode 100644 index 6a2a768a..00000000 --- a/telldus-gui/3rdparty/qtsingleapplication/doc/index.qdoc +++ /dev/null @@ -1,87 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of the Qt Solutions component. -** -** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -/*! - \page index.html - \title Single Application - - \section1 Description - - The QtSingleApplication component provides support - for applications that can be only started once per user. - - - - For some applications it is useful or even critical that they are started - only once by any user. Future attempts to start the application should - activate any already running instance, and possibly perform requested - actions, e.g. loading a file, in that instance. - - The QtSingleApplication class provides an interface to detect a running - instance, and to send command strings to that instance. - For console (non-GUI) applications, the QtSingleCoreApplication variant is provided, which avoids dependency on QtGui. - - - - - \section1 Classes - \list - \i QtSingleApplication \i QtSingleCoreApplication\endlist - - \section1 Examples - \list - \i \link qtsingleapplication-example-trivial.html A Trivial Example \endlink \i \link qtsingleapplication-example-loader.html Loading Documents \endlink \i \link qtsinglecoreapplication-example-console.html A Non-GUI Example \endlink \endlist - - - - - - - \section1 Tested platforms - \list - \i Qt 4.4, 4.5 / Windows XP / MSVC.NET 2005 - \i Qt 4.4, 4.5 / Linux / gcc - \i Qt 4.4, 4.5 / MacOS X 10.5 / gcc - \endlist - - - - -*/ diff --git a/telldus-gui/3rdparty/qtsingleapplication/examples/console/console.pro b/telldus-gui/3rdparty/qtsingleapplication/examples/console/console.pro deleted file mode 100644 index e0390e23..00000000 --- a/telldus-gui/3rdparty/qtsingleapplication/examples/console/console.pro +++ /dev/null @@ -1,5 +0,0 @@ -TEMPLATE = app -CONFIG += console -SOURCES += main.cpp -include(../../src/qtsinglecoreapplication.pri) -QT -= gui diff --git a/telldus-gui/3rdparty/qtsingleapplication/examples/console/console.qdoc b/telldus-gui/3rdparty/qtsingleapplication/examples/console/console.qdoc deleted file mode 100644 index 77b0d736..00000000 --- a/telldus-gui/3rdparty/qtsingleapplication/examples/console/console.qdoc +++ /dev/null @@ -1,65 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of the Qt Solutions component. -** -** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -/*! \page qtsinglecoreapplication-example-console.html - \title A non-GUI example - - This example shows how to use the single-application functionality - in a console application. It does not require the \c QtGui library - at all. - - The only differences from the GUI application usage demonstrated - in the other examples are: - - 1) The \c.pro file should include \c qtsinglecoreapplication.pri - instead of \c qtsingleapplication.pri - - 2) The class name is \c QtSingleCoreApplication instead of \c - QtSingleApplication. - - 3) No calls are made regarding window activation, for obvious reasons. - - console.pro: - \quotefile console/console.pro - - main.cpp: - \quotefile console/main.cpp - -*/ diff --git a/telldus-gui/3rdparty/qtsingleapplication/examples/console/main.cpp b/telldus-gui/3rdparty/qtsingleapplication/examples/console/main.cpp deleted file mode 100644 index 652feb93..00000000 --- a/telldus-gui/3rdparty/qtsingleapplication/examples/console/main.cpp +++ /dev/null @@ -1,89 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of the Qt Solutions component. -** -** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - - -#include "qtsinglecoreapplication.h" -#include - - -void report(const QString& msg) -{ - qDebug("[%i] %s", (int)QCoreApplication::applicationPid(), qPrintable(msg)); -} - -class MainClass : public QObject -{ - Q_OBJECT -public: - MainClass() - : QObject() - {} - -public slots: - void handleMessage(const QString& message) - { - report( "Message received: \"" + message + "\""); - } -}; - -int main(int argc, char **argv) -{ - report("Starting up"); - - QtSingleCoreApplication app(argc, argv); - - if (app.isRunning()) { - QString msg(QString("Hi master, I am %1.").arg(QCoreApplication::applicationPid())); - bool sentok = app.sendMessage(msg, 2000); - QString rep("Another instance is running, so I will exit."); - rep += sentok ? " Message sent ok." : " Message sending failed; the other instance may be frozen."; - report(rep); - return 0; - } else { - report("No other instance is running; so I will."); - MainClass mainObj; - QObject::connect(&app, SIGNAL(messageReceived(const QString&)), - &mainObj, SLOT(handleMessage(const QString&))); - return app.exec(); - } -} - - -#include "main.moc" diff --git a/telldus-gui/3rdparty/qtsingleapplication/examples/examples.pro b/telldus-gui/3rdparty/qtsingleapplication/examples/examples.pro deleted file mode 100644 index 36b8fd38..00000000 --- a/telldus-gui/3rdparty/qtsingleapplication/examples/examples.pro +++ /dev/null @@ -1,4 +0,0 @@ -TEMPLATE = subdirs -SUBDIRS = trivial \ - loader \ - console diff --git a/telldus-gui/3rdparty/qtsingleapplication/examples/loader/file1.qsl b/telldus-gui/3rdparty/qtsingleapplication/examples/loader/file1.qsl deleted file mode 100644 index 50fcd26d..00000000 --- a/telldus-gui/3rdparty/qtsingleapplication/examples/loader/file1.qsl +++ /dev/null @@ -1 +0,0 @@ -File 1 diff --git a/telldus-gui/3rdparty/qtsingleapplication/examples/loader/file2.qsl b/telldus-gui/3rdparty/qtsingleapplication/examples/loader/file2.qsl deleted file mode 100644 index 4475433e..00000000 --- a/telldus-gui/3rdparty/qtsingleapplication/examples/loader/file2.qsl +++ /dev/null @@ -1 +0,0 @@ -File 2 diff --git a/telldus-gui/3rdparty/qtsingleapplication/examples/loader/loader.pro b/telldus-gui/3rdparty/qtsingleapplication/examples/loader/loader.pro deleted file mode 100644 index 3e52586b..00000000 --- a/telldus-gui/3rdparty/qtsingleapplication/examples/loader/loader.pro +++ /dev/null @@ -1,6 +0,0 @@ -greaterThan(QT_MAJOR_VERSION, 4): QT += printsupport -TEMPLATE = app - -include(../../src/qtsingleapplication.pri) - -SOURCES += main.cpp diff --git a/telldus-gui/3rdparty/qtsingleapplication/examples/loader/loader.qdoc b/telldus-gui/3rdparty/qtsingleapplication/examples/loader/loader.qdoc deleted file mode 100644 index bfd15d06..00000000 --- a/telldus-gui/3rdparty/qtsingleapplication/examples/loader/loader.qdoc +++ /dev/null @@ -1,81 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of the Qt Solutions component. -** -** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -/*! \page qtsingleapplication-example-loader.html - \title Loading Documents - - The application in this example loads or prints the documents - passed as commandline parameters to further instances of this - application. - - \quotefromfile loader/main.cpp - \printuntil }; - The user interface in this application is a QMainWindow subclass - with a QMdiArea as the central widget. It implements a slot - \c handleMessage() that will be connected to the messageReceived() - signal of the QtSingleApplication class. - - \printuntil } - The MainWindow constructor creates a minimal user interface. - - \printto case Print: - The handleMessage() slot interprets the message passed in as a - filename that can be prepended with \e /print to indicate that - the file should just be printed rather than loaded. - - \printto #include - Loading the file will also activate the window. - - \printto mw - The \c main entry point function creates a QtSingleApplication - object, and creates a message to send to a running instance - of the application. If the message was sent successfully the - process exits immediately. - - \printuntil } - If the message could not be sent the application starts up. Note - that \c false is passed to the call to setActivationWindow() to - prevent automatic activation for every message received, e.g. when - the application should just print a file. Instead, the message - handling function determines whether activation is requested, and - signals that by emitting the needToShow() signal. This is then - simply connected directly to QtSingleApplication's - activateWindow() slot. -*/ diff --git a/telldus-gui/3rdparty/qtsingleapplication/examples/loader/main.cpp b/telldus-gui/3rdparty/qtsingleapplication/examples/loader/main.cpp deleted file mode 100644 index f55e57ac..00000000 --- a/telldus-gui/3rdparty/qtsingleapplication/examples/loader/main.cpp +++ /dev/null @@ -1,152 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of the Qt Solutions component. -** -** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include -#include -#include -#include -#include -#include -#include -#include - -class MainWindow : public QMainWindow -{ - Q_OBJECT -public: - MainWindow(); - -public slots: - void handleMessage(const QString& message); - -signals: - void needToShow(); - -private: - QMdiArea *workspace; -}; - -MainWindow::MainWindow() -{ - workspace = new QMdiArea(this); - - setCentralWidget(workspace); -} - -void MainWindow::handleMessage(const QString& message) -{ - enum Action { - Nothing, - Open, - Print - } action; - - action = Nothing; - QString filename = message; - if (message.toLower().startsWith("/print ")) { - filename = filename.mid(7); - action = Print; - } else if (!message.isEmpty()) { - action = Open; - } - if (action == Nothing) { - emit needToShow(); - return; - } - - QFile file(filename); - QString contents; - if (file.open(QIODevice::ReadOnly)) - contents = file.readAll(); - else - contents = "[[Error: Could not load file " + filename + "]]"; - - QTextEdit *view = new QTextEdit; - view->setPlainText(contents); - - switch(action) { - case Print: - { - QPrinter printer; - view->print(&printer); - delete view; - } - break; - - case Open: - { - workspace->addSubWindow(view); - view->setWindowTitle(message); - view->show(); - emit needToShow(); - } - break; - default: - break; - }; -} - -#include "main.moc" - -int main(int argc, char **argv) -{ - QtSingleApplication instance("File loader QtSingleApplication example", argc, argv); - QString message; - for (int a = 1; a < argc; ++a) { - message += argv[a]; - if (a < argc-1) - message += " "; - } - - if (instance.sendMessage(message)) - return 0; - - MainWindow mw; - mw.handleMessage(message); - mw.show(); - - QObject::connect(&instance, SIGNAL(messageReceived(const QString&)), - &mw, SLOT(handleMessage(const QString&))); - - instance.setActivationWindow(&mw, false); - QObject::connect(&mw, SIGNAL(needToShow()), &instance, SLOT(activateWindow())); - - return instance.exec(); -} diff --git a/telldus-gui/3rdparty/qtsingleapplication/examples/trivial/main.cpp b/telldus-gui/3rdparty/qtsingleapplication/examples/trivial/main.cpp deleted file mode 100644 index 69e102f3..00000000 --- a/telldus-gui/3rdparty/qtsingleapplication/examples/trivial/main.cpp +++ /dev/null @@ -1,78 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of the Qt Solutions component. -** -** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include -#include - -class TextEdit : public QTextEdit -{ - Q_OBJECT -public: - TextEdit(QWidget *parent = 0) - : QTextEdit(parent) - {} -public slots: - void append(const QString &str) - { - QTextEdit::append(str); - } -}; - -#include "main.moc" - - - -int main(int argc, char **argv) -{ - QtSingleApplication instance(argc, argv); - if (instance.sendMessage("Wake up!")) - return 0; - - TextEdit logview; - logview.setReadOnly(true); - logview.show(); - - instance.setActivationWindow(&logview); - - QObject::connect(&instance, SIGNAL(messageReceived(const QString&)), - &logview, SLOT(append(const QString&))); - - return instance.exec(); -} diff --git a/telldus-gui/3rdparty/qtsingleapplication/examples/trivial/trivial.pro b/telldus-gui/3rdparty/qtsingleapplication/examples/trivial/trivial.pro deleted file mode 100644 index 673497a4..00000000 --- a/telldus-gui/3rdparty/qtsingleapplication/examples/trivial/trivial.pro +++ /dev/null @@ -1,5 +0,0 @@ -TEMPLATE = app - -include(../../src/qtsingleapplication.pri) - -SOURCES += main.cpp diff --git a/telldus-gui/3rdparty/qtsingleapplication/examples/trivial/trivial.qdoc b/telldus-gui/3rdparty/qtsingleapplication/examples/trivial/trivial.qdoc deleted file mode 100644 index 9491cb65..00000000 --- a/telldus-gui/3rdparty/qtsingleapplication/examples/trivial/trivial.qdoc +++ /dev/null @@ -1,76 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of the Qt Solutions component. -** -** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -/*! \page qtsingleapplication-example-trivial.html - \title A Trivial Example - - The application in this example has a log-view that displays - messages sent by further instances of the same application. - - The example demonstrates the use of the QtSingleApplication - class to detect and communicate with a running instance of - the application using the sendMessage() API. The messageReceived() - signal is used to display received messages in a QTextEdit log. - - \quotefromfile trivial/main.cpp - \printuntil instance - The example has only the \c main entry point function. - A QtSingleApplication object is created immediately. - - \printuntil return - If another instance of this application is already running, - sendMessage() will succeed, and this instance just exits - immediately. - - \printuntil show() - Otherwise the instance continues as normal and creates the - user interface. - - \printuntil return instance.exec(); - The \c logview object is also set as the application's activation - window. Every time a message is received, the window will be raised - and activated automatically. - - The messageReceived() signal is also connected to the QTextEdit's - append() slot. Every message received from further instances of - this application will be displayed in the log. - - Finally the event loop is entered. -*/ diff --git a/telldus-gui/3rdparty/qtsingleapplication/qtsingleapplication.pro b/telldus-gui/3rdparty/qtsingleapplication/qtsingleapplication.pro deleted file mode 100644 index 07257c5d..00000000 --- a/telldus-gui/3rdparty/qtsingleapplication/qtsingleapplication.pro +++ /dev/null @@ -1,5 +0,0 @@ -TEMPLATE=subdirs -CONFIG += ordered -include(common.pri) -qtsingleapplication-uselib:SUBDIRS=buildlib -SUBDIRS+=examples diff --git a/telldus-gui/3rdparty/qtsingleapplication/src/QtLockedFile b/telldus-gui/3rdparty/qtsingleapplication/src/QtLockedFile deleted file mode 100644 index 16b48ba9..00000000 --- a/telldus-gui/3rdparty/qtsingleapplication/src/QtLockedFile +++ /dev/null @@ -1 +0,0 @@ -#include "qtlockedfile.h" diff --git a/telldus-gui/3rdparty/qtsingleapplication/src/QtSingleApplication b/telldus-gui/3rdparty/qtsingleapplication/src/QtSingleApplication deleted file mode 100644 index d111bf72..00000000 --- a/telldus-gui/3rdparty/qtsingleapplication/src/QtSingleApplication +++ /dev/null @@ -1 +0,0 @@ -#include "qtsingleapplication.h" diff --git a/telldus-gui/3rdparty/qtsingleapplication/src/qtlocalpeer.cpp b/telldus-gui/3rdparty/qtsingleapplication/src/qtlocalpeer.cpp deleted file mode 100644 index 332b0643..00000000 --- a/telldus-gui/3rdparty/qtsingleapplication/src/qtlocalpeer.cpp +++ /dev/null @@ -1,203 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of the Qt Solutions component. -** -** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - - -#include "qtlocalpeer.h" -#include -#include - -#if defined(Q_OS_WIN) -#include -#include -typedef BOOL(WINAPI*PProcessIdToSessionId)(DWORD,DWORD*); -static PProcessIdToSessionId pProcessIdToSessionId = 0; -#endif -#if defined(Q_OS_UNIX) -#include -#include -#include -#endif - -namespace QtLP_Private { -#include "qtlockedfile.cpp" -#if defined(Q_OS_WIN) -#include "qtlockedfile_win.cpp" -#else -#include "qtlockedfile_unix.cpp" -#endif -} - -const char* QtLocalPeer::ack = "ack"; - -QtLocalPeer::QtLocalPeer(QObject* parent, const QString &appId) - : QObject(parent), id(appId) -{ - QString prefix = id; - if (id.isEmpty()) { - id = QCoreApplication::applicationFilePath(); -#if defined(Q_OS_WIN) - id = id.toLower(); -#endif - prefix = id.section(QLatin1Char('/'), -1); - } - prefix.remove(QRegExp("[^a-zA-Z]")); - prefix.truncate(6); - - QByteArray idc = id.toUtf8(); - quint16 idNum = qChecksum(idc.constData(), idc.size()); - socketName = QLatin1String("qtsingleapp-") + prefix - + QLatin1Char('-') + QString::number(idNum, 16); - -#if defined(Q_OS_WIN) - if (!pProcessIdToSessionId) { - QLibrary lib("kernel32"); - pProcessIdToSessionId = (PProcessIdToSessionId)lib.resolve("ProcessIdToSessionId"); - } - if (pProcessIdToSessionId) { - DWORD sessionId = 0; - pProcessIdToSessionId(GetCurrentProcessId(), &sessionId); - socketName += QLatin1Char('-') + QString::number(sessionId, 16); - } -#else - socketName += QLatin1Char('-') + QString::number(::getuid(), 16); -#endif - - server = new QLocalServer(this); - QString lockName = QDir(QDir::tempPath()).absolutePath() - + QLatin1Char('/') + socketName - + QLatin1String("-lockfile"); - lockFile.setFileName(lockName); - lockFile.open(QIODevice::ReadWrite); -} - - - -bool QtLocalPeer::isClient() -{ - if (lockFile.isLocked()) - return false; - - if (!lockFile.lock(QtLP_Private::QtLockedFile::WriteLock, false)) - return true; - - bool res = server->listen(socketName); -#if defined(Q_OS_UNIX) && (QT_VERSION >= QT_VERSION_CHECK(4,5,0)) - // ### Workaround - if (!res && server->serverError() == QAbstractSocket::AddressInUseError) { - QFile::remove(QDir::cleanPath(QDir::tempPath())+QLatin1Char('/')+socketName); - res = server->listen(socketName); - } -#endif - if (!res) - qWarning("QtSingleCoreApplication: listen on local socket failed, %s", qPrintable(server->errorString())); - QObject::connect(server, SIGNAL(newConnection()), SLOT(receiveConnection())); - return false; -} - - -bool QtLocalPeer::sendMessage(const QString &message, int timeout) -{ - if (!isClient()) - return false; - - QLocalSocket socket; - bool connOk = false; - for(int i = 0; i < 2; i++) { - // Try twice, in case the other instance is just starting up - socket.connectToServer(socketName); - connOk = socket.waitForConnected(timeout/2); - if (connOk || i) - break; - int ms = 250; -#if defined(Q_OS_WIN) - Sleep(DWORD(ms)); -#else - struct timespec ts = { ms / 1000, (ms % 1000) * 1000 * 1000 }; - nanosleep(&ts, NULL); -#endif - } - if (!connOk) - return false; - - QByteArray uMsg(message.toUtf8()); - QDataStream ds(&socket); - ds.writeBytes(uMsg.constData(), uMsg.size()); - bool res = socket.waitForBytesWritten(timeout); - if (res) { - res &= socket.waitForReadyRead(timeout); // wait for ack - if (res) - res &= (socket.read(qstrlen(ack)) == ack); - } - return res; -} - - -void QtLocalPeer::receiveConnection() -{ - QLocalSocket* socket = server->nextPendingConnection(); - if (!socket) - return; - - while (socket->bytesAvailable() < (int)sizeof(quint32)) - socket->waitForReadyRead(); - QDataStream ds(socket); - QByteArray uMsg; - quint32 remaining; - ds >> remaining; - uMsg.resize(remaining); - int got = 0; - char* uMsgBuf = uMsg.data(); - do { - got = ds.readRawData(uMsgBuf, remaining); - remaining -= got; - uMsgBuf += got; - } while (remaining && got >= 0 && socket->waitForReadyRead(2000)); - if (got < 0) { - qWarning("QtLocalPeer: Message reception failed %s", socket->errorString().toLatin1().constData()); - delete socket; - return; - } - QString message(QString::fromUtf8(uMsg)); - socket->write(ack, qstrlen(ack)); - socket->waitForBytesWritten(1000); - socket->waitForDisconnected(1000); // make sure client reads ack - delete socket; - emit messageReceived(message); //### (might take a long time to return) -} diff --git a/telldus-gui/3rdparty/qtsingleapplication/src/qtlocalpeer.h b/telldus-gui/3rdparty/qtsingleapplication/src/qtlocalpeer.h deleted file mode 100644 index 1b533b1a..00000000 --- a/telldus-gui/3rdparty/qtsingleapplication/src/qtlocalpeer.h +++ /dev/null @@ -1,77 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of the Qt Solutions component. -** -** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QTLOCALPEER_H -#define QTLOCALPEER_H - -#include -#include -#include - -#include "qtlockedfile.h" - -class QtLocalPeer : public QObject -{ - Q_OBJECT - -public: - QtLocalPeer(QObject *parent = 0, const QString &appId = QString()); - bool isClient(); - bool sendMessage(const QString &message, int timeout); - QString applicationId() const - { return id; } - -Q_SIGNALS: - void messageReceived(const QString &message); - -protected Q_SLOTS: - void receiveConnection(); - -protected: - QString id; - QString socketName; - QLocalServer* server; - QtLP_Private::QtLockedFile lockFile; - -private: - static const char* ack; -}; - -#endif // QTLOCALPEER_H diff --git a/telldus-gui/3rdparty/qtsingleapplication/src/qtlockedfile.cpp b/telldus-gui/3rdparty/qtsingleapplication/src/qtlockedfile.cpp deleted file mode 100644 index c142a863..00000000 --- a/telldus-gui/3rdparty/qtsingleapplication/src/qtlockedfile.cpp +++ /dev/null @@ -1,193 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of the Qt Solutions component. -** -** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qtlockedfile.h" - -/*! - \class QtLockedFile - - \brief The QtLockedFile class extends QFile with advisory locking - functions. - - A file may be locked in read or write mode. Multiple instances of - \e QtLockedFile, created in multiple processes running on the same - machine, may have a file locked in read mode. Exactly one instance - may have it locked in write mode. A read and a write lock cannot - exist simultaneously on the same file. - - The file locks are advisory. This means that nothing prevents - another process from manipulating a locked file using QFile or - file system functions offered by the OS. Serialization is only - guaranteed if all processes that access the file use - QLockedFile. Also, while holding a lock on a file, a process - must not open the same file again (through any API), or locks - can be unexpectedly lost. - - The lock provided by an instance of \e QtLockedFile is released - whenever the program terminates. This is true even when the - program crashes and no destructors are called. -*/ - -/*! \enum QtLockedFile::LockMode - - This enum describes the available lock modes. - - \value ReadLock A read lock. - \value WriteLock A write lock. - \value NoLock Neither a read lock nor a write lock. -*/ - -/*! - Constructs an unlocked \e QtLockedFile object. This constructor - behaves in the same way as \e QFile::QFile(). - - \sa QFile::QFile() -*/ -QtLockedFile::QtLockedFile() - : QFile() -{ -#ifdef Q_OS_WIN - wmutex = 0; - rmutex = 0; -#endif - m_lock_mode = NoLock; -} - -/*! - Constructs an unlocked QtLockedFile object with file \a name. This - constructor behaves in the same way as \e QFile::QFile(const - QString&). - - \sa QFile::QFile() -*/ -QtLockedFile::QtLockedFile(const QString &name) - : QFile(name) -{ -#ifdef Q_OS_WIN - wmutex = 0; - rmutex = 0; -#endif - m_lock_mode = NoLock; -} - -/*! - Opens the file in OpenMode \a mode. - - This is identical to QFile::open(), with the one exception that the - Truncate mode flag is disallowed. Truncation would conflict with the - advisory file locking, since the file would be modified before the - write lock is obtained. If truncation is required, use resize(0) - after obtaining the write lock. - - Returns true if successful; otherwise false. - - \sa QFile::open(), QFile::resize() -*/ -bool QtLockedFile::open(OpenMode mode) -{ - if (mode & QIODevice::Truncate) { - qWarning("QtLockedFile::open(): Truncate mode not allowed."); - return false; - } - return QFile::open(mode); -} - -/*! - Returns \e true if this object has a in read or write lock; - otherwise returns \e false. - - \sa lockMode() -*/ -bool QtLockedFile::isLocked() const -{ - return m_lock_mode != NoLock; -} - -/*! - Returns the type of lock currently held by this object, or \e - QtLockedFile::NoLock. - - \sa isLocked() -*/ -QtLockedFile::LockMode QtLockedFile::lockMode() const -{ - return m_lock_mode; -} - -/*! - \fn bool QtLockedFile::lock(LockMode mode, bool block = true) - - Obtains a lock of type \a mode. The file must be opened before it - can be locked. - - If \a block is true, this function will block until the lock is - aquired. If \a block is false, this function returns \e false - immediately if the lock cannot be aquired. - - If this object already has a lock of type \a mode, this function - returns \e true immediately. If this object has a lock of a - different type than \a mode, the lock is first released and then a - new lock is obtained. - - This function returns \e true if, after it executes, the file is - locked by this object, and \e false otherwise. - - \sa unlock(), isLocked(), lockMode() -*/ - -/*! - \fn bool QtLockedFile::unlock() - - Releases a lock. - - If the object has no lock, this function returns immediately. - - This function returns \e true if, after it executes, the file is - not locked by this object, and \e false otherwise. - - \sa lock(), isLocked(), lockMode() -*/ - -/*! - \fn QtLockedFile::~QtLockedFile() - - Destroys the \e QtLockedFile object. If any locks were held, they - are released. -*/ diff --git a/telldus-gui/3rdparty/qtsingleapplication/src/qtlockedfile.h b/telldus-gui/3rdparty/qtsingleapplication/src/qtlockedfile.h deleted file mode 100644 index 84c18e5c..00000000 --- a/telldus-gui/3rdparty/qtsingleapplication/src/qtlockedfile.h +++ /dev/null @@ -1,97 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of the Qt Solutions component. -** -** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QTLOCKEDFILE_H -#define QTLOCKEDFILE_H - -#include -#ifdef Q_OS_WIN -#include -#endif - -#if defined(Q_OS_WIN) -# if !defined(QT_QTLOCKEDFILE_EXPORT) && !defined(QT_QTLOCKEDFILE_IMPORT) -# define QT_QTLOCKEDFILE_EXPORT -# elif defined(QT_QTLOCKEDFILE_IMPORT) -# if defined(QT_QTLOCKEDFILE_EXPORT) -# undef QT_QTLOCKEDFILE_EXPORT -# endif -# define QT_QTLOCKEDFILE_EXPORT __declspec(dllimport) -# elif defined(QT_QTLOCKEDFILE_EXPORT) -# undef QT_QTLOCKEDFILE_EXPORT -# define QT_QTLOCKEDFILE_EXPORT __declspec(dllexport) -# endif -#else -# define QT_QTLOCKEDFILE_EXPORT -#endif - -namespace QtLP_Private { - -class QT_QTLOCKEDFILE_EXPORT QtLockedFile : public QFile -{ -public: - enum LockMode { NoLock = 0, ReadLock, WriteLock }; - - QtLockedFile(); - QtLockedFile(const QString &name); - ~QtLockedFile(); - - bool open(OpenMode mode); - - bool lock(LockMode mode, bool block = true); - bool unlock(); - bool isLocked() const; - LockMode lockMode() const; - -private: -#ifdef Q_OS_WIN - Qt::HANDLE wmutex; - Qt::HANDLE rmutex; - QVector rmutexes; - QString mutexname; - - Qt::HANDLE getMutexHandle(int idx, bool doCreate); - bool waitMutex(Qt::HANDLE mutex, bool doBlock); - -#endif - LockMode m_lock_mode; -}; -} -#endif diff --git a/telldus-gui/3rdparty/qtsingleapplication/src/qtlockedfile_unix.cpp b/telldus-gui/3rdparty/qtsingleapplication/src/qtlockedfile_unix.cpp deleted file mode 100644 index 976c1b9e..00000000 --- a/telldus-gui/3rdparty/qtsingleapplication/src/qtlockedfile_unix.cpp +++ /dev/null @@ -1,115 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of the Qt Solutions component. -** -** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include -#include -#include -#include - -#include "qtlockedfile.h" - -bool QtLockedFile::lock(LockMode mode, bool block) -{ - if (!isOpen()) { - qWarning("QtLockedFile::lock(): file is not opened"); - return false; - } - - if (mode == NoLock) - return unlock(); - - if (mode == m_lock_mode) - return true; - - if (m_lock_mode != NoLock) - unlock(); - - struct flock fl; - fl.l_whence = SEEK_SET; - fl.l_start = 0; - fl.l_len = 0; - fl.l_type = (mode == ReadLock) ? F_RDLCK : F_WRLCK; - int cmd = block ? F_SETLKW : F_SETLK; - int ret = fcntl(handle(), cmd, &fl); - - if (ret == -1) { - if (errno != EINTR && errno != EAGAIN) - qWarning("QtLockedFile::lock(): fcntl: %s", strerror(errno)); - return false; - } - - - m_lock_mode = mode; - return true; -} - - -bool QtLockedFile::unlock() -{ - if (!isOpen()) { - qWarning("QtLockedFile::unlock(): file is not opened"); - return false; - } - - if (!isLocked()) - return true; - - struct flock fl; - fl.l_whence = SEEK_SET; - fl.l_start = 0; - fl.l_len = 0; - fl.l_type = F_UNLCK; - int ret = fcntl(handle(), F_SETLKW, &fl); - - if (ret == -1) { - qWarning("QtLockedFile::lock(): fcntl: %s", strerror(errno)); - return false; - } - - m_lock_mode = NoLock; - return true; -} - -QtLockedFile::~QtLockedFile() -{ - if (isOpen()) - unlock(); -} - diff --git a/telldus-gui/3rdparty/qtsingleapplication/src/qtlockedfile_win.cpp b/telldus-gui/3rdparty/qtsingleapplication/src/qtlockedfile_win.cpp deleted file mode 100644 index 5e212620..00000000 --- a/telldus-gui/3rdparty/qtsingleapplication/src/qtlockedfile_win.cpp +++ /dev/null @@ -1,211 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of the Qt Solutions component. -** -** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qtlockedfile.h" -#include -#include - -#define MUTEX_PREFIX "QtLockedFile mutex " -// Maximum number of concurrent read locks. Must not be greater than MAXIMUM_WAIT_OBJECTS -#define MAX_READERS MAXIMUM_WAIT_OBJECTS - -#if QT_VERSION >= 0x050000 -#define QT_WA(unicode, ansi) unicode -#endif - -Qt::HANDLE QtLockedFile::getMutexHandle(int idx, bool doCreate) -{ - if (mutexname.isEmpty()) { - QFileInfo fi(*this); - mutexname = QString::fromLatin1(MUTEX_PREFIX) - + fi.absoluteFilePath().toLower(); - } - QString mname(mutexname); - if (idx >= 0) - mname += QString::number(idx); - - Qt::HANDLE mutex; - if (doCreate) { - QT_WA( { mutex = CreateMutexW(NULL, FALSE, (TCHAR*)mname.utf16()); }, - { mutex = CreateMutexA(NULL, FALSE, mname.toLocal8Bit().constData()); } ); - if (!mutex) { - qErrnoWarning("QtLockedFile::lock(): CreateMutex failed"); - return 0; - } - } - else { - QT_WA( { mutex = OpenMutexW(SYNCHRONIZE | MUTEX_MODIFY_STATE, FALSE, (TCHAR*)mname.utf16()); }, - { mutex = OpenMutexA(SYNCHRONIZE | MUTEX_MODIFY_STATE, FALSE, mname.toLocal8Bit().constData()); } ); - if (!mutex) { - if (GetLastError() != ERROR_FILE_NOT_FOUND) - qErrnoWarning("QtLockedFile::lock(): OpenMutex failed"); - return 0; - } - } - return mutex; -} - -bool QtLockedFile::waitMutex(Qt::HANDLE mutex, bool doBlock) -{ - Q_ASSERT(mutex); - DWORD res = WaitForSingleObject(mutex, doBlock ? INFINITE : 0); - switch (res) { - case WAIT_OBJECT_0: - case WAIT_ABANDONED: - return true; - break; - case WAIT_TIMEOUT: - break; - default: - qErrnoWarning("QtLockedFile::lock(): WaitForSingleObject failed"); - } - return false; -} - - - -bool QtLockedFile::lock(LockMode mode, bool block) -{ - if (!isOpen()) { - qWarning("QtLockedFile::lock(): file is not opened"); - return false; - } - - if (mode == NoLock) - return unlock(); - - if (mode == m_lock_mode) - return true; - - if (m_lock_mode != NoLock) - unlock(); - - if (!wmutex && !(wmutex = getMutexHandle(-1, true))) - return false; - - if (!waitMutex(wmutex, block)) - return false; - - if (mode == ReadLock) { - int idx = 0; - for (; idx < MAX_READERS; idx++) { - rmutex = getMutexHandle(idx, false); - if (!rmutex || waitMutex(rmutex, false)) - break; - CloseHandle(rmutex); - } - bool ok = true; - if (idx >= MAX_READERS) { - qWarning("QtLockedFile::lock(): too many readers"); - rmutex = 0; - ok = false; - } - else if (!rmutex) { - rmutex = getMutexHandle(idx, true); - if (!rmutex || !waitMutex(rmutex, false)) - ok = false; - } - if (!ok && rmutex) { - CloseHandle(rmutex); - rmutex = 0; - } - ReleaseMutex(wmutex); - if (!ok) - return false; - } - else { - Q_ASSERT(rmutexes.isEmpty()); - for (int i = 0; i < MAX_READERS; i++) { - Qt::HANDLE mutex = getMutexHandle(i, false); - if (mutex) - rmutexes.append(mutex); - } - if (rmutexes.size()) { - DWORD res = WaitForMultipleObjects(rmutexes.size(), rmutexes.constData(), - TRUE, block ? INFINITE : 0); - if (res != WAIT_OBJECT_0 && res != WAIT_ABANDONED) { - if (res != WAIT_TIMEOUT) - qErrnoWarning("QtLockedFile::lock(): WaitForMultipleObjects failed"); - m_lock_mode = WriteLock; // trick unlock() to clean up - semiyucky - unlock(); - return false; - } - } - } - - m_lock_mode = mode; - return true; -} - -bool QtLockedFile::unlock() -{ - if (!isOpen()) { - qWarning("QtLockedFile::unlock(): file is not opened"); - return false; - } - - if (!isLocked()) - return true; - - if (m_lock_mode == ReadLock) { - ReleaseMutex(rmutex); - CloseHandle(rmutex); - rmutex = 0; - } - else { - foreach(Qt::HANDLE mutex, rmutexes) { - ReleaseMutex(mutex); - CloseHandle(mutex); - } - rmutexes.clear(); - ReleaseMutex(wmutex); - } - - m_lock_mode = QtLockedFile::NoLock; - return true; -} - -QtLockedFile::~QtLockedFile() -{ - if (isOpen()) - unlock(); - if (wmutex) - CloseHandle(wmutex); -} diff --git a/telldus-gui/3rdparty/qtsingleapplication/src/qtsingleapplication.cpp b/telldus-gui/3rdparty/qtsingleapplication/src/qtsingleapplication.cpp deleted file mode 100644 index d0fb15d7..00000000 --- a/telldus-gui/3rdparty/qtsingleapplication/src/qtsingleapplication.cpp +++ /dev/null @@ -1,347 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of the Qt Solutions component. -** -** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - - -#include "qtsingleapplication.h" -#include "qtlocalpeer.h" -#include - - -/*! - \class QtSingleApplication qtsingleapplication.h - \brief The QtSingleApplication class provides an API to detect and - communicate with running instances of an application. - - This class allows you to create applications where only one - instance should be running at a time. I.e., if the user tries to - launch another instance, the already running instance will be - activated instead. Another usecase is a client-server system, - where the first started instance will assume the role of server, - and the later instances will act as clients of that server. - - By default, the full path of the executable file is used to - determine whether two processes are instances of the same - application. You can also provide an explicit identifier string - that will be compared instead. - - The application should create the QtSingleApplication object early - in the startup phase, and call isRunning() to find out if another - instance of this application is already running. If isRunning() - returns false, it means that no other instance is running, and - this instance has assumed the role as the running instance. In - this case, the application should continue with the initialization - of the application user interface before entering the event loop - with exec(), as normal. - - The messageReceived() signal will be emitted when the running - application receives messages from another instance of the same - application. When a message is received it might be helpful to the - user to raise the application so that it becomes visible. To - facilitate this, QtSingleApplication provides the - setActivationWindow() function and the activateWindow() slot. - - If isRunning() returns true, another instance is already - running. It may be alerted to the fact that another instance has - started by using the sendMessage() function. Also data such as - startup parameters (e.g. the name of the file the user wanted this - new instance to open) can be passed to the running instance with - this function. Then, the application should terminate (or enter - client mode). - - If isRunning() returns true, but sendMessage() fails, that is an - indication that the running instance is frozen. - - Here's an example that shows how to convert an existing - application to use QtSingleApplication. It is very simple and does - not make use of all QtSingleApplication's functionality (see the - examples for that). - - \code - // Original - int main(int argc, char **argv) - { - QApplication app(argc, argv); - - MyMainWidget mmw; - mmw.show(); - return app.exec(); - } - - // Single instance - int main(int argc, char **argv) - { - QtSingleApplication app(argc, argv); - - if (app.isRunning()) - return !app.sendMessage(someDataString); - - MyMainWidget mmw; - app.setActivationWindow(&mmw); - mmw.show(); - return app.exec(); - } - \endcode - - Once this QtSingleApplication instance is destroyed (normally when - the process exits or crashes), when the user next attempts to run the - application this instance will not, of course, be encountered. The - next instance to call isRunning() or sendMessage() will assume the - role as the new running instance. - - For console (non-GUI) applications, QtSingleCoreApplication may be - used instead of this class, to avoid the dependency on the QtGui - library. - - \sa QtSingleCoreApplication -*/ - - -void QtSingleApplication::sysInit(const QString &appId) -{ - actWin = 0; - peer = new QtLocalPeer(this, appId); - connect(peer, SIGNAL(messageReceived(const QString&)), SIGNAL(messageReceived(const QString&))); -} - - -/*! - Creates a QtSingleApplication object. The application identifier - will be QCoreApplication::applicationFilePath(). \a argc, \a - argv, and \a GUIenabled are passed on to the QAppliation constructor. - - If you are creating a console application (i.e. setting \a - GUIenabled to false), you may consider using - QtSingleCoreApplication instead. -*/ - -QtSingleApplication::QtSingleApplication(int &argc, char **argv, bool GUIenabled) - : QApplication(argc, argv, GUIenabled) -{ - sysInit(); -} - - -/*! - Creates a QtSingleApplication object with the application - identifier \a appId. \a argc and \a argv are passed on to the - QAppliation constructor. -*/ - -QtSingleApplication::QtSingleApplication(const QString &appId, int &argc, char **argv) - : QApplication(argc, argv) -{ - sysInit(appId); -} - -#if QT_VERSION < 0x050000 - -/*! - Creates a QtSingleApplication object. The application identifier - will be QCoreApplication::applicationFilePath(). \a argc, \a - argv, and \a type are passed on to the QAppliation constructor. -*/ -QtSingleApplication::QtSingleApplication(int &argc, char **argv, Type type) - : QApplication(argc, argv, type) -{ - sysInit(); -} - - -# if defined(Q_WS_X11) -/*! - Special constructor for X11, ref. the documentation of - QApplication's corresponding constructor. The application identifier - will be QCoreApplication::applicationFilePath(). \a dpy, \a visual, - and \a cmap are passed on to the QApplication constructor. -*/ -QtSingleApplication::QtSingleApplication(Display* dpy, Qt::HANDLE visual, Qt::HANDLE cmap) - : QApplication(dpy, visual, cmap) -{ - sysInit(); -} - -/*! - Special constructor for X11, ref. the documentation of - QApplication's corresponding constructor. The application identifier - will be QCoreApplication::applicationFilePath(). \a dpy, \a argc, \a - argv, \a visual, and \a cmap are passed on to the QApplication - constructor. -*/ -QtSingleApplication::QtSingleApplication(Display *dpy, int &argc, char **argv, Qt::HANDLE visual, Qt::HANDLE cmap) - : QApplication(dpy, argc, argv, visual, cmap) -{ - sysInit(); -} - -/*! - Special constructor for X11, ref. the documentation of - QApplication's corresponding constructor. The application identifier - will be \a appId. \a dpy, \a argc, \a - argv, \a visual, and \a cmap are passed on to the QApplication - constructor. -*/ -QtSingleApplication::QtSingleApplication(Display* dpy, const QString &appId, int argc, char **argv, Qt::HANDLE visual, Qt::HANDLE cmap) - : QApplication(dpy, argc, argv, visual, cmap) -{ - sysInit(appId); -} -# endif // Q_WS_X11 -#endif // QT_VERSION < 0x050000 - - -/*! - Returns true if another instance of this application is running; - otherwise false. - - This function does not find instances of this application that are - being run by a different user (on Windows: that are running in - another session). - - \sa sendMessage() -*/ - -bool QtSingleApplication::isRunning() -{ - return peer->isClient(); -} - - -/*! - Tries to send the text \a message to the currently running - instance. The QtSingleApplication object in the running instance - will emit the messageReceived() signal when it receives the - message. - - This function returns true if the message has been sent to, and - processed by, the current instance. If there is no instance - currently running, or if the running instance fails to process the - message within \a timeout milliseconds, this function return false. - - \sa isRunning(), messageReceived() -*/ -bool QtSingleApplication::sendMessage(const QString &message, int timeout) -{ - return peer->sendMessage(message, timeout); -} - - -/*! - Returns the application identifier. Two processes with the same - identifier will be regarded as instances of the same application. -*/ -QString QtSingleApplication::id() const -{ - return peer->applicationId(); -} - - -/*! - Sets the activation window of this application to \a aw. The - activation window is the widget that will be activated by - activateWindow(). This is typically the application's main window. - - If \a activateOnMessage is true (the default), the window will be - activated automatically every time a message is received, just prior - to the messageReceived() signal being emitted. - - \sa activateWindow(), messageReceived() -*/ - -void QtSingleApplication::setActivationWindow(QWidget* aw, bool activateOnMessage) -{ - actWin = aw; - if (activateOnMessage) - connect(peer, SIGNAL(messageReceived(const QString&)), this, SLOT(activateWindow())); - else - disconnect(peer, SIGNAL(messageReceived(const QString&)), this, SLOT(activateWindow())); -} - - -/*! - Returns the applications activation window if one has been set by - calling setActivationWindow(), otherwise returns 0. - - \sa setActivationWindow() -*/ -QWidget* QtSingleApplication::activationWindow() const -{ - return actWin; -} - - -/*! - De-minimizes, raises, and activates this application's activation window. - This function does nothing if no activation window has been set. - - This is a convenience function to show the user that this - application instance has been activated when he has tried to start - another instance. - - This function should typically be called in response to the - messageReceived() signal. By default, that will happen - automatically, if an activation window has been set. - - \sa setActivationWindow(), messageReceived(), initialize() -*/ -void QtSingleApplication::activateWindow() -{ - if (actWin) { - actWin->setWindowState(actWin->windowState() & ~Qt::WindowMinimized); - actWin->raise(); - actWin->activateWindow(); - } -} - - -/*! - \fn void QtSingleApplication::messageReceived(const QString& message) - - This signal is emitted when the current instance receives a \a - message from another instance of this application. - - \sa sendMessage(), setActivationWindow(), activateWindow() -*/ - - -/*! - \fn void QtSingleApplication::initialize(bool dummy = true) - - \obsolete -*/ diff --git a/telldus-gui/3rdparty/qtsingleapplication/src/qtsingleapplication.h b/telldus-gui/3rdparty/qtsingleapplication/src/qtsingleapplication.h deleted file mode 100644 index 049406f7..00000000 --- a/telldus-gui/3rdparty/qtsingleapplication/src/qtsingleapplication.h +++ /dev/null @@ -1,105 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of the Qt Solutions component. -** -** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QTSINGLEAPPLICATION_H -#define QTSINGLEAPPLICATION_H - -#include - -class QtLocalPeer; - -#if defined(Q_OS_WIN) -# if !defined(QT_QTSINGLEAPPLICATION_EXPORT) && !defined(QT_QTSINGLEAPPLICATION_IMPORT) -# define QT_QTSINGLEAPPLICATION_EXPORT -# elif defined(QT_QTSINGLEAPPLICATION_IMPORT) -# if defined(QT_QTSINGLEAPPLICATION_EXPORT) -# undef QT_QTSINGLEAPPLICATION_EXPORT -# endif -# define QT_QTSINGLEAPPLICATION_EXPORT __declspec(dllimport) -# elif defined(QT_QTSINGLEAPPLICATION_EXPORT) -# undef QT_QTSINGLEAPPLICATION_EXPORT -# define QT_QTSINGLEAPPLICATION_EXPORT __declspec(dllexport) -# endif -#else -# define QT_QTSINGLEAPPLICATION_EXPORT -#endif - -class QT_QTSINGLEAPPLICATION_EXPORT QtSingleApplication : public QApplication -{ - Q_OBJECT - -public: - QtSingleApplication(int &argc, char **argv, bool GUIenabled = true); - QtSingleApplication(const QString &id, int &argc, char **argv); -#if QT_VERSION < 0x050000 - QtSingleApplication(int &argc, char **argv, Type type); -# if defined(Q_WS_X11) - QtSingleApplication(Display* dpy, Qt::HANDLE visual = 0, Qt::HANDLE colormap = 0); - QtSingleApplication(Display *dpy, int &argc, char **argv, Qt::HANDLE visual = 0, Qt::HANDLE cmap= 0); - QtSingleApplication(Display* dpy, const QString &appId, int argc, char **argv, Qt::HANDLE visual = 0, Qt::HANDLE colormap = 0); -# endif // Q_WS_X11 -#endif // QT_VERSION < 0x050000 - - bool isRunning(); - QString id() const; - - void setActivationWindow(QWidget* aw, bool activateOnMessage = true); - QWidget* activationWindow() const; - - // Obsolete: - void initialize(bool dummy = true) - { isRunning(); Q_UNUSED(dummy) } - -public Q_SLOTS: - bool sendMessage(const QString &message, int timeout = 5000); - void activateWindow(); - - -Q_SIGNALS: - void messageReceived(const QString &message); - - -private: - void sysInit(const QString &appId = QString()); - QtLocalPeer *peer; - QWidget *actWin; -}; - -#endif // QTSINGLEAPPLICATION_H diff --git a/telldus-gui/3rdparty/qtsingleapplication/src/qtsingleapplication.pri b/telldus-gui/3rdparty/qtsingleapplication/src/qtsingleapplication.pri deleted file mode 100644 index 6f2bced9..00000000 --- a/telldus-gui/3rdparty/qtsingleapplication/src/qtsingleapplication.pri +++ /dev/null @@ -1,17 +0,0 @@ -include(../common.pri) -INCLUDEPATH += $$PWD -DEPENDPATH += $$PWD -QT *= network -greaterThan(QT_MAJOR_VERSION, 4): QT *= widgets - -qtsingleapplication-uselib:!qtsingleapplication-buildlib { - LIBS += -L$$QTSINGLEAPPLICATION_LIBDIR -l$$QTSINGLEAPPLICATION_LIBNAME -} else { - SOURCES += $$PWD/qtsingleapplication.cpp $$PWD/qtlocalpeer.cpp - HEADERS += $$PWD/qtsingleapplication.h $$PWD/qtlocalpeer.h -} - -win32 { - contains(TEMPLATE, lib):contains(CONFIG, shared):DEFINES += QT_QTSINGLEAPPLICATION_EXPORT - else:qtsingleapplication-uselib:DEFINES += QT_QTSINGLEAPPLICATION_IMPORT -} diff --git a/telldus-gui/3rdparty/qtsingleapplication/src/qtsinglecoreapplication.cpp b/telldus-gui/3rdparty/qtsingleapplication/src/qtsinglecoreapplication.cpp deleted file mode 100644 index 56345373..00000000 --- a/telldus-gui/3rdparty/qtsingleapplication/src/qtsinglecoreapplication.cpp +++ /dev/null @@ -1,149 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of the Qt Solutions component. -** -** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - - -#include "qtsinglecoreapplication.h" -#include "qtlocalpeer.h" - -/*! - \class QtSingleCoreApplication qtsinglecoreapplication.h - \brief A variant of the QtSingleApplication class for non-GUI applications. - - This class is a variant of QtSingleApplication suited for use in - console (non-GUI) applications. It is an extension of - QCoreApplication (instead of QApplication). It does not require - the QtGui library. - - The API and usage is identical to QtSingleApplication, except that - functions relating to the "activation window" are not present, for - obvious reasons. Please refer to the QtSingleApplication - documentation for explanation of the usage. - - A QtSingleCoreApplication instance can communicate to a - QtSingleApplication instance if they share the same application - id. Hence, this class can be used to create a light-weight - command-line tool that sends commands to a GUI application. - - \sa QtSingleApplication -*/ - -/*! - Creates a QtSingleCoreApplication object. The application identifier - will be QCoreApplication::applicationFilePath(). \a argc and \a - argv are passed on to the QCoreAppliation constructor. -*/ - -QtSingleCoreApplication::QtSingleCoreApplication(int &argc, char **argv) - : QCoreApplication(argc, argv) -{ - peer = new QtLocalPeer(this); - connect(peer, SIGNAL(messageReceived(const QString&)), SIGNAL(messageReceived(const QString&))); -} - - -/*! - Creates a QtSingleCoreApplication object with the application - identifier \a appId. \a argc and \a argv are passed on to the - QCoreAppliation constructor. -*/ -QtSingleCoreApplication::QtSingleCoreApplication(const QString &appId, int &argc, char **argv) - : QCoreApplication(argc, argv) -{ - peer = new QtLocalPeer(this, appId); - connect(peer, SIGNAL(messageReceived(const QString&)), SIGNAL(messageReceived(const QString&))); -} - - -/*! - Returns true if another instance of this application is running; - otherwise false. - - This function does not find instances of this application that are - being run by a different user (on Windows: that are running in - another session). - - \sa sendMessage() -*/ - -bool QtSingleCoreApplication::isRunning() -{ - return peer->isClient(); -} - - -/*! - Tries to send the text \a message to the currently running - instance. The QtSingleCoreApplication object in the running instance - will emit the messageReceived() signal when it receives the - message. - - This function returns true if the message has been sent to, and - processed by, the current instance. If there is no instance - currently running, or if the running instance fails to process the - message within \a timeout milliseconds, this function return false. - - \sa isRunning(), messageReceived() -*/ - -bool QtSingleCoreApplication::sendMessage(const QString &message, int timeout) -{ - return peer->sendMessage(message, timeout); -} - - -/*! - Returns the application identifier. Two processes with the same - identifier will be regarded as instances of the same application. -*/ - -QString QtSingleCoreApplication::id() const -{ - return peer->applicationId(); -} - - -/*! - \fn void QtSingleCoreApplication::messageReceived(const QString& message) - - This signal is emitted when the current instance receives a \a - message from another instance of this application. - - \sa sendMessage() -*/ diff --git a/telldus-gui/3rdparty/qtsingleapplication/src/qtsinglecoreapplication.h b/telldus-gui/3rdparty/qtsingleapplication/src/qtsinglecoreapplication.h deleted file mode 100644 index b87fffe4..00000000 --- a/telldus-gui/3rdparty/qtsingleapplication/src/qtsinglecoreapplication.h +++ /dev/null @@ -1,71 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of the Qt Solutions component. -** -** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QTSINGLECOREAPPLICATION_H -#define QTSINGLECOREAPPLICATION_H - -#include - -class QtLocalPeer; - -class QtSingleCoreApplication : public QCoreApplication -{ - Q_OBJECT - -public: - QtSingleCoreApplication(int &argc, char **argv); - QtSingleCoreApplication(const QString &id, int &argc, char **argv); - - bool isRunning(); - QString id() const; - -public Q_SLOTS: - bool sendMessage(const QString &message, int timeout = 5000); - - -Q_SIGNALS: - void messageReceived(const QString &message); - - -private: - QtLocalPeer* peer; -}; - -#endif // QTSINGLECOREAPPLICATION_H diff --git a/telldus-gui/3rdparty/qtsingleapplication/src/qtsinglecoreapplication.pri b/telldus-gui/3rdparty/qtsingleapplication/src/qtsinglecoreapplication.pri deleted file mode 100644 index d2d6cc3e..00000000 --- a/telldus-gui/3rdparty/qtsingleapplication/src/qtsinglecoreapplication.pri +++ /dev/null @@ -1,10 +0,0 @@ -INCLUDEPATH += $$PWD -DEPENDPATH += $$PWD -HEADERS += $$PWD/qtsinglecoreapplication.h $$PWD/qtlocalpeer.h -SOURCES += $$PWD/qtsinglecoreapplication.cpp $$PWD/qtlocalpeer.cpp - -QT *= network - -win32:contains(TEMPLATE, lib):contains(CONFIG, shared) { - DEFINES += QT_QTSINGLECOREAPPLICATION_EXPORT=__declspec(dllexport) -} diff --git a/telldus-gui/CMakeLists.txt b/telldus-gui/CMakeLists.txt deleted file mode 100644 index ed193422..00000000 --- a/telldus-gui/CMakeLists.txt +++ /dev/null @@ -1,40 +0,0 @@ -PROJECT( telldus-gui ) - -CMAKE_MINIMUM_REQUIRED( VERSION 2.4.0 ) - -if(COMMAND cmake_policy) - cmake_policy(SET CMP0003 NEW) -endif(COMMAND cmake_policy) - -SET(PACKAGE_MAJOR_VERSION 2) -SET(PACKAGE_MINOR_VERSION 1) -SET(PACKAGE_PATCH_VERSION 3) -SET(PACKAGE_SOVERSION 2) -SET(PACKAGE_VERSION "${PACKAGE_MAJOR_VERSION}.${PACKAGE_MINOR_VERSION}.${PACKAGE_PATCH_VERSION}") -SET(DISPLAYED_VERSION "${PACKAGE_VERSION}_beta1") - -SET(BRANDING "telldus" CACHE STRING "The brand to use") - -SET(UPDATE_TRANSLATIONS FALSE CACHE BOOL "Update source translation files (WARNING: make clean will delete the source .ts files! Danger!)") -SET(LANGUAGES sv) - -SET(BUILD_LIBTELLDUS-GUI TRUE CACHE BOOL "Build libtelldus-gui") -SET(BUILD_TELLDUS-CENTER TRUE CACHE BOOL "Build TelldusCenter") - -SET(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake") -SET(GENERATE_MAN FALSE CACHE BOOL "Enable generation of man-files") - -IF(UNIX) - SET(PLUGIN_LIB_PATH "lib" CACHE STRING "Relative path to the directory to install TelldusCenter plugin libraries into") - SET(PLUGIN_LIB_FULL_PATH "${PLUGIN_LIB_PATH}/telldus/tellduscenter/plugins") -ENDIF () - -if(BUILD_LIBTELLDUS-GUI) - ADD_SUBDIRECTORY(TelldusGui) -endif(BUILD_LIBTELLDUS-GUI) - -IF (BUILD_TELLDUS-CENTER) - ADD_SUBDIRECTORY(TelldusCenter) - ADD_SUBDIRECTORY(Plugins) -ENDIF (BUILD_TELLDUS-CENTER) - diff --git a/telldus-gui/Plugins/CMakeLists.txt b/telldus-gui/Plugins/CMakeLists.txt deleted file mode 100644 index 382f6744..00000000 --- a/telldus-gui/Plugins/CMakeLists.txt +++ /dev/null @@ -1,70 +0,0 @@ - -CMAKE_MINIMUM_REQUIRED( VERSION 2.4.0 ) - -SET(BUILD_PLUGIN_TELLDUS-CORE TRUE CACHE BOOL "Build plugin 'TelldusCore'") - -IF (BUILD_LIBTELLDUS-GUI) - SET(BUILD_PLUGIN_DEVICES TRUE CACHE BOOL "Build plugin 'Devices'") - SET(BUILD_PLUGIN_SYSTRAY TRUE CACHE BOOL "Build plugin 'Systray'") -ENDIF (BUILD_LIBTELLDUS-GUI) - -SET(BUILD_PLUGIN_CONTROLLERS TRUE CACHE BOOL "Build plugin 'Controllers admin plugin'") -SET(BUILD_PLUGIN_DBUS FALSE CACHE BOOL "Build plugin 'DBus'") -SET(BUILD_PLUGIN_LIVE FALSE CACHE BOOL "Build plugin 'Telldus Live!'") -SET(BUILD_PLUGIN_SCHEDULERGUISIMPLE FALSE CACHE BOOL "Build plugin 'Simple Scheduler GUI'") -SET(BUILD_PLUGIN_SENSORS TRUE CACHE BOOL "Build plugin 'Sensors'") -SET(BUILD_PLUGIN_XPL FALSE CACHE BOOL "Build plugin 'xPL'") - -ADD_SUBDIRECTORY(telldus) - -IF(BUILD_PLUGIN_TELLDUS-CORE) - ADD_SUBDIRECTORY(TelldusCore) -ENDIF(BUILD_PLUGIN_TELLDUS-CORE) - -IF(BUILD_PLUGIN_DEVICES) - ADD_SUBDIRECTORY(Devices) -ENDIF(BUILD_PLUGIN_DEVICES) - -IF(BUILD_PLUGIN_SYSTRAY) - ADD_SUBDIRECTORY(Systray) -ENDIF(BUILD_PLUGIN_SYSTRAY) - -IF(BUILD_PLUGIN_CONTROLLERS) - ADD_SUBDIRECTORY(Controllers) -ENDIF() - -IF(BUILD_PLUGIN_DBUS) - ADD_SUBDIRECTORY(DBus) -ENDIF(BUILD_PLUGIN_DBUS) - -IF(BUILD_PLUGIN_LIVE) - ADD_SUBDIRECTORY(Live) -ENDIF(BUILD_PLUGIN_LIVE) - -IF(BUILD_PLUGIN_SENSORS) - ADD_SUBDIRECTORY(Sensors) -ENDIF() - -IF(BUILD_PLUGIN_XPL) - ADD_SUBDIRECTORY(xPL) -ENDIF(BUILD_PLUGIN_XPL) - -IF(BUILD_PLUGIN_SCHEDULERGUISIMPLE) - ADD_SUBDIRECTORY(SchedulerGUISimple) -ENDIF(BUILD_PLUGIN_SCHEDULERGUISIMPLE) - -IF(REQUIRE_PLUGIN_SCHEDULER) - ADD_SUBDIRECTORY(Scheduler) -ENDIF(REQUIRE_PLUGIN_SCHEDULER) - -IF(REQUIRE_PLUGIN_SUNCALCULATOR) - ADD_SUBDIRECTORY(SunCalculator) -ENDIF(REQUIRE_PLUGIN_SUNCALCULATOR) - -IF(REQUIRE_PLUGIN_QML) - ADD_SUBDIRECTORY(QML) -ENDIF(REQUIRE_PLUGIN_QML) - -IF(REQUIRE_PLUGIN_SETTINGS) - ADD_SUBDIRECTORY(Settings) -ENDIF(REQUIRE_PLUGIN_SETTINGS) diff --git a/telldus-gui/Plugins/Controllers/CMakeLists.txt b/telldus-gui/Plugins/Controllers/CMakeLists.txt deleted file mode 100644 index 338942e2..00000000 --- a/telldus-gui/Plugins/Controllers/CMakeLists.txt +++ /dev/null @@ -1,52 +0,0 @@ -SET(REQUIRE_PLUGIN_QML TRUE PARENT_SCOPE) -#SET(REQUIRE_PLUGIN_SETTINGS TRUE PARENT_SCOPE) - -SET(QT_USE_QTDECLARATIVE TRUE) - -SET( Plugin_NAME "Controllers" ) - - -SET( Plugin_SRCS - controller.cpp - controllerlist.cpp - controllersplugin.cpp - tellstick.cpp -) - -SET( Plugin_HDRS - controllersplugin.h -) - -SET( Plugin_MOC_HDRS - controller.h - controllerlist.h - tellstick.h -) - -SET( Plugin_RESOURCES - controllers.qrc -) - -SET( Plugin_PATH "com.telldus.controllers" ) - -SET( Plugin_EXTRA - btn_action_remove.png - btn_action_upgrade.png - ControllerUpgradeDialog.qml - ControllerView.qml - header_bg.png - HeaderTitle.qml - icon.png - main.qml - qmldir - row_bg.png - StateLabel.qml - tellstick.png - tellstick_duo.png -) - -FIND_LIBRARY(FTD2XX_LIBRARY ftd2xx) -FIND_PACKAGE(TelldusCore REQUIRED) -SET( Plugin_LIBRARIES ${TELLDUSCORE_LIBRARY} ${FTD2XX_LIBRARY} ) - -INCLUDE( ../TelldusCenterPlugin.cmake NO_POLICY_SCOPE ) diff --git a/telldus-gui/Plugins/Controllers/ControllerUpgradeDialog.qml b/telldus-gui/Plugins/Controllers/ControllerUpgradeDialog.qml deleted file mode 100644 index 6672fcf9..00000000 --- a/telldus-gui/Plugins/Controllers/ControllerUpgradeDialog.qml +++ /dev/null @@ -1,124 +0,0 @@ -import QtQuick 1.1 -import QtDesktop 0.1 - -Window { - id: controllerUpgradeDialog - width: 400 - height: 200 - - modal: true - title: "Upgrade TellStick" - visible: false - deleteOnClose: false - - property int step: controller.upgradeStep - property variant controller: undefined - Connections { - target: controller - onUpgradeDone: state = 'upgradeDone' - } - - Item { - id: confirm - anchors.top: parent.top - anchors.left: parent.left - width: parent.width - height: parent.height - clip: true - Item { - anchors.fill: parent - anchors.margins: 16 - - Column { - Text { text: "This will upgrade your TellStick to the latest version.\n\n" } - Text { text: "Please do not unplug the TellStick or end the application during upgrade." } - Text { text: "Doing so might render the TellStick unusable." } - } - Row { - anchors.bottom: parent.bottom - anchors.right: parent.right - spacing: 8 - Button { - text: "Upgrade" - onClicked: controllerUpgradeDialog.state = 'upgrade' - } - Button { - text: "Close" - onClicked: controllerUpgradeDialog.visible = false - } - } - } - } - - Item { - id: content - anchors.topMargin:16 - anchors.margins: 16 - anchors.top: parent.top - anchors.left: parent.right - width: parent.width - 32 - height: parent.height - 32 - anchors.right: undefined - clip: true - Column { - StateLabel { text: "1. Disconnecting TellStick"; currentState: controllerUpgradeDialog.step; state: 0 } - StateLabel { text: "2. Aquiring TellStick"; currentState: controllerUpgradeDialog.step; state: 1 } - StateLabel { text: "3. Entering bootloader"; currentState: controllerUpgradeDialog.step; state: 2 } - StateLabel { text: "4. Uploading firmware"; currentState: controllerUpgradeDialog.step; state: 3 } - StateLabel { text: "5. Rebooting TellStick"; currentState: controllerUpgradeDialog.step; state: 4 } - StateLabel { text: "6. Connecting TellStick"; currentState: controllerUpgradeDialog.step; state: 5 } - } - ProgressBar { - anchors.left: parent.left - anchors.right: parent.right - anchors.bottom: parent.bottom - minimumValue: 0 - maximumValue: 100 - value: controller.upgradeProgress - } - } - Item { - id: done - anchors.top: parent.top - anchors.left: parent.right - width: parent.width - height: parent.height - clip: true - Item { - anchors.fill: parent - anchors.margins: 16 - - Column { - Text { text: "Upgrade done.\n\n" } - Text { text: "Your TellStick has now been flashed with the latest firmware." } - } - Button { - anchors.bottom: parent.bottom - anchors.right: parent.right - text: "Close" - onClicked: controllerUpgradeDialog.visible = false - } - } - } - - states: [ - State { - name: 'upgrade' - AnchorChanges { target: confirm; anchors.left: undefined; anchors.right: controllerUpgradeDialog.left } - AnchorChanges { target: content; anchors.left: controllerUpgradeDialog.left; anchors.right: undefined } - StateChangeScript { script: controller.upgrade() } - }, - State { - name: 'upgradeDone' - AnchorChanges { target: confirm; anchors.left: undefined; anchors.right: controllerUpgradeDialog.left } - AnchorChanges { target: content; anchors.left: undefined; anchors.right: controllerUpgradeDialog.left } - AnchorChanges { target: done; anchors.left: controllerUpgradeDialog.left; anchors.right: undefined } - } - ] - - transitions: [ - Transition { - AnchorAnimation { duration: 500; easing.type: Easing.InOutQuad } - } - ] -} diff --git a/telldus-gui/Plugins/Controllers/ControllerView.qml b/telldus-gui/Plugins/Controllers/ControllerView.qml deleted file mode 100644 index 1cfb4d33..00000000 --- a/telldus-gui/Plugins/Controllers/ControllerView.qml +++ /dev/null @@ -1,130 +0,0 @@ -import QtQuick 1.1 -import QtDesktop 0.1 - -BorderImage { - id: view - source: "row_bg.png" - border.left: 5; border.top: 5 - border.right: 5; border.bottom: 5 - width: parent.width - height: content.height + content.anchors.margins*2 - - property variant c: controller //Needed for upgradeDialogComponent - - Component { - id: upgradeDialogComponent - ControllerUpgradeDialog { - controller: c - } - } - Loader { - id: upgradeDialog - visible: false - onVisibleChanged: { - if (visible) { - upgradeDialog.sourceComponent = upgradeDialogComponent - upgradeDialog.item.visible = true - } else { - upgradeDialog.sourceComponent = undefined - } - } - Connections { - target: upgradeDialog.item - onVisibleChanged: upgradeDialog.visible = upgradeDialog.item.visible - } - } - - Item { - id: content - anchors.top: parent.top - anchors.left: parent.left - anchors.margins: 5 - height: childrenRect.height - width: childrenRect.width - - Row { - spacing: 10 - Image { - source: icon(controller.type) - width: 50 - smooth: true - fillMode: Image.PreserveAspectFit - opacity: controller.available ? 1 : 0.5 - } - - Column { - Text { - color: "#004275" - text: productName(controller.type) - font.pixelSize: 15 - } - TextField { - //id: nameEdit - text: controller.name; - placeholderText: 'Enter a name for this controller' - onTextChanged: controller.name = text - } - } - Loader { - sourceComponent: tellstick - } - Image { - source: "btn_action_remove.png" - visible: !controller.available - MouseArea { - anchors.fill: parent - onClicked: controller.tryRemove(); - } - } - Image { - source: "btn_action_upgrade.png" - visible: controller.upgradable - MouseArea { - anchors.fill: parent - onClicked: upgradeDialog.visible = true - } - } - } - } - - Component { - id: tellstick - Grid { - spacing: 3 - columns: 2 - Text { - color: "#004275" - text: "Serial:" - } - Text { - color: "#004275" - text: controller.serial - } - Text { - color: "#004275" - text: "Firmware version:" - } - Text { - color: "#004275" - text: controller.firmware - } - } - } - - function icon(type) { - if (type == 1) { - return "tellstick.png"; - } else if (type == 2) { - return "tellstick_duo.png"; - } - return "tellstick.png"; - } - function productName(type) { - if (type == 1) { - return "TellStick"; - } else if (type == 2) { - return "TellStick Duo"; - } - return ""; - } -} diff --git a/telldus-gui/Plugins/Controllers/HeaderTitle.qml b/telldus-gui/Plugins/Controllers/HeaderTitle.qml deleted file mode 100644 index 0d7ae213..00000000 --- a/telldus-gui/Plugins/Controllers/HeaderTitle.qml +++ /dev/null @@ -1,10 +0,0 @@ -import Qt 4.7 - -Text { - id: headerTitle - text: "Name" - color: "white" - font.weight: Font.Bold - height: parent.height - verticalAlignment: Text.AlignVCenter -} diff --git a/telldus-gui/Plugins/Controllers/StateLabel.qml b/telldus-gui/Plugins/Controllers/StateLabel.qml deleted file mode 100644 index 3bf8f59f..00000000 --- a/telldus-gui/Plugins/Controllers/StateLabel.qml +++ /dev/null @@ -1,10 +0,0 @@ -import QtQuick 1.1 -import QtDesktop 0.1 - -Text { - property int currentState: -1 - property int state: 0 - id: stateLabel; - text: "" - font.bold: state == currentState -} diff --git a/telldus-gui/Plugins/Controllers/__init__.js b/telldus-gui/Plugins/Controllers/__init__.js deleted file mode 100644 index b06ea8c4..00000000 --- a/telldus-gui/Plugins/Controllers/__init__.js +++ /dev/null @@ -1,25 +0,0 @@ -/** Sensors **/ -__setupPackage__( __extension__ ); - -__postInit__ = function() { - application.allDoneLoading.connect( com.telldus.controllers.init ); -} - -com.telldus.controllers = function() { - var view = null; - - function init() { - view = new com.telldus.qml.view({}); - view.setProperty('controllerModel', com.telldus.controllers.list); - view.load("main.qml"); - view.sizeRootObjectToView(true); - application.configuration.addPage('Controllers', view, 'icon.png'); - com.telldus.controllers.list.changed.connect(application.configuration.valueChanged) - application.configuration.save.connect(com.telldus.controllers.list.save) - } - - return { //Public functions - init:init - } - -}(); diff --git a/telldus-gui/Plugins/Controllers/btn_action_remove.png b/telldus-gui/Plugins/Controllers/btn_action_remove.png deleted file mode 100644 index d9e5bf75..00000000 Binary files a/telldus-gui/Plugins/Controllers/btn_action_remove.png and /dev/null differ diff --git a/telldus-gui/Plugins/Controllers/btn_action_upgrade.png b/telldus-gui/Plugins/Controllers/btn_action_upgrade.png deleted file mode 100644 index daa6131a..00000000 Binary files a/telldus-gui/Plugins/Controllers/btn_action_upgrade.png and /dev/null differ diff --git a/telldus-gui/Plugins/Controllers/controller.cpp b/telldus-gui/Plugins/Controllers/controller.cpp deleted file mode 100644 index a691d746..00000000 --- a/telldus-gui/Plugins/Controllers/controller.cpp +++ /dev/null @@ -1,142 +0,0 @@ -#include "controller.h" -#include -#include -#include - -class Controller::PrivateData { -public: - bool available, nameChanged; - int id, type, upgradeStep; - QString name, serial, firmware; - qreal upgradeProgress; -}; - -Controller::Controller(int id, int type, const QString &name, QObject *parent) : - QObject(parent) -{ - d = new PrivateData; - d->id = id; - d->type = type; - d->available = false; - d->nameChanged = false; - d->name = name; - d->upgradeStep = -1; - d->upgradeProgress = 0; - - const int DATA_LENGTH = 255; - char buff[DATA_LENGTH]; - if (tdControllerValue(id, "serial", buff, DATA_LENGTH) == TELLSTICK_SUCCESS) { - d->serial = QString::fromUtf8(buff); - } - if (tdControllerValue(id, "firmware", buff, DATA_LENGTH) == TELLSTICK_SUCCESS) { - d->firmware = QString::fromUtf8(buff); - } -} - -Controller::~Controller() { - delete d; -} - -bool Controller::available() const { - return d->available; -} - -void Controller::setAvailable(bool available) { - d->available = available; - emit availableChanged(); - emit firmwareChanged(); - emit upgradableChanged(); -} - -QString Controller::firmware() const { - if (!d->available) { - return "?"; - } - return d->firmware; -} - -void Controller::setFirmware(const QString &version) { - d->firmware = version; - emit firmwareChanged(); -} - -int Controller::id() const { - return d->id; -} - -QString Controller::name() const { - return d->name; -} - -void Controller::setName(const QString &name) { - if (name == d->name) { - return; - } - d->nameChanged = true; - d->name = name; - emit nameChanged(); -} - -void Controller::save() { - if (d->nameChanged) { - tdSetControllerValue(d->id, "name", d->name.toUtf8()); - d->nameChanged = false; - } -} - -QString Controller::serial() const { - return d->serial; -} - -void Controller::tryRemove() { - QMessageBox msgBox; - msgBox.setText( tr("Are you sure you want to remove the selected controller?") ); - msgBox.setInformativeText( tr("If you connect it again at a later point it will be readded automatically.") ); - msgBox.setIcon( QMessageBox::Warning ); - msgBox.setStandardButtons( QMessageBox::Yes | QMessageBox::No ); - msgBox.setDefaultButton( QMessageBox::No ); - if ( msgBox.exec() == QMessageBox::Yes) { - tdRemoveController(d->id); - } -} - -int Controller::type() const { - return d->type; -} - -bool Controller::upgradable() const { - if (!this->available()) { - return false; - } - return isUpgradable(); -} - -void Controller::upgrade() { - //Do nothing -} - -qreal Controller::upgradeProgress() { - return d->upgradeProgress; -} - -int Controller::upgradeStep() const { - return d->upgradeStep; -} - -void Controller::setUpgradeStep(int newStep) { - d->upgradeStep = newStep; - if (newStep = -1) { - setUpgradeProgress(0); - } - emit upgradeStepChanged(); -} - -void Controller::setUpgradeProgress(qreal completed) { - d->upgradeProgress = completed; - emit upgradeProgressChanged(); -} - -bool Controller::isUpgradable() const { - return false; -} - diff --git a/telldus-gui/Plugins/Controllers/controller.h b/telldus-gui/Plugins/Controllers/controller.h deleted file mode 100644 index 392aa5a1..00000000 --- a/telldus-gui/Plugins/Controllers/controller.h +++ /dev/null @@ -1,72 +0,0 @@ -#ifndef CONTROLLER_H -#define CONTROLLER_H - -#include -#include - -class Controller : public QObject -{ - Q_OBJECT - Q_PROPERTY(bool available READ available NOTIFY availableChanged) - Q_PROPERTY(QString firmware READ firmware NOTIFY firmwareChanged) - Q_PROPERTY(int id READ id NOTIFY idChanged) - Q_PROPERTY(QString name READ name WRITE setName NOTIFY nameChanged) - Q_PROPERTY(QString serial READ serial NOTIFY serialChanged) - Q_PROPERTY(int type READ type NOTIFY typeChanged) - Q_PROPERTY(bool upgradable READ upgradable NOTIFY upgradableChanged) - Q_PROPERTY(qreal upgradeProgress READ upgradeProgress NOTIFY upgradeProgressChanged) - Q_PROPERTY(int upgradeStep READ upgradeStep NOTIFY upgradeStepChanged) - -public: - explicit Controller(int id = 0, int type = 1, const QString &name = "", QObject *parent = 0); - virtual ~Controller(); - - bool available() const; - virtual void setAvailable(bool available); - - QString firmware() const; - void setFirmware(const QString &version); - - int id() const; - - QString name() const; - void setName(const QString &name); - - void save(); - - QString serial() const; - - Q_INVOKABLE void tryRemove(); - - int type() const; - - bool upgradable() const; - Q_INVOKABLE virtual void upgrade(); - qreal upgradeProgress(); - int upgradeStep() const; - -signals: - void availableChanged(); - void firmwareChanged(); - void idChanged(); - void nameChanged(); - void serialChanged(); - void typeChanged(); - void upgradableChanged(); - void upgradeProgressChanged(); - void upgradeStepChanged(); - void upgradeDone(); - -protected: - virtual bool isUpgradable() const; - void setUpgradeStep(int newStep); - void setUpgradeProgress(qreal completed); - -private: - class PrivateData; - PrivateData *d; -}; - -Q_DECLARE_METATYPE(Controller*) - -#endif // CONTROLLER_H diff --git a/telldus-gui/Plugins/Controllers/controllerlist.cpp b/telldus-gui/Plugins/Controllers/controllerlist.cpp deleted file mode 100644 index b5baa1fe..00000000 --- a/telldus-gui/Plugins/Controllers/controllerlist.cpp +++ /dev/null @@ -1,110 +0,0 @@ -#include "controllerlist.h" -#include "controller.h" -#include "tellstick.h" - -#include - -class ControllerList::PrivateData { -public: - QList list; - int callbackId; -}; - -ControllerList::ControllerList(QObject *parent) : - QAbstractListModel(parent) -{ - d = new PrivateData; - - QHash roles; - roles[Qt::UserRole+1] = "controller"; - setRoleNames(roles); - - connect(this, SIGNAL(controllerEventSignal(int,int,int,QString)), this, SLOT(controllerEventSlot(int,int,int,QString)), Qt::QueuedConnection); - d->callbackId = tdRegisterControllerEvent(&ControllerList::controllerEvent, this); - - const int DATA_LENGTH = 255; - char name[DATA_LENGTH]; - int available, controllerId, type; - while(tdController(&controllerId, &type, name, DATA_LENGTH, &available) == TELLSTICK_SUCCESS) { - Controller *controller = loadController(controllerId, type, QString::fromUtf8(name), this); - controller->setAvailable(available); - connect(controller, SIGNAL(nameChanged()), this, SIGNAL(changed())); - d->list.append(controller); - } -} - -ControllerList::~ControllerList() { - tdUnregisterCallback(d->callbackId); - delete d; -} - -QVariant ControllerList::data(const QModelIndex &index, int role) const { - return QVariant::fromValue(d->list.at(index.row())); -} - -int ControllerList::rowCount(const QModelIndex &parent) const { - return d->list.size(); -} - -void ControllerList::save() { - for(int i = 0; i < d->list.size(); ++i) { - d->list.at(i)->save(); - } -} - -void ControllerList::controllerEventSlot(int controllerId, int changeEvent, int changeType, const QString &newValue) { - if (changeEvent == TELLSTICK_DEVICE_STATE_CHANGED) { - for(int i = 0; i < d->list.size(); ++i) { - if (d->list.at(i)->id() != controllerId) { - continue; - } - if (changeType == TELLSTICK_CHANGE_AVAILABLE) { - if (newValue == "1") { - d->list.at(i)->setAvailable(true); - } else if (newValue == "0") { - d->list.at(i)->setAvailable(false); - } - } else if (changeType == TELLSTICK_CHANGE_FIRMWARE) { - d->list.at(i)->setFirmware(newValue); - } - } - return; - } - - if (changeEvent == TELLSTICK_DEVICE_ADDED) { - beginInsertRows( QModelIndex(), d->list.size(), d->list.size() ); - Controller *controller = loadController(controllerId, changeType, "", this); - controller->setAvailable(true); - connect(controller, SIGNAL(nameChanged()), this, SIGNAL(changed())); - d->list.append(controller); - endInsertRows(); - return; - } - - if (changeEvent == TELLSTICK_DEVICE_REMOVED) { - for(int i = 0; i < d->list.size(); ++i) { - if (d->list.at(i)->id() != controllerId) { - continue; - } - beginRemoveRows( QModelIndex(), i, i ); - d->list.takeAt(i); - endRemoveRows(); - } - return; - } -} - -Controller *ControllerList::loadController(int id, int type, const QString &name, QObject *parent) { - if (type == 1 || type == 2) { - return new TellStick(id, type, "", parent); - } - return new Controller(id, type, "", parent); -} - -void WINAPI ControllerList::controllerEvent( int controllerId, int changeEvent, int changeType, const char *newValue, int callbackId, void *context) { - ControllerList *controllerList = reinterpret_cast(context); - if (!controllerList) { - return; - } - emit controllerList->controllerEventSignal(controllerId, changeEvent, changeType, QString::fromUtf8(newValue)); -} diff --git a/telldus-gui/Plugins/Controllers/controllerlist.h b/telldus-gui/Plugins/Controllers/controllerlist.h deleted file mode 100644 index be16af6f..00000000 --- a/telldus-gui/Plugins/Controllers/controllerlist.h +++ /dev/null @@ -1,39 +0,0 @@ -#ifndef CONTROLLERLIST_H -#define CONTROLLERLIST_H - -#include -#include -#include - -class Controller; - -class ControllerList : public QAbstractListModel -{ - Q_OBJECT - Q_PROPERTY(int length READ rowCount) -public: - explicit ControllerList(QObject *parent = 0); - ~ControllerList(); - - virtual int rowCount(const QModelIndex &parent = QModelIndex()) const; - virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const; - -signals: - void changed(); - void controllerEventSignal(int controllerId, int changeEvent, int changeType, const QString &newValue); - -public slots: - void save(); - -private slots: - void controllerEventSlot(int controllerId, int changeEvent, int changeType, const QString &newValue); - -private: - static Controller *loadController(int id, int type, const QString &name, QObject *parent); - static void WINAPI controllerEvent( int controllerId, int changeEvent, int changeType, const char *newValue, int callbackId, void *context); - class PrivateData; - PrivateData *d; - -}; - -#endif // CONTROLLERLIST_H diff --git a/telldus-gui/Plugins/Controllers/controllers.qrc b/telldus-gui/Plugins/Controllers/controllers.qrc deleted file mode 100644 index 15095557..00000000 --- a/telldus-gui/Plugins/Controllers/controllers.qrc +++ /dev/null @@ -1,7 +0,0 @@ - - - firmware/TellStick.hex - firmware/TellStickDuo.hex - firmware/TellStickNet.hex - - diff --git a/telldus-gui/Plugins/Controllers/controllersplugin.cpp b/telldus-gui/Plugins/Controllers/controllersplugin.cpp deleted file mode 100644 index 681ccca2..00000000 --- a/telldus-gui/Plugins/Controllers/controllersplugin.cpp +++ /dev/null @@ -1,30 +0,0 @@ -#include "controllersplugin.h" -#include "controllerlist.h" -#include "controller.h" -#include -#include - - -ControllersPlugin::ControllersPlugin ( QObject * parent ) - :QScriptExtensionPlugin( parent ) -{ -} - -ControllersPlugin::~ControllersPlugin() { -} - -void ControllersPlugin::initialize ( const QString & key, QScriptEngine * engine ) { - if (key == "com.telldus.controllers") { - qmlRegisterType("Telldus", 1, 0, "Controller"); - - QScriptValue qml = engine->globalObject().property("com").property("telldus").property("controllers"); - QScriptValue list = engine->newQObject(new ControllerList(), QScriptEngine::ScriptOwnership); - qml.setProperty("list", list); - } -} - -QStringList ControllersPlugin::keys () const { - return QStringList() << "com.telldus.controllers"; -} - -Q_EXPORT_PLUGIN2(ControllersInterface, ControllersPlugin) diff --git a/telldus-gui/Plugins/Controllers/controllersplugin.h b/telldus-gui/Plugins/Controllers/controllersplugin.h deleted file mode 100644 index 57cbe1d2..00000000 --- a/telldus-gui/Plugins/Controllers/controllersplugin.h +++ /dev/null @@ -1,16 +0,0 @@ -#ifndef CONTROLLERSPLUGIN_H -#define CONTROLLERSPLUGIN_H - -#include - -class ControllersPlugin : public QScriptExtensionPlugin { -public: - ControllersPlugin ( QObject * parent = 0 ); - ~ControllersPlugin (); - - virtual void initialize ( const QString & key, QScriptEngine * engine ); - virtual QStringList keys () const; -}; - - -#endif // CONTROLLERSPLUGIN_H diff --git a/telldus-gui/Plugins/Controllers/firmware/TellStick.hex b/telldus-gui/Plugins/Controllers/firmware/TellStick.hex deleted file mode 100644 index f0802c55..00000000 --- a/telldus-gui/Plugins/Controllers/firmware/TellStick.hex +++ /dev/null @@ -1,114 +0,0 @@ -:100000001728FF3FFF3FFF3FFF00030E83018316CA -:10001000AA000408A9000A08AB008A012B088A007C -:10002000290884002A0E8300FF0E7F0E09000D3080 -:1000300003138316AC000A30AD002B30AE005630EF -:10004000AF00B0010D30B1000A30B200B30154303E -:10005000B4005330B5003030B6003030B700313026 -:10006000B800B9010B30BC000A30BD00BE017223DC -:100070008501860187018312850186018701871426 -:1000800035237823AC308316C0001C233630C800DB -:100090006A23B1308316C0001C2303138316031395 -:1000A00083166123700803194D2845237008A800A2 -:1000B00067289028BE144D289028BC30C800A6227E -:1000C0004D28BD30C800A6224D2890284D2828086C -:1000D000423A031959282808443A03195A2828088B -:1000E000483A03195C2828084D3A03195C28280867 -:1000F0004E3A03195C282808503A03195D2828084D -:10010000523A031961282808533A03196528280828 -:10011000543A031965282808563A031965286628B1 -:10012000F822700803194D282B30C8006A23831663 -:100130002808C8006A2383162808533A031DCC28D0 -:10014000BA01BB0180303B06F00080307002031D15 -:10015000AB283D083A020318CB28831287102D22C2 -:1001600087148316BF013C083F020318C7280330D9 -:10017000FB00FF30FA00FB0BBE28C128FA0BBE289B -:10018000BB289630FA00FA0BC328BF0AB328BA0A74 -:100190000319BB0AA22815292808543A031DFC2874 -:1001A000BA01BB0180303B06F00080307002031DB5 -:1001B000DB283D083A020318FB28831287102C2104 -:1001C00087148316BF013C083F020318F728033049 -:1001D000FB00FF30FA00FB0BEE28F128FA0BEE28AB -:1001E000EB289630FA00FA0BF328BF0AE328BA0A84 -:1001F0000319BB0AD22815292808563A031D0429D9 -:100200003630C8006A23152983162808483A031D8A -:100210000D293330C8006A231529831628084D3A62 -:10022000031D1529B430C0001C23031383160313C8 -:100230008316BE1C1E292030C0001C23BE100B30AC -:10024000BC000A30BD000D30C8006A230A30831696 -:10025000C8006A234D282B2903138316C4012030BC -:10026000C000C101043041020318B42940088400D1 -:100270000008F2007208013A031D53290130F4000E -:100280004108F000740803194929F00D7010FF3F70 -:100290004329A030F00770088400FF308000FF3051 -:1002A000840A8000B1290130F4004108F00074088C -:1002B00003195E29F00D7010FF3F58297008A03F08 -:1002C000F200400884000008F00072088400700802 -:1002D0008000840A80010130F4004108F0007408B5 -:1002E00003197629F00D7010FF3F70297008A03FA8 -:1002F000C700470884000008F000840A0008F100E5 -:100300000A30F4000030F500CD228316470884003F -:10031000700880007108840A80000130F4004108F0 -:10032000F000740803199829F00D7010FF3F92290E -:100330007008A03FF200720884000008F000840AF0 -:100340000008F1007008FF3CF0007108031C013F39 -:10035000FF3CF10072088400700880007108840A74 -:100360008000C00AC10A3229400884000008C20087 -:10037000C00A831210100C1483164208003C0318A4 -:10038000282A400884000008C300C101043041024B -:100390000318262AC0304305F4000630F200740822 -:1003A000F00072080319D829F00CF013FF3FD2298E -:1003B0000130F40074080319E129F00D7010FF3FBB -:1003C000DB297008A03F84000008F200840A0008BE -:1003D000F3007208C5007308C600C30D4310C30DB7 -:1003E00043107308FF3A031DF729FF307206031DFF -:1003F000FB29C4091E2A83120C1CFB2910100C10A7 -:10040000003083164505F4004608FF39F5007508ED -:10041000F000F101700883128F00831645088312E3 -:100420008E0083164409F0007008C4000030701874 -:100430002030831206062039860610148316C20364 -:1004400001304202031C262AC10AC629C00ABC295F -:1004500083120C1C282A8612080003138316C3017A -:10046000831210100C1420308316C200420884003E -:100470000008F2007208003A0319A12A4208840019 -:100480000008F2007208013A031D482AC3099E2A97 -:10049000420884000008C000C1010030C1004008CB -:1004A000F2004108F300F20DF30D7210F20DF30D9E -:1004B0007210F20DF30D72107208C0007308C100C3 -:1004C000420884000008F0007008F007F1010318EA -:1004D000F10A7208F00773080318013FF10770086A -:1004E000C0007108C1007008FF3CC0007108031C07 -:1004F000013FFF3CC10083120C1C7B2A10100C1022 -:10050000003083164005F4004108FF39F5007508F6 -:10051000F000F101700883128F00831640088312E7 -:100520008E0083164309F0007008C3000030701875 -:100530002030831206062039860610148316C20A5C -:10054000362A83120C1CA12A861208000313831674 -:10055000C901831210100C108F018E0110140313A7 -:1005600083128C1AC32A0C1CBB2A8316C90A831255 -:100570008F018E010C10053083164902031CC22A1C -:10058000F0010800AF2A03138316532348088400A0 -:10059000700880000130F000080003138312FB0193 -:1005A000FA01F9018030F800F10CF00C031CE12A8B -:1005B0007408F90775080318750FFA070318FB0A82 -:1005C0000310F01FE92A7408FA0775080318750F5D -:1005D000FB07FB0CFA0CF90CF80C031CD42A7B0863 -:1005E000F3007A08F2007908F1007808F0000800BA -:1005F00003138316C0012030C1005030400203189D -:100600001A2B4108C800A6227008031D092BF0010F -:100610000800410884000008F10071082B3A031D0E -:10062000172B4108840080010130F0000800C10A46 -:10063000C00AFD2AF001080003138316C101C2019C -:100640004108400784000008F1007108003A0319CE -:10065000342B4108400784000008C8006A23831631 -:10066000C10A0319C20A202B08006730031383163E -:100670009900181398161812181583129817181342 -:1006800018168316861406110800031383121A081D -:100690008316C0008312981C4F2B1812181683164D -:1006A0004008F0000800031383121A088316CA00DA -:1006B0008312981C5D2B1812181683164A08F00036 -:1006C00008000030031383128C1A0130F100710806 -:1006D000F000080003138316981C6A2B4808831245 -:1006E00099000800031383160F178F160F160800C2 -:1006F00003138312901210160800FF3FFF3FFF3FC5 -:04400E00F42FFFFF8D -:00000001FF diff --git a/telldus-gui/Plugins/Controllers/firmware/TellStickDuo.hex b/telldus-gui/Plugins/Controllers/firmware/TellStickDuo.hex deleted file mode 100644 index c1f9e16e..00000000 --- a/telldus-gui/Plugins/Controllers/firmware/TellStickDuo.hex +++ /dev/null @@ -1,1046 +0,0 @@ -:0400000014EF00F009 -:10000800FACFCCF4FBCFCDF4E9CFCEF4DAED1BF088 -:10001800D8CFBAF4E8CFBBF4E0CFBCF4AAEF1AF01B -:1000280004EE48F07C0EF66E000EF76E10EE28F027 -:1000380035EC00F000EE00F014EE48F02EEC00F085 -:1000480005EE00F011EE00F02EEC00F0000EF86E58 -:10005800B2EF1EF0EE6AE550E150FCE1E250FAE141 -:1000680012000900F5CFEEFFE550E150FAE1E25049 -:10007800F8E1120074656D70657261747572656877 -:10008800756D696469747900010000000001000061 -:100098000100FFFFF3FFFFFF80FFFFFF85D1040191 -:1000A80004017551D8B401D001D014D04C0E04010C -:1000B8000401766501D001D00DD0520E040104016F -:1000C800766101D001D006D00401876F010E126E4F -:1000D800040187517DD1190E04010401766501D010 -:1000E80001D00ED01E0E04010401766101D001D0AA -:1000F80007D00401876F030E126E0401875168D17F -:10010800270E04010401766501D001D00ED02C0E13 -:1001180004010401766101D001D007D00401876F82 -:10012800040E126E0401875153D165EC1DF050D1B5 -:10013800180E04010401766501D001D0F6D71D0E12 -:1001480004010401766101D001D0EFD70401876F63 -:10015800050E126E040187513BD1030E0401040100 -:10016800766501D001D0E1D7090E0401040176615A -:1001780001D001D0DAD70401876F070E126E04018F -:10018800875126D1156601D001D02DD0010E04016A -:100198000401766501D001D00ED0050E04010401DA -:1001A800766101D001D007D00401876F010E156E6A -:1001B800040187510DD1040E04010401766501D0B4 -:1001C80001D00ED0080E04010401766101D001D0DF -:1001D80007D00401876F020E156E04018751F8D00D -:1001E80065EC1DF0F5D01504D8A401D001D023D0BA -:1001F800040E04010401766501D001D096D7080EDB -:1002080004010401766101D001D08FD70401876F02 -:10021800000E156E0401875104010401464B472B5B -:100228000401D89004015C3704015D3704015E378E -:1002380004015F37CDD01550020AD8A401D001D0EF -:1002480027D0010E04010401766501D001D06DD7D5 -:10025800050E04010401766101D001D066D70401BE -:10026800876F000E156E0401875104010401464B87 -:10027800472B040104015C5113120401D8900401B6 -:100288005C3704015D3704015E3704015F37A0D095 -:1002980065EC1DF09DD0156601D001D02DD0030E60 -:1002A80004010401766501D001D00ED0090E0401C5 -:1002B8000401766101D001D007D00401876F010ED7 -:1002C800156E0401875184D0080E04010401766577 -:1002D80001D001D00ED0100E04010401766101D0C6 -:1002E80001D007D00401876F020E156E04018751F3 -:1002F8006FD065EC1DF06CD01504D8A401D001D0E6 -:1003080023D0080E04010401766501D001D00DD771 -:10031800100E04010401766101D001D006D7040152 -:10032800876F000E156E0401875104010401464BC6 -:10033800472B0401D89004015C3704015D370401A0 -:100348005E3704015F3744D01550020AD8A401D0A3 -:1003580001D027D0030E04010401766501D001D035 -:10036800E4D6090E04010401766101D001D0DDD67E -:100378000401876F000E156E040187510401040102 -:10038800464B472B040104015C5113120401D89019 -:1003980004015C3704015D3704015E3704015F37EF -:1003A80017D065EC1DF014D01250000A01E177D681 -:1003B800010A01E190D6020A01E1E4D6070A01E147 -:1003C800B7D6010A01E1C9D6020A01E164D700D013 -:1003D800040104014651080A4711D8A401D001D0EC -:1003E8004DD0042A050E046001D001D033D013503B -:1003F8001A241A6E000E1B201B6E000E1C201C6E89 -:10040800000E1D201D6E040E046001D001D010D016 -:100418001AC088F41BC089F41CC08AF40401876BD5 -:1004280087C41AF088C41BF089C41CF08AC41DF064 -:1004380013502424246E000E2520256E000E26203D -:10044800266E000E2720276E0401876F000E136E9C -:1004580004018751000E04010401466F000E0401D7 -:10046800476F010E040104015C6F000E04015D6F0B -:10047800000E04015E6F000E04015F6F1250030A44 -:10048800D8A401D001D04ED00450040AD8A401D079 -:1004980001D048D01AC077F41BC078F41CC079F496 -:1004A8001DC07AF465EC1DF0D7EC1FF0C70E0401EF -:1004B8000401966F790E0401976F850E04010401FB -:1004C800946F790E0401956FA8EC1FF0500E04018B -:1004D8000401966F790E0401976FC10E040104019F -:1004E800946F790E0401956FA8EC1FF077C496F409 -:1004F80078C497F479C498F47AC499F4DD0E0401A9 -:100508000401946F790E0401956F1FEC15F0040136 -:10051800876F010E04010401946F04018751C9EC2F -:100528001FF0A4D01250070AD8A401D001D09DD042 -:100538000450050AD8A401D001D097D01350040163 -:1005480004017B6F04017C6B04017D6B04017E6BED -:1005580024C07FF425C080F426C081F427C082F42B -:100568001AC083F41BC084F41CC085F41DC086F433 -:1005780065EC1DF0040104017B51040104017F2591 -:100588000401876F040104017C51040104018021E6 -:100598000401886F040104017D51040104018121D3 -:1005A8000401896F040104017E51040104018221C0 -:1005B80004018A6FFF0E0401871504018B6F000E7A -:1005C8000401881504018C6F000E040189150401CB -:1005D8008D6F000E04018A1504018E6F04018B05CE -:1005E8008C118D118E11D8B401D001D001D03ED01C -:1005F800D7EC1FF0C70E04010401966F790E0401B1 -:10060800976F850E04010401946F790E0401956FAC -:10061800A8EC1FF0340E04010401966F790E040152 -:10062800976FC10E04010401946F790E0401956F50 -:10063800A8EC1FF083C496F484C497F485C498F496 -:1006480086C499F4DD0E04010401946F790E040147 -:10065800956F1FEC15F00401876F010E040104016A -:10066800946F04018751C9EC1FF000D012000401F7 -:1006780004017551D8B401D001D004D0040104019B -:10068800762B03D0040104017607C9D1050E0401B5 -:100698000401766501D001D009D00C0E04010401D3 -:1006A800766101D001D002D0162AC7D10D0E0401FF -:1006B8000401766501D001D019D0160E0401040199 -:1006C800766101D001D012D0140E166401D001D089 -:1006D8000DD00401776F010E0B6E040177510401F0 -:1006E800776F030E166E04017751A7D1D5EC1EF073 -:1006F800A4D10D0E04010401766501D001D0F6D70E -:10070800160E04010401766101D001D0EFD7160658 -:10071800166601D001D00AD0000E206E000E216EA0 -:100728000401776F020E0B6E0401775186D176C4EF -:100738007AF475C479F4BAEC15F079C441F47AC442 -:1007480042F4040104014229FE0ED8B44119D8A488 -:1007580001D001D003D0D5EC1EF06FD10401040103 -:100768004129D8B44229D8A401D001D001D065D1FB -:1007780021502010D8A401D001D006D004010401D2 -:100788004151216E206A7AD004010401415120129E -:10079800040104014251211228D00401776F070E89 -:1007A800040104016E6F040177515CD00401776F76 -:1007B800050E040104016E6F0401775153D0040142 -:1007C800776F080E040104016E6F040177514AD057 -:1007D8000401776F090E040104016E6F040177515B -:1007E80041D0040104016E693DD020C077F421C0D6 -:1007F80078F427D004017751840AE1E0100ADFE099 -:10080800F0D704017751140ADAE0EBD704017751E5 -:10081800100AC3E0E6D704017751600AD9E0E1D7AE -:1008280004017751440AC2E0DCD704017751740A05 -:10083800BDE0D7D704017751240AAFE0900AADE0B4 -:10084800D0D704017851190AD5E0300ADAE0040A51 -:10085800DDE0700AE0E0950AE3E0100AE6E0200A2D -:10086800E9E0BFD70401776F030E0B6E04017751DF -:100878000401776F000E066E04017751DED076C44E -:100888007AF475C479F4BAEC15F079C441F47AC4F1 -:1008980042F4040104014229FE0ED8B44119D8A437 -:1008A80001D001D038D0040104016EAF01D001D0CD -:1008B8001DD704010401756701D001D017D7D8905E -:1008C8000401040144310401786F04010401433137 -:1008D8000401776F380E0401775D000E7859D8A0AF -:1008E80001D001D003D71E0E04010401766501D0A2 -:1008F80001D0FCD60401776F000E040104016E6F6D -:1009080004017751000E04010401416F000E040137 -:10091800426F00D00DD0040104014129D8B4422906 -:10092800D8A401D001D001D088D0040104016E07F9 -:100938000401300E0624E96EEA6A0401040EEA2274 -:10094800040141C4EFFF062A040104016E6701D0C7 -:1009580001D057D0D5EC1EF0D7EC1FF0AD0E040136 -:100968000401966F790E0401976FCD0E04010401FE -:10097800946F790E0401956FA8EC1FF0A60E040180 -:100988000401966F790E0401976F850E0401040126 -:10099800946F790E0401956FA8EC1FF0040120C034 -:1009A80096F4040121C097F404010401986B040132 -:1009B800996BC10E04010401946F790E0401956FBF -:1009C8001FEC15F006C08EF40401300E040104017A -:1009D8008C6F0401040E04018D6FDD0E0401040107 -:1009E8008A6F790E04018B6F32EC16F00401776F71 -:1009F800010E04010401946F04017751C9EC1FF042 -:100A08001CD0910E04010401435D010E04014459F8 -:100A1800D8A001D001D08AD6D5EC1EF00ED00B504C -:100A2800000A01E133D6010A01E163D6030A01E1B4 -:100A38007ED6010A01E123D700D01200000E04017E -:100A480004017C6F000E04017D6F000E04017E6FAF -:100A5800000E04017F6F0401770E040104019D6FED -:100A68000401040E04019E6F0401750E04010401C3 -:100A78009B6F0401040E04019C6F0BEC1EF0040133 -:100A8800770E04010401966F0401040E0401976FA8 -:100A98000401750E04010401946F0401040E04019D -:100AA800956FE2EC17F0010E04010401786F000E57 -:100AB8000401796F000E04017A6F000E04017B6F48 -:100AC800000E04010401806F000E0401816F04010F -:100AD80004018151800A800F200ED8B4805DD8A00F -:100AE80001D001D001D070D00401770E04010401B7 -:100AF800966F0401040E0401976F0401750E04013A -:100B08000401946F0401040E0401956FE2EC17F0E0 -:100B180004010401826F0401770E04010401966F39 -:100B28000401040E0401976F0401750E0401040109 -:100B3800946F0401040E0401956FE2EC17F00401B0 -:100B48000401836F1CD026D00401040178510401EC -:100B580004017C13040104017951040104017D138B -:100B6800040104017A51040104017E130401040103 -:100B78007B51040104017F130DD0000E2CD183C4D6 -:100B880095F482C494F48FEC1EF0000ADCE0010AAC -:100B9800DBE0F3D70401D8900401783704017937F2 -:100BA80004017A3704017B3704010401804B812B4F -:100BB800040104018151800A800F200ED8B4805DA1 -:100BC800D8A001D001D090D704017CC484F40401DA -:100BD8007DC485F404017EC486F404017FC487F4CF -:100BE8000401841F851F861F871F110E06D0D89009 -:100BF80004018733863385338433E82EF8D7FF0E14 -:100C0800040184150401886F000E04018515040190 -:100C1800896F000E0401861504018A6F000E040115 -:100C2800871504018B6F04017CC48CF404017DC416 -:100C38008DF404017EC48EF404017FC48FF4190E70 -:100C480006D0D89004018F338E338D338C33E82E41 -:100C5800F8D7FF0E04018C150401906F000E0401F3 -:100C68008D150401916F000E04018E150401926F19 -:100C7800000E04018F150401936F04018B510401C8 -:100C880093190EE104018A510401921909E1040142 -:100C980089510401911904E1040188510401901952 -:100CA800D8B401D001D002D0000E95D0FF0E0401B7 -:100CB8007CC484F404017DC485F404017EC486F4F4 -:100CC80004017FC487F40401841F851F861F871FC2 -:100CD800040184150401886F000E040185150401C0 -:100CE800896F000E0401861504018A6F000E040145 -:100CF800871504018B6FFF0E04017CC48CF404017A -:100D08007DC48DF404017EC48EF404017FC48FF485 -:100D18008DC48CF48EC48DF48FC48EF404018F6B53 -:100D280004018C150401906F000E04018D15040157 -:100D3800916F000E04018E150401926F000E0401DC -:100D48008F150401936F04018B51040193190EE16F -:100D580004018A510401921909E10401895104012D -:100D6800911904E10401885104019019D8B401D003 -:100D780001D002D0000E2FD0D7EC1FF0F00E0401E6 -:100D88000401966F790E0401976F850E0401040122 -:100D9800946F790E0401956FA8EC1FF07CC496F44B -:100DA8007DC497F47EC498F47FC499F4DD0E0401E1 -:100DB8000401946F790E0401956F1FEC15F004017E -:100DC800846F020E04010401946F04018451C9EC7C -:100DD8001FF0010E00D012000401A30E040104014B -:100DE800AA6F0401040E0401AB6F96D1040104013B -:100DF800A951250AD8B401D001D005D0A9C4B2F4AC -:100E080034EC1FF089D10401B06F000E0401040115 -:100E1800A86F0401B05160D092D104010401A88FD9 -:100E280076D00401AAC4E9FF0401ABC4EAFF0401B7 -:100E3800020E0401AA27000E0401AB230401EECF21 -:100E4800ACF40401EDCFADF404010401AD51AC11D3 -:100E5800D8A401D001D007D09F0E04010401AC6FC3 -:100E6800790E0401AD6F1BD004010401AC51F66E7C -:100E7800E96E050EEA6E04010401AD51EA6403D07F -:100E8800EA6EEF5003D0F76E0800F5500401040134 -:100E9800B26F34EC1FF004010401AC4BAD2B04011C -:100EA8000401AC51F66EE96E050EEA6E0401040108 -:100EB800AD51EA6403D0EA6EEF5003D0F76E080034 -:100EC800F5500009D8A401D001D0CED725D1C00E45 -:100ED80004010401A8131BD00401A1C4F6FF0401F6 -:100EE800A2C4F7FF04010401A14BA22B08000401CE -:100EF800F5CFA9F40401A951000A8EE0580A8DE043 -:100F08002B0A8FE0060AE3E00D0A87E0DFD7040129 -:100F1800AAC4E9FF0401ABC4EAFF0401020E0401FC -:100F2800AA27000E0401AB230401EECFACF40401A0 -:100F3800EDCFADF478D00401B06F010E04010401C7 -:100F4800A96F0401B05104010401A951050AD8A4EC -:100F580001D001D001D02AD004010401A951020D09 -:100F6800FA0EF324F66EF76A780EF7220900F5CF29 -:100F7800B0F40900F5CFB1F40401B0510401040143 -:100F8800AC5D0401B15104010401AD59D8B001D0E0 -:100F980001D001D00BD004010401A92B04010401E4 -:100FA800A951050AD8A401D001D0D6D745D004014B -:100FB800B06F010E04010401A96F0401B0510401CE -:100FC8000401A951040AD8A401D001D001D0EED758 -:100FD80004010401A951020D040EF324F66EF76A08 -:100FE800790EF7220900F5CFB0F40900F5CFB1F476 -:100FF8000401B05104010401AC5D0401B1510401C4 -:101008000401AD59D8B001D001D001D0CFD7040127 -:101018000401A92B04010401A951040AD8A401D090 -:1010280001D0D6D709D004010401A851C00B800A09 -:10103800BEE0400A80E000D0A9C4A7F464D056D02E -:1010480004010401A751020DFA0EF324F66EF76AA3 -:10105800780EF72209000401F5CFB4F40A00040160 -:10106800F5CFB5F4ACC4B2F4ADC4B3F444EC18F0A5 -:10107800B2C4B2F4B3C4B3F40A0E04010401B46FE9 -:10108800000E0401B56FF8EC1AF004010401B25126 -:10109800300F04010401A96F32D004010401A751E3 -:1010A800020D040EF324F66EF76A790EF722090092 -:1010B8000401F5CFB4F40A000401F5CFB5F4ACC4CB -:1010C800B2F4ADC4B3F444EC18F00F0E04010401FB -:1010D800B217230E04010401B225F66EF76A790EE1 -:1010E800F72208000401F5CFA9F409D0040104018E -:1010F800A851C00B800AD1E0400AA2E000D0A9C4E0 -:10110800B2F434EC1FF004010401A7070401A72975 -:10111800D8A401D001D093D70401A1C4F6FF0401DB -:10112800A2C4F7FF04010401A14BA22B080004018B -:10113800F5CFA9F40401A96701D001D057D600D092 -:101148001200000E04010401806F000E0401816F7B -:10115800000E0401826F000E0401836F010E04016A -:1011680004017C6F000E04017D6F000E04017E6F88 -:10117800000E04017F6F000E04010401786F000E59 -:101188000401796F000E040104017A6F000E040156 -:101198007B6F0401770E040104019D6F0401040EA6 -:1011A80004019E6F0401750E040104019B6F040184 -:1011B800040E04019C6F0BEC1EF00401770E040171 -:1011C8000401966F0401040E0401976F0401750E63 -:1011D80004010401946F0401040E0401956FE2EC0C -:1011E80017F0040104017B51800A800F240ED8B443 -:1011F8007A5DD8A001D001D001D018D10401770EB2 -:1012080004010401966F0401040E0401976F0401A0 -:10121800750E04010401946F0401040E0401956F16 -:10122800E2EC17F004010401846F0401770E040155 -:101238000401966F0401040E0401976F0401750EF2 -:1012480004010401946F0401040E0401956FE2EC9B -:1012580017F004010401856F0401770E04010401ED -:10126800966F0401040E0401976F0401750E0401C2 -:101278000401946F0401040E0401956FE2EC17F069 -:1012880004010401866F0401770E04010401966FBE -:101298000401040E0401976F0401750E0401040192 -:1012A800946F0401040E0401956FE2EC17F0040139 -:1012B8000401876F7CD0040104017B51800A800FF0 -:1012C800200ED8B47A5DD8A001D001D01AD004017C -:1012D80080C488F4040181C489F4040182C48AF4B6 -:1012E800040183C48BF4D89004018B338A33893387 -:1012F800883388C480F489C481F48AC482F48BC496 -:1013080083F465D0040104017B51800A800F200E0C -:10131800D8B47A5DD8A001D001D01AD0040180C415 -:1013280088F4040181C489F4040182C48AF40401A4 -:1013380083C48BF4D89004018B338A338933883380 -:1013480088C480F489C481F48AC482F48BC483F489 -:10135800040104017C510401040180130401040107 -:101368007D51040104018113040104017E5104012B -:1013780004018213040104017F5104010401831351 -:1013880026D0040104017B51800A800F1F0ED8B4B7 -:101398007A5DD8A001D001D008D0010E0401040163 -:1013A800786F000E0401796F12D0000E7ED087C4CA -:1013B8008FF486C48EF485C48DF484C48CF46BECED -:1013C8001CF0000A01E177D7010A9CE0DAD7040192 -:1013D800040179517811D8B401D001D001D026D0B8 -:1013E800040104017B51800A800F1F0ED8B47A5D76 -:1013F800D8B001D001D00AD00401D89004017C37BC -:1014080004017D3704017E3704017F37040104019C -:101418007A4B7B2B040104017B51800A800F240E38 -:10142800D8B47A5DD8A001D001D0E8D6D7EC1FF0A7 -:10143800970E04010401966F790E0401976F850ECB -:1014480004010401946F790E0401956FA8EC1FF054 -:10145800500E04010401966F790E0401976FC10EB6 -:1014680004010401946F790E0401956FA8EC1FF034 -:1014780080C496F481C497F482C498F483C499F420 -:10148800DD0E04010401946F790E0401956F1FECC1 -:1014980015F00401886F020E04010401946F040121 -:1014A8008851C9EC1FF0010E00D012000401746FBE -:1014B800000E04010401706F04017451E2D06CC481 -:1014C8009DF418C09BF419C09CF467EC1EF0D8A0DA -:1014D80001D001D04AD0960E040104013D6501D027 -:1014E80001D006D018C068F419C069F46CC46DF452 -:1014F800040104013D51D8B401D001D024D03DC429 -:1015080076F40401746F000E04010401756F040180 -:101518007451DBEC0EF03DC476F40401746F000ED8 -:1015280004010401756F040174513BEC03F03DC4E0 -:1015380076F40401746F000E04010401756F040150 -:10154800745152EC00F0040104013C2B0401746F47 -:10155800000E040104013D6F040174510401746F0D -:10156800000E176E0401745142D0040104013D6756 -:1015780001D001D006D018C066F419C067F46CC455 -:101588003BF4040104013C51D8B401D001D024D06B -:101598003CC476F40401746F010E04010401756FF4 -:1015A80004017451DBEC0EF03CC476F40401746F52 -:1015B800010E04010401756F040174513BEC03F042 -:1015C8003CC476F40401746F010E04010401756FC4 -:1015D8000401745152EC00F0040104013D2B040194 -:1015E800746F000E040104013C6F0401745104017E -:1015F800D8906C33040104016C6701D001D015D078 -:101608000401746F800E040104016C6F04017451AD -:10161800184A192A1950020A1810D8A401D001D062 -:1016280004D0000E186E000E196E19500401040142 -:10163800691904E11850040104016819D8A401D0FB -:1016480001D00ED0040104016C51040104016D6342 -:1016580001D001D005D00401040168690401696959 -:10166800040104013D51960AD8A401D001D009D043 -:101678000401746F010E04010401706F04017451B8 -:101688000DD0040104014051191804E104010401BA -:101698003F511818D8A401D001D011D70401040172 -:1016A800706701D001D001D0A2D01750D8B401D0B2 -:1016B80001D001D09CD066C477F467C478F468C4BC -:1016C80075F469C476F4AAEC19F075C472F476C49A -:1016D80073F40401040173BF01D001D00DD00401DB -:1016E80004017351800A800F320ED8B4725DD8B0ED -:1016F80001D001D001D07BD0040104017351800ACC -:10170800800F9E0ED8B4725DD8A001D001D00CD045 -:10171800040104017351800A800FA30ED8B4725DCE -:10172800D8A001D001D000D00401746F000E0401CC -:101738000401716F040174513BC477F466C475F4F5 -:1017480067C476F4A5EC08F00401040171273BC4D2 -:1017580077F466C475F467C476F425EC10F00401D8 -:10176800040171273BC477F466C475F467C476F442 -:101778007AEC0DF00401040171273BC477F466C4C8 -:1017880075F467C476F485EC12F00401040171273E -:101798003BC477F466C475F467C476F4FCEC0BF0CC -:1017A8000401040171273BC477F466C475F467C467 -:1017B80076F422EC05F00401040171270401746F2A -:1017C800010E176E04017451040104017151D8B45B -:1017D80001D001D00BD0000E186E000E196E000E4D -:1017E800040104013F6F000E0401406F00D0120095 -:1017F80004018B6F000E04010401786F04018B5102 -:10180800000E040104017D6F000E04017E6F000EBE -:1018180004017F6F000E0401806F010E04010401B2 -:10182800816F000E0401826F000E0401836F000EA9 -:101838000401846F0401770E040104019D6F040103 -:10184800040E04019E6F0401750E040104019B6FD0 -:101858000401040E04019C6F0BEC1EF00401770ECA -:1018680004010401966F0401040E0401976F04013A -:10187800750E04010401946F0401040E0401956FB0 -:10188800E2EC17F075C47BF476C47CF4040104011F -:1018980077C479F4040104017A6B000E0401040191 -:1018A800856F000E0401866F040104018651800AC9 -:1018B800800F200ED8B4855DD8A001D001D001D00A -:1018C8005AD00401770E040104018F6F0401040E3D -:1018D8000401906F0401750E040104018D6F040169 -:1018E800040E04018E6F44EC1BF004010401896F9F -:1018F800040104018951020AD8A401D001D002D000 -:10190800000EF3D0040104018951D8B401D001D0EC -:1019180018D0040104018151040104017D1304015C -:1019280004018251040104017E130401040183515E -:10193800040104017F13040104018451040104011A -:1019480080130401D890040181370401823704010F -:1019580083370401843704010401854B862B040175 -:1019680004018651800A800F200ED8B4855DD8A066 -:1019780001D001D0A6D7000E04010401876F000E24 -:101988000401886F040104018851800A800F040E45 -:10199800D8B4875DD8A001D001D001D04BD00401C4 -:1019A800770E040104018F6F0401040E0401906F87 -:1019B8000401750E040104018D6F0401040E040175 -:1019C8008E6F44EC1BF0040104018A6F04010401CA -:1019D8008A51020AD8A401D001D002D0000E85D0C5 -:1019E800040104018A51D8B401D001D013D087C4AE -:1019F8008BF4010E04018C6F04018B2B03D0D8905B -:101A080004018C3704018B2FFAD704018C5104018F -:101A18000401781304010401874B882B0401040195 -:101A28008851800A800F040ED8B4875DD8A001D0F1 -:101A380001D0B5D70401040178510C0AD8B401D0FB -:101A480001D002D0000E51D0D7EC1FF0AD0E04012A -:101A58000401966F790E0401976FCD0E04010401FD -:101A6800946F790E0401956FA8EC1FF0730E0401B2 -:101A78000401966F790E0401976F850E0401040125 -:101A8800946F790E0401956FA8EC1FF00401480EBD -:101A980004010401966F0401040E0401976FC10E3E -:101AA80004010401946F790E0401956FA8EC1FF0EE -:101AB8007DC496F47EC497F47FC498F480C499F4E6 -:101AC800DD0E04010401946F790E0401956F1FEC7B -:101AD80015F004018B6F010E04010401946F0401D9 -:101AE8008B51C9EC1FF0010E00D012000401770ED3 -:101AF800040104019D6F0401040E04019E6F04019A -:101B0800750E040104019B6F0401040E04019C6F0F -:101B18000BEC1EF00401886F000E04010401786FBD -:101B280004018851040E04010401806F000E0401B1 -:101B3800816F0401040181AF01D001D001D08AD0A6 -:101B48000401886F000E04010401846F04018851A8 -:101B5800000E04010401856F000E0401866F040164 -:101B680004018651800A800F080ED8B4855DD8A07C -:101B780001D001D001D04BD00401770E040104013B -:101B88008C6F0401040E04018D6F0401750E0401AD -:101B980004018A6F0401040E04018B6F28EC1DF008 -:101BA80004010401876F040104018751020AD8A4C3 -:101BB80001D001D002D0000EF9D0040104018751F0 -:101BC800D8B401D001D013D085C488F4010E040123 -:101BD800896F0401882B03D0D89004018937040148 -:101BE800882FFAD7040189510401040184130401E0 -:101BF8000401854B862B040104018651800A800F5D -:101C0800080ED8B4855DD8A001D001D0B5D704019D -:101C180004018051040A8111D8A401D001D002D056 -:101C280084C478F404017B0E040104018025E96E64 -:101C3800EA6A0401040EEA22040184C4EFFF0401E5 -:101C480004018007D8A081070401040181AF01D0F5 -:101C580001D076D7000E04010401796F000E04014B -:101C68007A6F000E04010401826F000E0401836F75 -:101C7800040104018351800A800F040ED8B4825DE8 -:101C8800D8A001D001D001D033D00401886F310E23 -:101C9800040104018C6F0401885104017B0E0401C6 -:101CA80004018225E96EEA6A0401040EEA22EF5073 -:101CB800040104018B6F79C48AF455EC1AF004010D -:101CC800896F0401895104010401796F04017A6B59 -:101CD80004010401824B832B040104018351800A0F -:101CE800800F040ED8B4825DD8A001D001D0CDD722 -:101CF800040178C488F40401896B040104017A5151 -:101D08000401891905E104010401795104018819C4 -:101D1800D8B401D001D002D0000E48D0D7EC1FF0C3 -:101D2800AD0E04010401966F790E0401976FCD0E74 -:101D380004010401946F790E0401956FA8EC1FF05B -:101D4800680E04010401966F790E0401976F850EE1 -:101D580004010401946F790E0401956FA8EC1FF03B -:101D68000401886F050E040104018E6F0401885177 -:101D780004017B0E040104018C6F0401040E0401AC -:101D88008D6FDD0E040104018A6F790E04018B6FDB -:101D980032EC16F00401886F010E04010401946FFF -:101DA80004018851C9EC1FF0010E00D01200040193 -:101DB80004017551D8B401D001D005D0030E040137 -:101DC8000401762704D0030E04010401765F2DD1A7 -:101DD8000B0E04010401766501D001D009D0170E5D -:101DE80004010401766101D001D002D0072A28D16C -:101DF800030E04010401766501D001D01CD00E0E3B -:101E080004010401766101D001D015D0190E0764D0 -:101E180001D001D00AD00401776F010E0C6E0401C5 -:101E28007751000E1E6E000E1F6E0401776F000EB4 -:101E3800076E0401775104D176C47AF475C479F435 -:101E48008FEC1BF079C422F07AC423F02328FE0E0D -:101E5800D8B42218D8A401D001D003D053EC1FF075 -:101E6800EFD02228D8B42328D8A401D001D001D09B -:101E7800E7D01F501E10D8A401D001D004D02250A2 -:101E88001F6E1E6A4DD022501E1223501F121FD0E3 -:101E98000401776F060E096E040177513F0E0401A5 -:101EA80004016A6F000E04016B6F2ED00401776F76 -:101EB800080E096E040177514F0E040104016A6F80 -:101EC800000E04016B6F20D053EC1FF0B9D01EC078 -:101ED80077F41FC078F40FD0040177514D0AE6E07B -:101EE800F3D7040177512D0AE1E0EED704017751C9 -:101EF8004C0ACEE0E9D7040178510A0AEDE0100A4D -:101F0800F0E0F00AF3E0E0D70401776F020E0C6E00 -:101F1800040177510401776F000E076E04017751B1 -:101F28008FD076C47AF475C479F48FEC1BF079C439 -:101F380022F07AC423F02328FE0ED8B42218D8A49D -:101F480001D001D003D053EC1FF07AD02228D8B4A6 -:101F58002328D8A401D001D001D072D00401280EC2 -:101F68000724E96EEA6A0401040EEA2222C0EFFFA0 -:101F7800072A0906096601D001D05DD753EC1FF086 -:101F8800D7EC1FF0AD0E04010401966F790E040121 -:101F9800976FCD0E04010401946F790E0401956FBB -:101FA800A8EC1FF0A60E04010401966F790E040137 -:101FB800976F850E04010401946F790E0401956FE3 -:101FC800A8EC1FF004011EC096F404011FC097F48A -:101FD80004010401986B0401996BC10E040104010A -:101FE800946F790E0401956F1FEC15F007C08EF4FD -:101FF8000401280E040104018C6F0401040E04017D -:102008008D6FDD0E040104018A6F790E04018B6F58 -:1020180032EC16F00401776F010E04010401946F8D -:1020280004017751C9EC1FF00BD00C50000A01E1F4 -:10203800CFD6010A01E100D7030A01E172D700D027 -:102048001200000E040104017C6F000E04017D6F74 -:10205800000E04017E6F000E04017F6F010E040163 -:102068000401786F000E0401796F000E04017A6F85 -:10207800000E04017B6F0401770E040104019D6FBB -:102088000401040E04019E6F0401750E040104018D -:102098009B6F0401040E04019C6F0BEC1EF00401FD -:1020A800770E04010401966F0401040E0401976F72 -:1020B8000401750E04010401946F0401040E040167 -:1020C800956FE2EC17F0000E04010401806F000E1A -:1020D8000401816F040104018151800A800F0C0EF4 -:1020E800D8B4805DD8A001D001D001D08FD0040130 -:1020F800770E04010401966F0401040E0401976F22 -:102108000401750E04010401946F0401040E040116 -:10211800956FE2EC17F004010401826F0401770E59 -:1021280004010401966F0401040E0401976F040171 -:10213800750E04010401946F0401040E0401956FE7 -:10214800E2EC17F004010401836F0401770E040127 -:102158000401966F0401040E0401976F0401750EC3 -:1021680004010401946F0401040E0401956FE2EC6C -:1021780017F004010401846F0401770E04010401BF -:10218800966F0401040E0401976F0401750E040193 -:102198000401946F0401040E0401956FE2EC17F03A -:1021A80004010401856F0401D89004017C370401FF -:1021B8007D3704017E3704017F3707D017D004012B -:1021C80004017C8113D0000E6BD085C48AF484C4CA -:1021D80089F483C488F482C487F4AAEC1CF0000A4A -:1021E800EDE0010AECE0030AEEE000D0040104018E -:1021F800804B812B040104018151800A800F0C0E51 -:10220800D8B4805DD8A001D001D071D704017F5126 -:102218007C117D117E11D8A401D001D002D0000E0E -:102228003FD0D7EC1FF0970E04010401966F790E8A -:102238000401976F850E04010401946F790E04015F -:10224800956FA8EC1FF05D0E04010401966F790EDE -:102258000401976FC10E04010401946F790E040103 -:10226800956FA8EC1FF07CC496F47DC497F47EC4E7 -:1022780098F47FC499F4DD0E04010401946F790E7B -:102288000401956F1FEC15F00401866F020E04011E -:102298000401946F04018651C9EC1FF0010E00D0AF -:1022A80012000401746F0B0E04010401716F040124 -:1022B80074510401746F0A0E04010401726F040161 -:1022C8007451010E040104017A6F000E04017B6F42 -:1022D800FC0E04010401786F790E0401796F280E51 -:1022E80004010401766F020E0401776F00EC1AF006 -:1022F800040177517611D8A401D001D011D00C0E69 -:1023080004010401A36F000E0401A46F7E0E0401F2 -:102318000401A16F790E0401A26FF0EC06F0F0D071 -:10232800010E040104017A6F000E04017B6FFA0E9E -:1023380004010401786F790E0401796F280E0401F5 -:102348000401766F020E0401776F00EC1AF00401A5 -:1023580077517611D8A401D001D00AD0D30E040148 -:102368000401A16F790E0401A26FF0EC06F0C8D049 -:102378000401746F000E04010401736F04017451A9 -:102388000401746F000E04010401706F040174519C -:10239800B0D098D0040173C474F40401756B010EB5 -:1023A80004017427000E7523280E04017425E96EB4 -:1023B800020E04017521EA6EEF5004010401716FE9 -:1023C80004010401732B92D0040173C474F4040152 -:1023D800756B010E04017427000E7523280E040185 -:1023E8007425E96E020E04017521EA6EEF500401AE -:1023F8000401726F04010401732B78D072C479F45C -:1024080071C478F4010E0401040173250401040168 -:10241800766F0401776B000E04017723FAEC18F04D -:102428000401746F010E04010401706F04017451FA -:10243800E20E04010401A16F790E0401A26FF0EC11 -:1024480006F054D072C479F471C478F4010E040112 -:102458000401732504010401766F0401776B000EF3 -:102468000401772352EC19F00401746F010E040182 -:102478000401706F04017451E70E04010401A16F97 -:10248800790E0401A26FF0EC06F030D0280E04019A -:1024980004017325E96EEA6A020EEA22EF5004018C -:1024A800746F0401745104010401A36F0401A46B47 -:1024B8000C0E04010401A16F790E0401A26FF0EC67 -:1024C80006F01ED0280E040104017325E96EEA6A9D -:1024D800020EEA22EF50500A01E15CD7020A01E13C -:1024E80073D7010A8BE0070AADE0D0D704010401D5 -:1024F800732B040104017051D8B401D001D049D71D -:102508001200000E04010401786F000E0401796FB7 -:10251800000E04017A6F000E04017B6F010E0401A6 -:1025280004017C6F000E04017D6F000E04017E6FB4 -:10253800000E04017F6F0401770E040104019D6FF2 -:102548000401040E04019E6F0401750E04010401C8 -:102558009B6F0401040E04019C6F0BEC1EF0000E2F -:1025680004010401806F000E0401816F040104015D -:102578008151800A800F180ED8B4805DD8A001D090 -:1025880001D001D0A2D00401770E04010401966F96 -:102598000401040E0401976F0401750E040104017F -:1025A800946F0401040E0401956FE2EC17F0040126 -:1025B8000401826F0401770E04010401966F04017F -:1025C800040E0401976F0401750E04010401946F51 -:1025D8000401040E0401956FE2EC17F004010401F4 -:1025E800836F0401770E04010401966F0401040E41 -:1025F8000401976F0401750E04010401946F04012E -:10260800040E0401956FE2EC17F004010401846FD5 -:102618000401770E04010401966F0401040E0401FD -:10262800976F0401750E04010401946F0401040EF0 -:102638000401956FE2EC17F004010401856F1CD0CA -:102648002AD0040104017C51040104017813040117 -:1026580004017D51040104017913040104017E5130 -:10266800040104017A13040104017F5104010401E7 -:102678007B1311D0000E58D085C48AF484C489F421 -:1026880083C488F482C487F4E9EC1CF0000AD8E01B -:10269800010AD7E0EFD70401D89004017C37040180 -:1026A8007D3704017E3704017F3704010401804B24 -:1026B800812B040104018151800A800F180ED8B4BF -:1026C800805DD8A001D001D05ED7D7EC1FF0430EB3 -:1026D80004010401966F790E0401976F850E0401B9 -:1026E8000401946F790E0401956FA8EC1FF078C46B -:1026F80096F479C497F47AC498F47BC499F4DD0EFF -:1027080004010401946F790E0401956F1FEC15F014 -:102718000401866F020E04010401946F04018651BE -:10272800C9EC1FF0010E00D0120004018B6F000EDF -:1027380004010401886F04018B51030E0401040194 -:10274800886501D001D001D023D00401040188514B -:10275800040104017E25E96E0401000E0401040150 -:102768007F21EA6E0401840E040104018825E16ECC -:10277800E26A0401040EE222EFCFE7FF040104013C -:10278800882B030E04010401886501D001D0DDD730 -:10279800050E040104017E2504018B6F000E04015F -:1027A80004017F2104018C6F8BC482F48CC483F4F0 -:1027B8000096000E116E0094040100EE04F004016E -:1027C8007E51E92604017F51EA22EF5004010401F9 -:1027D800816F04010401816701D001D001D081D04B -:1027E80004010401816701D001D001D072D082C4F4 -:1027F800E9FF83C4EAFFEF5004010401806F04017C -:102808008B6F000E04010401896F04018B51030EC4 -:1028180004010401896501D001D001D050D080C4E1 -:102828008BF4C00E04018B17060E04018C6FD89030 -:1028380004018B3304018C2FFAD704018B51040156 -:1028480004018A6F0401840E040104018A25E96EDB -:10285800EA6A0401040EEA22010EEF6201D001D0F7 -:1028680002D0008613D00401840E040104018A25D5 -:10287800E96EEA6A0401040EEA22EF500D6EB18097 -:1028880000D000A401D001D0FCD700940401D89056 -:102898008037D890803704010401810704010401BE -:1028A800816701D001D001D00AD004010401892B2D -:1028B800030E04010401896501D001D0B0D70401D9 -:1028C8000401824B832B04010401816701D001D0EC -:1028D8008ED7009400D000A401D001D0FCD7B190CD -:1028E80089981200026601D001D017D0030E0401A6 -:1028F80004017E6501D001D007D00D0E040104014A -:102908007E6501D001D002D0FE0E94D004017F6F05 -:10291800010E026E04017F518BD00204D8A401D0AD -:1029280001D039D00B0E040104017E6501D001D01D -:1029380007D0160E040104017E6501D001D01BD01A -:102948000FC07FF40401806B040104016B51040182 -:10295800801905E1040104016A5104017F19D8B402 -:1029680001D001D008D004017F6F000E026E04016F -:102978007F51FE0E5FD00090040104017DA101D0BB -:10298800008004017F6F020E026E04017F51000E69 -:1029980000B0010E4FD00250020AD8A401D001D0D5 -:1029A80047D0040104017D51D8B401D001D015D01D -:1029B800030E040104017E6501D001D00ED00E0E75 -:1029C800040104017E6101D001D007D004017F6FAA -:1029D800000E026E04017F5129D00B0E0401040180 -:1029E8007E6501D001D00ED0170E040104017E616E -:1029F80001D001D007D004017F6F010E026E0401DF -:102A08007F5114D0030E040104017E6501D001D06A -:102A18000DD00E0E040104017E6101D001D006D054 -:102A280004017F6F000E026E04017F51FF0E02D079 -:102A3800FF0E00D0120094C4A3F495C4A4F4BB0EF6 -:102A480004010401A16F790E0401A26FF0EC06F0F5 -:102A580004019951961197119811D8A401D001D069 -:102A68000AD0F20E04010401A16F790E0401A26FCD -:102A7800F0EC06F071D004019D6F010E0401040111 -:102A88009A6F04019D5104019D6F000E0401040119 -:102A98009B6F04019D51070E040104019B6501D041 -:102AA80001D001D059D0040196C49DF4040197C403 -:102AB8009EF4040198C49FF4040199C4A0F41D0E67 -:102AC80006D0D8900401A0339F339E339D33E82E5F -:102AD800F8D704019D510F0B040104019C6F0401F8 -:102AE80004019C6701D001D008D0040104019A05B3 -:102AF800D8A401D001D001D018D0040104019CC48D -:102B0800A3F404010401A46BDA0E04010401A16F0B -:102B1800790E0401A26FF0EC06F004019D6F000E1F -:102B2800040104019A6F04019D510401040ED89018 -:102B3800040196370401973704019837040199373F -:102B4800E82EF5D7040104019B2B070E04010401AC -:102B58009B6501D001D0A7D7950E04010401A16F90 -:102B6800790E0401A26FF0EC06F012007AC47FF42B -:102B780079C47EF423EC1CF0040104017B6F056624 -:102B880001D001D006D004017C6F000E0A6E04014A -:102B98007C51040104017B51FE0AD8A401D001D064 -:102BA80008D0FE0E04010401796FFF0E04017A6F4C -:102BB80054D0040104017B29D8A401D001D006D047 -:102BC80004010401796904017A6947D01450040AA0 -:102BD800D8A401D001D009D00A3AF00E0A1604018F -:102BE8007C6F000E146E04017C51040104017B51BA -:102BF800D8B401D001D011D014C07CF4010E040166 -:102C08007D6F04017C2B03D0D89004017D3704012B -:102C18007C2FFAD704017D510A12052A142A080EBE -:102C2800056001D001D006D00401040179690401CE -:102C38007A6913D004017C6F000E056E04017C5183 -:102C480004017C6F000E146E04017C5104010AC05B -:102C580079F4040104017A6B00D012008AC4A3F449 -:102C68008BC4A4F4EC0E04010401A16F790E0401D5 -:102C7800A26FF0EC06F00401906F000E040104014D -:102C88008F6F04019051040104018E510401040165 -:102C98008F5DD8A001D001D001D04BD00401040130 -:102CA8008F51040104018C25E96E0401000E040112 -:102CB80004018D21EA6EEF500401906F0F0E04019C -:102CC80090170401905104010401A56F0401A66B3B -:102CD800040104018F51040104018C25E96E0401EB -:102CE800000E040104018D21EA6EEF500401916F7A -:102CF8000401913B0F0E9117040191510401040145 -:102D0800A36F0401A46BD80E04010401A16F790E0E -:102D18000401A26FF0EC06F0040104018F2B0401FA -:102D280004018E51040104018F5DD8A001D001D0A7 -:102D3800B5D7950E04010401A16F790E0401A26FA5 -:102D4800F0EC06F012000401D8903A3704010401AF -:102D5800D951D8B401D001D01BD004010401392BBA -:102D6800040104013951030AD8A401D001D005D0C7 -:102D7800070E040104013A130AD0030E04010401EA -:102D8800396501D001D003D0040104013A8108D08B -:102D98000401DA6F000E04010401396F0401DA51ED -:102DA8000401D8904537040104013E2B04010401B5 -:102DB8003AAF01D001D004D004010401458100D00C -:102DC800040104013E51080AD8A401D001D029D039 -:102DD8000401DA6F000E040104013E6F0401DA51A8 -:102DE800280E040104013F25E96E000E04010401C8 -:102DF8004021EA6E040145C4EFFF040104013F4B82 -:102E0800402B040104014051020A3F11D8A401D00B -:102E180001D007D0000E040104013F6F000E040129 -:102E2800406F1200040104016251D8B401D001D0EE -:102E380024D00401040161510401040160277E0EBD -:102E480004010401606501D001D004D0040104012B -:102E5800616911D004010401606701D001D00BD071 -:102E68000401CA6F010E04010401616F0401CA5113 -:102E780004010401620760C4BEFF04010401655136 -:102E8800D8B401D001D024D0040104016451040154 -:102E9800040163277E0E04010401636501D001D09B -:102EA80004D004010401646911D0040104016367BA -:102EB80001D001D00BD00401CA6F010E0401040136 -:102EC800646F0401CA5104010401650763C4BBFFB0 -:102ED80004010401626701D001D002D0000EBE6E69 -:102EE80004010401656701D001D002D0000EBB6E59 -:102EF80012000096000E116E00947EC4E9FF7FC494 -:102F0800EAFFEF500D6EB18000D000A401D001D0CF -:102F1800FCD79D92010E04010401806F000E04018C -:102F2800816F2FD0040104018051040104017E2522 -:102F3800E96E040104018151040104017F21EA6E54 -:102F4800010EEF6201D001D002D0008616D00094A5 -:102F5800040104018051040104017E25E96E040185 -:102F680004018151040104017F21EA6EEF500D6EC6 -:102F780000D000A401D001D0FCD704010401804B8B -:102F8800812B040104018051040104017E25E96EAE -:102F9800040104018151040104017F21EA6EEF500C -:102FA800D8A401D001D0BED79D82009400D000A43F -:102FB80001D001D0FCD7B1908998120004019A6F12 -:102FC800000E04010401996F04019A5196C4E9FFA7 -:102FD80097C4EAFFEF50040104019D6F94C4E9FF10 -:102FE80095C4EAFF0401EECF9BF40401EDCF9CF4F5 -:102FF80067EC1EF0D8B001D002D0010E01D0000E4F -:1030080004010401986F04010401992B96C49DF4EE -:1030180097C49EF494C49BF495C49CF40BEC1EF0E6 -:1030280096C4E9FF97C4EAFFEF50040104019D6FBD -:1030380094C4E9FF95C4EAFF0401EECF9BF40401B0 -:10304800EDCF9CF467EC1EF0D8B001D002D0010E91 -:1030580001D0000E040104019819D8B401D001D0A0 -:1030680004D00401040199510AD0040104019929EA -:10307800D8A401D001D002D0000E01D0C4D71200CC -:10308800000E04010401B76F000E0401B86F0401BB -:103098000401B551B411D8B401D001D047D004010E -:1030A800B96F010E04010401B66F0401B95109D0CA -:1030B8000401D8900401B4370401B53704010401B0 -:1030C800B62B04010401B5AF01D001D0F1D704013A -:1030D800D8900401B7370401B83704010401B4518A -:1030E80004010401B25D04010401B55104010401A5 -:1030F800B359D8A001D001D00FD004010401B451B4 -:1031080004010401B25F04010401B5510401040182 -:10311800B35B04010401B7810401D8900401B533FD -:103128000401B43304010401B62FD1D7B7C4B2F4F3 -:10313800B8C4B3F400D01200000EAB6EAB8EAB88EF -:10314800AC90AC8AAC94B896948E949C06D004014A -:10315800AECF70F404010401716B9EBA01D001D0A6 -:10316800F6D70401726F400EAF6E040172519F9A38 -:103178009F98F28C9D8A9D98CD909E90000ECF6E60 -:10318800000ECE6ECD9ACD98CD92000E04010401AA -:10319800776F020E0401786F000E04010401756F49 -:1031A800000E0401766F280E04010401736F020EED -:1031B8000401746F15EC1FF0000E04010401776F11 -:1031C800010E0401786F2D0E04010401756F000EC5 -:1031D8000401766F0501000E04010401736F0501F7 -:1031E800050E0401746F15EC1FF01200F4EC1FF0CB -:1031F80004017C6F000E040104017A6F04017C5104 -:1032080040D004017C6F020E040104017E6F0401AA -:103218007C51FEEC1FF0280E04017C6F020E7D6FBE -:1032280004010401765104017C270401040177514B -:1032380004017D237CC47EF47DC47FF47DEC17F00B -:1032480004017C6F000E040104017B6F04017C51B2 -:103258000BD00D0E04017C6FF90EE82EFED77C2FE3 -:10326800FCD7040104017B2B0401040178510401FB -:1032780004017B5DD8A001D001D0EBD70401040183 -:103288007A2B040104017951040104017A5DD8A064 -:1032980001D001D0B6D7EAEC1FF01200F4EC1FF011 -:1032A80004017C6F000E040104017A6F04017C5153 -:1032B80040D004017C6F020E040104017E6F0401FA -:1032C8007C51FEEC1FF0280E04017C6F020E7D6F0E -:1032D80004010401765104017C270401040177519B -:1032E80004017D237CC47EF47DC47FF499EC13F043 -:1032F80004017C6F000E040104017B6F04017C5102 -:103308000BD00D0E04017C6FF90EE82EFED77C2F32 -:10331800FCD7040104017B2B04010401785104014A -:1033280004017B5DD8A001D001D0EBD704010401D2 -:103338007A2B040104017951040104017A5DD8A0B3 -:1033480001D001D0B6D7EAEC1FF012000401040145 -:103358007529D8B47629D8A401D001D006D00401A3 -:10336800040175690401766946D0040104017851A5 -:10337800800A0401796F0401755104010401775D25 -:10338800040104017651800A04017959D8A001D0BA -:1033980001D012D004010401755104010401775DC4 -:1033A80004010401756F040104017651040104014C -:1033B80078590401766F1FD0000E0401796F020E50 -:1033C8007A6F0401040175510401795F0401040155 -:1033D800765104017A5B04010401775104017925CF -:1033E80004010401756F04010401785104017A2174 -:1033F8000401766F00D012003ED076C4E9FF77C48E -:10340800EAFFEF50D8B401D001D014D0040178C439 -:10341800F6FF040179C4F7FF0800F5CF7CF476C401 -:10342800E9FF77C4EAFFEF5004017C19D8B401D052 -:1034380001D019D076C4E9FF77C4EAFFEF50040140 -:103448007C6F040178C4F6FF040179C4F7FF080013 -:10345800F55004017C5D04010401766F0401776B6B -:10346800D8A077071DD004010401764B772B0401FF -:103478000401784B792B040104017A07D8A07B0753 -:1034880004017A29D8B47B29D8A401D001D0B5D7B2 -:10349800000E04010401766F000E0401776F00D05E -:1034A8001200800E040104018F6F000E0401906F5A -:1034B8000401040190518F11D8A401D001D001D08A -:1034C80040D00401000E04018ABF010E040104016A -:1034D8008D6F04018E6B040104018B5104010401FA -:1034E8008F150009D8B401D001D00CD00401040113 -:1034F8008E518D11000ED8B4010E040104018D6F98 -:1035080004018E6B0401D8908A37040104018E519E -:103518008D11D8B401D001D006D0040104018C511A -:10352800040104018A1B0401D890040190330401AA -:103538008F330401040190518F11D8A401D001D018 -:10354800C0D7040104018A5100D01200FACFBDF49B -:10355800FBCFBEF4E9CFBFF4EACFC0F4E1CFC1F4AA -:10356800E2CFC2F4D9CFC3F4DACFC4F4F3CFC5F4B1 -:10357800F4CFC6F4F6CFC7F4F7CFC8F4F8CFC9F440 -:103588009EAA01D001D002D0A2EC1DF09EA801D0C5 -:1035980001D002D03AEC1EF09EA201D001D003D097 -:1035A80016EC17F09E92C9C4F8FFC8C4F7FFC7C449 -:1035B800F6FFC6C4F4FFC5C4F3FFC4C4DAFFC3C42E -:1035C800D9FFC2C4E2FFC1C4E1FFC0C4EAFFBFC45F -:1035D800E9FFBEC4FBFFBDC4FAFFBCC4E0FFBBC427 -:1035E800E8FFBAC4D8FF100004010401B551B411B2 -:1035F800D8B401D001D03ED00401B76F010E040148 -:103608000401B66F0401B75109D00401D890040130 -:10361800B4370401B53704010401B62B04010401D1 -:10362800B5AF01D001D0F1D704010401B4510401B0 -:103638000401B25D04010401B55104010401B35948 -:10364800D8A001D001D00CD004010401B451040168 -:103658000401B25F04010401B55104010401B35B24 -:103668000401D8900401B5330401B4330401040102 -:10367800B62FDAD7B2C4B2F4B3C4B3F400D0120090 -:103688008FC496F490C497F48DC494F48EC495F4C2 -:10369800E2EC17F004010401926F1D0E040104010D -:1036A800926501D001D009D0290E0401040192616C -:1036B80001D001D002D0000E2DD08FC496F490C452 -:1036C80097F48DC494F48EC495F4E2EC17F00401D9 -:1036D8000401916F090E04010401926501D001D023 -:1036E80017D0150E04010401926101D001D010D049 -:1036F800090E04010401916501D001D009D0150E0D -:1037080004010401916101D001D002D0010E02D060 -:10371800020E00D012007AC47EF479C47DF476ECEF -:1037280014F0040104017B6F040104017B51FE0ABB -:10373800D8A401D001D008D0FE0E04010401796F8D -:10374800FF0E04017A6F31D0040104017B29D8A44B -:1037580001D001D006D004010401796904017A6915 -:1037680024D0D8900832040104017B51D8B401D088 -:1037780001D001D0088E0F2A032A080E036001D059 -:1037880001D006D004010401796904017A690DD0D9 -:1037980004017C6F000E036E04017C51040108C013 -:1037A80079F4040104017A6B00D012000600EACF14 -:1037B800CFF4E1CFD0F4E2CFD1F4D9CFD2F4DACF3D -:1037C800D3F4F3CFD4F4F4CFD5F4F6CFD6F4F7CFBF -:1037D800D7F4F8CFD8F4F2A401D001D00BD0000E62 -:1037E80081B8010E04010401D96FA7EC16F0000E90 -:1037F800D66EF294A1A201D001D006D0B368C90E4A -:10380800B26E71EC1FF0A192D8C4F8FFD7C4F7FFCD -:10381800D6C4F6FFD5C4F4FFD4C4F3FFD3C4DAFF8B -:10382800D2C4D9FFD1C4E2FFD0C4E1FFCFC4EAFFBC -:10383800CEC4E9FFCDC4FBFFCCC4FAFF11000D0EC6 -:10384800040104017F6501D001D020D0160E0401C7 -:1038580004017F6101D001D019D00401040143A102 -:1038680001D001D002D0FE0E31D0020E04010401B5 -:10387800432504010401436F000E0401040144219F -:103888000401446F040104017E5120D0050E040197 -:1038980004017F6501D001D017D00C0E040104018A -:1038A8007F6101D001D010D004010401434B442BA7 -:1038B8000401040143B101D001D004D00401040182 -:1038C8007E5104D0FF0E02D0FE0E00D012000F0E63 -:1038D800040104018C6501D001D017D00A0E04013F -:1038E80004018D6101D001D010D00A0E0401040139 -:1038F8008E6101D001D009D00A0E040104018F6144 -:1039080001D001D002D0000E20D00A0E040104011B -:103918008C6101D001D017D00A0E040104018D6119 -:1039280001D001D010D00F0E040104018E6501D022 -:1039380001D009D00A0E040104018F6101D001D021 -:1039480002D0010E02D0020E00D012000F0E0401A8 -:103958000401876501D001D017D00A0E04010401C3 -:10396800886101D001D010D00F0E040104018965CF -:1039780001D001D009D00A0E040104018A6101D0E6 -:1039880001D002D0000E20D00A0E04010401876184 -:1039980001D001D017D00F0E04010401886501D0B1 -:1039A80001D010D00F0E04010401896501D001D0A7 -:1039B80009D00A0E040104018A6101D001D002D0A5 -:1039C800010E02D0020E00D012000D0E04010401F7 -:1039D800876101D001D017D00D0E04010401886160 -:1039E80001D001D010D00D0E04010401896101D06D -:1039F80001D009D0100E040104018A6501D001D05C -:103A080002D0010E20D00D0E04010401876101D0FF -:103A180001D017D0100E04010401886501D001D02F -:103A280010D00D0E04010401896101D001D009D024 -:103A38000D0E040104018A6101D001D002D0000EEC -:103A480002D0020E00D012008CC496F48DC497F4F4 -:103A58008AC494F48BC495F4E2EC17F004010401D1 -:103A68008E6F8CC496F48DC497F48AC494F48BC476 -:103A780095F4E2EC17F0040104018F6F0D0E0401B8 -:103A880004018E6501D001D009D00D0E0401040196 -:103A98008F6501D001D002D0000E12D00B0E0401A8 -:103AA80004018E6101D001D009D00D0E040104017A -:103AB8008F6501D001D002D0010E02D0020E00D0D5 -:103AC800120004018F6F000E156E04018F51000E55 -:103AD800246E000E256E000E266E000E276E000E58 -:103AE8001A6E000E1B6E000E1C6E000E1D6E010E6F -:103AF800040104015C6F000E04015D6F000E0401F7 -:103B08005E6F000E04015F6F04018F6F000E126E6E -:103B180004018F51000E04010401466F000E0401D8 -:103B2800476F04018F6F000E046E04018F5104016A -:103B38008F6F000E136E04018F511200AECFCAF4BE -:103B4800ABA201D001D002D0AB98AB8800A201D0C3 -:103B580001D001D029D004010401CA512B0AD8A4EC -:103B680001D001D00BD0CD900082280E0124E96E3F -:103B7800EA6A020EEA22000EEF6E16D0280E012421 -:103B8800E96EEA6A020EEA220401CAC4EFFF012ABA -:103B9800000ECF6E000ECE6ECD809E900401CB6FCE -:103BA800000E106E0401CB5112009EA001D001D06E -:103BB8000CD01E0E106401D001D005D0CD90000E9F -:103BC800016E009201D0102A9E9000B201D001D05F -:103BD80001D01CD055EC11F0000E04010401776FE0 -:103BE800020E0401786F000E04010401756F000EC7 -:103BF8000401766F280E04010401736F020E04019C -:103C0800746F15EC1FF0000E016E009212009DC437 -:103C1800E9FF9EC4EAFFD890EF369DC4E9FF9EC431 -:103C2800EAFFEF50D8A401D001D01FD09DC4E9FF0E -:103C38009EC4EAFF010EEF6E9BC4E9FF9CC4EAFF35 -:103C4800EE50ED10D8A401D001D008D09BC4E9FFF4 -:103C58009CC4EAFF000EEE6E020EED6E9BC4E9FFF7 -:103C68009CC4EAFFEE06000EED5A12006FC4CAF4B7 -:103C780004010401CA29D8A401D001D009D0040143 -:103C8800CB6F000E04010401CA6F0401CB5103D0AD -:103C980004010401CA2B0E5004010401CA6301D0B7 -:103CA80001D002D09D980ED00501000E0401040138 -:103CB800CA25E96EEA6A0501050EEA22EF50AD6EE3 -:103CC800CAC46FF41200280E040104019B25E96E92 -:103CD800000E040104019C21EA6EEF500401040166 -:103CE8009E6F040104019E5104019DC49FF40401C8 -:103CF800A06B9FBFA00704019F17000EA017040127 -:103D0800A0519F11D8B401D001D002D0D88002D0E0 -:103D1800D89000D012000D0E04010401946101D066 -:103D280001D009D00D0E04010401956101D001D024 -:103D380002D0000E12D0180E04010401946501D0BF -:103D480001D009D00D0E04010401956101D001D004 -:103D580002D0010E02D0020E00D01200F5EC1EF0C7 -:103D6800EFEC1FF0A0EC18F0BAEC1FF0E1EC1FF03C -:103D78008DEC1FF00C0E04010401A36F000E04016A -:103D8800A46F7C0E04010401A16F790E0401A26FD7 -:103D9800F0EC06F05AEC0AF0D9EC1DF0FBD714EF62 -:103DA80000F00401796F000E0B6E040179510401D3 -:103DB800796F000E166E04017951000E040104019A -:103DC800436F000E0401446F0401796F000E056E05 -:103DD800040179510401796F000E146E04017951C0 -:103DE8001200000EC26E0401706F0F0EC16E040146 -:103DF8007051070EB46E000E806E000E926E000EAB -:103E0800946E000E956E000E826E000E836E000E8C -:103E1800936E000E816E89989298949294949296DB -:103E2800120073C479F474C47AF40BD079C4E9FF2E -:103E38007AC4EAFF040175C4EFFF04010401794B59 -:103E48007A2B040104017707D8A0780704017729A1 -:103E5800D8B47829D8A401D001D0E8D700D012006E -:103E680000D00E50040104016F19D8B401D001D05C -:103E7800F8D70501000E0E24E96EEA6A0501050E61 -:103E8800EA220401B2C4EFFF0E28D8A401D001D061 -:103E980003D0000E0E6E01D00E2A9D881200040178 -:103EA800796F000E036E040179510401796F000ED9 -:103EB800026E040179510401796F000E0F6E04013E -:103EC80079510401796F000E0C6E040179510401D7 -:103ED80004016A6904016B691200116601D001D0FE -:103EE80011D000840D6601D001D001D011D00DC0D1 -:103EF80011F0000E0D6E00B601D001D002D0897805 -:103F080001D000961150D8B401D001D001D01106CB -:103F18001200CA82CA9CCA8ACA98CA96000EBD6E86 -:103F2800000EBA6EBA86BA84BD86BD84BD9ABD98A5 -:103F3800BA9ABA98000EBE6E000EBB6E9E92CB68FF -:103F48009F929D82CA84120096C4A5F497C4A6F4D1 -:103F580094C4A3F495C4A4F4B40E04010401A16F9D -:103F6800790E0401A26FF0EC06F01200D594D592F8 -:103F7800D590D596D59AD58CF294F28A9296938854 -:103F8800F184D58E01EC20F01200200E040104010A -:103F9800A16F790E0401A26FF0EC06F094C495F4B9 -:103FA800FBEC1FF01200F40E04010401A16F790E5E -:103FB8000401A26FF0EC06F012009294929889988E -:103FC800B19AB198A082A282B190120001EC20F0BF -:103FD800D58EB1901200D08EF28EF28CF28E120035 -:103FE800D59EF8EC1FF0120089848996120095C4BA -:103FF80062F412007EC465F4120089948986120066 -:1078FA0001000A006400E8031027010010000001DB -:10790A000010556E6B6E6F776E20636F6D6D616ED2 -:10791A006420282575290D0A003031323334353672 -:10792A003738394142434445460073656C666C6595 -:10793A0061726E696E6776320065766572666C6F23 -:10794A0075726973680073656C666C6561726E69DD -:10795A006E6700636F64657377697463680066694C -:10796A006E656F6666736574006D616E646F6C79BF -:10797A006E000D0A2B5625750D0A0070726F746F12 -:10798A00636F6C0025733A307825583B0061726347 -:10799A007465636800286E756C6C29006F72656780 -:1079AA006F6E0073656E736F720025733A25733BB1 -:1079BA000025733A3078006D6F64656C00686173F6 -:1079CA00746100636C617373002B4E0D0A002558B5 -:1079DA0025580064617461002B530D0A002B540D65 -:1079EA000A0025733A00783130002B57002B5200D9 -:0679FA004E0056000000E3 -:020000040030CA -:04000000FF36FFFECA -:02000600BFFF3A -:00000001FF diff --git a/telldus-gui/Plugins/Controllers/firmware/TellStickNet.hex b/telldus-gui/Plugins/Controllers/firmware/TellStickNet.hex deleted file mode 100644 index b23930dd..00000000 --- a/telldus-gui/Plugins/Controllers/firmware/TellStickNet.hex +++ /dev/null @@ -1,5555 +0,0 @@ -:0400000014EF00F009 -:10000800FACFE2F8FBCFE3F8E9CFE4F815EF35F0E3 -:10001800D8CFC9F8E8CFCAF8E0CFCBF8C3EF34F0AF -:1000280007EE56F0000EF66E000EF76E010EF86E33 -:1000380010EE51F036EC00F0F86A00EE00F017EE22 -:1000480056F02FEC00F00EEE7EF010EE02F02FECE2 -:1000580000F0A1EF1DF0EE6AE550E150FCE1E2503E -:10006800FAE112000900F5CFEEFFE550E150FAE1A0 -:10007800E250F8E112000E010E01D96746EF00F0D8 -:1000880048EF00F09DEF00F05AEC42F0070107013D -:100098001A5108010801A15F070107011B51080156 -:1000A8000801A25B450E08010801A15D000E0801C8 -:1000B800A259D8A062EF00F064EF00F09AEF00F0C8 -:1000C8000801356F110E08010801376F0801355115 -:1000D80039EC3FF0370EE96E080EEA6E010EE9269C -:1000E800000EEA22EF500801366F080136A57FEFAF -:1000F80000F081EF00F08DEF00F006010601D5B3A6 -:1001080088EF00F08AEF00F08BEF00F08D7292EF2D -:1001180000F00601D5930601D5978D925AEC42F06E -:10012800A1C81AF7A2C81BF70601D595000E5EEF05 -:1001380001F00601D58306010601D5B1A6EF00F04E -:10014800A8EF00F0ADEF00F02EEC3CF0000E5EEFF3 -:1001580001F0FCC6DBF6FDC6DCF6DBC6E0FEDCC65D -:10016800E1FE140E08010801C46F000E0801C56FF6 -:100178000801210E08010801C26F0801080E0801D4 -:10018800C36F6DEC38F033C8BCF834C8BDF82FEC39 -:1001980043F0BCC833F8BDC834F8CE0E08010801D6 -:1001A800215D0A0E08012259D8B0DDEF00F0DFEF1B -:1001B80000F011EF01F00801080121B1E6EF00F0AD -:1001C800E8EF00F011EF01F00801080126BFEFEF9A -:1001D80000F0F1EF00F011EF01F00801080125B976 -:1001E800F8EF00F0FAEF00F011EF01F0EF0E080160 -:1001F8000801235D050E08012459D8B006EF01F067 -:1002080008EF01F011EF01F00801080125BF0FEF19 -:1002180001F011EF01F012EF01F0FF0021C8FCF628 -:1002280022C8FDF6060E08010801B06F000E08018D -:10023800B16F2D0E0801356F080E366F35C8AEF850 -:1002480036C8AFF81DC8ACF81EC8ADF858EC3AF07F -:100258001FC8E9FF20C8EAFFFF0EEF6E080108017A -:100268003451080AD8A43BEF01F03DEF01F059EFF3 -:1002780001F0080108013351D8B445EF01F047EF08 -:1002880001F052EF01F0080108013351060AD8A421 -:1002980050EF01F052EF01F059EF01F01FC8E9FFEC -:1002A80020C8EAFF080133C8EFFF0601D591010E07 -:1002B8005EEF01F012006FEC42F0250E0801080114 -:1002C8000B6F000E08010C6F0001DB0E080108011E -:1002D800096F0001000E08010A6F95EC3AF0000161 -:1002E8000001DB29D8A47BEF01F07DEF01F0ADEF31 -:1002F80001F00801086F000E00010001E06F08011D -:1003080008510801086F000E00010001DF6F0801A5 -:1003180008510801086F000E00010001DE6F080196 -:1003280008510801086F540E00010001DD6F080133 -:1003380008510801086FCA0E00010001DC6F0801AE -:1003480008510801086FAC0E00010001DB6F0801BD -:100358000851060E08010801B06F000E0801B16FC0 -:100368000001DB0E08010801AE6F0001000E080154 -:10037800AF6F0001990E08010801AC6F0001000E73 -:100388000801AD6F58EC3AF0C00E00010001806F13 -:10039800A80E0001816F000E0001826F330E00016C -:1003A800836FFF0E00010001846FFF0E0001856F4F -:1003B800FF0E0001866F000E0001876F000100012B -:1003C800EC29D8B4EAEF01F0ECEF01F00AEF02F003 -:1003D80000010001ED29D8B4F4EF01F0F6EF01F0C7 -:1003E8000AEF02F000010001EE29D8B4FEEF01F097 -:1003F80000EF02F00AEF02F000010001EF29D8A493 -:1004080008EF02F00AEF02F051EF02F00001988DB8 -:100418000001988FC00E000100016C6FA80E00014A -:100428006D6F000E00016E6F330E00016F6FFF0ECF -:1004380000010001706FFF0E0001716FFF0E0001D7 -:10044800726F000E0001736FC00E00010001746F1F -:10045800A80E0001756F000E0001766F010E0001F5 -:10046800776FC00E00010001786FA80E0001796F48 -:10047800000E00017A6F010E00017B6F000E000173 -:1004880000017C6F000E00017D6F000E00017E6F81 -:10049800000E00017F6F7DEF02F00001989D0001C2 -:1004A800989FECC06CF0EDC06DF0EEC06EF0EFC040 -:1004B8006FF0F0C070F0F1C071F0F2C072F0F3C0EC -:1004C80073F0F4C074F0F5C075F0F6C076F0F7C0BC -:1004D80077F0F8C078F0F9C079F0FAC07AF0FBC08C -:1004E8007BF0FCC07CF0FDC07DF0FEC07EF0FFC05C -:1004F8007FF012003FC8E9FF40C8EAFFEECF47F897 -:10050800EECF48F8EECF49F8EECF4AF800010001E7 -:100518006F5108014A1911E1000100016E510801EB -:1005280049190BE1000100016D510801481905E165 -:10053800000100016C5108014719D8A4A6EF02F088 -:10054800A8EF02F0ABEF02F0FF0E9AEF03F00801FC -:10055800080143690201000E08010801456F020104 -:10056800020E0801466F0801476F000E08010801D6 -:10057800446F08014751040E080108014465C7EF9C -:1005880002F0C9EF02F0CBEF02F058EF03F0020ED1 -:10059800080108013D25E96E000E080108013E2109 -:1005A800EA6E0C0E080108014525E16E000E0801EF -:1005B80008014621E26EE652EE52ED50E518EFCF03 -:1005C800E8FFD8B4E718D8A4ECEF02F0EEEF02F099 -:1005D80044EF03F03DC8E9FF3EC8EAFF0A0E0801F0 -:1005E80008014525E16E000E080108014621E26E6A -:1005F800E652EE52ED50E518EFCFE8FFD8B4E71811 -:10060800D8A409EF03F00BEF03F042EF03F03FC863 -:10061800E9FF40C8EAFFEECF47F8EECF48F8EECF43 -:1006280049F8EECF4AF845C8E9FF46C8EAFFEECFD9 -:100638004BF8EECF4CF8EECF4DF8EECF4EF8080160 -:100648004A5108014E190EE10801495108014D1996 -:1006580009E10801485108014C1904E10801475112 -:1006680008014B19D8A43BEF03F03DEF03F042EF2C -:1006780003F00801080144519AEF03F044C843F815 -:10068800170E080108014527000E08014623080136 -:100698000801442B040E08010801446556EF03F0D5 -:1006A80058EF03F0CBEF02F0080108014329D8B452 -:1006B80060EF03F062EF03F095EF03F00801080123 -:1006C8004351170D0201000EF32408010801456F7C -:1006D8000801466B0201020E080146230A0E0801B2 -:1006E8000801B06F000E0801B16F3FC8AEF840C8EE -:1006F800AFF845C8ACF846C8ADF858EC3AF03DC874 -:10070800E9FF3EC8EAFF0A0E080108014525E16E27 -:10071800000E080108014621E26EEECFE6FFEDCF9C -:10072800E5FF0801080143519AEF03F01200C2CF18 -:1007380029F8C0CF2AF8D5CF2BF8D6CF2DF8D7CFA8 -:100748002CF8010EC26E08012E6F3F0EC06E080114 -:100758002E5108012E6F880ED56E08012E51080102 -:100768002E6F000E080108011A6F08012E51000EA5 -:1007780008010801216F000E0801226F000E080110 -:10078800236F000E0801246F000E080108011D6F79 -:10079800000E08011E6F7BEC22F00801080174C8E6 -:1007A80025F80801080175C826F808010801276B13 -:1007B8000801286B000ED76E000ED66EC2820400A8 -:1007C800E6EF03F0C2B2EBEF03F0EDEF03F0E6EF74 -:1007D80003F0D6CF1FF8D7CF20F87BEC22F074C8EF -:1007E8001BF875C81CF8080108011F510801080109 -:1007F8002127080108012051080108012223000EC1 -:10080800080108012323000E0801080124231A0EF9 -:100818000801215DF20E080122599E0E0801235994 -:10082800000E080108012459D8A01DEF04F01FEF9D -:1008380004F03DEF04F07BEC22F00801080174514C -:1008480008010801251B0801080175510801080164 -:10085800261B7BEC22F008010801745108010801ED -:10086800271B08010801755108010801281B9FEF83 -:1008780004F0080108012051080108011E1906E1C9 -:10088800080108011F51080108011D19D8A44FEFDC -:1008980004F051EF04F053EF04F09DEF04F0080169 -:1008A8001DC82EF808011EC82FF8080108011F519D -:1008B80008012E5F08010801205108012F5B08017B -:1008C80008011B5108012E27080108011C510801C5 -:1008D8002F2308012EC830F808012FC831F8080165 -:1008E8000801326B0801336B54EC36F01FC81DF851 -:1008F80020C81EF80801D8900801253708012637B6 -:1009080008012737080128377BEC22F00801080185 -:1009180074AF91EF04F093EF04F096EF04F0080140 -:1009280008012581080108011A3F9DEF04F09FEF97 -:1009380004F0DEEF03F029C8C2FF2AC8C0FF2CC8A4 -:10094800D7FF2DC8D6FF2BC8D5FF25C816F826C84F -:1009580017F827C818F828C819F8B3EF04F01200D8 -:100968000C0E08010801796F000E08017A6FF9EC86 -:1009780042F04BEC44F008010801756F75C878F82F -:10098800F00E080178170801D89078330801D8903C -:100998007831EC0F08010801756F080108017567C7 -:1009A800D8EF04F0DAEF04F0E3EF04F0180E0801D2 -:1009B8000801726F020E0801736FC0EF05F0070E91 -:1009C80008010801C46F000E0801C56F000E080178 -:1009D8000801C26F000E0801C36F6DEC38F0ABEF71 -:1009E80005F04BEC44F008010801746F0801080198 -:1009F800746701EF05F003EF05F005EF05F0B7EFB9 -:100A080005F0080108017405D8A40DEF05F00FEFF3 -:100A180005F011EF05F0ABEF05F00801080174517E -:100A2800020AD8A41AEF05F01CEF05F076EF05F0DE -:100A3800030E08010801756124EF05F026EF05F0A3 -:100A480028EF05F0B7EF05F0000E08010801766FF2 -:100A5800000E0801776F4BEC44F008010801746F31 -:100A6800080108017451040AD8A43DEF05F03FEFCE -:100A780005F049EF05F04BEC44F008010801776FE9 -:100A88004BEC44F008010801766F180E08010801C4 -:100A9800765D020E08017759D8B055EF05F057EF8B -:100AA80005F059EF05F0B7EF05F0B50E080108019C -:100AB800765D050E08017759D8A065EF05F067EF58 -:100AC80005F070EF05F0B40E08010801726F050E0D -:100AD8000801736FC0EF05F076C872F877C873F82D -:100AE800C0EF05F0020E0801080175617EEF05F000 -:100AF80080EF05F082EF05F0B7EF05F04BEC44F01E -:100B080008010801746F08010801745108010801FF -:100B1800756191EF05F093EF05F095EF05F0B7EFEC -:100B280005F00801080174C8C4F808010801C56B7C -:100B3800000E08010801C26F000E0801C36F6DECBA -:100B480038F008010801745108010801755F0801AF -:100B58000801750708017529D8A4B5EF05F0B7EFA6 -:100B680005F0F5EF04F0180E08010801726F020E87 -:100B78000801736FC0EF05F01200000E06010601B0 -:100B8800CE6F000E0601CF6F080E08010801C46F72 -:100B9800000E0801C56F0801280E08010801C26F80 -:100BA8000801080E0801C36F6DEC38F028C8BCF8BE -:100BB80029C8BDF82FEC43F0BCC828F8BDC829F8EF -:100BC8002AC8BCF82BC8BDF82FEC43F0BCC82AF8DB -:100BD800BDC82BF82CC8BCF82DC8BDF82FEC43F0C5 -:100BE800F80E08010801BC25080108012C6FFF0E4A -:100BF80008010801BD2108012D6F080108012F51C6 -:100C08002E11D8B40AEF06F00CEF06F093EF06F0B9 -:100C18001DC8E9FF1EC8EAFF0801EECF30F8080139 -:100C2800EECF31F80801EECF32F80801EECF33F8F5 -:100C38001FC8E9FF20C8EAFF0801EECF34F8080111 -:100C4800EECF35F80801EECF36F80801EECF37F8C9 -:100C580008013C6F000E08010801386F08013C517B -:100C680008013C6F110E08010801396F08013C5159 -:100C780021C83AF822C83BF83AC8BCF83BC8BDF8C6 -:100C88002FEC43F0BCC83AF8BDC83BF80C0E08017D -:100C98000801BC6F000E0801BD6F0801300E080185 -:100CA8000801BA6F0801080E0801BB6FF2EC1EF0CC -:100CB80008010801BA1D08010801246F080108018C -:100CC800BB1D0801256F000E08010801796F000E91 -:100CD80008017A6FF9EC42F021C8A0F822C8A1F8FF -:100CE8000EEC10F0A0C826F8A1C827F8080108EEF5 -:100CF80026F00801EE5208012551ED18080124C814 -:100D0800E8FFD8B4EF18D8B48CEF06F08EEF06F0F1 -:100D180093EF06F02EEC3CF0000EC5EF06F01FC86E -:100D280041F820C842F81DC83FF81EC840F808011D -:100D3800280E080108013D6F0801080E08013E6FE2 -:100D48007EEC02F008010801236F0801080123293D -:100D5800D8A4B1EF06F0B3EF06F0B8EF06F02EEC2A -:100D68003CF0000EC5EF06F023C8A3F72CC8CEF65A -:100D78002DC8CFF607010F8107010F93010EC5EFAC -:100D880006F01200C8EF06F0C5CF12F81F0E0801D2 -:100D9800121712C813F80801146B000EC7B4010E1D -:100DA80008011313000E1413080114511311D8A4C9 -:100DB800E0EF06F0E2EF06F0C8EF06F0C580E5EFD9 -:100DC80006F0C5B0EAEF06F0ECEF06F0E5EF06F046 -:100DD800A1A6F1EF06F0F3EF06F0FAEF06F008012E -:100DE8000801106908011169C6EF07F010C82FF84B -:100DF80019EC3AF00009D8B404EF07F006EF07F051 -:100E080010EF07F0C584FD0E08010801106FFF0EF2 -:100E18000801116FC6EF07F0C5BC15EF07F017EF13 -:100E280007F0B4EF07F011C82FF819EC3AF00009F1 -:100E3800D8B421EF07F023EF07F02DEF07F0C584B2 -:100E4800FD0E08010801106FFF0E0801116FC6EFB3 -:100E580007F0C5BC32EF07F034EF07F0A8EF07F052 -:100E6800C58237EF07F0C5B23CEF07F03EEF07F059 -:100E780037EF07F0A1A643EF07F045EF07F04CEF77 -:100E880007F008010801106908011169C6EF07F0A9 -:100E9800080108011029080108012F6F19EC3AF020 -:100EA8000009D8B45AEF07F05CEF07F066EF07F0D7 -:100EB800C584FD0E08010801106FFF0E0801116FAF -:100EC800C6EF07F0C5BC6BEF07F06DEF07F09CEFBE -:100ED80007F0C58670EF07F0C5B675EF07F077EF36 -:100EE80007F070EF07F0C58AC5887BEF07F0C5B833 -:100EF80080EF07F082EF07F07BEF07F0C58485EFFE -:100F080007F0C5B48AEF07F08CEF07F085EF07F01C -:100F1800A1A691EF07F093EF07F09AEF07F0080109 -:100F28000801106908011169C6EF07F0A6EF07F07C -:100F3800C584FE0E08010801106FFF0E0801116F2D -:100F4800C6EF07F0B2EF07F0C584FE0E08010801EE -:100F5800106FFF0E0801116FC6EF07F0BEEF07F024 -:100F6800C584FE0E08010801106FFF0E0801116FFD -:100F7800C6EF07F00801C9CF10F808010801116B86 -:100F8800C6EF07F01200A0C8E9FFA1C8EAFF0801F0 -:100F9800EECFBCF80801EDCFBDF82FEC43F0A0C8A8 -:100FA800E9FFA1C8EAFF0801BCC8EEFF0801BDC8F7 -:100FB800EDFF020E08010801A025E96E000E0801E8 -:100FC8000801A121EA6E0801EECFBCF80801EDCFB7 -:100FD800BDF82FEC43F0020E08010801A025E96EC8 -:100FE800000E08010801A121EA6E0801BCC8EEFF45 -:100FF8000801BDC8EDFF040E08010801A025E96E2F -:10100800000E08010801A121EA6E0801EECFA2F83E -:101018000801EECFA3F80801EECFA4F80801EECF3F -:10102800A5F82BEC3EF0040E08010801A025E96E96 -:10103800000E08010801A121EA6E0801A2C8EEFF0E -:101048000801A3C8EEFF0801A4C8EEFF0801A5C85F -:10105800EDFFED52ED52080E08010801A025E96EDA -:10106800000E08010801A121EA6E0801EECFA2F8DE -:101078000801EECFA3F80801EECFA4F80801EECFDF -:10108800A5F82BEC3EF0080E08010801A025E96E32 -:10109800000E08010801A121EA6E0801A2C8EEFFAE -:1010A8000801A3C8EEFF0801A4C8EEFF0801A5C8FF -:1010B800EDFFED52ED520E0E08010801A025E96E74 -:1010C800000E08010801A121EA6E0801EECFBCF864 -:1010D8000801EDCFBDF82FEC43F00E0E0801080112 -:1010E800A025E96E000E08010801A121EA6E080199 -:1010F800BCC8EEFF0801BDC8EDFF100E08010801CD -:10110800A025E96E000E08010801A121EA6E080178 -:10111800EECFBCF80801EDCFBDF82FEC43F0100E70 -:1011280008010801A025E96E000E08010801A121A7 -:10113800EA6E0801BCC8EEFF0801BDC8EDFF120E3B -:1011480008010801A025E96E000E08010801A12187 -:10115800EA6E0801EECFBCF80801EDCFBDF82FEC20 -:1011680043F0120E08010801A025E96E000E0801DF -:101178000801A121EA6E0801BCC8EEFF0801BDC83C -:10118800EDFF12001DC8E9FF1EC8EAFF0801EECFF7 -:1011980028F80801EECF29F80801EECF2AF808014F -:1011A800EECF2BF81FC8E9FF20C8EAFF0801EECFF1 -:1011B8002CF80801EECF2DF80801EECF2EF8080123 -:1011C800EECF2FF80801486F000E08010801306FB4 -:1011D800080148510801486F060E08010801316FDF -:1011E8000801485121C832F822C833F832C8BCF87F -:1011F80033C8BDF82FEC43F0BCC832F8BDC833F88B -:101208000C0E08010801BC6F000E0801BD6F080133 -:10121800280E08010801BA6F0801080E0801BB6F03 -:10122800F2EC1EF008010801BA1D08010801246F3C -:1012380008010801BB1D0801256F21C8A0F822C8B4 -:10124800A1F80EEC10F0A0C826F8A1C827F80801EC -:101258000801275108010801251906E108010801BC -:101268002651080108012419D8B43DEF09F03FEFD1 -:1012780009F043EF09F02EEC3CF0BBEF09F0000E4B -:1012880008010801796F000E08017A6FF9EC42F045 -:10129800140E08010801C46F000E0801C56F08018B -:1012A800340E08010801C26F0801080E0801C36F57 -:1012B8006DEC38F00801340E08010801A06F080130 -:1012C800080E0801A16FC7EC07F0080140390F0BA1 -:1012D8000801486F0801D89048370801D890483568 -:1012E800EC0F08010801236F0801080123510801C8 -:1012F8000801215D0801486F000E08010801225904 -:101308000801496FEC0E0801482508010801216F02 -:10131800FF0E080149210801226F1DC84CF81EC89C -:101328004DF80801340E080108014A6F0801080E3B -:1013380008014B6F91ECB2F00009D8B4A6EF09F0A0 -:10134800A8EF09F0B7EF09F021C84CF822C84DF80A -:101358000801340E080108014A6F0801080E080147 -:101368004B6F29EC80F02EEC3CF0BBEF09F012003B -:10137800070107019D29D8A4C4EF09F0C6EF09F0B9 -:10138800EEEF09F0000E08010801536F000E080186 -:10139800546F450E08010801516F000E0801526F85 -:1013A8000801166F000E08010801506F0801165158 -:1013B800000E080108014C6F000E08014D6F000E69 -:1013C80008014E6F000E08014F6F22ECD7F007019D -:1013D80007019D6F070107019D29D8A4F6EF09F0C1 -:1013E800F8EF09F0FAEF09F0B0EF0AF09DC74CF8F2 -:1013F800D9EC39F008014D514C11D8A406EF0AF088 -:1014080008EF0AF00AEF0AF0B0EF0AF00001000155 -:101418006C510001000170150801166F00010001F0 -:101428006D510001000171150801176F00010001DD -:101438006E510001000172150801186F00010001CA -:101448006F510001000173150801196F05010501AD -:10145800DA5100010001701508011A6F0501050134 -:10146800DB5100010001711508011B6F0501050121 -:10147800DC5100010001721508011C6F050105010E -:10148800DD5100010001731508011D6F0801195194 -:1014980008011D190EE10801185108011C1909E17C -:1014A8000801175108011B1904E108011651080128 -:1014B8001A19D8B462EF0AF064EF0AF068EF0AF07C -:1014C8008FEC41F0B0EF0AF0060E08010801B06F8A -:1014D800000E0801B16F990E0801166F000E176F04 -:1014E80016C8AEF817C8AFF80801080E08010801B9 -:1014F800AC6F0801080E0801AD6F58EC3AF06CC0EB -:101508000EF86DC00FF86EC010F86FC011F80A0E13 -:1015180008010801BC6F000E0801BD6F0801080E24 -:1015280008010801BA6F0801080E0801BB6FF2EC48 -:101538001EF0BAC812F8BBC813F8D0920801080EFA -:1015480008010801146F0801080E0801156F15C875 -:10155800F4FF14C8F3FFFF00120096EF0BF01C0E07 -:1015680008010801C46F000E0801C56F08011D0EAF -:1015780008010801C26F0801080E0801C36F6DEC6D -:1015880038F02EEC3CF008011D0E080108017C6FB4 -:101598000801080E08017D6F9EEC30F00801080173 -:1015A8001D051E11D8A4DBEF0AF0DDEF0AF0F3EFFA -:1015B8000AF0080108012151060AD8A4E6EF0AF04A -:1015C800E8EF0AF0F3EF0AF0080108012251040AD3 -:1015D800D8B4F1EF0AF0F3EF0AF0F5EF0AF0A2EF52 -:1015E8000BF0080108012351020A2411D8A4FFEFC7 -:1015F8000AF001EF0BF015EF0BF008EE25F014EEF2 -:10160800DDF0060EEECFE6FFE82E06EF0BF02BC856 -:10161800D9F42CC8DAF42DC8DBF42EC8DCF4A2EF18 -:101628000BF00801080123052411D8A41EEF0BF0C4 -:1016380020EF0BF05EEF0BF0000100016F51080185 -:101648000801381914E1000100016E510801080170 -:1016580037190DE1000100016D5108010801361923 -:1016680006E1000100016C51080108013519D8B4E0 -:1016780040EF0BF042EF0BF044EF0BF0A2EF0BF052 -:101688002BC859F62CC85AF62DC85BF62EC85CF63E -:1016980008EE25F016EE5DF0060EEECFE6FFE82E1A -:1016A80051EF0BF00801396F010E07010701366F82 -:1016B80008013951020E08010801236F000E0801C4 -:1016C800246F06EE5DF018EE2FF0060EEECFE6FF63 -:1016D800E82E6AEF0BF059C635F85AC636F85BC6DD -:1016E80037F85CC638F808011D0E08010801786F44 -:1016F8000801080E0801796F98EC1BF00009D8A4BE -:1017080088EF0BF08AEF0BF08CEF0BF0A2EF0BF0E9 -:101718000801396F000E07010701366F08013951BA -:10172800A0EF0BF0070107013651000A01E117D7B6 -:10173800010AC0E0A0EF0BF0A2EF0BF01200FDECE5 -:1017480040F00009D8A4ABEF0BF0ADEF0BF0AFEF12 -:101758000BF089EF0CF07B0E08010801566FFF0EA5 -:101768000801576F4CEC27F00009D8A4BEEF0BF026 -:10177800C0EF0BF0C2EF0BF089EF0CF0C9EC26F0CC -:1017880065C832F866C833F867C834F868C835F8E9 -:1017980008013229D8B43329D8B43429D8B4352922 -:1017A800D8A4D9EF0BF0DBEF0BF0EBEF0BF0000157 -:1017B800988D0001988F0801366F000E0801080106 -:1017C800376F08013651ABEC42F089EF0CF0600E30 -:1017D80008010801566FFF0E0801576F4CEC27F0FF -:1017E8000009D8A4FAEF0BF0FCEF0BF0FEEF0BF0BA -:1017F80089EF0CF0C9EC26F065C82EF866C82FF8FA -:1018080067C830F868C831F8500E08010801566FEB -:10181800FF0E0801576F4CEC27F00009D8A417EF0A -:101828000CF019EF0CF01BEF0CF089EF0CF0C9EC81 -:1018380026F065C82AF866C82BF867C82CF868C867 -:101848002DF8C50E08010801566FFF0E0801576FE5 -:101858004CEC27F00009D8A434EF0CF036EF0CF06C -:1018680038EF0CF089EF0CF0C9EC26F065C822F8C7 -:1018780066C823F867C824F868C825F8D40E080194 -:101888000801566FFF0E0801576F4CEC27F000094E -:10189800D8A451EF0CF053EF0CF055EF0CF089EF92 -:1018A8000CF0C9EC26F065C826F866C827F867C8A2 -:1018B80028F868C829F80001989D32C86CF033C828 -:1018C8006DF034C86EF035C86FF02EC870F02FC8B0 -:1018D80071F030C872F031C873F02AC874F02BC8A0 -:1018E80075F02CC876F02DC877F022C878F023C898 -:1018F80079F024C87AF025C87BF026C87CF027C880 -:101908007DF028C87EF029C87FF012000701070182 -:101918007D51D8B492EF0CF094EF0CF0C1EF0CF0BD -:10192800070107017C51070107017A277E0E07018D -:1019380007017A65A2EF0CF0A4EF0CF0A9EF0CF008 -:10194800070107017C69BDEF0CF0070107017A6701 -:10195800B0EF0CF0B2EF0CF0BDEF0CF00801DA6F4D -:10196800010E070107017C6F0801DA510701070121 -:101978007D077AC7BBFF23EF0DF0070107017E51F2 -:10198800020AD8A4CAEF0CF0CCEF0CF0D0EF0CF0A0 -:101998007BC7BBFF23EF0DF0070107017E05D8A425 -:1019A800D8EF0CF0DAEF0CF021EF0DF0D1EC43F0AA -:1019B800070107017F5108010801DE5D0801DA6FA0 -:1019C80007010701805108010801DF590801DB6F91 -:1019D80007010701815108010801E0590801DC6F7E -:1019E80007010701825108010801E1590801DD6F6B -:1019F800F30EDA5D9E0EDB59000EDC59000E08016D -:101A0800DD59D8A00AEF0DF00CEF0DF01FEF0DF027 -:101A1800070107017B51FF0A070107017B6F7BC79D -:101A2800BBFFD1EC43F0DEC87FF7DFC880F7E0C822 -:101A380081F7E1C882F723EF0DF0000EBB6E0701B6 -:101A480007018651D8B42BEF0DF02DEF0DF05AEFAA -:101A58000DF00701070185510701070183277E0E55 -:101A68000701070183653BEF0DF03DEF0DF042EFF5 -:101A78000DF007010701856956EF0DF00701070111 -:101A8800836749EF0DF04BEF0DF056EF0DF00801AD -:101A9800DA6F010E07010701856F0801DA510701A6 -:101AA8000701860783C7BEFF6BEF0DF0070107012B -:101AB8008751020AD8A463EF0DF065EF0DF069EFC6 -:101AC8000DF084C7BEFF6BEF0DF0000EBE6E120066 -:101AD80008010F6F000E080108010E6F08010F5171 -:101AE8003DEF0EF0080108010D513A0AD8A47FEF26 -:101AF8000DF081EF0DF0A0EF0DF007010701015186 -:101B08000011D8A48AEF0DF08CEF0DF096EF0DF0D0 -:101B180008010F6F020E070107012F6F08010F510F -:101B28009EEF0DF008010F6F010E070107012F6FDF -:101B380008010F514CEF0EF007010701003B0701A8 -:101B4800013BF00E07010117070100510F0B0701B8 -:101B58000113F00E070100170DC872F82DEC2DF0D7 -:101B680008010F6F08010F510701070100134CEF1F -:101B78000EF0C2EF0DF0080108010E2B0101C80E8E -:101B8800080108010E25E96EEA6A0101010EEA2240 -:101B9800EF50D8A4D2EF0DF0D4EF0DF0BFEF0DF059 -:101BA8000101C80E080108010E25E96EEA6A010163 -:101BB800010EEA2208010DC8EFFF0701070100071F -:101BC800D8A001070701070101510011D8A4EFEFC0 -:101BD8000DF0F1EF0DF09EEF0DF0070107012F2B2F -:101BE8004CEF0EF0080108010D51690AD8B4FFEF57 -:101BF8000DF001EF0EF006EF0EF0070107012F6957 -:101C08009EEF0DF0070107012F2B4CEF0EF0080196 -:101C180008010D51730AD8A414EF0EF016EF0EF058 -:101C280020EF0EF008010F6F000E070107012F6F5C -:101C380008010F514CEF0EF007010701273B070180 -:101C4800283BF00E07012817070127510F0B070142 -:101C58002813F00E070127170DC872F82DEC2DF088 -:101C680008010F6F08010F510701070127134CEFF7 -:101C78000EF0070107012F51000A01E133D7010ACD -:101C880001E177D7030AAEE0010AC1E04CEF0EF09C -:101C98001200A1C768F8BEEC20F068C854F869C8FB -:101CA80055F80101000E08010801596F0101010EE4 -:101CB80008015A6F3DEC37F01A0E08010801592740 -:101CC800000E08015A230801080159510801545D02 -:101CD800080108015A5108015559D8B076EF0EF09D -:101CE80078EF0EF07CEF0EF065EC3FF02DEF0FF083 -:101CF80022EC2FF0E20E08010801576FFF0E0801D1 -:101D0800586FA1C756F830EC42F00801546F000E26 -:101D180008010801536F08015451130E0801080106 -:101D2800536599EF0EF09BEF0EF09DEF0EF0D8EF94 -:101D38000EF00401E30E080108015325E96EEA6A72 -:101D48000401040EEA22EF5008010801586F0DEC57 -:101D58003FF008010801576FA1C756F801EC15F0CC -:101D68000401E30E080108015325E96EEA6A04013B -:101D7800040EEA22EF5008010801646FE1EC3EF01E -:101D880008010801576FA1C756F801EC15F00801C2 -:101D98000801532B130E080108015365D6EF0EF006 -:101DA800D8EF0EF09DEF0EF00101000E08010801BA -:101DB800596F0101010E08015A6F3DEC37F0080117 -:101DC8000801595108010801586F0DEC3FF008014E -:101DD8000801576FA1C756F801EC15F00101000E74 -:101DE80008010801596F0101010E08015A6F3DEC05 -:101DF80037F008010801595108010801646FE1EC46 -:101E08003EF008010801576FA1C756F801EC15F01C -:101E18000801546F3A0E08010801576F0801545120 -:101E2800A1C756F801EC15F00101000E08010801E0 -:101E3800576F0101010E0801586FA1C756F845EC0C -:101E480042F0A1C768F8F6EC3BF065EC3FF016EC01 -:101E580044F01200FC0E92160E01FE8B96928D92A3 -:101E680036EF0FF00E010E01FDA13DEF0FF03FEF31 -:101E78000FF036EF0FF00801096F000E060106019A -:101E8800D56F080109510601D581000E060106012A -:101E9800FC6F000E0601FD6F000E0E010E01E86FCB -:101EA800000E0E01E96FCD0E0E010E01EC6F0A0E49 -:101EB8000E010E01ED6FCD0E0E010E01EA6F0A0E36 -:101EC8000E01EB6FCE0E0E010E01E46F0A0E0E012D -:101ED800E56FCE0E0E010E01E26F0A0E0E01E36FE2 -:101EE8000801096F000E08010801C06F08010951B7 -:101EF80064EC44F00801096F0D0E0E010E01A06F8D -:101F08000801095100F00801096F320E0E010E0197 -:101F1800A26F0801095100F00801096F120E0E01A5 -:101F28000E01A46F0801095100F00801096F400E65 -:101F38000E010E01A36F0801095100F00801096F95 -:101F4800120E0E010E01A66F0801095100F00801DA -:101F5800096F0C0E0E010E01A76F0801095100F060 -:101F68000801096FEE0E0E010E01AA6F0801095152 -:101F780000F00801096F050E0E010E01AB6F080194 -:101F8800095100F099C084FE00F09AC085FE00F067 -:101F98009BC082FE00F09CC083FE00F09DC080FEC6 -:101FA80000F09EC081FE00F0100E080108010B6FC2 -:101FB800010E08010C6F0801096F100E08010801D5 -:101FC8000A6F0801095199EC40F0720E08010801E6 -:101FD8000B6F340E08010C6F0801096F140E08010D -:101FE80008010A6F0801095199EC40F0000E080138 -:101FF80008010B6F000E08010C6F0801096F000E35 -:10200800080108010A6F0801095199EC40F00E0116 -:10201800DF851200F1C6A8F8F2C6A9F8F3C6AAF837 -:10202800F4C6ABF8E0CEA2F8E1CEA3F8A9EF10F021 -:10203800A0C8A6F8A1C8A7F8150E08010801A05D58 -:10204800000E0801A159D8A02CEF10F02EEF10F0C7 -:1020580035EF10F0140E08010801A66F000E0801F4 -:10206800A76FA6C8C4F8A7C8C5F80801AC0E080130 -:102078000801C26F0801080E0801C36F6DEC38F043 -:1020880008010801A65108010801A05F080108011C -:10209800A75108010801A15B08010801A6A157EF93 -:1020A80010F059EF10F069EF10F00801AC0E0801BC -:1020B8000801A625E96EEA6A0801080EEA22000E60 -:1020C800EF6E08010801A64BA72B0801AC0E08010A -:1020D8000801A46F0801080E0801A56F9EEF10F013 -:1020E8000801A4C8E9FF0801A5C8EAFF0801020E13 -:1020F8000801A427000E0801A523EECFC0F8EDCFF4 -:10210800C1F80801C05108010801A8270801C151F8 -:1021180008010801A923000E08010801AA23000EDE -:1021280008010801AB23020E08010801A65F000E92 -:102138000801A75B08010801A751A611D8A4A7EFB9 -:1021480010F0A9EF10F074EF10F008010801A15188 -:10215800A011D8A4B2EF10F0B4EF10F01CEF10F0FB -:10216800A2C8E0FEA3C8E1FE08010801A8510801C1 -:102178000801AA2508010801A86F08010801A9514A -:1021880008010801AB210801A96F0801AA6BD8B0A2 -:10219800AA2B0801AB6B080108EEAAF0EE50080163 -:1021A8000801A827ED5008010801A9230801080122 -:1021B800A81D08010801A06F08010801A91D080150 -:1021C800A16FE7EF10F01200140E0801080158255E -:1021D800E96E000E080108015921EA6EEF50080166 -:1021E800606F3F0E08016017180E0801602708018C -:1021F80060510801080158250801616FE86A080163 -:1022080060BFE8680801080159210801626F61C8C8 -:102218005EF862C85FF8140E080108015825E96ED7 -:10222800000E080108015921EA6E080108015C51F5 -:10223800EE2608015D51EE22000EEE22ED22ED524F -:10224800ED52B5EF11F008015AC8F6FF08015BC856 -:10225800F7FF000EF86E5EC8E9FF5FC8EAFF0800E6 -:10226800F5CFEFFF080108015A4B5B2B0801080165 -:102278005E4B5F2B580E0801080158250801606F56 -:10228800000E0801080159210801616F0801615118 -:10229800080108015F1905E10801605108010801FA -:1022A8005E19D8A45AEF11F05CEF11F0B0EF11F0FD -:1022B800100E08010801582508010801836F000E57 -:1022C8000801080159210801846F0C0E0801080152 -:1022D800582508010801816F000E080108015921DD -:1022E8000801826F080E0801080158250801080135 -:1022F8007F6F000E0801080159210801806F040E44 -:10230800080108015825080108017D6F000E080121 -:102318000801592108017E6F58C87BF859C87CF814 -:10232800180E08010801582508010801796F000EE8 -:1023380008010801592108017A6F80EC9BF0180EFA -:10234800080108015825080108015E6F000E080100 -:102358000801592108015F6F080108015C07D8A02E -:102368005D07080108015D515C11D8A4BEEF11F0AA -:10237800C0EF11F027EF11F01200140E0801080148 -:102388005825E96E000E080108015921EA6EEF5040 -:102398000801606F3F0E08016017180E08016027DA -:1023A800080160510801080158250801616FE86AB1 -:1023B800080160BFE8680801080159210801626F37 -:1023C80061C85EF862C85FF8140E08010801582554 -:1023D800E96E000E080108015921EA6E080108019A -:1023E8005C51EE2608015D51EE22000EEE22ED2230 -:1023F800ED52ED5289EF12F05AC8E9FF5BC8EAFFC7 -:102408005EC8E1FF5FC8E2FFEFCFE7FF0801080100 -:102418005A4B5B2B080108015E4B5F2B580E0801D5 -:10242800080158250801606F000E080108015921AC -:102438000801616F08016151080108015F1905E190 -:1024480008016051080108015E19D8A42EEF12F0A6 -:1024580030EF12F084EF12F0100E08010801582531 -:1024680008010801836F000E0801080159210801BD -:10247800846F0C0E08010801582508010801816FB6 -:10248800000E0801080159210801826F080E080191 -:1024980008015825080108017F6F000E080108018E -:1024A80059210801806F040E080108015825080108 -:1024B80008017D6F000E08010801592108017E6F8F -:1024C80058C87BF859C87CF8180E08010801582527 -:1024D80008010801796F000E080108015921080157 -:1024E8007A6F80EC9BF0180E080108015825080146 -:1024F80008015E6F000E08010801592108015F6F8D -:10250800080108015C07D8A05D07080108015D51B2 -:102518005C11D8A492EF12F094EF12F000EF12F0D1 -:102528001200000E080108012D659DEF12F09FEFC3 -:1025380012F0A1EF12F065EF13F02DC871F81DEC41 -:102548002BF00BC00DF00CC00EF043EF13F0DCECD9 -:1025580040F06CEC33F065EF13F06CEC33F065EFA2 -:1025680013F008012E6F010E08010801736F0801AE -:102578002E5108012F6F110E08010801726F080112 -:102588002F519FECA1F030502F10D8A4CEEF12F0AD -:10259800D0EF12F0D2EF12F0E5EF12F000EE29F0D2 -:1025A80010EE07F0E652EE52ED50E518EFCFE8FFD7 -:1025B800D8B4E718D8A4E3EF12F0E5EF12F0B5EFBE -:1025C80012F008012E6F080E176E08012E5165EFE4 -:1025D80013F008012E6F010E08010801736F08013E -:1025E8002E5108012F6F110E08010801726F0801A2 -:1025F8002F519FECA1F030502F10D8A406EF13F004 -:1026080008EF13F00AEF13F01DEF13F000EE29F0B6 -:1026180010EE07F0E652EE52ED50E518EFCFE8FF66 -:10262800D8B4E718D8A41BEF13F01DEF13F0EDEFA3 -:1026380012F008012E6F0C0E176E08012E5165EF6F -:1026480013F008012E6F0D0E176E08012E5165EF5D -:1026580013F008012E6F000E08010801736F0801BE -:102668002E5108012F6F140E08010801726F08011E -:102678002F519FECA1F06CEC33F065EF13F017507D -:10268800000A01E16AD7010A01E161D7030A01E101 -:1026980064D7010A01E161D7060A01E15ED7030A9E -:1026A80001E15FD7010A01E15CD70F0AD2E0010A14 -:1026B800D0E0020A8EE0070ACCE0020AC2E02DEF61 -:1026C80013F012000801606F690E08010801646FB9 -:1026D800080160518FEC3FF0080156515311541115 -:1026E8005511D8A47AEF13F07CEF13F088EF13F0AC -:1026F8000801606F300E08010801646F080160511D -:102708008FEC3FF02CEF14F00801606F000E080109 -:102718000801576F08016051070E08010801576545 -:1027280098EF13F09AEF13F09CEF13F0C9EF13F042 -:102738000801580E080108015725E96EEA6A0801E0 -:10274800080EEA2253C864F8E1EC3EF0EF6E040E7E -:102758000801606FD8900801080156330801553305 -:1027680008015433080153330801602FAEEF13F00A -:1027780008010801572B070E080108015765C7EF24 -:1027880013F0C9EF13F09CEF13F00801606F080E07 -:1027980008010801576F08016051080108015767CF -:1027A800D8EF13F0DAEF13F0DCEF13F001EF14F0C9 -:1027B80057C860F8FF0E080160270801580E080185 -:1027C8006025E96EEA6A0801080EEA22EF50300A2D -:1027D800D8B4F1EF13F0F3EF13F0F5EF13F001EFC6 -:1027E80014F0080108015707080108015767FFEFAF -:1027F80013F001EF14F0DCEF13F00801080157673C -:1028080008EF14F00AEF14F00CEF14F02CEF14F0AA -:1028180057C860F8FF0E080160270801580E080124 -:102828006025E96EEA6A0801080EEA22EF500801FD -:102838000801646F8FEC3FF0080108015707080191 -:10284800080157672AEF14F02CEF14F00CEF14F07E -:102858000801606F730E08010801646F0801605178 -:102868008FEC3FF01200140E08010801C46F000E2F -:102878000801C56F0801270E08010801C26F080189 -:10288800080E0801C36F6DEC38F0080108012751E4 -:10289800F00B400AD8B453EF14F055EF14F058EF8A -:1028A80014F0000E00EF15F01F0E080108012D1599 -:1028B80008013B6FFF0E080108012E1508013C6F47 -:1028C80008013C513B11D8B46CEF14F06EEF14F0D2 -:1028D80071EF14F0000E00EF15F027C83BF80F0E4B -:1028E80008013B170801D8903B370801D8903B35C1 -:1028F80006010601FA6F06010801FAC63FF8080149 -:102908000801406B000E080108013D6F000E080128 -:102918003E6FF0EC36F03DC825F83EC826F80601B3 -:102928000801FAC67BF8080108017C6B64EC3CF0EE -:102938000801080126512511D8B4A5EF14F0A7EF16 -:1029480014F0AAEF14F0000E00EF15F00801270E9E -:1029580008010801BA6F0801080E0801BB6F5FEC97 -:102968002CF0080108011E511D11D8B4BEEF14F057 -:10297800C0EF14F0D0EF14F01DC8E9FF1EC8EAFF3D -:10298800080137C8EEFF080138C8EEFF080139C84A -:10299800EEFF08013AC8EEFF1FC8E9FF20C8EAFFAA -:1029A800080133C8EEFF080134C8EEFF080135C836 -:1029B800EEFF080136C8EEFF21C8E9FF22C8EAFF8A -:1029C800080130C8EFFF06010601FA5108010801A5 -:1029D800295D08013B6F000E080108012A5908010A -:1029E8003C6F23C8E9FF24C8EAFF3BC8EEFF3CC898 -:1029F800EDFF010E00EF15F01200000E08010801AE -:102A0800566509EF15F00BEF15F00DEF15F0C7EF50 -:102A180015F056C871F81DEC2BF056C868F8BEECD6 -:102A280020F068C858F869C859F8080108015951D0 -:102A38005811D8A422EF15F024EF15F026EF15F061 -:102A4800C7EF15F00801080158055911D8A42FEF50 -:102A580015F031EF15F035EF15F056C868F8F6ECBB -:102A68003BF019B03AEF15F03CEF15F067EF15F0B1 -:102A780000EE03F0EECF5AF8EDCF5BF801500801F5 -:102A88005A5F025008015B5BD89008015B3108016E -:102A98005D6F08015A3108015C6F0801080158513F -:102AA80008015C5D08010801595108015D59D8A069 -:102AB80060EF15F062EF15F067EF15F056C868F88B -:102AC800F6EC3BF01980010E08010801AA6F000E10 -:102AD8000801AB6F08015A6F010E08010801A96FC0 -:102AE80008015A510801570E08010801A76F08018B -:102AF800080E0801A86F1CC0A6F807C0A4F808C0F3 -:102B0800A5F8A0EC23F000EE03F010EE07F0E62A9B -:102B1800000EE522E652EE52ED50E55C02E1EF5080 -:102B2800E75CD8A09AEF15F09CEF15F0A0EF15F030 -:102B380001C007F002C008F0080108015805591142 -:102B4800D8A4A9EF15F0ABEF15F0B1EF15F056C802 -:102B580068F8F6EC3BF0C5EF15F018BAB6EF15F0CB -:102B6800B8EF15F0C5EF15F0188A5AEC42F0060ECA -:102B780008010801A125136E000E08010801A22111 -:102B8800146EC7EF15F0120006EE95F018EE0DF072 -:102B9800140EEECFE6FFE82ECDEF15F00801216FF9 -:102BA800140E08010801676F0801215108010D0E74 -:102BB80008010801656F0801080E0801666F0EEC30 -:102BC80018F00009D8A4EBEF15F0EDEF15F0EFEFD2 -:102BD80015F08CEF16F0000E08010801676FFF0E64 -:102BE8000801686F08010D0E08010801656F0801EA -:102BF800080E0801666F49EC29F008016651651155 -:102C0800D8A409EF16F00BEF16F00FEF16F070ECE2 -:102C180034F08CEF16F0B60E08010801676FFF0E4E -:102C28000801686F08010D0E08010801656F0801A9 -:102C3800080E0801666F49EC29F008016651651114 -:102C4800D8A429EF16F02BEF16F02FEF16F0CCECE6 -:102C5800D3F08CEF16F09F0E08010801676FFF0E86 -:102C68000801686F08010D0E08010801656F080169 -:102C7800080E0801666F49EC29F0080166516511D4 -:102C8800D8A449EF16F04BEF16F04FEF16F0A3EC6F -:102C98000BF08CEF16F0770E08010801676FFF0E36 -:102CA8000801686F08010D0E08010801656F080129 -:102CB800080E0801666F49EC29F008016651651194 -:102CC800D8A469EF16F06BEF16F06FEF16F0C5ECAD -:102CD80029F08CEF16F00C0E08010801676FFF0E43 -:102CE8000801686F08010D0E08010801656F0801E9 -:102CF800080E0801666F49EC29F008016651651154 -:102D0800D8A489EF16F08BEF16F08CEF16F0FF00C1 -:102D18001200040E08010801C46F000E0801C56FF7 -:102D28000801210E08010801C26F0801080E0801F8 -:102D3800C36F6DEC38F0080108012151080A22110F -:102D4800D8A4A9EF16F0ABEF16F04DEF17F01FC897 -:102D58003FF820C840F8140E080108013D6F000E26 -:102D680008013E6FF0EC36F008013E513D11D8B431 -:102D7800C0EF16F0C2EF16F0C4EF16F04DEF17F0E3 -:102D88000801256F000E08010801216F080125516F -:102D9800080E080108012327080E0801080123610D -:102DA800D8EF16F0DAEF16F0E9EF16F0080108018F -:102DB800242B080108012467E4EF16F0E6EF16F06B -:102DC800E9EF16F008010801232BEBEF16F0CBEC26 -:102DD8003DF00009D8B4F3EF16F0F5EF16F0EBEF7D -:102DE80016F0DD0E08010801AC6F0A0E0801AD6F80 -:102DF8000BEC44F01FC8A3F820C8A4F80801256FFD -:102E0800010E08010801A26F080125511DC8A0F88C -:102E18001EC8A1F8CAEC18F0040E08010801C26F18 -:102E2800000E0801C36F0801210E08010801C06FD8 -:102E38000801080E0801C16FBBEC40F0FC0E080148 -:102E480008011F2508010801B06FFF0E08010801DD -:102E580020210801B16FFF0E08010801AE6FFF0EB7 -:102E68000801AF6FFF0E08010801AC6FFF0E0801E3 -:102E7800AD6F3CECDDF041EF17F08EEC43F000094C -:102E8800D8B449EF17F04BEF17F041EF17F003EC08 -:102E980039F0120027C838F828C839F867EC35F037 -:102EA80008012D6F690E08010801646F08012D5192 -:102EB8008FEC3FF0080108012A512911D8A467EFC7 -:102EC80017F069EF17F075EF17F008012D6F300E46 -:102ED80008010801646F08012D518FEC3FF003EFE2 -:102EE80018F008012D6F000E080108012C6F080169 -:102EF8002D51080108012B51080108012C5DD8A0AB -:102F080088EF17F08AEF17F08CEF17F0B4EF17F08F -:102F1800080108012C51080108012925E96E08015A -:102F2800000E080108012A21EA6EEF50300AD8B4D1 -:102F3800A0EF17F0A2EF17F0A4EF17F0B4EF17F017 -:102F4800080108012C2B080108012B510801080170 -:102F58002C5DD8A0B2EF17F0B4EF17F08CEF17F094 -:102F6800080108012B51080108012C5DD8A0BFEF0A -:102F780017F0C1EF17F0C3EF17F003EF18F00801CF -:102F880008012C51080108012925E96E0801000EE5 -:102F9800080108012A21EA6EEF5008010801586F5C -:102FA8000DEC3FF008010801646F8FEC3FF0080159 -:102FB80008012C51080108012925E96E0801000EB5 -:102FC800080108012A21EA6EEF5008010801646F20 -:102FD800E1EC3EF008010801646F8FEC3FF0080156 -:102FE80008012C2B080108012B51080108012C5D50 -:102FF800D8A001EF18F003EF18F0C3EF17F008019D -:103008002D6F730E08010801646F08012D518FECB4 -:103018003FF0120008016B6F000E08010801696F8C -:1030280008016B5108016B6F000E080108016A6FF7 -:1030380008016B5149EF18F00101000E0401040169 -:10304800FF25E96EEA6A0101010EEA22EF50080144 -:103058000801686F04010401FF2B08010801685189 -:103068003A0AD8A43AEF18F03CEF18F03EEF18F0FF -:1030780053EF18F008016A3BF00E6A1768C872F837 -:103088002DEC2DF0080108016A13C70E0401040194 -:10309800FF6551EF18F053EF18F020EF18F0080112 -:1030A8006AC86BF808016C6BFF0E080108016725F8 -:1030B80008016D6F08016E6BFF0E08016E23080191 -:1030C8006E51800A08016F6F08016B5108016D5D30 -:1030D80008016C51800A08016F59D8B076EF18F0D2 -:1030E80078EF18F081EF18F0080108016A5104011F -:1030F8000401FF27000EC9EF18F008016B6F000EDE -:1031080008010801696F08016B51AAEF18F0010165 -:10311800000E04010401FF25E96EEA6A0101010EAF -:10312800EA22080108016951080108016525E16ED4 -:103138000801000E080108016621E26EEFCFE7FFE3 -:1031480004010401FF2B08010801692B080108018B -:103158006A5108010801695DD8A0B5EF18F0B7EF0A -:1031680018F08BEF18F0080108016A5108010801EE -:103178006525E96E0801000E080108016621EA6E5E -:10318800000EEF6E010EC9EF18F012000801B96FBA -:10319800140E06010601FA6F0801B9510801B96F4A -:1031A800450E08010801A56F0801B9510801B96F5A -:1031B800000E08010801A66F0801B951140E080194 -:1031C8000801A32508010801A76F000E08010801DE -:1031D800A4210801A86F07010701204B212B20C754 -:1031E800A9F821C7AAF8000E08010801AB6F000E64 -:1031F8000801AC6F0801B96F640E08010801AD6FD2 -:103208000801B951A2C8AEF8000E08010801AF6F55 -:10321800000E0801B06F6CC0B1F86DC0B2F86EC096 -:10322800B3F86FC0B4F8A0C8E9FFA1C8EAFF080165 -:10323800EECFB5F80801EECFB6F80801EECFB7F833 -:103248000801EECFB8F80801A50E08010801BA6F09 -:103258000801080E0801BB6F5FEC2CF0140E080182 -:103268000801BC6F000E0801BD6F0801A50E08011A -:103278000801BA6F0801080E0801BB6FF2EC1EF0D6 -:10328800BAC8AFF8BBC8B0F8140E08010801A325E6 -:1032980008010801BD6F000E08010801A4210801FA -:1032A800BE6F0801B96F000E08010801BC6F080164 -:1032B800B951040E08010801A02508010801BA6FD8 -:1032C800000E08010801A1210801BB6FC4EC33F00E -:1032D800140E08010801C26F000E0801C36F08012F -:1032E800A50E08010801C06F0801080E0801C16F8A -:1032F800BBEC40F080EF19F012004CC850F84DC8F4 -:1033080051F8080150C8F6FF080151C8F7FF000E30 -:10331800F86E08000801F5CF4FF808010801504B76 -:10332800512B080108014F51D8B49DEF19F09FEFB8 -:1033380019F0CBEF19F0080108014F512E0AD8B443 -:10334800A8EF19F0AAEF19F0CBEF19F0080108015E -:103358004F512F0AD8B4B3EF19F0B5EF19F0CBEFEE -:1033680019F0080108014F512C0AD8B4BEEF19F022 -:10337800C0EF19F0CBEF19F0080108014F513E0AD0 -:10338800D8A4C9EF19F0CBEF19F085EF19F00801AF -:1033980008014C5108010801505D0801526F0801ED -:1033A8005205080108014E6F4EC853F867EC3DF00E -:1033B800080108014EC855F808010801566B4CC8A9 -:1033C80053F84DC854F853EC31F0010E08010801C8 -:1033D8005327000E0801542308010801535108011E -:1033E80008014C27080108015451080108014D2320 -:1033F800080108014F51D8B404EF1AF006EF1AF08B -:1034080027EF1AF0080108014F512F0AD8B40FEF1F -:103418001AF011EF1AF027EF1AF0080108014F51BE -:103428002C0AD8B41AEF1AF01CEF1AF027EF1AF08A -:10343800080108014F513E0AD8A425EF1AF027EFDA -:103448001AF029EF1AF02BEF1AF085EF19F008019E -:10345800526F000E08010801536F0801525167ECC2 -:103468003DF012004CC850F84DC851F850C8E9FF5B -:1034780051C8EAFFEF50080108014F6F0801080121 -:10348800504B512B080108014F51D8B44EEF1AF098 -:1034980050EF1AF07CEF1AF0080108014F512E0A7C -:1034A800D8B459EF1AF05BEF1AF07CEF1AF0080164 -:1034B80008014F512F0AD8B464EF1AF066EF1AF0DA -:1034C8007CEF1AF0080108014F512C0AD8B46FEFAD -:1034D8001AF071EF1AF07CEF1AF0080108014F5149 -:1034E8003E0AD8A47AEF1AF07CEF1AF03AEF1AF0F5 -:1034F800080108014C5108010801505D0801526F8C -:1035080008015205080108014E6F4EC853F867ECD0 -:103518003DF0080108014EC855F808010801566B2E -:103528004CC853F84DC854F8F9EC30F0010E0801B6 -:1035380008015327000E08015423080108015351BC -:10354800080108014C270801080154510801080125 -:103558004D23080108014F51D8B4B5EF1AF0B7EF61 -:103568001AF0D8EF1AF0080108014F512F0AD8B401 -:10357800C0EF1AF0C2EF1AF0D8EF1AF008010801EC -:103588004F512C0AD8B4CBEF1AF0CDEF1AF0D8EF80 -:103598001AF0080108014F513E0AD8A4D6EF1AF0D4 -:1035A800D8EF1AF0DAEF1AF0DCEF1AF03AEF1AF067 -:1035B8000801526F000E08010801536F08015251AB -:1035C80067EC3DF012004CC8E9FF4DC8EAFFEECFAA -:1035D80050F8EECF51F8EECF52F8EECF53F8040181 -:1035E8000401DC510801531911E104010401DB5104 -:1035F800080152190BE104010401DA5108015119BB -:1036080005E104010401D95108015019D8B40FEF9C -:103618001BF011EF1BF083EF1BF004010401DC51D8 -:1036280000010001771914E104010401DB510001D4 -:10363800000176190DE104010401DA5100010001CD -:10364800751906E104010401D9510001000174193A -:10365800D8A431EF1BF033EF1BF094EF1BF04CC8EC -:10366800E9FF4DC8EAFFEECF50F8EECF51F8EECFA4 -:1036780052F8EECF53F8000100016C5108015019BF -:103688000801546F000100016D510801511908012A -:10369800556F000100016E51080152190801566F5B -:1036A800000100016F51080153190801576F00010B -:1036B80000017051080154150801586F00010001FC -:1036C8007151080155150801596F00010001725127 -:1036D8000801561508015A6F0001000173510801CD -:1036E800571508015B6F08015B51581159115A11A0 -:1036F800D8B481EF1BF083EF1BF094EF1BF004EEBE -:10370800DDF008014EC8E1FF08014FC8E2FF060ED0 -:10371800EECFE6FFE82E8CEF1BF0010E97EF1BF0C3 -:10372800000E97EF1BF012009AEF1BF0CBEC3DF068 -:103738000009D8B4A2EF1BF0A4EF1BF09AEF1BF01E -:10374800CF0E08010801AC6F0A0E0801AD6F0BEC33 -:1037580044F078C8E9FF79C8EAFF010EEE6E000E62 -:10376800ED6E020E080108017825E96E000E0801C9 -:1037780008017921EA6E000EEE6E080EED6E040E59 -:10378800080108017825E96E000E08010801792171 -:10379800EA6E060EEF6E050E080108017825E96E3F -:1037A800000E080108017921EA6E040EEF6E060E7C -:1037B80008010801B06F000E0801B16F990E0801E9 -:1037C8007A6F000E7B6F7AC8AEF87BC8AFF8080E28 -:1037D80008010801782508010801AC6F000E0801EE -:1037E800080179210801AD6F58EC3AF00E0E080176 -:1037F80008017825E96E000E080108017921EA6EB2 -:1038080000016CC0EEFF00016DC0EEFF00016EC04C -:10381800EEFF00016FC0EEFF78C87CF879C87DF82C -:103828009EEC30F01C0E08010801BD6F000E080167 -:10383800BE6F08017A6F060E08010801BC6F080107 -:103848007A51120E08010801782508010801BA6F9B -:10385800000E0801080179210801BB6FC4EC33F0A0 -:103868001C0E08010801C26F000E0801C36F78C85A -:10387800C0F879C8C1F8BBEC40F003EC39F0010E90 -:1038880046EF1CF0120008011B6F000E080108012A -:10389800186F08011B510801080116AF56EF1CF0FC -:1038A80058EF1CF067EF1CF008010801156D0801BE -:1038B800161FD8B0162B08011B6F010E080108014E -:1038C800186F08011B510801080114AF6EEF1CF0B6 -:1038D80070EF1CF07BEF1CF008010801136D080164 -:1038E800141FD8B0142B010E08010801181B000E74 -:1038F80008010801196F000E08011A6F0801080174 -:1039080016511511D8B48BEF1CF08DEF1CF0DCEFBD -:103918001CF008011B6F010E08010801176F080150 -:103928001B51A0EF1CF00801D890080115370801B9 -:10393800163708010801172B0801080116AFA7EF71 -:103948001CF0A9EF1CF097EF1CF00801D8900801B3 -:10395800193708011A37080108011551080108012B -:10396800135D080108011651080108011459D8A06F -:10397800C0EF1CF0C2EF1CF0D1EF1CF008010801E9 -:10398800155108010801135F0801080116510801C3 -:103998000801145B0801080119810801D890080181 -:1039A80016330801153308010801172FA9EF1CF079 -:1039B800080108011851D8B4E4EF1CF0E6EF1CF038 -:1039C800EDEF1CF008010801196D08011A1FD8B0A5 -:1039D8001A2B19C813F81AC814F8F3EF1CF01200C0 -:1039E800990E08010801566FFF0E0801576F4CEC3D -:1039F80027F00009D8A403EF1DF005EF1DF007EF2D -:103A08001DF0A0EF1DF0C9EC26F065C8F8F566C8F2 -:103A1800F9F567C8FAF568C8FBF5CF0E0801080183 -:103A2800566FFF0E0801576F4CEC27F00009D8A419 -:103A380020EF1DF022EF1DF024EF1DF0A0EF1DF088 -:103A4800C9EC26F065C814F766C815F78C0E08018E -:103A58000801566FFF0E0801576F4CEC27F000095C -:103A6800D8A439EF1DF03BEF1DF03DEF1DF0A0EF9E -:103A78001DF0C9EC26F065C818F766C819F76DEC93 -:103A880044F00801556F000E08010801536F080142 -:103A98005551090E08010801536555EF1DF057EF00 -:103AA8001DF059EF1DF09EEF1DF00801556F020E35 -:103AB80008010801566F0801555177EC44F039ECBC -:103AC8002AF00801556F000E08010801546F08011B -:103AD80055510A0E08010801546575EF1DF077EF7E -:103AE8001DF079EF1DF091EF1DF00E0E0801556FD6 -:103AF800850EE82E7DEF1DF0552F7DEF1DF000D0CF -:103B080008010801542B0A0E0801080154658FEFBB -:103B18001DF091EF1DF079EF1DF008010801532BFE -:103B2800090E0801080153659CEF1DF09EEF1DF07A -:103B380059EF1DF05FEC44F01200000E0801080177 -:103B4800006F000E0801016F000E0801026F000EE1 -:103B58000801036F000E0E010E01B66F000E0E0174 -:103B68000E01B76F000E926E000E936E000E946EEB -:103B7800000E956E000E966E000E976E000E986EF3 -:103B8800000E806E000E816E000E826E000E836E37 -:103B9800000E846E000E856E0801046F400E9B6E49 -:103BA800080104510801046F0F0EC16E0801045189 -:103BB80042EC44F09CEC43F002EC3DF069EC44F03C -:103BC8005FEC01F0FEECE7F080EC43F0D1EC3AF06A -:103BD800420E080108010B6F370E08010C6F08012F -:103BE800046F140E080108010A6F0801045199ECCA -:103BF80040F0CBECCCF07DEC44F0C4EC43F0080191 -:103C08000801005108010801A15D0801046F0801BD -:103C18000801015108010801A2590801056F0801AE -:103C28000801025108010801A3590801066F08019B -:103C38000801035108010801A4590801076FF20E91 -:103C4800045D9E0E0559000E0659000E080107591D -:103C5800D8A031EF1EF033EF1EF03DEF1EF0C4EC9C -:103C680043F0A1C800F8A2C801F8A3C802F8A4C884 -:103C780003F81AECC7F050ECE2F0EFECC4F019ECE2 -:103C8800B6F046EC26F00400FDEF1DF014EF00F04E -:103C980012C817F811C816F882EC2FF008010801AD -:103CA800136F0701070113675CEF1EF05EEF1EF04C -:103CB80066EF1EF00801146F000E070107013B6F45 -:103CC80008011451080108011351FE0AD8A46FEF26 -:103CD8001EF071EF1EF07AEF1EF0FE0E08010801CB -:103CE800116FFF0E0801126FF1EF1EF008010801B5 -:103CF8001329D8A482EF1EF084EF1EF08BEF1EF07C -:103D080008010801116908011269F1EF1EF00701A5 -:103D180007011151040AD8A494EF1EF096EF1EF083 -:103D2800A2EF1EF007013B3BF00E3B170801146F92 -:103D3800000E07010701116F08011451080108015D -:103D48001351D8B4AAEF1EF0ACEF1EF0C1EF1EF06D -:103D580011C714F8010E0801156F0801142BB8EFEC -:103D68001EF0D890080115370801142FB5EF1EF082 -:103D780008011551070107013B1307010701132B20 -:103D880007010701112B080E070107011361CFEF87 -:103D98001EF0D1EF1EF0D8EF1EF0080108011169DE -:103DA80008011269F1EF1EF00801146F000E0701F7 -:103DB8000701136F080114510801146F000E070161 -:103DC8000701116F08011451070108013BC711F8D9 -:103DD80008010801126BF1EF1EF01200D8900801DB -:103DE8000801BD3108010801BF6F08010801BC3195 -:103DF8000801BE6FBAC8C0F8BBC8C1F8000E0801F8 -:103E08000801C26F000E0801C36F000E0801C46FDD -:103E1800000E0801C56F34EF1FF00801C0C8E9FFA4 -:103E28000801C1C8EAFF0801020E0801C027000EF8 -:103E38000801C123EECFC6F8EDCFC7F80801C65177 -:103E480008010801C2270801C75108010801C32356 -:103E5800000E08010801C423000E08010801C5234B -:103E680008010801BE07D8A0BF070801BE29D8B4B9 -:103E7800BF29D8A442EF1FF044EF1FF011EF1FF045 -:103E880008010801BCA14BEF1FF04DEF1FF060EFD8 -:103E98001FF0C0C8E9FFC1C8EAFFEF500801C66FAC -:103EA8000801C65108010801C227000E0801C323F2 -:103EB8000801C4230801C52308010801C2510801EB -:103EC8000801C42508010801C26F08010801C3518F -:103ED80008010801C5210801C36F0801C46BD8B0E7 -:103EE800C42B0801C56B080108EEC4F0EE500801A8 -:103EF8000801C227ED5008010801C3230801080181 -:103F0800C21D08010801BA6F08010801C31D080194 -:103F1800BB6F8FEF1FF01200000E08010801376F0A -:103F2800000E0801386F000E0801396F000E0801F5 -:103F38003A6F08013551321133113411D8B4A7EF53 -:103F48001FF0A9EF1FF01CEF20F008013B6F010ED6 -:103F580008010801366F08013B51C0EF1FF0080146 -:103F6800D89008013237080133370801343708017F -:103F7800353708010801362B0801080135AFC7EFAE -:103F88001FF0C9EF1FF0B3EF1FF00801D890080128 -:103F98003737080138370801393708013A37080137 -:103FA80008013251080108012E5D0801080133514A -:103FB800080108012F5908010801345108010801B6 -:103FC8003059080108013551080108013159D8A0B4 -:103FD800F0EF1FF0F2EF1FF00DEF20F008010801DD -:103FE8003251080108012E5F080108013351080108 -:103FF80008012F5B08010801345108010801305BF2 -:1040080008010801355108010801315B0801080160 -:1040180037810801D8900801353308013433080185 -:1040280033330801323308010801362FC9EF1FF076 -:1040380037C82EF838C82FF839C830F83AC831F8D8 -:1040480026EF20F0120007010701A529D8A42FEFB9 -:1040580020F031EF20F056EF20F0FEC653F8FFC6EF -:1040680054F8FEC651F8FFC652F80801336F040E23 -:1040780008010801506F08013351630E0801346FBD -:10408800060E356F080134C84CF8080135C84DF8DC -:10409800080108014E6B08014F6B22ECD7F00701AD -:1040A8000701A56F07010701A529D8A45EEF20F035 -:1040B80060EF20F062EF20F0BDEF20F0A5C74CF8CC -:1040C80093EC39F008014D514C11D8A46EEF20F053 -:1040D80070EF20F072EF20F0BDEF20F0DEEC43F03F -:1040E80036C82FF837C830F82FC859F830C85AF8EA -:1040F8003DEC37F059C82DF85AC82EF8000E0801C3 -:104108000801316F000E0801326FA3EF20F008019B -:1041180008013151080108012F25E96E080108013D -:104128003251080108013021EA6EEF5008010801F8 -:10413800536F67EC3DF008010801314B322B080141 -:1041480008013251800A0801336F08012D51080116 -:104158000801315D080108012E51800A0801335910 -:10416800D8A0B9EF20F0BBEF20F08BEF20F053EC94 -:1041780021F01200000E080108016865C6EF20F062 -:10418800C8EF20F0D1EF20F0000E08010801686F99 -:10419800000E0801696F52EF21F068C871F81DEC34 -:1041A8002BF017C06AF8080108016A51070AD8B449 -:1041B800E0EF20F0E2EF20F0F6EF20F00801080130 -:1041C8006A510B0AD8B4EBEF20F0EDEF20F0F6EFD0 -:1041D80020F0000E08010801686F000E0801696FE1 -:1041E80052EF21F000EE09F010EE07F0E652EE5221 -:1041F800ED50E55C02E1EF50E75CD8A006EF21F056 -:1042080008EF21F039EF21F000EE07F0EECF6BF860 -:10421800EDCF6CF8095008016B5F0A5008016C5B20 -:1042280000EE03F0EECF6DF8EDCF6EF80150080107 -:104238006D5F025008016E5BFF0E08016D250801D5 -:104248006F6FFF0E08016E210801706F08016B5136 -:1042580008016F5D08010801686F08016C510801C9 -:1042680070590801696F52EF21F000EE09F0EECFA6 -:104278006BF8EDCF6CF8075008016B5F0850080128 -:104288006C5BFF0E08016B2508010801686FFF0EC3 -:1042980008016C210801696F52EF21F01200070133 -:1042A80007010D51170D0201000EF3240801080142 -:1042B8004E6F08014F6B0201020E08014F23080ED2 -:1042C80006010601BC25080108014C6F000E060115 -:1042D8000601BD2108014D6F0C0E080108014E258D -:1042E800E96E000E080108014F21EA6E0801EECFC1 -:1042F800BCF80801EDCFBDF82FEC43F0BCC850F86E -:10430800BDC851F80A0E080108014E25E96E000ED5 -:10431800080108014F21EA6E0801EECFBCF8080138 -:10432800EDCFBDF82FEC43F0BCC852F8BDC853F828 -:104338004CC8BCF84DC8BDF82FEC43F0BCC854F8C5 -:10434800BDC855F8000E08010801566F000E080197 -:10435800576FDD0E08010801AC6F0A0E0801AD6F3A -:104368000BEC44F04CC8A3F84DC8A4F80801586FEA -:10437800110E08010801A26F080158514EC8A0F893 -:104388004FC8A1F8CAEC18F0080E08010801C26F5E -:10439800000E0801C36F0801500E08010801C06F24 -:1043A8000801080E0801C16FBBEC40F003EC39F0BE -:1043B800000E06010601BC6F000E0601BD6F070165 -:1043C8000701A069120070EF22F06DC8B0F86EC83E -:1043D800B1F86BC8AEF86CC8AFF868C8ACF869C873 -:1043E800ADF858EC3AF07AEF22F008010801682994 -:1043F800D8B46929D8B403EF22F005EF22F00BEF07 -:1044080022F068C8ACF869C8ADF80BEC44F0100E9F -:10441800080108016F6F000E0801706F63EF22F04A -:10442800080108016F51080108016D5D08010801C4 -:104438007051080108016E59D8B025EF22F027EF16 -:1044480022F02BEF22F06DC86FF86EC870F86FC8B5 -:10445800B0F870C8B1F86BC8AEF86CC8AFF808010E -:10446800710E08010801AC6F0801080E0801AD6F54 -:1044780058EC3AF06FC8C2F870C8C3F80801710E5A -:1044880008010801C06F0801080E0801C16FBBECE4 -:1044980040F0080108016F51080108016B27000E60 -:1044A800080108016C23080108016F51080108017F -:1044B8006D5F080108017051080108016E5B080171 -:1044C80008016E516D11D8A46CEF22F06EEF22F046 -:1044D80014EF22F07AEF22F0080108016A51000A6D -:1044E80084E0010A01E171D77AEF22F01200080195 -:1044F800776F000E08010801766F080177510E0EDC -:104508000801080176658BEF22F08DEF22F08FEF1E -:1045180022F007EF23F0010E070107018C150801AF -:10452800776F000E070107018D150801786F000EDF -:10453800070107018E150801796F000E07010701B1 -:104548008F1508017A6F08017751000808017B6F01 -:10455800000E0801785508017C6F000E0801795596 -:1045680008017D6F000E08017A5508017E6F010E63 -:1045780008017B1508017F6F000E08017C150801F2 -:10458800806F000E08017D150801816FD00E0801AB -:104598007E150801826F07018CC783F807018DC754 -:1045A80084F807018EC785F807018FC786F8D89069 -:1045B8000801863385338433833308017F5108012A -:1045C8008319070107018C6F0801805108018419BC -:1045D80007018D6F080181510801851907018E6F48 -:1045E800080182510801861907018F6F0801080127 -:1045F800762B0E0E08010801766505EF23F007EF0C -:1046080023F08FEF22F08CC774F88DC775F80DEF83 -:1046180023F01200010E08010801566F000E080170 -:10462800576F0801080162690801080163690801F8 -:1046380008016469080108016569080108016669DB -:104648000801080167694CC84EF84DC84FF84CC8B6 -:10465800E9FF4DC8EAFFEECF6CF8EECF6DF8EECF6C -:104668006EF8EECF6FF8000100016C5108016C196B -:104678000801706F000100016D5108016D190801F2 -:10468800716F000100016E5108016E190801726F07 -:10469800000100016F5108016F190801736F0001D3 -:1046A80000017051080170150801746F00010001C4 -:1046B8007151080171150801756F000100017251EF -:1046C800080172150801766F000100017351080195 -:1046D80073150801776F08017751741175117611F8 -:1046E800D8B479EF23F07BEF23F084EF23F00001B7 -:1046F800740E080108014E6F0001000E08014F6F8B -:104708004EC8E9FF4FC8EAFF0801EECF68F8080174 -:10471800EECF69F80801EECF6AF80801EECF6BF822 -:104728000801500E08010801786F0801080E0801F9 -:10473800796F98EC1BF0120022EF24F0D2EF23F0EF -:10474800AAC8B0F8ABC8B1F8A7C8AEF8A8C8AFF8FF -:10475800A4C8ACF8A5C8ADF858EC3AF0DBEF23F0E4 -:1047680008010801A429D8B4A529D8B4BEEF23F0BC -:10477800C0EF23F0C6EF23F0A4C8ACF8A5C8ADF885 -:104788000BEC44F0AAC8C2F8ABC8C3F8A7C8C0F875 -:10479800A8C8C1F8BBEC40F0DBEF23F00801080122 -:1047A800A651000ADDE0010ACBE0DBEF23F02CEF95 -:1047B80024F019EF24F008010801A729D8B4A82982 -:1047C800D8B4E9EF23F0EBEF23F0F1EF23F0A7C81B -:1047D800ACF8A8C8ADF82CEC44F0AAC8C4F8ABC82B -:1047E800C5F8A4C8C2F8A5C8C3F86DEC38F0DBEF6B -:1047F80023F0AAC8B0F8ABC8B1F8A7C8AEF8A8C8E3 -:10480800AFF8A4C8ACF8A5C8ADF83CECDDF00DEFE6 -:1048180024F08EEC43F00009D8B415EF24F017EF1C -:1048280024F00DEF24F0DBEF23F008010801A65176 -:10483800000ADFE0010ABFE0DBEF23F0080108010E -:10484800A951000AB6E0010A01E178D72CEF24F05B -:1048580012002FEF24F0C5CF2CF81F0E08012C17DB -:104868002CC82DF808012E6B000EC7B4010E0801E4 -:104878002D13000E2E1308012E512D11D8A447EF29 -:1048880024F049EF24F02FEF24F0C5804CEF24F0FA -:10489800C5B051EF24F053EF24F04CEF24F0A1A65B -:1048A80058EF24F05AEF24F05CEF24F0B6EF24F030 -:1048B80029C82FF819EC3AF00009D8B466EF24F0AB -:1048C80068EF24F06BEF24F0C584B6EF24F0C5BC84 -:1048D80070EF24F072EF24F09EEF24F02AC82FF82E -:1048E80019EC3AF00009D8B47CEF24F07EEF24F0FC -:1048F80081EF24F0C584B6EF24F0C5BC86EF24F020 -:1049080088EF24F099EF24F02BC82FF819EC3AF02F -:104918000009D8B492EF24F094EF24F097EF24F034 -:10492800C584B6EF24F09CEF24F0C584B6EF24F0DC -:10493800A1EF24F0C584B6EF24F0C584A4EF24F0D9 -:10494800C5B4A9EF24F0ABEF24F0A4EF24F0A1A69E -:10495800B0EF24F0B2EF24F0B4EF24F0B6EF24F077 -:10496800B6EF24F0120007010701A451070107015F -:104978009F63C1EF24F0C3EF24F0C5EF24F03EEFAE -:1049880025F0070107019F51FE0AD8B4CEEF24F0A5 -:10499800D0EF24F019EF25F0270E08010801AA6FBF -:1049A800000E0801AB6F0801A06F010E0801080195 -:1049B800A96F0801A0511D0E08010801A76F000E7C -:1049C8000801A86F070107019F511C0DF3CFA1F83B -:1049D8001B0E0801A1270401BD0E0801A125E96EDF -:1049E800EA6A0401040EEA22EF5008010801A66FE2 -:1049F800070107019F511C0D0401BD0EF324E96E48 -:104A0800EA6A0401040EEA22EECFA2F8EDCFA3F879 -:104A1800D90E0801A22508010801A46FFF0E08019C -:104A2800A3210801A56FA0EC23F0A4C79FF7270EC8 -:104A380008010801AA6F000E0801AB6F1CC0A9F895 -:104A4800D90E012408010801A76FFF0E02200801F2 -:104A5800A86F0801A06F010E08010801A66F0801E0 -:104A6800A0511D0E08010801A46F000E0801A56FD2 -:104A7800A0EC23F012000701D89033370801080191 -:104A8800F051D8B44AEF25F04CEF25F06FEF25F040 -:104A980007010701262B070107012651030AD8A49D -:104AA80058EF25F05AEF25F060EF25F0070E0701C3 -:104AB800070133136DEF25F0030E07010701266583 -:104AC80068EF25F06AEF25F06DEF25F00701070183 -:104AD800338177EF25F00801F16F000E0701070118 -:104AE800266F0801F1510701D890393707010701EE -:104AF8003F2B0701070133AF84EF25F086EF25F040 -:104B08008BEF25F00701070139818BEF25F00701AD -:104B180007013F51080AD8A494EF25F096EF25F035 -:104B2800C2EF25F00801F16F000E070107013F6F82 -:104B38000801F151B30E06010601D825E96E020EEF -:104B480006010601D921EA6E070139C7EFFF060100 -:104B58000601D84BD92B06010601D951020AD811F2 -:104B6800D8A4B9EF25F0BBEF25F0C2EF25F0000E71 -:104B780006010601D86F000E0601D96F1200D9CEC2 -:104B8800A4F8EECEA2F8EFCEA3F808010801A451CC -:104B98000E010E01D963D3EF25F0D5EF25F0C3EF51 -:104BA80025F0ECCEA4F8EDCEA5F808010801A25135 -:104BB80008010801A45D08010801A35108010801C2 -:104BC800A559D8B0EAEF25F0ECEF25F00BEF26F069 -:104BD8000801A2C8A6F80801A3C8A7F80801080197 -:104BE800A4510801A65F08010801A5510801A75BA7 -:104BF8000801A651CD0808010801A06F0801A751B6 -:104C0800D8A0E82A0A080801A16F45EF26F0080194 -:104C18000801A55108010801A31906E108010801C6 -:104C2800A45108010801A219D8A41DEF26F01FEF0E -:104C380026F028EF26F0CD0E08010801A06F0A0E15 -:104C48000801A16F45EF26F00801A4C8A6F80801DD -:104C5800A5C8A7F808010801A2510801A65F080124 -:104C68000801A3510801A75BFF0E0801A62508014A -:104C78000801A06FFF0E0801A7210801A16F45EFE9 -:104C880026F01200BFEF26F04A0E08010801536F04 -:104C9800A50E0801546F4A0E08010801516FA50EB0 -:104CA8000801526F0801096F040E08010801506FCE -:104CB80008010951000E080108014C6F000E080197 -:104CC8004D6F000E08014E6F000E08014F6F22EC69 -:104CD800D7F006010601E66F06010601E629D8A409 -:104CE80078EF26F07AEF26F07CEF26F0C8EF26F072 -:104CF8000801096F010E070107013E6F08010951FC -:104D0800C8EF26F0E6C64CF8D9EC39F008014D5149 -:104D18004C11D8A492EF26F094EF26F096EF26F0E7 -:104D2800C8EF26F065EC3FF0A9EF26F00801080E61 -:104D3800080108014D6F0801080E08014E6F35EC97 -:104D48003DF008C864F88FEC3FF0E6C64CF8D9ECA3 -:104D580039F008014D514C11D8A4B5EF26F0B7EF42 -:104D680026F09AEF26F08FEC41F0C8EC15F065ECD0 -:104D78003FF0C8EF26F0070107013E51000A84E022 -:104D8800010AC0E0C8EF26F01200000E0801080171 -:104D98006D6F000E08016E6F000E08016F6F000E38 -:104DA8000801706F77EC41F00009D8A4DEEF26F017 -:104DB800E0EF26F0EFEF26F0000E08010801656F1E -:104DC800000E0801666F000E0801676F000E0801EB -:104DD800686F4BEF27F004010401FF2B37EF27F032 -:104DE8000101000E04010401FF25E96EEA6A0101D0 -:104DF800010EEA22EF500801716F08017151080194 -:104E08000801696F08016A6B08016B6B08016C6B1C -:104E180004010401FF2B08016951730A6A116B111F -:104E28006C11D8A41AEF27F01CEF27F01EEF27F01B -:104E380041EF27F00801040ED89008016D370801EA -:104E48006E3708016F3708017037E82E20EF27F01A -:104E580069C872F82DEC2DF00801716F08017151C5 -:104E6800080108016D13C70E04010401FF653FEF37 -:104E780027F041EF27F0F4EF26F06DC865F86EC80B -:104E880066F86FC867F870C868F84BEF27F012002B -:104E98002DC7FFF4BEEF27F00801646F0C0E080160 -:104EA8000801676F080164510801580E08010801DC -:104EB800656F0801080E0801666F0EEC18F000090E -:104EC800D8A469EF27F06BEF27F06EEF27F0000EFC -:104ED800CBEF27F00801580E08010801676F080199 -:104EE800080E0801686F56C865F857C866F849EC97 -:104EF80029F0080166516511D8A485EF27F087EFDE -:104F080027F08AEF27F0010ECBEF27F077EC41F07E -:104F18000009D8B492EF27F094EF27F098EF27F024 -:104F2800C9EC26F0A9EF27F00801646F000E08010C -:104F38000801676F08016451000E08010801656FD8 -:104F4800000E0801666F0EEC18F00101000E040156 -:104F58000401FF25E96EEA6A0101010EEA22730ED7 -:104F6800EF62B9EF27F0BBEF27F0BEEF27F0000E96 -:104F7800CBEF27F0C70E04010401FF65C6EF27F049 -:104F8800C8EF27F050EF27F0000ECBEF27F0120004 -:104F980058C8E9FF59C8EAFF010EEE6E230EEE6EFF -:104FA800450EEE6E670EED6EED52ED52040E0801E1 -:104FB80008015825E96E000E080108015921EA6E1A -:104FC800890EEE6EAB0EEE6ECD0EEE6EEF0EED6E42 -:104FD800ED52ED52080E080108015825E96E000E41 -:104FE800080108015921EA6EFE0EEE6EDC0EEE6E27 -:104FF800BA0EEE6E980EED6EED52ED520C0E0801E3 -:1050080008015825E96E000E080108015921EA6EC9 -:10501800760EEE6E540EEE6E320EEE6E100EED6ED5 -:10502800ED52ED52100E080108015825E96E000EE8 -:10503800080108015921EA6EF00EEE6EE10EEE6EDF -:10504800D20EEE6EC30EED6EED52ED52140E080147 -:1050580008015825E96E000E080108015921EA6E79 -:10506800000EEE6E000EEE6E000EEE6E000EED6E91 -:10507800ED52ED52580E080108015825E96E000E50 -:10508800080108015921EA6E010EEF6E12000DC8E1 -:1050980013F894EC2DF013C810F814C811F808018F -:1050A800080111511011D8A45CEF28F05EEF28F028 -:1050B80061EF28F0000EC9EF28F00DC871F81DEC5B -:1050C8002BF0080108010F510E11D8B46EEF28F02B -:1050D80070EF28F08BEF28F0010E08010801AA6F85 -:1050E800000E0801AB6F1CC0A9F80DC0A7F80EC0D0 -:1050F800A8F80801126F010E08010801A66F08013F -:1051080012510EC8A4F80FC8A5F8A0EC23F000EEC1 -:105118000DF0EE2A000EED2210EE05F0E652EE52EA -:10512800ED50E55C02E1EF50E75CD8B09EEF28F067 -:10513800A0EF28F0A4EF28F003C00DF004C00EF093 -:105148000801080110051111D8A4ADEF28F0AFEF40 -:1051580028F0B2EF28F01984C6EF28F018BAB7EF94 -:1051680028F0B9EF28F0C6EF28F0188A5AEC42F078 -:105178001F0E08010801A125136E000E0801080181 -:10518800A221146E010EC9EF28F012000094000E3F -:10519800070107010E6F009253C8E9FF54C8EAFFE0 -:1051A800EF5007010701126FB180DBEF28F000A272 -:1051B800E0EF28F0E2EF28F0DBEF28F09D92010EF7 -:1051C80008010801556F000E0801566F25EF29F0F8 -:1051D800080108015551080108015325E96E080125 -:1051E80008015651080108015421EA6E010EEF62C8 -:1051F80000EF29F002EF29F005EF29F0008421EFF4 -:1052080029F00092080108015551080108015325A9 -:10521800E96E080108015651080108015421EA6E97 -:10522800EF5007010701126F1AEF29F000A21FEFD4 -:1052380029F021EF29F01AEF29F008010801554B50 -:10524800562B080108015551080108015325E96E3C -:10525800080108015651080108015421EA6EEF506F -:10526800D8A439EF29F03BEF29F0ECEF28F09D8224 -:1052780000923FEF29F000A244EF29F046EF29F011 -:105288003FEF29F0B190899812004DEF29F04DEFCA -:1052980029F008010801675108016A6F080108012F -:1052A800685108016B6F0801674B682B6AC8F6FFE5 -:1052B8006BC8F7FF000EF86E0E0EF76403D00800F7 -:1052C800F55005D0F6CFE9FFF7CFEAFFEF50080118 -:1052D8006C6F080165C8F6FF080166C8F7FF000E85 -:1052E800F86E0E0EF76403D00800F55005D0F6CF1F -:1052F800E9FFF7CFEAFFEF5008016D6F08016C5125 -:1053080008016D5D08010801696F080169678FEF81 -:1053180029F091EF29F0B7EF29F00801080165514C -:1053280008016A6F08010801665108016B6F0801DE -:10533800654B662B6AC8F6FF6BC8F7FF000EF86E60 -:105348000E0EF76403D00800F55005D0F6CFE9FF3C -:10535800F7CFEAFFEF500009D8A4B5EF29F0B7EF6F -:1053680029F04BEF29F008010801695108010801EB -:10537800656F0801666B080165BF6607C4EF29F011 -:1053880012000001000198ADCCEF29F0CEEF29F012 -:10539800FDEF29F000010001EC690001ED69000151 -:1053A800EE690001EF6900010001F0690001F1698F -:1053B8000001F2690001F36900010001F4690001CC -:1053C800F5690001F6690001F76900010001F86953 -:1053D8000001F9690001FA690001FB690001000197 -:1053E800FC690001FD690001FE690001FF6925EF04 -:1053F8002AF06CC0ECF06DC0EDF06EC0EEF06FC03E -:10540800EFF070C0F0F071C0F1F072C0F2F073C04C -:10541800F3F074C0F4F075C0F5F076C0F6F077C01C -:10542800F7F078C0F8F079C0F9F07AC0FAF07BC0EC -:10543800FBF07CC0FCF07DC0FDF07EC0FEF07FC0BC -:10544800FFF0250E08010801246F000E0801256FE2 -:105458000001DB0E08010801226F0001000E08019F -:10546800236F4DEC39F0FF0012008988050E080102 -:10547800566F300EE82E3EEF2AF0562F3EEF2AF0F8 -:1054880089982B0E0801566F560EE82E49EF2AF020 -:10549800562F49EF2AF004000801566F020E080142 -:1054A8000801586F08015651FBC557F840EC30F019 -:1054B8000801566F080E08010801586F0801565177 -:1054C800FAC557F840EC30F00801566F080E08018D -:1054D8000801586F08015651F9C557F840EC30F0EB -:1054E8000801566F080E08010801586F0801565147 -:1054F800F8C557F840EC30F0B4EC3EF0070107016E -:1055080018051911D8A48BEF2AF08DEF2AF091EF26 -:105518002AF05AEC3EF093EF2AF0B4EC3EF0080182 -:10552800566F040E08010801586F0801565114C738 -:1055380057F840EC30F08988050E0801566F300E98 -:10554800E82EA4EF2AF0562FA4EF2AF0899812002B -:105558000801326F000E08010801316F080132514D -:105568002EC8E9FF2FC8EAFFEF5008010801356F80 -:105578002CC8E9FF2DC8EAFF0801EECF33F808016F -:10558800EDCF34F887EC3EF0D8B0CDEF2AF0D0EF6D -:105598002AF0010ED1EF2AF0000E08010801306F41 -:1055A80008010801312B2EC835F82FC836F82CC849 -:1055B80033F82DC834F899EC3CF02EC8E9FF2FC811 -:1055C800EAFFEF5008010801356F2CC8E9FF2DC824 -:1055D800EAFF0801EECF33F80801EDCF34F887EC85 -:1055E8003EF0D8B0FAEF2AF0FDEF2AF0010EFEEFF8 -:1055F8002AF0000E080108013019D8B406EF2BF084 -:1056080008EF2BF00DEF2BF00801080131511CEFCA -:105618002BF0080108013129D8A415EF2BF017EF5A -:105628002BF01AEF2BF0000E1CEF2BF0D4EF2AF022 -:10563800120008010801715107010701A46327EF4F -:105648002BF029EF2BF02BEF2BF08AEF2BF0070133 -:105658000701A451FE0AD8B434EF2BF036EF2BF033 -:1056680056EF2BF01C0E08010801B06F000E080160 -:10567800B16F010E08010801AE6F000E0801AF6F8F -:1056880007010701A4511C0D0401BD0EF3240801F4 -:105698000801AC6F0801AD6B0401040E0801AD23CD -:1056A80058EC3AF071C8A4F7080108017151FE0AD4 -:1056B800D8A461EF2BF063EF2BF065EF2BF08AEFA6 -:1056C8002BF01C0E08010801B06F000E0801B16F25 -:1056D8000801080171511C0DBD0E0801726F040EFE -:1056E800736FF35008017227E86AF3BEE86808018F -:1056F800732372C8AEF873C8AFF8010E0801080129 -:10570800AC6F000E0801AD6F58EC3AF012008DEF47 -:105718002BF0C5CF2AF81F0E08012A172AC82BF824 -:1057280008012C6B000EC7B4010E08012B13000EE4 -:105738002C1308012C512B11D8A4A5EF2BF0A7EF9F -:105748002BF08DEF2BF0C580AAEF2BF0C5B0AFEF93 -:105758002BF0B1EF2BF0AAEF2BF0A1A6B6EF2BF0B0 -:10576800B8EF2BF0BAEF2BF0F7EF2BF029C82FF892 -:1057780019EC3AF0C0EF2BF0DBEF2BF0C582C5EF48 -:105788002BF0C5B2CAEF2BF0CCEF2BF0C5EF2BF006 -:10579800A1A6D1EF2BF0D3EF2BF0D5EF2BF0F7EF3D -:1057A8002BF029C82FF819EC3AF0DBEF2BF0C5BC29 -:1057B800E0EF2BF0E2EF2BF0C2EF2BF0C584E5EF22 -:1057C8002BF0C5B4EAEF2BF0ECEF2BF0E5EF2BF064 -:1057D800A1A6F1EF2BF0F3EF2BF0F5EF2BF0F7EF9D -:1057E8002BF0F7EF2BF0120006010601CE5106014F -:1057F8000601D25D06010601CF5106010601D35903 -:10580800D8B009EF2CF00BEF2CF018EF2CF00701B3 -:105818000701A351070107010D19D8B416EF2CF0A1 -:1058280018EF2CF01AEF2CF05EEF2CF006010601B1 -:10583800D25106010601CE5D08010801516F06012B -:105848000601D35106010601CF590801526F08011C -:1058580008014F5108010801515D08010801505124 -:10586800080108015259D8B03CEF2CF03EEF2CF05B -:1058780042EF2CF051C84FF852C850F84FC8C4F83E -:1058880050C8C5F84DC8C2F84EC8C3F86DEC38F01A -:10589800C2C84FF8C3C850F8080108014F510601A3 -:1058A8000601D22708010801505106010601D32339 -:1058B8005EEF2CF01200020E08010801BA25E96E0D -:1058C800000E08010801BB21EA6E0801EECFBCF802 -:1058D8000801EDCFBDF82FEC43F0020E08010801D6 -:1058E800BA25E96E000E08010801BB21EA6E08011D -:1058F800BCC8EEFF0801BDC8EDFF040E0801080191 -:10590800BA25E96E000E08010801BB21EA6E0801FC -:10591800EECFBCF80801EDCFBDF82FEC43F0040E34 -:1059280008010801BA25E96E000E08010801BB212B -:10593800EA6E0801BCC8EEFF0801BDC8EDFF0A0EFB -:1059480008010801BA25E96E000E08010801BB210B -:10595800EA6E0801EECFBCF80801EDCFBDF82FECD8 -:1059680043F00A0E08010801BA25E96E000E080185 -:105978000801BB21EA6E0801BCC8EEFF0801BDC8DA -:10598800EDFF120012C816F811C815F80CECE7F074 -:1059980008010801136F080108011351FE0AD8A471 -:1059A800D8EF2CF0DAEF2CF0E3EF2CF0FE0E080124 -:1059B8000801116FFF0E0801126F2CEF2DF008017E -:1059C80008011329D8A4EBEF2CF0EDEF2CF0F4EF3D -:1059D8002CF0080108011169080112692CEF2DF05B -:1059E8000701D8903533080108011351D8B4FFEFE7 -:1059F8002CF001EF2DF004EF2DF007010701358F92 -:105A080007010701292B070107012C2B080E0701A5 -:105A180007012C6112EF2DF014EF2DF01BEF2DF084 -:105A2800080108011169080112692CEF2DF008011D -:105A3800146F000E070107012C6F080114510701AC -:105A4800080135C711F808010801126B2CEF2DF079 -:105A580012005FEF2DF0000E93EF2DF0010E93EF83 -:105A68002DF0020E93EF2DF0030E93EF2DF0040EA0 -:105A780093EF2DF0050E93EF2DF0060E93EF2DF01A -:105A8800070E93EF2DF0080E93EF2DF0090E93EF0C -:105A98002DF00A0E93EF2DF00B0E93EF2DF00C0E58 -:105AA80093EF2DF00D0E93EF2DF00E0E93EF2DF0DA -:105AB8000F0E93EF2DF0080108017251300ACBE068 -:105AC800010ACCE0030ACDE0010ACEE0070ACFE0E4 -:105AD800010AD0E0030AD1E0010AD2E00F0AD3E0BC -:105AE800010AD4E0780AD5E0030AD6E0010AD7E033 -:105AF800070AD8E0010AD9E0030ADAE0270AC9E070 -:105B0800030ACAE0010ACBE0070ACCE0010ACDE0AB -:105B1800030ACEE090EF2DF0000E93EF2DF0120067 -:105B2800000E0801080113659CEF2DF09EEF2DF083 -:105B3800A7EF2DF0000E08010801136F000E0801F1 -:105B4800146FF9EF2DF013C871F81DEC2BF000EE6F -:105B58000DF010EE0BF0E652EE52ED50E55C02E16E -:105B6800EF50E75CD8A0BBEF2DF0BDEF2DF0C8EFEC -:105B78002DF00D500B5C08010801136F0E500C58E6 -:105B88000801146FF9EF2DF000EE0BF0EECF15F8C9 -:105B9800EDCF16F803500801155F04500801165B95 -:105BA80000EE05F0EECF17F8EDCF18F80D5008010C -:105BB800175F0E500801185B0801155108011725D9 -:105BC8000801196F080116510801182108011A6FF8 -:105BD800010E0801192508010801136F000E0801BC -:105BE8001A210801146FF9EF2DF0120045EF2EF07D -:105BF80013C8E9FF14C8EAFFEF50D8B406EF2EF037 -:105C080008EF2EF021EF2EF0080115C8F6FF080165 -:105C180016C8F7FF000EF86E0800F5CF19F813C87C -:105C2800E9FF14C8EAFFEF5008011919D8B41FEFAB -:105C38002EF021EF2EF03DEF2EF013C8E9FF14C827 -:105C4800EAFFEF500801196F080115C8F6FF0801AF -:105C580016C8F7FF000EF86E0800F5500801195D28 -:105C680008010801136F0801146BD8A014075EEF30 -:105C78002EF008010801134B142B08010801154BDD -:105C8800162B080108011707D8A0180708011729BB -:105C9800D8B41829D8A453EF2EF055EF2EF0FCEF06 -:105CA8002DF0000E08010801136F000E0801146F93 -:105CB8005EEF2EF01200800E08010801276F000E1B -:105CC8000801286F0801080128512711D8A46FEF8F -:105CD8002EF071EF2EF073EF2EF0BCEF2EF00801CE -:105CE800000E080122BF010E08010801256F0801F6 -:105CF800266B08010801235108010801271500092E -:105D0800D8B489EF2EF08BEF2EF097EF2EF0080124 -:105D1800080126512511000ED8B4010E080108010A -:105D2800256F0801266B0801D89022370801080161 -:105D380026512511D8B4A3EF2EF0A5EF2EF0ABEF26 -:105D48002EF008010801245108010801221B08014E -:105D5800D890080128330801273308010801285181 -:105D68002711D8A4BAEF2EF0BCEF2EF073EF2EF067 -:105D7800080108012251C1EF2EF0120027C82EF8A1 -:105D880028C82FF825C82CF826C82DF8ACEC2AF01E -:105D9800080108012A6F1D0E080108012A65D7EFBE -:105DA8002EF0D9EF2EF0E6EF2EF0290E08010801AB -:105DB8002A61E1EF2EF0E3EF2EF0E6EF2EF0000E71 -:105DC80021EF2FF027C82EF828C82FF825C82CF85F -:105DD80026C82DF8ACEC2AF008010801296F090E35 -:105DE800080108012A65FBEF2EF0FDEF2EF01EEFEB -:105DF8002FF0150E080108012A6105EF2FF007EFB3 -:105E08002FF01EEF2FF0090E0801080129650FEF8A -:105E18002FF011EF2FF01EEF2FF0150E08010801DB -:105E2800296119EF2FF01BEF2FF01EEF2FF0010E55 -:105E380021EF2FF0020E21EF2FF012000601000EC5 -:105E480008010801586F0601060E0801596FCCECCD -:105E580027F00101000E08010801596F0101010E28 -:105E680008015A6F3DEC37F059C856F85AC857F828 -:105E780056C85CF857C85DF80101000E0801080112 -:105E88005A6F0101010E08015B6F0601000E08013F -:105E98000801586F0601060E0801596FC1EC11F090 -:105EA800200E080108015C6F000E08015D6F470EA7 -:105EB800080108015A6FFE0E08015B6F0601000E0B -:105EC80008010801586F0601060E0801596FE8EC31 -:105ED80010F00401E30E080108015A6F0401040ED2 -:105EE80008015B6F0601000E08010801586F0601E2 -:105EF800060E0801596F89ECB9F012000D0E080161 -:105F0800080117658AEF2FF08CEF2FF0B4EF2FF010 -:105F1800160E08010801176194EF2FF096EF2FF085 -:105F2800B4EF2FF006010601C4A19DEF2FF09FEFFB -:105F38002FF0A2EF2FF0FE0EE0EF2FF0020E060179 -:105F48000601C42506010601C46F000E06010601FC -:105F5800C5210601C56F080108011651E0EF2FF0B1 -:105F6800050E080108011765BCEF2FF0BEEF2FF0F2 -:105F7800DDEF2FF00C0E080108011761C6EF2FF0B6 -:105F8800C8EF2FF0DDEF2FF006010601C44BC52B3B -:105F980006010601C4B1D3EF2FF0D5EF2FF0DAEFE9 -:105FA8002FF0080108011651E0EF2FF0FF0EE0EF87 -:105FB8002FF0FE0EE0EF2FF01200080108010D2966 -:105FC800D8B40E29D8A4EBEF2FF0EDEF2FF0F4EFB3 -:105FD8002FF0080108010D6908010E693FEF30F044 -:105FE800080108011051800A0801116F08010D51BC -:105FF800080108010F5D080108010E51800A080117 -:106008001159D8A00AEF30F00CEF30F01FEF30F044 -:10601800080108010D51080108010F5D0801080178 -:106028000D6F080108010E510801080110590801F7 -:106038000E6F3FEF30F0000E0801116F020E126F65 -:10604800080108010D510801115F080108010E51EE -:106058000801125B080108010F5108011125080108 -:1060680008010D6F080108011051080112210801EB -:106078000E6F3FEF30F0120008015B6F010E080150 -:1060880008015A6F08015B5108015B6F000E080197 -:106098000801596F08015B5158C85BF8FF0E0801E9 -:1060A8005B27010E08015C6F08015B2B5FEF30F086 -:1060B800D89008015C3708015B2F5CEF30F00801CD -:1060C8005C51080108015A6F08015B6F000E080156 -:1060D8000801596F08015B5190EF30F00801080181 -:1060E8005751080108015A150009D8B47EEF30F05D -:1060F80080EF30F084EF30F05AEC3EF086EF30F06D -:10610800B4EC3EF00801D89008015A3108010801A2 -:106118005A6F08010801592B080108015851080154 -:106128000801595DD8A09BEF30F09DEF30F072EF79 -:1061380030F012007CC8E9FF7DC8EAFF0801EECF05 -:10614800BCF80801EDCFBDF82FEC43F07CC8E9FF9F -:106158007DC8EAFF0801BCC8EEFF0801BDC8EDFF15 -:10616800020E080108017C25E96E000E08010801ED -:106178007D21EA6E0801EECFBCF80801EDCFBDF82D -:106188002FEC43F0020E080108017C25E96E000E91 -:10619800080108017D21EA6E0801BCC8EEFF08016C -:1061A800BDC8EDFF060E080108017C25E96E000E4A -:1061B800080108017D21EA6E0801EECFBCF808014C -:1061C800EDCFBDF82FEC43F0060E080108017C2541 -:1061D800E96E000E080108017D21EA6E0801BCC8BD -:1061E800EEFF0801BDC8EDFF120004010401FB51D8 -:1061F800C00808010801576F04010401FC51D8A028 -:10620800E82A05080801586F0801080155510801D6 -:106218000801575D0801080156510801080158593D -:10622800D8B019EF31F01BEF31F01FEF31F057C83C -:1062380055F858C856F808010801555104010401D9 -:10624800FB2708010801565104010401FC2304013D -:106258000401FB5106010601BC5D04010401FC5167 -:1062680006010601BD59D8B03CEF31F03EEF31F0E0 -:1062780042EF31F0FBC4BCF6FCC4BDF655C8C2F809 -:1062880056C8C3F853C8C0F854C8C1F8BBEC40F0AE -:1062980055C853F856C854F852EF31F012000401AB -:1062A8000401FB51C00808010801576F04010401EB -:1062B800FC51D8A0E82A05080801586F0801080110 -:1062C800555108010801575D080108015651080198 -:1062D80008015859D8B073EF31F075EF31F079EF04 -:1062E80031F057C855F858C856F8080108015551F3 -:1062F80004010401FB2708010801565104010401A7 -:10630800FC2304010401FB5106010601BC5D0401E4 -:106318000401FC5106010601BD59D8B096EF31F0D1 -:1063280098EF31F09CEF31F0FBC4BCF6FCC4BDF62D -:1063380055C85BF856C85CF853C859F854C85AF899 -:106348002EEC40F055C853F856C854F8ACEF31F06D -:1063580012000F0E080108012465B5EF31F0B7EF00 -:1063680031F0D8EF31F00A0E080108012561BFEFBE -:1063780031F0C1EF31F0D8EF31F00A0E0801080111 -:106388002661C9EF31F0CBEF31F0D8EF31F00A0ECA -:10639800080108012761D3EF31F0D5EF31F0D8EFCC -:1063A80031F0000E06EF32F00A0E080108012461F0 -:1063B800E0EF31F0E2EF31F003EF32F00A0E0801BE -:1063C80008012561EAEF31F0ECEF31F003EF32F02C -:1063D8000F0E080108012665F4EF31F0F6EF31F0F1 -:1063E80003EF32F00A0E080108012761FEEF31F0D1 -:1063F80000EF32F003EF32F0010E06EF32F0020E3A -:1064080006EF32F012000F0E080108011F650FEFAA -:1064180032F011EF32F032EF32F00A0E08010801C3 -:10642800206119EF32F01BEF32F032EF32F00F0E2D -:1064380008010801216523EF32F025EF32F032EF31 -:1064480032F00A0E0801080122612DEF32F02FEF19 -:1064580032F032EF32F0000E60EF32F00A0E08012F -:1064680008011F613AEF32F03CEF32F05DEF32F095 -:106478000F0E08010801206544EF32F046EF32F0B4 -:106488005DEF32F00F0E0801080121654EEF32F082 -:1064980050EF32F05DEF32F00A0E08010801226178 -:1064A80058EF32F05AEF32F05DEF32F0010E60EF44 -:1064B80032F0020E60EF32F012000D0E08010801F2 -:1064C8001F6169EF32F06BEF32F08CEF32F00D0E96 -:1064D80008010801206173EF32F075EF32F08CEF9C -:1064E80032F00D0E0801080121617DEF32F07FEFD7 -:1064F80032F08CEF32F0100E08010801226587EFA8 -:1065080032F089EF32F08CEF32F0010EBAEF32F050 -:106518000D0E080108011F6194EF32F096EF32F07A -:10652800B7EF32F0100E0801080120659EEF32F037 -:10653800A0EF32F0B7EF32F00D0E0801080121612B -:10654800A8EF32F0AAEF32F0B7EF32F00D0E0801E3 -:1065580008012261B2EF32F0B4EF32F0B7EF32F057 -:10656800000EBAEF32F0020EBAEF32F01200000E4F -:1065780008010801156F000E0801166F000E0801CA -:10658800176F000E0801186F080108010DA1CFEF61 -:1065980032F0D1EF32F0E9EF32F008010801115181 -:1065A800080108011527080108011251080108010E -:1065B80016230801080113510801080117230801CF -:1065C800080114510801080118230801D89008018E -:1065D8001137080112370801133708011437080169 -:1065E800D8900801103308010F3308010E33080151 -:1065F8000D33080110510D110E110F11D8A407EF1A -:1066080033F009EF33F0C8EF32F015C80DF816C8AB -:106618000EF817C80FF818C810F813EF33F0120067 -:10662800C2C8F7F4C3C8F8F4C4C8F9F4C5C8FAF482 -:10663800C6C8C8F8080E08010801C86126EF33F07B -:1066480028EF33F02AEF33F042EF33F0FAC4C7F8FB -:10665800F9C4FAF4F8C4F9F4F7C4F8F4C7C8F7F4BD -:10666800080E08010801C85F080E08010801C86182 -:1066780040EF33F042EF33F02AEF33F0080108011E -:10668800C86749EF33F04BEF33F04DEF33F061EF6C -:1066980033F00401D890FABFD880F737F837F937C4 -:1066A800FA3708010801C80708010801C8675FEF41 -:1066B80033F061EF33F04DEF33F0F7C4C2F8F8C4AC -:1066C800C3F8F9C4C4F8FAC4C5F86BEF33F0120084 -:1066D800B7EC24F02DC01AF02EC01BF001C007F053 -:1066E80002C008F001C009F002C00AF003C00BF0B4 -:1066F80004C00CF003C00DF004C00EF00801736F65 -:106708000D0E08010801726F0801735118A68FEF6A -:1067180033F091EF33F099EF33F00801736F040E03 -:1067280008010801726F0801735172C817F01890B8 -:10673800189218940B000E001898189A189C189E16 -:10674800199019921994199619883F903F923F967B -:106758003F9801C029F002C02AF07BEC22F074C8EF -:1067680021F075C822F07BEC22F074C823F075C8BC -:1067780024F03D683E68010E2F6E000E306E120048 -:10678800CF0E0E010E01E26F0A0E0E01E36F080133 -:10679800DC0E0801BD270A0E0801BE23BDC8E6FEAF -:1067A800BEC8E7FE060E08010801C26F000E080108 -:1067B800C36FBAC8C0F8BBC8C1F8BBEC40F0060E3E -:1067C80008010801C26F000E0801C36F0001990E8D -:1067D80008010801C06F0001000E0801C16FBBEC81 -:1067E80040F00801BF6F080E08010801C06F0801DA -:1067F800BF5164EC44F00801BF6F060E08010801A0 -:10680800C06F0801BF5108010801BC670EEF34F0E2 -:1068180010EF34F018EF34F00801BF6F000E0801D4 -:106828000801C06F0801BF5164EC44F01200070171 -:1068380007013A6722EF34F024EF34F04EEF34F0DA -:1068480008011F6F010E070107013A6F08011F5168 -:1068580008011F6F000E080108011E6F08011F5173 -:10686800000E080108011E653CEF34F03EEF34F0DD -:1068780040EF34F04EEF34F04468080108011E2B55 -:10688800000E080108011E654CEF34F04EEF34F09D -:1068980040EF34F04428D8B454EF34F056EF34F0D5 -:1068A8005BEF34F044C04CF8A3EC36F044680801C0 -:1068B8001F6F010E00010001456F08011F510801FB -:1068C8001F6F000E00010001466F08011F510001F3 -:1068D80046890001468312000A0E08010801B06FBC -:1068E800000E0801B16F06010601E651170D000EF2 -:1068F8000801226F020E236FF35008012227E86A6D -:10690800F3BEE8680801232322C8AEF823C8AFF80D -:106918000601630E08010801AC6F0601060E0801A6 -:10692800AD6F58EC3AF006010601E651170DF3CFAA -:1069380022F80A0E080122270201000E080122256A -:10694800E96EEA6A0201020EEA220601EECFFEF6BD -:106958000601EDCFFFF607010701A529D8B4B7EF67 -:1069680034F0B9EF34F0C2EF34F0A5C74CF8A3EC1B -:1069780036F007010701A569C2EF34F01200FACF1B -:10698800CCF8FBCFCDF8E9CFCEF8EACFCFF8E1CFFE -:10699800D0F8E2CFD1F8D9CFD2F8DACFD3F8F3CF05 -:1069A800D4F8F4CFD5F8F6CFD6F8F7CFD7F8F8CF94 -:1069B800D8F8F5CFD9F8F2A4E4EF34F0E6EF34F0E4 -:1069C800E8EF34F004EC42F09EA2EDEF34F0EFEF84 -:1069D80034F0F2EF34F08AEC0CF09E92D9C8F5FF4F -:1069E800D8C8F8FFD7C8F7FFD6C8F6FFD5C8F4FF50 -:1069F800D4C8F3FFD3C8DAFFD2C8D9FFD1C8E2FFA1 -:106A0800D0C8E1FFCFC8EAFFCEC8E9FFCDC8FBFF79 -:106A1800CCC8FAFFCBC8E0FFCAC8E8FFC9C8D8FF8E -:106A28001000EACFE5F8E1CFE6F8E2CFE7F8D9CFF2 -:106A3800E8F8DACFE9F8F3CFEAF8F4CFEBF8F6CFD5 -:106A4800ECF8F7CFEDF8F8CFEEF8F5CFEFF8A4A60D -:106A580030EF35F032EF35F03DEF35F0E20E786E7D -:106A6800000E81B8010E08010801F06F3FEC25F017 -:106A7800A496A1A242EF35F044EF35F04AEF35F085 -:106A8800B368C40EB26ECEEC3CF0A192EFC8F5FF2D -:106A9800EEC8F8FFEDC8F7FFECC8F6FFEBC8F4FF47 -:106AA800EAC8F3FFE9C8DAFFE8C8D9FFE7C8E2FF98 -:106AB800E6C8E1FFE5C8EAFFE4C8E9FFE3C8FBFF71 -:106AC800E2C8FAFF110038C859F839C85AF83DEC3D -:106AD80037F008010801595108010801586F0DECF9 -:106AE8003FF0080108013B6F38C859F839C85AF80F -:106AF8003DEC37F008010801595108010801646F9D -:106B0800E1EC3EF0080108013A6F080108013B5129 -:106B1800300AD8B492EF35F094EF35F098EF35F0AD -:106B28003BC864F88FEC3FF03AC864F88FEC3FF04C -:106B380008013C6F3A0E08010801646F08013C51D6 -:106B48008FEC3FF038C85AF839C85BF80101000EDD -:106B580008010801586F0101010E0801596F89ECFD -:106B680037F0120053C859F854C85AF83DEC37F0BA -:106B780008010801595108010801586F0DEC3FF050 -:106B880008010801566F53C859F854C85AF83DEC23 -:106B980037F008010801595108010801646FE1EC58 -:106BA8003EF008010801556F080108015651300AE6 -:106BB800D8B4E1EF35F0E3EF35F0E7EF35F056C83C -:106BC80064F88FEC3FF055C864F88FEC3FF008018B -:106BD800576F3A0E08010801646F080157518FEC8E -:106BE8003FF053C85AF854C85BF80101000E080179 -:106BF8000801586F0101010E0801596F89EC37F03F -:106C080012000801276F000E06010601D66F080161 -:106C18002751000E06010601CA6F000E0601CB6F50 -:106C2800000E0601CC6F000E0601CD6F000E0501A7 -:106C38000501FC6F000E0501FD6F000E0501FE6FDA -:106C4800000E0501FF6F010E07010701906F000E8E -:106C58000701916F000E0701926F000E0701936FF5 -:106C68000801276F000E070107010A6F0801275165 -:106C7800000E07010701166F000E0701176F0801C4 -:106C8800276F000E06010601E86F08012751080169 -:106C9800276F000E070107010C6F0801275112002A -:106CA8008CC735F88DC736F88EC737F88FC738F8D0 -:106CB80008013351301131113211D8A466EF36F082 -:106CC80068EF36F075EF36F0010E08010801306FF5 -:106CD800000E0801316F000E0801326F000E080126 -:106CE800336F30C88CF731C88DF732C88EF733C888 -:106CF8008FF70801396F000E08010801346F080189 -:106D080039510F0E0801080134658DEF36F08FEF09 -:106D180036F091EF36F0A0EF36F07BEC22F0080168 -:106D28000801342B0F0E0801080134659EEF36F078 -:106D3800A0EF36F091EF36F0A2EF36F01200040E15 -:106D4800080108014C65ABEF36F0ADEF36F0AFEF58 -:106D580036F0EFEF36F0080108014C51170DF3CF6C -:106D68004DF80C0E08014D270201000E08014D25B3 -:106D7800E96EEA6A0201020EEA22000EEE6E000EC9 -:106D8800ED6E080108014C51170D0201000EF324A5 -:106D9800E96EEA6A0201020EEA22000EEE6E000EA9 -:106DA800EE6E000EEE6E000EED6EED52ED52080125 -:106DB80008014C51170DF3CF4DF80E0E08014D2761 -:106DC8000201000E08014D25E96EEA6A0201020E71 -:106DD800EA22040EEF6E12000601DBC645F8060132 -:106DE800DCC646F8080108013D510801452708019D -:106DF80008013E5108014623140E080145250801E3 -:106E08000801436F000E080146210801446FCE0EA9 -:106E180008010801435D0A0E08014459D8A017EF7C -:106E280037F019EF37F020EF37F00801CE0E0801E0 -:106E3800435F0A0E0801445BE0CE41F8E1CE42F818 -:106E480043C8E0FE44C8E1FE3FC8A0F840C8A1F826 -:106E58000EEC10F0A0C843F8A1C844F841C8E0FE01 -:106E680042C8E1FE43C83DF844C83EF83CEF37F05D -:106E7800120059C85BF85AC85CF845EF37F045EF7F -:106E880037F0080108015B5108015D6F080108012E -:106E98005C5108015E6F08015B4B5C2B5DC8F6FF17 -:106EA8005EC8F7FF000EF86E0E0EF76403D00800F8 -:106EB800F55005D0F6CFE9FFF7CFEAFFEF5000090C -:106EC800D8A469EF37F06BEF37F043EF37F00801DC -:106ED8005BC85DF808015CC85EF8080108015951F3 -:106EE80008015D5F080108015A5108015E5BFF0E49 -:106EF80008015D2508010801596FFF0E08015E2190 -:106F080008015A6F88EF37F0120058C85CF859C862 -:106F18005DF893EF37F0080108015C4B5D2B5CC806 -:106F2800E9FF5DC8EAFFEF50D8A49DEF37F09FEF67 -:106F380037F08FEF37F0A1EF37F0080108015A5109 -:106F480008015E6F080108015B5108015F6F0801C5 -:106F58005A4B5B2B5EC8F6FF5FC8F7FF000EF86E52 -:106F680008015CC8E1FF08015DC8E2FF08010801EB -:106F78005C4B5D2B0E0EF76403D00800F55005D06E -:106F8800F6CFE9FFF7CFEAFFEF50E76EE750D8A456 -:106F9800D0EF37F0D2EF37F09FEF37F0D4EF37F07C -:106FA800120008014C0E080108014D6F0801080E77 -:106FB80008014E6F35EC3DF00009D8A4E6EF37F034 -:106FC800E8EF37F0EAEF37F020EF38F00801080172 -:106FD8004C51C00BC00AD8A4F4EF37F0F6EF37F0E5 -:106FE80003EF38F008014C0E080108014D6F080145 -:106FF800080E08014E6F35EC3DF020EF38F008011F -:1070080008014C670AEF38F00CEF38F00EEF38F053 -:1070180020EF38F0080108014CC84FF808010801B2 -:10702800506B000E080108014D6F000E08014E6FED -:10703800F8EC2BF0D5EF37F0120024C82EF825C84D -:107048002FF822C82CF823C82DF8ACEC2AF0080138 -:107058000801266F24C82EF825C82FF822C82CF856 -:1070680023C82DF8ACEC2AF008010801276F0D0E93 -:1070780008010801266543EF38F045EF38F052EF74 -:1070880038F00D0E0801080127654DEF38F04FEF75 -:1070980038F052EF38F0000E6CEF38F00B0E0801A4 -:1070A800080126615AEF38F05CEF38F069EF38F0E4 -:1070B8000D0E08010801276564EF38F066EF38F017 -:1070C80069EF38F0010E6CEF38F0020E6CEF38F013 -:1070D8001200C4C8C6F8C5C8C7F808010801C351DA -:1070E800C211D8B47AEF38F07CEF38F09DEF38F061 -:1070F8008BEF38F061CF7EFEC2C8E9FFC3C8EAFF54 -:107108000E017ECEEFFF08010801C24BC32B080118 -:107118000801C607D8A0C7070801C629D8B4C729D7 -:10712800D8A499EF38F09BEF38F07EEF38F0B1EF44 -:1071380038F0A1EF38F061CF7EFE08010801C607DC -:10714800D8A0C7070801C629D8B4C729D8A4AFEF63 -:1071580038F0B1EF38F09FEF38F0C4C8C2F8C5C8AE -:10716800C3F8B7EF38F0120022EC2FF00801146FC3 -:10717800000E08010801136F08011451130E0801CD -:1071880008011365CAEF38F0CCEF38F0CEEF38F0CD -:10719800FFEF38F00501E40E080108011325E96E38 -:1071A800EA6A0501050EEA22EF500801146F04018E -:1071B800E30E080108011325E96EEA6A0401040ECA -:1071C800EA22EF5008011419D8B4EDEF38F0EFEFC8 -:1071D80038F0F2EF38F0000E02EF39F0080108013C -:1071E800132B130E080108011365FDEF38F0FFEFAC -:1071F80038F0CEEF38F0010E02EF39F012000E0130 -:10720800DF8F0E01DF9F080E08010801A06F0DEF48 -:1072180039F008010801A0070801A029D8A417EF30 -:1072280039F019EF39F00DEF39F00E01FC93060132 -:107238000601D5B322EF39F024EF39F044EF39F0E5 -:1072480006010601D5B52BEF39F02DEF39F044EFE3 -:1072580039F05AEC42F0A1C81AF7A2C81BF7060188 -:10726800D58506010601D5A73CEF39F03EEF39F088 -:1072780041EF39F08D8242EF39F08D920601D577D2 -:107288000E01DF87C4EC43F0A1C81EF7A2C81FF7A0 -:1072980012000801276F000E08010801266F080177 -:1072A80027517CEF39F022C8E9FF23C8EAFFEF50E5 -:1072B800080108012B6F26C82AF80801276FA00EBD -:1072C80008010801296F080127512DEC24F0080155 -:1072D8000801224B232B0801276FA00E0801080183 -:1072E800296F080127518BEC2BF008010801262B88 -:1072F800080126C827F80801286B0801080124514D -:107308000801275D08010801255108012859D8A05E -:1073180090EF39F092EF39F057EF39F01200CBECDB -:107328003DF00009D8A49BEF39F09DEF39F0A6EFA6 -:1073380039F0000E080108014C6F000E08014D6F6E -:10734800D8EF39F007010701A051080108014C19CD -:10735800D8B4B1EF39F0B3EF39F0C5EF39F04CC814 -:10736800A0F7000E06010601BC6F000E0601BD6FF6 -:10737800000E080108014E6F000E08014F6FBFECA8 -:1073880042F04CC80DF706010601BC51C0080801BF -:1073980008014C6F06010601BD51D8A0E82A05086E -:1073A80008014D6FD8EF39F012004CC80DF70701EE -:1073B8000701A351080108014C19D8B4E6EF39F0C8 -:1073C800E8EF39F0F1EF39F0000E080108014C6FD1 -:1073D800000E08014D6F18EF3AF0070107010FA1E1 -:1073E800F8EF39F0FAEF39F005EF3AF007010F91AD -:1073F800000E080108014E6F000E08014F6F83EC64 -:1074080042F006010601D25106010601CE5D0801CF -:1074180008014C6F06010601D35106010601CF5938 -:1074280008014D6F18EF3AF012002FC8C9FFC6AE19 -:1074380020EF3AF022EF3AF025EF3AF0FF0E57EF3F -:107448003AF027EF3AF0C7B02CEF3AF02EEF3AF0C7 -:1074580027EF3AF030EF3AF0C5CF30F81F0E0801A9 -:10746800301730C831F80801326B000EC7B4010E6E -:1074780008013113000E3213080132513111D8A41A -:1074880048EF3AF04AEF3AF030EF3AF0C5AC4FEF38 -:107498003AF051EF3AF054EF3AF0FE0E57EF3AF067 -:1074A800000E57EF3AF01200AEC8B4F8AFC8B5F8FE -:1074B800ACC8B2F8ADC8B3F882EF3AF00801B4C866 -:1074C800F6FF0801B5C8F7FF000EF86EB2C8E1FF75 -:1074D800B3C8E2FF0E0EF76403D00800F55005D0DC -:1074E800F6CFE9FFF7CFEAFFEF50E76E0801080192 -:1074F800B44BB52B08010801B24BB32B08010801A6 -:10750800B007D8A0B1070801B029D8B4B129D8A4C8 -:1075180090EF3AF092EF3AF062EF3AF094EF3AF0E7 -:10752800120008010E6F000E080108010D6F080116 -:107538000E51BAEF3AF00DC811F808010E6FA00EFF -:1075480008010801106F08010E51C6EC06F0080189 -:107558000801105109C8E9FF0AC8EAFFEF6E0801DF -:107568000801094B0A2B080108010D2B08010DC859 -:107578000EF808010F6B080108010B5108010E5D98 -:10758800080108010C5108010F59D8A0CEEF3AF0B4 -:10759800D0EF3AF09FEF3AF012000801086F000EA2 -:1075A80007010701556F080108510001988F9BECEE -:1075B80003F016C830F817C831F818C832F819C8D7 -:1075C80033F854EC36F02EEC0FF01DEC41F0B8EC2B -:1075D8003FF0C9ECDFF00801086F000E0801080150 -:1075E8001D6F080108511BEC34F00001000198BD23 -:1075F80000EF3BF002EF3BF00CEF3BF00801086FA7 -:10760800000E08010801096F080108511AEC42F040 -:1076180012000401B30E08010801336F0401040EBF -:107628000801346F2DC831F82EC832F812ECD2F0A8 -:107638000009D8B422EF3BF024EF3BF030EF3BF0E9 -:10764800070108830801306F070E07010701A66FBD -:107658000801305147EF3BF02DC806F72EC807F751 -:10766800000E07010701226F000E0701236F0801B2 -:10767800306F000E07010701A66F080130512FC8AF -:107688003CF70701089312000401B30E0801080132 -:10769800336F0401040E0801346F2DC831F82EC869 -:1076A80032F892ECCEF00009D8B45DEF3BF05FEF12 -:1076B8003BF06BEF3BF0070108830801306F070EC2 -:1076C80007010701A66F0801305182EF3BF0000E59 -:1076D80007010701066F000E0701076F2DC822F783 -:1076E8002EC823F70801306F000E07010701A66FA7 -:1076F800080130512FC83CF7070108931200000E0B -:1077080008010801646F000E0801656F080108018F -:1077180060A191EF3BF093EF3BF09FEF3BF0080146 -:107728000801625108010801642708010801635132 -:107738000801080165230801D8900801623708018B -:1077480063370801D89008016133080160330801E4 -:10775800080161516011D8A4B4EF3BF0B6EF3BF0DB -:107768008AEF3BF064C860F865C861F8BCEF3BF08D -:107778001200320E080108015D6F000E08015E6FED -:10778800000E080108015B6F000E08015C6F010123 -:10779800C80E08010801596F0101010E08015A6F4E -:1077A80053EC40F0000E07010701276F000E070198 -:1077B800286F08010D6F000E070107012E6F0801E1 -:1077C8000D5108010D6F000E070107011D6F08011B -:1077D8000D5108010D6F000E070107012F6F0801F9 -:1077E8000D511200000E080108016865FEEF3BF01C -:1077F80000EF3CF002EF3CF02DEF3CF068C871F868 -:107808001DEC2BF0B7EC24F000EE29F010EE07F099 -:10781800E652EE52ED50E518EFCFE8FFD8B4E7187E -:10782800D8B419EF3CF01BEF3CF02DEF3CF0080109 -:10783800696F010E08010801736F08016951080199 -:107848006A6F100E08010801726F08016A519FECF7 -:10785800A1F0120006010601D5A135EF3CF037EF83 -:107868003CF039EF3CF063EF3CF00601D581FF0EA8 -:1078780006010601FC25080108014C6FFF0E0601F0 -:107888000601FD2108014D6FCE0E080108014C5D6F -:107898000A0E08014D59D8A054EF3CF056EF3CF0C1 -:1078A8005DEF3CF0CD0E080108014C6F0A0E08018F -:1078B8004D6F0E01FE8D4CC8ECFE4DC8EDFE12005A -:1078C8000601DBC67FF80601DCC680F8080108015E -:1078D8007B5108017F27080108017C51080180239A -:1078E800140E08017F25080108017D6F000E0801AC -:1078F800802108017E6FCE0E080108017D5D0A0E09 -:1079080008017E59D8A08BEF3CF08DEF3CF094EF46 -:107918003CF00801CE0E08017D5F0A0E08017E5B6F -:107928007DC8E0FE7EC8E1FE120035C8E9FF36C812 -:10793800EAFFD890EF3635C8E9FF36C8EAFFEF50BE -:10794800D8A4A9EF3CF0ABEF3CF0CDEF3CF035C844 -:10795800E9FF36C8EAFF010EEF6E33C8E9FF34C805 -:10796800EAFFEE50ED10D8A4BCEF3CF0BEEF3CF0BF -:10797800C6EF3CF033C8E9FF34C8EAFF000EEE6EEC -:10798800020EED6E33C8E9FF34C8EAFFEE06000EBA -:10799800ED5A1200070107010E67D5EF3CF0D7EF4B -:1079A8003CF0F4EF3CF00082070107011267DFEFBB -:1079B8003CF0E1EF3CF0E3EF3CF001EF3DF012C7A3 -:1079C8000EF7000E07010701126F00B4EEEF3CF04E -:1079D800F0EF3CF0F3EF3CF08978F4EF3CF00094E2 -:1079E800070107010E51D8B4FCEF3CF0FEEF3CF064 -:1079F80001EF3DF0070107010E0712009E92CB68C8 -:107A0800CA82CA9CCA8ACA88CA869F929D82CA8428 -:107A1800000EBD6E000EBA6EBA86BA84BA9EBA9CC3 -:107A2800BD86BD84BD9EBD9CBD86BD84BA86BA8414 -:107A3800BD9ABD98BA9ABA98000EBE6E000EBB6E7B -:107A48000801086F000E07010701866F0801085139 -:107A58000801086F000E070107017D6F0801085132 -:107A6800120006010601CE5106010601D25D06018B -:107A78000601CF5106010601D359D8B046EF3DF0B3 -:107A880048EF3DF055EF3DF007010701A35107010D -:107A980007010D19D8B453EF3DF055EF3DF058EFFD -:107AA8003DF0000E66EF3DF04BEC44F04DC8E9FFA9 -:107AB8004EC8EAFFEF6E06010601D24BD32B010E2A -:107AC80066EF3DF01200C00E04010401FB5D050ED7 -:107AD8000401FC59D8A073EF3DF075EF3DF077EF46 -:107AE8003DF098EF3DF053C8C0F864EC44F0040151 -:107AF8000401FB4BFC2B04010401FB5106010601A8 -:107B0800BC5D04010401FC5106010601BD59D8B051 -:107B180090EF3DF092EF3DF096EF3DF0FBC4BCF6E0 -:107B2800FCC4BDF698EF3DF012000D0E08010801E7 -:107B38002C61A1EF3DF0A3EF3DF0B0EF3DF00D0E4D -:107B4800080108012D61ABEF3DF0ADEF3DF0B0EF5E -:107B58003DF0000ECAEF3DF0180E080108012C6533 -:107B6800B8EF3DF0BAEF3DF0C7EF3DF00D0E08015C -:107B780008012D61C2EF3DF0C4EF3DF0C7EF3DF0C5 -:107B8800010ECAEF3DF0020ECAEF3DF012000E01E1 -:107B98000E01DFB7D2EF3DF0D4EF3DF0D7EF3DF067 -:107BA800010EFAEF3DF0C4EC43F0070107011E5146 -:107BB80008010801A15F070107011F510801080119 -:107BC800A25B7A0E08010801A15D000E0801A25906 -:107BD800D8A0F1EF3DF0F3EF3DF0F7EF3DF00E01E7 -:107BE800DF9703EC39F0000EFAEF3DF012000801C0 -:107BF8000801695167C8E9FF68C8EAFFEF6207EF43 -:107C08003EF009EF3EF00FEF3EF067C867F868C82E -:107C180068F82AEF3EF0080167C8E9FF080168C85C -:107C2800EAFF08010801674B682BEF50D8A41FEF43 -:107C38003EF021EF3EF0FBEF3DF0000E0801080199 -:107C4800676F000E0801686F2AEF3EF01200080106 -:107C58000801A55108010801A21B08010801A25149 -:107C680008010801A51B08010801A5510801080120 -:107C7800A21B08010801A45108010801A31B08015F -:107C88000801A35108010801A41B08010801A45117 -:107C980008010801A31BA2C8A2F8A3C8A3F8A4C896 -:107CA800A4F8A5C8A5F859EF3EF012008988050E7A -:107CB80008015D6F300EE82E5FEF3EF05D2F5FEF3D -:107CC8003EF08998150E08015D6F6C0EE82E6AEF7C -:107CD8003EF05D2F6AEF3EF08988050E08015D6F62 -:107CE800300EE82E75EF3EF05D2F75EF3EF0899867 -:107CF800050E08015D6F300EE82E80EF3EF05D2F17 -:107D080080EF3EF01200B30E080108013325E96E3A -:107D1800020E080108013421EA6EEF50080108013B -:107D2800366F080108013651080135C837F80801CF -:107D3800386B37BF380708013717000E38170801A6 -:107D480038513711D8B4ABEF3EF0ADEF3EF0B0EF9D -:107D58003EF0D880B3EF3EF0D890B3EF3EF012007B -:107D68008988050E08015D6F300EE82EB9EF3EF0E8 -:107D78005D2FB9EF3EF08998050E08015D6F300E52 -:107D8800E82EC4EF3EF05D2FC4EF3EF08988050E63 -:107D980008015D6F300EE82ECFEF3EF05D2FCFEF7C -:107DA8003EF08998150E08015D6F6C0EE82EDAEF2B -:107DB8003EF05D2FDAEF3EF012000F0E08010801C9 -:107DC8006417300E08010801642508010801656F71 -:107DD8000801666B000E08016623090E08010801F8 -:107DE8006465F9EF3EF0FBEF3EF007EF3FF0370E2A -:107DF80008010801642508010801656F0801666B20 -:107E0800000E080166230801080165510CEF3FF0D8 -:107E180012000801583B0F0E5817300E08010801D0 -:107E2800582508010801596F08015A6B000E08010E -:107E38005A23090E08010801586525EF3FF027EF7E -:107E48003FF033EF3FF0370E0801080158250801CD -:107E58000801596F08015A6B000E08015A230801DE -:107E68000801595138EF3FF0120037C8B4FE00F04E -:107E780008013B6F010E0E010E01B26F08013B5164 -:107E880000F047EF3FF00E010E018AB14EEF3FF0D0 -:107E980050EF3FF047EF3FF008013B6F000E0E0137 -:107EA8000E01B26F08013B5100F0B8CE39F800F06E -:107EB800B9CE3AF839C837F83AC838F864EF3FF01D -:107EC8001200C80E080108015D6F000E08015E6F00 -:107ED800000E080108015B6F000E08015C6F0101CC -:107EE800000E08010801596F0101010E08015A6FBF -:107EF80053EC40F00801566F000E04010401FF6FB7 -:107F0800080156510801566F000E06010601D76F89 -:107F1800080156511200000E08010801696F000E91 -:107F280008016A6F0101000E08010801676F01016D -:107F3800010E0801686FFBEC3DF067C865F868C87A -:107F480066F80801080166516511D8B4AEEF3FF034 -:107F5800B0EF3FF0B7EF3FF065C8E9FF66C8EAFF4A -:107F6800080164C8EFFF120008010A6F000E08013B -:107F78000801096F08010A51040E08010801096582 -:107F8800C8EF3FF0CAEF3FF0CCEF3FF0DDEF3FF036 -:107F980009C84CF8A3EC36F008010801092B040EB7 -:107FA800080108010965DBEF3FF0DDEF3FF0CCEF9A -:107FB8003FF007010F8312000801116F000E07013F -:107FC80007012A6F080111510801116F000E0701FE -:107FD8000701106F08011151000E06010601C46F58 -:107FE800000E0601C56F0801116F000E0701070199 -:107FF800136F080111510801116F000E07010701E5 -:10800800116F0801115112000801116F000E0701CC -:1080180007012C6F080111510801116F000E0701AB -:1080280007010B6F080111510801116F000E0701BC -:108038000701296F080111510801116F000E07018E -:1080480007012B6F08011151070107019869070102 -:108058009969120042EF40F0080159C8F6FF08017B -:108068005AC8F7FF000EF86E08000E01F5CF7EFE25 -:1080780008010801594B5A2B7ECE61FF08010801FF -:108088005B07D8A05C0708015B29D8B45C29D8A491 -:1080980050EF40F052EF40F030EF40F0120059C876 -:1080A8005FF85AC860F864EF40F05FC8E9FF60C83D -:1080B800EAFF08015BC8EFFF080108015F4B602B6E -:1080C800080108015D07D8A05E0708015D29D8B43A -:1080D8005E29D8A472EF40F074EF40F059EF40F0F9 -:1080E80076EF40F01200A1C768F8BEEC20F07D0ED4 -:1080F80008010801685D000E08016959D8B087EFCA -:1081080040F089EF40F08BEF40F098EF40F065ECDD -:108118003FF0BB0E08010801536FFF0E0801546FB2 -:10812800B6EC35F04DEC0EF012000AC8B4FE0BC8E0 -:108138007EFE0CC87FFEF250C00B080108010D6FCF -:108148003F0EF2167ECEB6FE00F07FCEB7FE0801D7 -:1081580008010D51F212B1EF40F00E010E018AB183 -:10816800B8EF40F0BAEF40F0B1EF40F01200CBEFBB -:1081780040F0C0C8E9FFC1C8EAFFEF500E010E0188 -:108188007E6F08010801C04BC12B7ECE61FF08013C -:108198000801C207D8A0C3070801C229D8B4C32957 -:1081A800D8A4D9EF40F0DBEF40F0BDEF40F012006B -:1081B80007010701A229D8B4E4EF40F0E6EF40F048 -:1081C800EDEF40F0A2C74CF8A3EC36F00701070129 -:1081D800A2690801306F070E07010701A66F0801A1 -:1081E80030510701089107010831010BFCEF40F0FD -:1081F80012000101000E04010401FF25E96EEA6A7C -:108208000101010EEA22EF50680AD8B40EEF41F0DE -:1082180010EF41F013EF41F0000E1CEF41F00401A4 -:108228000401FF29070107012D6F010E1CEF41F022 -:10823800120004010401DD6904010401DE6904017E -:108248000401DF6904010401E06904010401E16932 -:1082580004010401E269000E04010401D96F000E53 -:108268000401DA6F000E0401DB6F000E0401DC6FFD -:108278001200000E080108010D6545EF41F047EFB7 -:1082880041F04AEF41F0000E5BEF41F00DC871F884 -:108298001DEC2BF01750070AD8B455EF41F058EFF2 -:1082A80041F0010E59EF41F0000E5BEF41F0120072 -:1082B80037EC44F027EC20F02CC82DF874EC44F08F -:1082C80051EC43F00009D8A46CEF41F06EEF41F097 -:1082D80072EF41F065EC3FF076EF41F037EC44F097 -:1082E8004DEC0EF012000101000E04010401FF25FF -:1082F800E96EEA6A0101010EEA22EF50690AD8B470 -:1083080088EF41F08BEF41F0010E8CEF41F0000E49 -:108318008EEF41F01200070107010FB396EF41F00D -:1083280098EF41F0A6EF41F02EEC3CF0000E06016C -:108338000601CE6F000E0601CF6F07010701A36982 -:1083480007010F831200F28A00F0F29AD6CFFAF1F1 -:10835800D7CFFBF1EDC6FCF1EEC6FDF1EFC6FEF19D -:10836800F0C6FFF1F2B4BBEF41F0BDEF41F0A7EF6B -:1083780041F0F28A1200F28A00F0F29AD6CFFAF1AE -:10838800D7CFFBF1EDC6FCF1EEC6FDF1EFC6FEF16D -:10839800F0C6FFF1F2B4D3EF41F0D5EF41F0BFEFF3 -:1083A80041F0F28A120008010D6F010E0701070162 -:1083B8007E6F08010D51070107017B69BB68C4EC9A -:1083C80043F0A1C87FF7A2C880F7A3C881F7A4C863 -:1083D80082F71200000E080108010D65F6EF41F062 -:1083E800F8EF41F0FAEF41F003EF42F00DC871F8F1 -:1083F8001DEC2BF018960DC82DF895EC12F0120014 -:10840800F2A409EF42F00BEF42F019EF42F0010E2F -:1084180006010601ED27000E0601EE23000E0601F7 -:10842800EF23000E0601F023F29412004428D8B47A -:1084380020EF42F022EF42F027EF42F044C04CF820 -:10844800A3EC36F0446808010A6F000E0001000131 -:10845800456F08010A51120057C859F858C85AF808 -:108468003DEC37F059C85CF85AC85DF857C85AF857 -:1084780058C85BF856C859F88CECE3F044EF42F062 -:10848800120057C859F858C85AF83DEC37F059C87F -:108498005CF85AC85DF857C85AF858C85BF856C807 -:1084A80059F883ECDEF059EF42F01200A7EC41F0E6 -:1084B800FBC1A5F8FCC1A6F8FDC1A7F8FEC1A8F844 -:1084C800A5C8A1F8A6C8A2F8A7C8A3F8A8C8A4F880 -:1084D8006EEF42F01200948694883F0EC716000E85 -:1084E800C66E000EC56EC686C78E82868288C68A0C -:1084F8000801096F430EC86E080109511200080EE1 -:10850800080108014E2508010801796F000E0801CD -:1085180008014F2108017A6FF9EC42F04EC8D2F6F3 -:108528004FC8D3F612000801226F010E0801080196 -:10853800376F0801225139EC3FF0370EE96E080E0B -:10854800EA6EEF30E832010BAAEF42F012000001A8 -:1085580000014567B2EF42F0B4EF42F0BEEF42F0DF -:108568000801386F010E00010001456F08013851FC -:10857800000146911200F90E080108014E25080174 -:108588000801AC6F0A0E080108014F210801AD6F00 -:108598000BEC44F04EC8FBF44FC8FCF412000AC8B8 -:1085A80059F80BC85AF83DEC37F059C855F85AC86D -:1085B80056F80AC853F80BC854F8F9EC30F0E5EF50 -:1085C80042F012000AC859F80BC85AF83DEC37F0C7 -:1085D80059C855F85AC856F80AC853F80BC854F879 -:1085E80053EC31F0F8EF42F0120006010601FA519F -:1085F800080108017925080108017B6F000E0801B0 -:1086080008017A2108017C6F64EC3CF01200A1C7D4 -:1086180068F8BEEC20F065EC3FF0680E0801080130 -:10862800536FFF0E0801546FB6EC35F021EC44F09F -:1086380012000701070108A124EF43F026EF43F0D9 -:1086480029EF43F0000E2EEF43F007010881010ED9 -:108658002EEF43F01200BCC8BFF8BDC8C0F8C0C8B0 -:10866800BEF8BFC8C0F8BEC8BFF8BFC8BCF8C0C80D -:10867800BDF83FEF43F0120032C838F833C839F874 -:1086880067EC35F034C853F835C854F836C855F88F -:1086980037C856F866EC13F0120006010601E551DA -:1086A800030AD8B45AEF43F05DEF43F0010E5EEFD2 -:1086B80043F0000E60EF43F0120006010601D751A7 -:1086C800040AD8B46AEF43F06DEF43F0010E6EEF81 -:1086D80043F0000E70EF43F012002EC834F82FC894 -:1086E80035F830C836F831C837F82CC832F82DC8F4 -:1086F80033F840EC43F01200000ED76E000ED66E31 -:10870800F194F294F28A0801086F870ED56E080179 -:10871800085112000E010E01DFAB95EF43F098EF00 -:1087280043F0010E99EF43F0000E9BEF43F0120067 -:1087380076927690769C769A768876967684A496C3 -:108748007768A38697949388A586120030C838F86E -:1087580031C839F867EC35F032C853F833C854F8E3 -:10876800B6EC35F0120026C82BF824C829F825C81D -:108778002AF822C827F823C828F84EEC17F0120068 -:10878800A7EC41F0FAC1A1F8FBC1A2F8FCC1A3F81B -:10879800FDC1A4F8D0EF43F01200BFEC41F0FAC1DC -:1087A800DEF8FBC1DFF8FCC1E0F8FDC1E1F8DDEF60 -:1087B80043F012000101000E08010801366F0101A3 -:1087C800010E0801376FE9EF43F0120008010E6F40 -:1087D800020E070107017E6F08010E510DC87BF7D5 -:1087E80012002EC832F82FC833F82CC830F82DC81C -:1087F80031F8AAEC43F0120008010E6F020E0701CF -:108808000701876F08010E510DC884F71200E2CEE8 -:10881800AEF8E3CEAFF8ACC8E2FEADC8E3FE15EFA4 -:1088280044F01200C4EC43F0A1C8E9F6A2C8EAF685 -:10883800A3C8EBF6A4C8ECF6120008012C6F680E6A -:1088480008010801646F08012C518FEC3FF01200F9 -:10885800E0CEAEF8E1CEAFF8ACC8E0FEADC8E1FEC0 -:1088680036EF44F0120008012D6F730E080108015D -:10887800646F08012D518FEC3FF012009792929887 -:108888008998B19AB198A082A282B190120061CF62 -:108898007EFE0E010E017E5152EF44F012000001DF -:1088A8004651010B58EF44F01200070107012E5101 -:1088B8005EEF44F012007AEC44F0B1907684120036 -:1088C800C0C87EFE7ECE61FF1200D08EF28EF28C82 -:1088D8001200769471EC44F012008E828E9412008D -:1088E8002DC87DF7120056C886F712008E928E8426 -:0888F8001200BCEC09F01200B3 -:10FE16002F7365727665722F61737369676E3F65BE -:10FE26006D6265646465643D312670726F746F63DC -:10FE36006F6C56657273696F6E3D32266D61633DF8 -:10FE46000048415052414455395055535445575531 -:10FE56003355334136484550415145465245504544 -:10FE6600500000005E01E8036700535741513854C3 -:10FE76004845433245424139484546454A3552553B -:10FE860053544548455939323754000D0A436F6E6D -:10FE96006E656374696F6E3A20636C6F73650D0AE5 -:10FEA6000D0A0020485454502F312E300D0A486F49 -:10FEB60073743A200073656C666C6561726E696E68 -:10FEC6006776320054656C6C537469636B4E657467 -:10FED6003A0054656C6C537469636B204E6574000C -:10FEE60073656C666C6561726E696E6700657665D2 -:10FEF60072666C6F7572697368007265676C697398 -:10FF060074656E657200646973636F6E6E656374A3 -:10FF16000066696E656F666673657400636F646517 -:10FF26007377697463680070726F746F636F6C00C7 -:10FF36005265676973746572006D616E646F6C7982 -:10FF46006E0076657273696F6E00676174657761BE -:10FF5600790061726374656368006E65746D6173C0 -:10FF66006B0052617744617461006F7265676F6EF2 -:10FF760000736176656970007365637265740073FA -:10FF8600656E736F72006D6574686F6400636C6193 -:10FF9600737300686F7573650073657469700068C4 -:10FFA60061737461006D6F64656C006461746100F7 -:10FFB60073656E640050696E6700686173680064FB -:10FFC6006E7331007368613100756E697400646E1A -:10FFD60073320047455420006D61630032383A00A1 -:10FFE6006B65790041434B00783130003137006F43 -:0AFFF6007300520050005300000099 -:020000040001F9 -:1000000074656D706572617475726568756D69642B -:10001000697479006170692E74656C6C6475732EF7 -:10002000636F6D000000010000000000000000018F -:100030000000000000009E9FFE4101000000FFFF45 -:10004000F3FFFFFFFF80FFFFFEFEFFFEFFFFFEFF4F -:1000500007000D0E080108014A25E96E000E08018F -:1000600008014B21EA6EEF50080108014F6F080E9E -:10007000080108014A25E96E000E080108014B211C -:10008000EA6E0801EECF66F80801EECF67F80801C6 -:10009000EECF68F80801EECF69F8040E08010801F8 -:1000A0004A25E96E000E080108014B21EA6E08019D -:1000B000EECF5AF80801EECF5BF80801EECF5CF8FE -:1000C0000801EECF5DF81890189218940B000E00FE -:1000D00018B86DEF80F06FEF80F085EF80F0C4EC22 -:1000E00043F0740E08010801A1250F6E350E0801BA -:1000F0000801A221106E060E08010801A321116E4D -:10010000000E08010801A421126EDDEF81F0080144 -:1001100008014FA58EEF80F090EF80F094EF80F013 -:100120006CEC33F0D6EF8DF0080108014FA99BEF7E -:1001300080F09DEF80F0BBEF80F066C821F067C8CB -:1001400022F068C823F069C824F008016A6F000E25 -:1001500008010801736F08016A5108016B6F040EF2 -:1001600008010801726F08016B519FECA1F06CEC63 -:1001700033F0D6EF8DF0080108014FA3C2EF80F0F5 -:10018000C4EF80F0F8EF80F0010E080108015A2555 -:10019000256E000E080108015B21266E000E080185 -:1001A00008015C21276E000E080108015D21286E00 -:1001B000B4EC04F072C840F073C841F008016A6FF3 -:1001C000010E08010801736F08016A5108016B6F85 -:1001D000120E08010801726F08016B519FECA1F02B -:1001E00008016A6F060E176E08016A51FAEF80F077 -:1001F0006CEC33F0D6EF8DF0080108014FA503EF4A -:1002000081F005EF81F007EF81F0D6EF8DF0080166 -:1002100008014FA90EEF81F010EF81F056EF81F049 -:1002200008010801695124180EE10801080168510C -:10023000231809E1080108016751221804E10801A7 -:10024000080166512118D8B428EF81F02AEF81F017 -:1002500056EF81F021C05AF822C05BF823C05CF849 -:1002600024C05DF866C821F067C822F068C823F092 -:1002700069C824F008016A6F010E08010801736F54 -:1002800008016A5108016B6F040E08010801726FC2 -:1002900008016B519FECA1F05AC821F05BC822F015 -:1002A0005CC823F05DC824F0D6EF8DF0080108018A -:1002B0004FA35DEF81F05FEF81F0D9EF81F0010E88 -:1002C000080108015A25256E000E080108015B216E -:1002D000266E000E080108015C21276E000E080141 -:1002E00008015D21286E0E0E080108014A25E96EFD -:1002F000000E080108014B21EA6EEECF2FF0EDCF82 -:1003000030F0B4EC04F072C840F073C841F008015A -:1003100008014FA98EEF81F090EF81F0C1EF81F0DD -:1003200008016A6F010E08010801736F08016A5124 -:1003300008016B6F100E08010801726F08016B5104 -:100340009FECA1F008016A6F070E176E08016A5151 -:10035000C4EC43F0740E08010801A1250F6E350EA0 -:1003600008010801A221106E060E08010801A32150 -:10037000116E000E08010801A421126E1898D9EF21 -:1003800081F008016A6F010E08010801736F08010E -:100390006A5108016B6F120E08010801726F0801A3 -:1003A0006B519FECA1F008016A6F060E176E0801F1 -:1003B0006A51D6EF8DF0E6EF81F01750040A01E1A3 -:1003C000A6D6010A01E118D7DBEF81F04CC854F83A -:1003D0004DC855F8080108014FA1F1EF81F0F3EF86 -:1003E00081F0F7EF81F008010801544B552B08010B -:1003F00008014FA3FEEF81F000EF82F004EF82F0DE -:1004000008010801544B552B00EE0DF010EE0BF0D7 -:10041000E652EE52ED50E55C02E1EF50E75CD8A009 -:1004200014EF82F016EF82F03DEF82F000EE0BF059 -:10043000EECF6AF8EDCF6BF80D5008016A5F0E50F1 -:1004400008016B5B00EE05F0EECF6CF8EDCF6DF8B8 -:10045000035008016C5F045008016D5B08016A518C -:1004600008016C5D08010801526F08016B51080119 -:100470006D590801536F54EF82F000EE0DF0EECF8E -:100480006AF8EDCF6BF80B5008016A5F0C50080159 -:100490006B5BFF0E08016A2508010801526FFF0E11 -:1004A00008016B210801536F2550080108015A5DAE -:1004B00008010801626F2650080108015B59080114 -:1004C000636F2750080108015C590801646F2850C8 -:1004D000080108015D590801656F62C856F863C8D4 -:1004E00057F808016A6F000E080108014E6F0801F5 -:1004F0006A510801080155515411D8B482EF82F0B5 -:1005000084EF82F094EF83F00801080153515211F7 -:10051000D8B48DEF82F08FEF82F092EF83F0080174 -:10052000080165BF96EF82F098EF82F0CBEF82F082 -:1005300008010801525108016A6F0801080153516E -:1005400008016B6F08016C6B08016D6B08016A5143 -:1005500008010801625D08016B5108010801635937 -:1005600008016C5108010801645908016D51080126 -:1005700008016559D8B0BFEF82F0C1EF82F0CBEF30 -:1005800082F008016A6F010E080108014E6F080130 -:100590006A513DEF83F00801080154510801080138 -:1005A000622508016A6F0801080155510801080118 -:1005B000632108016B6F000E080108016421080126 -:1005C0006C6F000E08010801652108016D6F0801BC -:1005D0006D51800A800F08E1000E6C5D05E1000E90 -:1005E0006B5D02E1010E6A5DD8A0F9EF82F0FBEFCE -:1005F00082F03DEF83F00801080154510801080121 -:10060000525D08016A6F080108015551080108018F -:10061000535908016B6F08016C6B08016BBF6C07C5 -:1006200008016C5108016D6F08016D51800A0801C5 -:100630006E6F08010801625108016A5D0801080136 -:10064000635108016B5908010801645108016C5994 -:10065000080108016551800A08016E59D8A033EFDE -:1006600083F035EF83F03DEF83F008016A6F010EF0 -:10067000080108014E6F08016A5108010801525132 -:1006800008016A6F08010801535108016B6F0801E6 -:100690006C6B08016D6B080108016551800A080147 -:1006A0006E6F08016A5108010801625D08016B5113 -:1006B00008010801635908016C51080108016459D7 -:1006C00008016D51800A08016E59D8B06AEF83F0B5 -:1006D0006CEF83F092EF83F0080156C86AF80801C6 -:1006E00057C86BF808010801545108016A2708012E -:1006F0000801555108016B2308016B51800A800FD6 -:10070000010ED8B46A5DD8A088EF83F08AEF83F039 -:1007100092EF83F008016A6F010E080108014E6F25 -:1007200008016A51E4EF83F0080165516211631119 -:100730006411D8A49EEF83F0A0EF83F0AAEF83F0BA -:1007400008016A6F010E080108014E6F08016A5125 -:10075000E4EF83F00801080165BFB1EF83F0B3EF68 -:1007600083F0E4EF83F008010801525108016A6F39 -:1007700008010801535108016B6F08016C6B0801F7 -:100780006D6B08016A5108010801625D08016B5137 -:1007900008010801635908016C51080108016459F6 -:1007A00008016D51080108016559D8B0DAEF83F0EE -:1007B000DCEF83F0E4EF83F008016A6F010E0801BB -:1007C00008014E6F08016A51080108014E67EBEFFE -:1007D00083F0EDEF83F00AEF84F0080108014FB5D4 -:1007E000F4EF83F0F6EF83F008EF84F008016A6F0E -:1007F000010E08010801736F08016A5108016B6F4F -:10080000100E08010801726F08016B519FECA1F0F6 -:10081000D6EF8DF0080108014F51060BD8B413EF45 -:1008200084F015EF84F019EF84F06CEC33F0D6EF20 -:100830008DF0080108014FB920EF84F022EF84F019 -:1008400024EF84F0D6EF8DF04DEF88F00801080119 -:10085000695124180EE1080108016851231809E1C3 -:10086000080108016751221804E1080108016651D6 -:100870002118D8B43EEF84F040EF84F06CEF84F0A0 -:1008800021C05AF822C05BF823C05CF824C05DF890 -:1008900066C821F067C822F068C823F069C824F050 -:1008A00008016A6F010E08010801736F08016A519F -:1008B00008016B6F040E08010801726F08016B518B -:1008C0009FECA1F05AC821F05BC822F05CC823F06D -:1008D0005DC824F0D6EF8DF008016A6F070E176E21 -:1008E00008016A512950075C08010801586F2A5015 -:1008F00008580801596F0801080159AF82EF84F0C8 -:1009000084EF84F09AEF84F000EE03F0EECF6AF803 -:10091000EDCF6BF8015008016A5F025008016B5B74 -:1009200008016A5108010801582708016B510801A4 -:100930000801592308010801585121240801080120 -:100940005E6F080108015951222008015F6F000EF7 -:1009500023200801606F000E24200801616F080148 -:1009600008016651080108015E5D08016A6F08010F -:1009700008016751080108015F5908016B6F080100 -:100980000801685108010801605908016C6F0801ED -:100990000801695108010801615908016D6F0801DA -:1009A0006DAFD5EF84F0D7EF84F0EBEF84F0080162 -:1009B0006A6F000E08010801736F08016A5108018F -:1009C0006B6F100E08010801726F08016B519FECEC -:1009D000A1F0D6EF8DF00950295C08016A6F0A502A -:1009E0002A5808016B6F08016C6B08016BBF6C071C -:1009F00008016C5108016D6F08016A51215C080102 -:100A000008015E6F08016B51225808015F6F0801F1 -:100A10006C5123580801606F08016D51245808017A -:100A2000616F00EE09F010EE29F0E652EE52ED5043 -:100A3000E55C02E1EF50E75CD8B021EF85F023EFF1 -:100A400085F043EF85F00150035C08016A6F0250A6 -:100A5000045808016B6F08016C6B08016D6B08018D -:100A60006A51080108015E5F08016B510801080125 -:100A70005F5B08016C5108010801605B08016D5162 -:100A800008010801615B080108015E5108010801C5 -:100A9000665D080108015E6F080108015F510801E9 -:100AA0000801675908015F6F0801080160510801DA -:100AB000080168590801606F0801080161510801C7 -:100AC000080169590801616F080108016151800A34 -:100AD000800F0BE1000E0801605D07E1000E0801C8 -:100AE0005F5D03E1010E08015E5DD8A07AEF85F03D -:100AF0007CEF85F07DEF86F00150035C08016A6FA2 -:100B00000250045808016B6F08016C6B08016D6B93 -:100B1000080108015E5108016A5D080108015F5182 -:100B200008016B5908010801605108016C5908015E -:100B30000801615108016D59D8A0A1EF85F0A3EF1C -:100B400085F07DEF86F03F963F98199009C058F8E0 -:100B50000AC059F8080108015E5109260801080178 -:100B60005F510A22080108015851295C0801080157 -:100B700059512A58D8A0BFEF85F0C1EF85F0EFEFAB -:100B800085F000EE09F010EE29F0E652EE52ED503D -:100B9000E55C02E1EF50E75CD8B0D1EF85F0D3EF30 -:100BA00085F0EDEF85F000EE09F0EECF6AF8EDCFBD -:100BB0006BF8295008016A5F2A5008016B5B080135 -:100BC0006A51212608016B512222000E2322000EB9 -:100BD000242209C029F00AC02AF033EF86F000EE83 -:100BE00003F0EECF6AF8EDCF6BF8015008016A5FB1 -:100BF000025008016B5B295008016A2508010801B1 -:100C0000586F2A5008016B210801596F09500801DB -:100C10000801585D0A50080108015959D8B013EF6E -:100C200086F015EF86F033EF86F000EE09F0EECF98 -:100C30006AF8EDCF6BF808010801585108016A5FA6 -:100C400008010801595108016B5B08016A5121260E -:100C500008016B512222000E2322000E242209C01B -:100C600029F00AC02AF000EE03F010EE09F0E65277 -:100C7000EE52ED50E55C02E1EF50E75CD8A043EFA7 -:100C800086F045EF86F057EF86F000EE03F0EECFEA -:100C90006AF8EDCF6BF8015008016A5F0250080155 -:100CA0006B5B08016A51095E08016B510A5A00EE3C -:100CB00003F010EE29F0E652EE52ED50E55C02E151 -:100CC000EF50E75CD8A067EF86F069EF86F07BEF26 -:100CD00086F000EE03F0EECF6AF8EDCF6BF801502E -:100CE00008016A5F025008016B5B08016A51295EC6 -:100CF00008016B512A5AF1EF86F000EE29F010EE50 -:100D000009F0E652EE52ED50E518EFCFE8FFD8B407 -:100D1000E718D8B48EEF86F090EF86F0F1EF86F00A -:100D20003FA695EF86F097EF86F0F0EF86F03FA8AC -:100D30009CEF86F09EEF86F0EFEF86F00950295C7D -:100D400008016A6F0A502A5808016B6F08016C6B22 -:100D500008016BBF6C0708016C5108016D6F080139 -:100D60006A51215E08016B51225A08016C51235AC5 -:100D700008016D51245A00EE09F010EE29F0E652F8 -:100D8000EE52ED50E55C02E1EF50E75CD8B0CBEFFE -:100D900086F0CDEF86F0EAEF86F00150035C0801A3 -:100DA0006A6F0250045808016B6F08016C6B0801F0 -:100DB0006BBF6C0708016C5108016D6F08016A5127 -:100DC000215E08016B51225A08016C51235A080117 -:100DD0006D51245A09C029F00AC02AF019843F88AD -:100DE0003F8600EE07F010EE09F0E652EE52ED50AD -:100DF000E518EFCFE8FFD8B4E718D8A402EF87F0E2 -:100E000004EF87F047EF87F019B609EF87F00BEF93 -:100E100087F024EF87F0C4EC43F0740E080108015A -:100E2000A1250F6E350E08010801A221106E060ED5 -:100E300008010801A321116E000E08010801A42178 -:100E4000126E189847EF87F00801080169512418BD -:100E50000EE1080108016851231809E108010801A1 -:100E60006751221804E10801080166512118D8A42D -:100E70003CEF87F03EEF87F047EF87F03FA043EF6E -:100E800087F045EF87F047EF87F01898199600EE46 -:100E900021F0EECF6AF8EDCF6BF80801080166513A -:100EA00008016A5F08010801675108016B5B0E0EBB -:100EB000080108014A25E96E000E080108014B21CE -:100EC000EA6EEECF6CF8EDCF6DF808016A510801BB -:100ED0006C5D08010801506F08016B5108016D59E4 -:100EE0000801516F30502F10D8A479EF87F07BEFB5 -:100EF00087F087EF87F00801080151515011D8B4ED -:100F000084EF87F086EF87F087EF87F0198250C86B -:100F10002FF051C830F01750080AD8A492EF87F08C -:100F200094EF87F0D4EF87F0080108016951241885 -:100F30000EE1080108016851231809E108010801C0 -:100F40006751221804E10801080166512118D8A44C -:100F5000ACEF87F0AEEF87F0D2EF87F03FA0B3EFB2 -:100F600087F0B5EF87F0D2EF87F0C4EC43F0BA0E0C -:100F700008010801A1250F6E1A0E08010801A2211F -:100F8000106E030E08010801A321116E000E080166 -:100F90000801A421126E188808016A6F090E176EE5 -:100FA00008016A512DEF88F01750090AD8A4DBEF29 -:100FB00087F0DDEF87F006EF88F0080108014FB1F8 -:100FC000E4EF87F0E6EF87F004EF88F066C821F0E1 -:100FD00067C822F068C823F069C824F008016A6F66 -:100FE000000E08010801736F08016A5108016B6F58 -:100FF000140E08010801726F08016B519FECA1F0FB -:101000006CEC33F0D6EF8DF02DEF88F017500A0A14 -:10101000D8A40DEF88F00FEF88F02DEF88F00801CD -:101020000801695124180EE10801080168512318CC -:1010300009E1080108016751221804E108010801CB -:1010400066512118D8A427EF88F029EF88F02BEFFC -:1010500088F06CEC33F0D6EF8DF065EF88F0080186 -:101060000801695124180EE108010801685123188C -:1010700009E1080108016751221804E1080108018B -:1010800066512118D8A447EF88F049EF88F04BEF5C -:1010900088F06CEC33F0D6EF8DF01750060A02E1C1 -:1010A00026EF84F0010A01E11DD40F0A01E11AD4F0 -:1010B000010A01E117D4030A01E114D4010A01E194 -:1010C00011D4070ACCE02DEF88F0080108014FABDE -:1010D0006CEF88F06EEF88F070EF88F0D6EF8DF04F -:1010E00017500B0AD8A477EF88F079EF88F07BEFE0 -:1010F00088F0D6EF8DF017500A0AD8A482EF88F056 -:1011000084EF88F086EF88F0D6EF8DF017500C0A48 -:10111000D8A48DEF88F08FEF88F091EF88F0D6EFAC -:101120008DF0080108014D514C11D8B49AEF88F0A8 -:101130009CEF88F09AEF8CF0080108015751800A63 -:10114000800F010ED8B4565DD8B0A9EF88F0ABEF90 -:1011500088F032EF8AF00C0E080108014A25E96E8A -:10116000000E080108014B21EA6EEF380F0B080151 -:101170006A6F6AC86BF808016C6BD89008016B370E -:101180006C37D89008016B376C370801080156514D -:1011900008016B5D08010801796F080108015751CA -:1011A00008016C5908017A6FF9EC42F00801080156 -:1011B0005651080108014C27080108015751080140 -:1011C00008014D23080108014C5108010801525D36 -:1011D000080108014D51080108015359D8B0F3EF37 -:1011E00088F0F5EF88F0F9EF88F052C84CF853C852 -:1011F0004DF8080108014C512526080108014D5100 -:101200002622000E2722000E282200EE0BF0EECF41 -:101210006AF8EDCF6BF8080108014C5108016A2704 -:10122000080108014D5108016B2308016A51055C52 -:1012300008016B510658D8B020EF89F022EF89F0F1 -:1012400096EF89F000EE05F0EECF6AF8EDCF6BF87F -:101250000B5008016A5F0C5008016B5B010E08011E -:101260006A2508010801586F000E08016B2108016A -:10127000596F58C8AAF859C8ABF808016A6F000E30 -:1012800008010801A96F08016A51FF0E0801080151 -:10129000A76FFF0E0801A86F1CC0A6F80BC0A4F82A -:1012A0000CC0A5F8A0EC23F0080108015851080172 -:1012B00008014C5D08010801AA6F08010801595195 -:1012C000080108014D590801AB6F08016A6F000E53 -:1012D00008010801A96F08016A51FF0E0801080101 -:1012E000A76FFF0E0801A86F1CC0A6F803C0A4F8E2 -:1012F00004C0A5F8A0EC23F008014CC86AF8080166 -:101300004DC86BF808010801585108016A5F0801CF -:101310000801595108016B5B035008016A250B6EE7 -:10132000045008016B210C6EB9EF89F04CC8AAF883 -:101330004DC8ABF808016A6F000E08010801A96FDB -:1013400008016A51FF0E08010801A76FFF0E08018E -:10135000A86F1CC0A6F80BC0A4F80CC0A5F8A0ECA0 -:1013600023F0080108014C510B26080108014D51DA -:101370000C223D28D8B43E28D8B4C1EF89F0C3EF81 -:1013800089F030EF8AF0080108014C513D5E0801F8 -:1013900008014D513E5A3D50312408010801586F53 -:1013A0003E5032200801596F0801080159AFDBEFA8 -:1013B00089F0DDEF89F0E1EF89F03D683E6830EFBC -:1013C0008AF000EE3DF0EE52ED50800A800F010EE3 -:1013D000D8B4EF5CD8B0EFEF89F0F1EF89F030EFDF -:1013E0008AF00801080158512526080108015951C1 -:1013F0002622000E2722000E28220801080158513B -:101400000B260801080159510C2200EE0BF010EEDA -:1014100005F0E652EE52ED50E55C02E1EF50E75C7C -:10142000D8B015EF8AF017EF8AF02EEF8AF000EEB1 -:1014300005F0EECF6AF8EDCF6BF8035008016A5F54 -:10144000045008016B5B010E08016A27000E6B2334 -:1014500008016A510B5E08016B510C5A3D683E68E9 -:101460009AEF8CF0080108015751800A800F010E95 -:10147000D8B4565DD8A03FEF8AF041EF8AF09AEFDA -:101480008CF008014CC86AF808014DC86BF80801D7 -:101490000801565108016A2708010801575108013F -:1014A0006B2308016A5108010801525D08016B5164 -:1014B000080108015359D8B060EF8AF062EF8AF052 -:1014C00073EF8AF008010801565108010801525DC6 -:1014D000080108014C6F0801080157510801080173 -:1014E000535908014D6F0C0E080108014A25E96E99 -:1014F000000E080108014B21EA6EEF380F0B0801BE -:101500006A6F6AC86BF808016C6BD89008016B377A -:101510006C37D89008016B376C376BC879F86CC89A -:101520007AF8F9EC42F000EE0BF0EECF6AF8EDCF6E -:101530006BF808010801565108016A2708010801E3 -:10154000575108016B23080108014C5108016A2713 -:10155000080108014D5108016B2308016A51055C1F -:1015600008016B510658D8B0B8EF8AF0BAEF8AF08C -:101570007DEF8BF000EE05F0EECF6AF8EDCF6BF863 -:101580000B5008016A5F0C5008016B5B010E0801EB -:101590006A27000E6B2308010801565108016A5D95 -:1015A00008010801586F08010801575108016B59DB -:1015B0000801596F0801080159BFE1EF8AF0E3EF14 -:1015C0008AF031EF8BF058C8AAF859C8ABF8080177 -:1015D0006A6F000E08010801A96F08016A51FF0E29 -:1015E00008010801A76FFF0E0801A86F1CC0A6F82C -:1015F0000801080156510B2408010801A46F0801D5 -:10160000080157510C200801A56FA0EC23F0080138 -:1016100008015851080108014C5D08010801AA6F32 -:10162000080108015951080108014D590801AB6F23 -:1016300008016A6F000E08010801A96F08016A51CC -:10164000FF0E08010801A76FFF0E0801A86F1CC05C -:10165000A6F803C0A4F804C0A5F8A0EC23F07BEF23 -:101660008BF04CC8AAF84DC8ABF808016A6F000EA1 -:1016700008010801A96F08016A51FF0E080108015D -:10168000A76FFF0E0801A86F1CC0A6F800EE05F0BA -:10169000EECF6BF8EDCF6CF8035008016B5F045090 -:1016A00008016C5B00EE0BF0EECF6DF8EDCF6EF83D -:1016B00008010801565108016D270801080157511A -:1016C00008016E2308016B5108016D5D08016F6F01 -:1016D00008016C5108016E590801706FFF0E080176 -:1016E0006F2508010801A46FFF0E08017021080191 -:1016F000A56FA0EC23F0A1EF8BF04CC8AAF84DC861 -:10170000ABF808016A6F000E08010801A96F080113 -:101710006A51FF0E08010801A76FFF0E0801A86FAC -:101720001CC0A6F80801080156510B240801080145 -:10173000A46F0801080157510C200801A56FA0EC07 -:1017400023F03D28D8B43E28D8A4A9EF8BF0ABEF06 -:101750008BF0B5EF8BF056C83DF057C83EF04CC843 -:1017600031F04DC832F09AEF8CF03D50080108017D -:10177000565D3E50080108015759D8B0C2EF8BF0B2 -:10178000C4EF8BF030EF8CF0080156C86AF80801FE -:1017900057C86BF8080108014C5108016A27080175 -:1017A00008014D5108016B2300EE3DF0EECF6CF8BF -:1017B000EDCF6DF8315008016C27325008016D23D0 -:1017C00008016A5108016C5D08016B5108016D59EF -:1017D000D8A0EDEF8BF0EFEF8BF00CEF8CF0080161 -:1017E00056C86AF8080157C86BF8080108014C513F -:1017F00008016A27080108014D5108016B233D507B -:1018000008016A5D3E5008016B59D8B00AEF8CF0B0 -:101810000CEF8CF012EF8CF04CC831F04DC832F068 -:101820002AEF8CF000EE3DF0EECF6AF8EDCF6BF8CA -:10183000315008016A27325008016B230801080162 -:10184000565108016A5D316E0801080157510801BF -:101850006B59326E56C83DF057C83EF09AEF8CF087 -:10186000080156C86AF8080157C86BF80801080152 -:101870004C5108016A27080108014D5108016B23EA -:1018800000EE3DF0EECF6CF8EDCF6DF83150080171 -:101890006C27325008016D2308016A5108016C5D04 -:1018A00008016B5108016D59D8B059EF8CF05BEF0E -:1018B0008CF09AEF8CF000EE3DF0EECF6AF8EDCFB1 -:1018C0006BF8315008016A27325008016B23080178 -:1018D0000801565108016A5D0801080157510801C5 -:1018E0006B59D8A076EF8CF078EF8CF09AEF8CF0F3 -:1018F000080156C86AF8080157C86BF808010801C2 -:101900004C5108016A27080108014D5108016B2359 -:101910003D5008016A5F3E5008016B5B3150080181 -:101920006A5F325008016B5B08016A513126080179 -:101930006B5132220801080155515411D8B4A3EF5C -:101940008CF0A5EF8CF0E4EF8CF01750070AD8B4B8 -:10195000ACEF8CF0AEEF8CF0B2EF8CF00BC00DF072 -:101960000CC00EF018AEB7EF8CF0B9EF8CF0CFEFE3 -:101970008CF008016A6F010E08010801736F0801FD -:101980006A5108016B6F100E08010801726F08019F -:101990006B519FECA1F0B7EC24F0E4EF8CF0188EC3 -:1019A00018BCD5EF8CF0D7EF8CF0E4EF8CF0188CEE -:1019B0005AEC42F00F0E08010801A125156E000E29 -:1019C00008010801A221166E080108014FA1EBEFE2 -:1019D0008CF0EDEF8CF0D6EF8DF00801080154513A -:1019E000080108015A2508016A6F080108015551CC -:1019F000080108015B2108016B6F000E0801080156 -:101A00005C2108016C6F000E080108015D210801CE -:101A10006D6F010E252408016E6F000E262008014F -:101A20006F6F000E27200801706F000E282008013C -:101A3000716F08016D51080171190EE108016C51B7 -:101A40000801701909E108016B5108016F1904E1DF -:101A500008016A5108016E19D8A431EF8DF033EFF7 -:101A60008DF0D6EF8DF0010E2526000E2622000EF9 -:101A70002722000E2822B9EF8DF008016A6F0C0EA4 -:101A8000176E08016A5108016A6F010E080108010A -:101A9000736F08016A5108016B6F110E080108018C -:101AA000726F08016B519FECA1F0D6EF8DF0080129 -:101AB0006A6F0B0E176E08016A515AEC42F01F0E46 -:101AC00008010801A125156E000E08010801A221D8 -:101AD000166EC4EF8DF008010801695124180EE15B -:101AE000080108016851231809E10801080167513C -:101AF000221804E10801080166512118D8A483EFD7 -:101B00008DF085EF8DF09BEF8DF008016A6F000E70 -:101B100008010801736F08016A5108016B6F100E0C -:101B200008010801726F08016B519FECA1F06CEC89 -:101B300033F0D6EF8DF008016A6F0A0E176E0801B8 -:101B40006A51C4EF8DF008016A6F000E08010801A8 -:101B5000736F08016A5108016B6F100E08010801CC -:101B6000726F08016B519FECA1F06CEC33F0D6EF73 -:101B70008DF01750060A81E0010A99E00F0AABE0E8 -:101B8000010AE1E0A1EF8DF008016A6F010E080182 -:101B90000801736F08016A5108016B6F100E08018C -:101BA0000801726F08016B519FECA1F0120008014F -:101BB000276F000E080108011E6F08012751000E53 -:101BC000080108011E65E7EF8DF0E9EF8DF0EBEFFE -:101BD0008DF0F6EF93F01EC871F81DEC2BF00801A4 -:101BE000276F000E08010801206F08012751080126 -:101BF000276F000E080108011F6F08012751080117 -:101C0000276F000E080108011D6F0801275119B246 -:101C10000CEF8EF00EEF8EF015EF8EF019A413EF8F -:101C20008EF015EF8EF02DEF8EF0CBEC3DF000092D -:101C3000D8B41DEF8EF01FEF8EF02DEF8EF008015F -:101C4000276F100E08010801206F08012751000EB0 -:101C500019B4010E080108011F6F18AA32EF8EF0A7 -:101C600034EF8EF058EF8EF05AEC42F00801080184 -:101C7000A151135C0801276F08010801A2511458F3 -:101C80000801286F08012851800A800F010ED8B47E -:101C9000275DD8B04EEF8EF050EF8EF058EF8EF0FB -:101CA0000801276F100E08010801206F0801275155 -:101CB00018AC5DEF8EF05FEF8EF083EF8EF05AEC94 -:101CC00042F008010801A151155C0801276F0801C5 -:101CD0000801A25116580801286F08012851800AEE -:101CE000800F010ED8B4275DD8B079EF8EF07BEF6E -:101CF0008EF083EF8EF00801276F100E08010801A7 -:101D0000206F0801275117500B0AD8A48AEF8EF0D4 -:101D10008CEF8EF0B6EF8EF05AEC42F0080108011D -:101D2000A151155C0801276F08010801A25116583E -:101D30000801286F08012851800A800F010ED8B4CD -:101D4000275DD8B0A6EF8EF0A8EF8EF0B6EF8EF03C -:101D50000801276F110E08010801206F08012751A3 -:101D60000801276F0C0E176E080127511750040A3F -:101D7000D8A4BDEF8EF0BFEF8EF018EF90F0000EFC -:101D800008010801216F000E0801226F030E0801EF -:101D90000801215D000E08012259D8A0D2EF8EF073 -:101DA000D4EF8EF0D6EF8EF018EF90F00801080116 -:101DB0002151140DF3CF27F8100E08012727000139 -:101DC0009F0E08012725E96EEA6A0001000EEA224B -:101DD000EE50ED10D8A4EFEF8EF0F1EF8EF0F3EFB0 -:101DE0008EF018EF90F000EE1AF008010801215172 -:101DF000140DF3CF27F8100E0801272700019F0EBE -:101E000008012725E16EE26A0001000EE222E65297 -:101E1000EE52ED50E518EFCFE8FFD8B4E718D8A49C -:101E200014EF8FF016EF8FF006EF90F0B7EC24F080 -:101E30000A0E08010801B06F000E0801B16F080119 -:101E400008012151140D9F0E0801276F000E286F05 -:101E5000F35008012727E86AF3BEE8680801282341 -:101E600027C8AEF828C8AFF8330E08010801AC6FD8 -:101E7000000E0801AD6F58EC3AF00801080121513D -:101E8000140DF3CF27F80A0E0801272700019F0E33 -:101E900008012725E96EEA6A0001000EEA22EECF6A -:101EA0002BF0EDCF2CF0080108012151140DF3CFD8 -:101EB00027F80C0E0801272700019F0E080127258F -:101EC000E96EEA6A0001000EEA22EECF28F8EECFB2 -:101ED00029F8EECF2AF8EECF2BF8010E08012825BD -:101EE000256E000E08012921266E000E08012A2108 -:101EF000276E000E08012B21286E00EE35F0EECF84 -:101F000027F8EDCF28F8335008012727345008016F -:101F100028232B50080127272C50080128232D5057 -:101F2000080127191A6E2E50080128191B6E080186 -:101F3000276F120E08010801206F080127510801C0 -:101F4000276F060E176E08012751140E08010801AD -:101F5000626F000E0801636F080108012151020839 -:101F600008010801606F080108012251D8A0E82A81 -:101F700000080801616F83EC3BF060C8AAF861C8F3 -:101F8000ABF80801276F010E08010801A96F0801CD -:101F90002751080108012129140D9F0E0801286FFF -:101FA000000E296FF35008012827E86AF3BEE8689D -:101FB0000801292328C8A7F829C8A8F808012A6F0A -:101FC000010E08010801A66F08012A510801080145 -:101FD0002151140D9F0E08012B6F000E2C6FF35032 -:101FE00008012B27E86AF3BEE86808012C232BC8F8 -:101FF000A4F82CC8A5F8A0EC23F0000E0001000105 -:10200000D76F000E0001D86F18EF90F0080108019B -:10201000214B222B030E08010801215D000E08014F -:102020002259D8A016EF90F018EF90F0D6EF8EF06E -:10203000080108012051D8B420EF90F022EF90F071 -:1020400035EF90F0080108011F51D8B42AEF90F045 -:102050002DEF90F0010E2EEF90F0000E0801080118 -:10206000736F20C872F89FECA1F018B83AEF90F0A7 -:102070003CEF90F0BEEF90F01750070AD8A443EF62 -:1020800090F045EF90F090EF90F0C4EC43F00F50DB -:1020900008010801A15D0801276F1050080108011F -:1020A000A2590801286F115008010801A35908011D -:1020B000296F125008010801A45908012A6F08016C -:1020C0002AAF65EF90F067EF90F069EF90F0E9EFDD -:1020D00093F01850070B060AD8A471EF90F073EF35 -:1020E00090F092EF90F0000E18B6010E0801080172 -:1020F000206F1EC82DF895EC12F01EC82DF895EC37 -:1021000012F008010801206788EF90F08AEF90F044 -:1021100090EF90F00801276F0E0E176E08012751FF -:10212000E9EF93F0B7EC24F00801276F020E0801E5 -:102130000801736F080127510801286F100E08016C -:102140000801726F080128519FECA1F0C4EC43F024 -:10215000740E08010801A1250F6E350E0801080153 -:10216000A221106E060E08010801A321116E000EB7 -:1021700008010801A421126EE9EF93F0C4EC43F0CA -:102180000F5008010801A15D0801276F10500801D8 -:102190000801A2590801286F115008010801A3592C -:1021A0000801296F125008010801A45908012A6F7B -:1021B00008012AAFDEEF90F0E0EF90F0E2EF90F050 -:1021C000E9EF93F0B7EC24F02DEF93F01DEC43F022 -:1021D0000009D8B4EEEF90F0F0EF90F01BEF91F023 -:1021E0000801276F010E176E080127513FA4FBEF6E -:1021F00090F0FDEF90F00DEF91F00801276F010EC8 -:10220000080108012F6F0801275133C02DF834C091 -:102210002EF848EC3BF01BEF91F00801276F010E00 -:10222000080108012F6F0801275133C02DF834C071 -:102230002EF80DEC3BF052EF93F00801230E08014D -:1022400008012D6F0801080E08012E6FD3EC94F0E1 -:102250000009D8B42EEF91F030EF91F01BEF91F020 -:10226000DCEC40F00009D8B438EF91F03AEF91F08F -:1022700072EF91F023C833F024C834F025C835F04C -:1022800026C836F00801276F020E176E0801275185 -:1022900000EE35F0EECF27F8EDCF28F833500801E7 -:1022A00027273450080128232B50080127272C50BA -:1022B000080128232D50080127191A6E2E500801F5 -:1022C00028191B6E0801276F000E426E0801275166 -:1022D000270E1D6E000E1E6E000E1F6E000E206E6D -:1022E0008EEF91F0C4EC43F0740E08010801A125B3 -:1022F0000F6E350E08010801A221106E060E0801AE -:102300000801A321116E000E08010801A421126E1C -:102310000801276F000E176E0801275152EF93F046 -:102320005AEC42F0A1C813F0A2C814F0330E080111 -:1023300008014C6F000E08014D6F0EEC23F00801F0 -:10234000276F030E176E0801275152EF93F0370ED7 -:10235000080108014E6F000E08014F6F330E08018F -:1023600008014C6F000E08014D6FE7EC1AF00009F0 -:10237000D8A4BDEF91F0BFEF91F0EEEF91F05AECE1 -:1023800042F0135008010801A15F14500801080130 -:10239000A25B08010801A1511D5C08010801A251BE -:1023A0001E58D8B0D6EF91F0D8EF91F01BEF91F016 -:1023B000060E4260DEEF91F0E0EF91F0E6EF91F073 -:1023C000422AD8901D361E361F3620360801276F48 -:1023D000020E176E0801275152EF93F00801276F84 -:1023E000020E08010801206F080127510801276F1C -:1023F000000E080108011F6F080127510801276F0F -:10240000050E176E0801275152EF93F00801276F50 -:10241000020E08010801206F080127510801276FEB -:10242000010E080108011F6F0801275100EE42F05C -:10243000030EEF641EEF92F020EF92F01BEF91F08D -:102440000801276F040E426E08012751200E1D6EF1 -:10245000EF0E1E6E090E1F6E000E206E52EF93F0EF -:10246000020E426036EF92F038EF92F04AEF92F0AF -:102470000801276F120E08010801206F080127517B -:102480000801276F010E080108011F6F080127517D -:102490001BEF91F018A64FEF92F051EF92F063EF1F -:1024A00092F00801276F140E08010801206F08013F -:1024B00027510801276F010E080108011D6F08014F -:1024C00027516BEF92F00801276F020E08010801F7 -:1024D000206F0801275152EF93F0050E426073EF11 -:1024E00092F075EF92F087EF92F00801276F100ECF -:1024F00008010801206F080127510801276F010E0C -:10250000080108011F6F080127511BEF91F0080116 -:10251000276F080E176E080127510801276F110E4B -:1025200008010801206F0801275152EF93F0050EB2 -:1025300042609DEF92F09FEF92F0B1EF92F00801B0 -:10254000276F110E08010801206F080127510801AB -:10255000276F010E080108011F6F080127511BEFAB -:1025600091F00801276F140E08010801206F08017F -:1025700027510801276F010E080108011D6F08018E -:10258000275152EF93F00801276F140E080108013C -:10259000206F080127510801276F010E080108016B -:1025A0001D6F0801275152EF93F0050E4260DBEFDB -:1025B00092F0DDEF92F0EFEF92F00801276F100E2E -:1025C00008010801206F080127510801276F010E3B -:1025D000080108011F6F080127511BEF91F0080146 -:1025E000276F140E08010801206F08012751080108 -:1025F000276F010E080108011D6F0801275152EFD6 -:1026000093F0050E426007EF93F009EF93F01BEF94 -:1026100093F00801276F110E08010801206F0801CF -:1026200027510801276F010E080108011F6F0801DB -:1026300027511BEF91F00801276F140E08010801C4 -:10264000206F080127510801276F010E08010801BA -:102650001D6F0801275152EF93F01750000A01E156 -:10266000B5D5010A01E1E9D5030A01E159D6010A0C -:1026700001E16DD6060A01E1C9D6030A01E1F0D6EF -:10268000010A01E12AD70F0A01E151D7010A01E14C -:102690007AD7030A8AE0010A01E11FD7070AB1E0ED -:1026A0001BEF91F0080108012051D8B45AEF93F0C4 -:1026B0005CEF93F0DDEF93F0080108011F51D8B4EF -:1026C00064EF93F066EF93F0D1EF93F0422AD89045 -:1026D0001D361E361F3620360950295C08010801B8 -:1026E000216F0A502A580801226F00EE09F010EEFF -:1026F00029F0E652EE52ED50E55C02E1EF50E75C66 -:10270000D8B085EF93F087EF93F09DEF93F000EE54 -:1027100003F0EECF27F8EDCF28F801500801275F2E -:1027200002500801285B08012751080108012127F0 -:10273000080128510801080122230801080121513C -:102740000801276F0801080122510801286F0801BC -:10275000296B08012A6B08012751215E08012851C5 -:10276000225A08012951235A08012A51245A0801E2 -:10277000080121512F26080108012251302209C0E9 -:1027800029F00AC02AF00801276F000E080108018D -:10279000736F0801275120C872F89FECA1F0DDEF9C -:1027A00093F00801276F010E08010801736F0801FB -:1027B000275120C872F89FECA1F0080108011D51B3 -:1027C000D8B4E5EF93F0E7EF93F0E9EF93F06CEC1A -:1027D00033F0080108011E2B000E080108011E65D8 -:1027E000F4EF93F0F6EF93F0EBEF8DF0000E0801AD -:1027F0000801216F000E0801226F030E0801080175 -:10280000215D000E08012259D8A009EF94F00BEFCA -:1028100094F00DEF94F0D2EF94F0080108012151EB -:10282000140DF3CF27F8100E0801272700019F0E83 -:1028300008012725E96EEA6A0001000EEA22EE503F -:10284000ED10D8A426EF94F028EF94F02AEF94F03E -:10285000D2EF94F0080108012151140DF3CF27F8AD -:10286000120E0801272700019F0E08012725E96E97 -:10287000EA6A0001000EEA22EECF28F8EDCF29F82F -:102880005AEC42F00801285108010801A15D080135 -:102890002A6F0801295108010801A25908012B6F6C -:1028A000DD0E08012A5D010E2B59D8A05AEF94F0D5 -:1028B0005CEF94F0C0EF94F0140E08010801626F11 -:1028C000000E0801636F0801080121510208080188 -:1028D0000801606F080108012251D8A0E82A000809 -:1028E0000801616F83EC3BF060C8AAF861C8ABF8DF -:1028F0000801276F010E08010801A96F080127517F -:10290000080108012129140D9F0E0801286F000EEF -:10291000296FF35008012827E86AF3BEE868080128 -:10292000292328C8A7F829C8A8F808012A6F010E8A -:1029300008010801A66F08012A5108010801215168 -:10294000140D9F0E08012B6F000E2C6FF350080121 -:102950002B27E86AF3BEE86808012C232BC8A4F8EB -:102960002CC8A5F8A0EC23F0000E00010001D76FE1 -:10297000000E0001D86F080108012107D8A0220726 -:1029800008010801214B222B030E08010801215DDB -:10299000000E08012259D8A0D0EF94F0D2EF94F0A5 -:1029A0000DEF94F0120059EF9BF00801486F000EF4 -:1029B00007010701326F080148510801486F000EF6 -:1029C00007010701386F080148510001780E08011E -:1029D00008014C6F0001000E08014D6F0EEC23F052 -:1029E00007010701322BC4EC43F0A1C8C6F6A2C808 -:1029F000C7F6A3C8C8F6A4C8C9F60801486F020EF6 -:102A000007010701A66F080148517CEF9BF0040104 -:102A1000B70E080108014E6F0401040E08014F6F44 -:102A20000001780E080108014C6F0001000E08013A -:102A30004D6FE7EC1AF00009D8A421EF95F023EFD1 -:102A400095F071EF95F0C4EC43F006010601C65114 -:102A500008010801A15D0801486F06010601C75180 -:102A600008010801A2590801496F06010601C85171 -:102A700008010801A35908014A6F06010601C9515E -:102A800008010801A45908014B6FF30E485D9E0E22 -:102A90004959000E4A59000E08014B59D8A053EF6E -:102AA00095F055EF95F06FEF95F00801486F010E26 -:102AB00007010701A66F08014851020E070107012F -:102AC000326565EF95F067EF95F06FEF95F00801CF -:102AD000486F060E07010701A66F080148517CEFF9 -:102AE0009BF078C0B3F479C0B4F47AC0B5F47BC07D -:102AF000B6F40801486F030E07010701A66F08012D -:102B00004851350E08010801536F000E0801546F3B -:102B1000000E08010801516F000E0801526F0801F4 -:102B2000486F040E08010801506F08014851B30EA8 -:102B30000801496F040E4A6F080149C84CF80801A2 -:102B40004AC84DF8080108014E6B08014F6B22EC92 -:102B5000D7F007010701A26F07010701A229D8A436 -:102B6000B4EF95F0B6EF95F0B8EF95F07CEF9BF0F1 -:102B70000801486F040E07010701A66F08014851BC -:102B8000A2C74CF893EC39F008014D514C11D8A470 -:102B9000CCEF95F0CEEF95F0D0EF95F07CEF9BF079 -:102BA00006010601E34BE42BE4C653F867EC3DF065 -:102BB000E3C653F867EC3DF00801486F010E0801C9 -:102BC0000801536F0801485167EC3DF00801486F58 -:102BD000000E08010801536F0801485167EC3DF0F1 -:102BE0000801486F000E08010801536F08014851A1 -:102BF00067EC3DF00801486F010E08010801536FB2 -:102C00000801485167EC3DF00801486F000E0801CB -:102C10000801536F0801485167EC3DF00801486F07 -:102C2000000E08010801536F0801485167EC3DF0A0 -:102C30000801486F000E08010801536F0801485150 -:102C400067EC3DF00801486F000E08010801536F62 -:102C50000801485167EC3DF00801486F000E08017B -:102C60000801536F0801485167EC3DF00801486FB7 -:102C7000000E08010801536F0801485167EC3DF050 -:102C80000701070107510611D8B449EF96F04BEF41 -:102C900096F053EF96F006C74CF807C74DF836ECA0 -:102CA0001AF059EF96F022C74CF823C74DF881EC83 -:102CB00019F00801486F000E08010801536F080160 -:102CC000485167EC3DF03CC753F867EC3DF0080114 -:102CD000486F000E08010801536F0801485167EC66 -:102CE0003DF00801486F010E08010801536F08010B -:102CF000485167EC3DF053EC21F0C4EC43F0A1C81F -:102D0000C6F6A2C8C7F6A3C8C8F6A4C8C9F6080183 -:102D1000486F050E07010701A66F080148517CEFB7 -:102D20009BF0A2C74CF8D9EC39F008014D514C1179 -:102D3000D8A49DEF96F09FEF96F0DBEF96F0C4ECF1 -:102D400043F006010601C65108010801A15D080112 -:102D5000486F06010601C75108010801A259080180 -:102D6000496F06010601C85108010801A35908016D -:102D70004A6F06010601C95108010801A45908015A -:102D80004B6FF30E485D9E0E4959000E4A59000ED6 -:102D900008014B59D8A0CFEF96F0D1EF96F06FEF26 -:102DA00095F00801486F060E07010701A66F08019C -:102DB00048517CEF9BF008013D0E080108014D6F62 -:102DC0000801080E08014E6F35EC3DF008013C0E7D -:102DD000080108014D6F0801080E08014E6F35EC1F -:102DE0003DF006010601E451080108013D1906E124 -:102DF00006010601E351080108013C19D8B403EFAC -:102E000097F005EF97F009EF97F08FEC41F07CEF2A -:102E10009BF008013F0E080108014D6F0801080EE4 -:102E200008014E6F35EC3DF008013E0E0801080127 -:102E30004D6F0801080E08014E6F35EC3DF008019A -:102E4000410E080108014D6F0801080E08014E6F80 -:102E500035EC3DF00801400E080108014D6F0801F6 -:102E6000080E08014E6F35EC3DF00801430E0801D5 -:102E700008014D6F0801080E08014E6F35EC3DF05A -:102E80000801420E080108014D6F0801080E0801F3 -:102E90004E6F35EC3DF00801450E080108014D6FFD -:102EA0000801080E08014E6F35EC3DF00801440E94 -:102EB000080108014D6F0801080E08014E6F35EC3E -:102EC0003DF00801470E080108014D6F0801080E8A -:102ED00008014E6F35EC3DF00801460E080108016F -:102EE0004D6F0801080E08014E6F35EC3DF0A7EF5D -:102EF00097F0D5EC37F00801310E080108014D6F4D -:102F00000801080E08014E6F35EC3DF00801300E47 -:102F1000080108014D6F0801080E08014E6F35ECDD -:102F20003DF00801310E080108014D6F0801080E3F -:102F300008014E6F35EC3DF00801300E0801080124 -:102F40004D6F0801080E08014E6F35EC3DF0080189 -:102F500008014007D8A0410708014029D8B44129F9 -:102F6000D8A4B5EF97F0B7EF97F079EF97F098EF17 -:102F700098F0D5EC37F00801330E080108014D6FC9 -:102F80000801080E08014E6F35EC3DF00801320EC5 -:102F9000080108014D6F0801080E08014E6F35EC5D -:102FA0003DF00801350E080108014D6F0801080EBB -:102FB00008014E6F35EC3DF00801340E08010801A0 -:102FC0004D6F0801080E08014E6F35EC3DF0080109 -:102FD000390E080108014D6F0801080E08014E6FF7 -:102FE00035EC3DF00801380E080108014D6F08016D -:102FF000080E08014E6F35EC3DF00801370E080150 -:1030000008014D6F0801080E08014E6F35EC3DF0C8 -:103010000801360E080108014D6F0801080E08016D -:103020004E6F35EC3DF008013B0E080108014D6F75 -:103030000801080E08014E6F35EC3DF008013A0E0C -:10304000080108014D6F0801080E08014E6F35ECAC -:103050003DF00801080132053311D8A432EF98F091 -:1030600034EF98F07BEF98F0080108013405351132 -:10307000D8A43DEF98F03FEF98F07BEF98F008016F -:1030800008013A51040A3B11D8A449EF98F04BEFDC -:1030900098F07BEF98F0070108830401B30E080154 -:1030A00008014D6F0401040E08014E6F35EC3DF030 -:1030B0000401B40E080108014D6F0401040E08015B -:1030C0004E6F35EC3DF00401B50E080108014D6F5F -:1030D0000401040E08014E6F35EC3DF00401B60EFC -:1030E000080108014D6F0401040E08014E6F35EC14 -:1030F0003DF08AEF9AF088EF98F008012F0E080152 -:1031000008014D6F0801080E08014E6F35EC3DF0C7 -:10311000080108013A07D8A03B0708013A29D8B4AA -:103120003B29D8A496EF98F098EF98F07DEF98F0AF -:10313000080108014207D8A0430708014229D8B472 -:103140004329D8A4A6EF98F0A8EF98F0B9EF97F02C -:1031500089EF99F0D5EC37F00801330E080108012A -:103160004D6F0801080E08014E6F35EC3DF0080167 -:10317000320E080108014D6F0801080E08014E6F5C -:1031800035EC3DF00801350E080108014D6F0801CE -:10319000080E08014E6F35EC3DF00801340E0801B1 -:1031A00008014D6F0801080E08014E6F35EC3DF027 -:1031B0000801390E080108014D6F0801080E0801C9 -:1031C0004E6F35EC3DF00801380E080108014D6FD7 -:1031D0000801080E08014E6F35EC3DF00801370E6E -:1031E000080108014D6F0801080E08014E6F35EC0B -:1031F0003DF00801360E080108014D6F0801080E68 -:1032000008014E6F35EC3DF008013B0E0801080146 -:103210004D6F0801080E08014E6F35EC3DF00801B6 -:103220003A0E080108014D6F0801080E08014E6FA3 -:1032300035EC3DF00801080132053311D8A423EF25 -:1032400099F025EF99F06CEF99F008010801340529 -:103250003511D8A42EEF99F030EF99F06CEF99F07A -:10326000080108013A51040A3B11D8A43AEF99F039 -:103270003CEF99F06CEF99F0070108830401B30E5D -:10328000080108014D6F0401040E08014E6F35EC72 -:103290003DF00401B40E080108014D6F0401040E55 -:1032A00008014E6F35EC3DF00401B50E0801080130 -:1032B0004D6F0401040E08014E6F35EC3DF0040122 -:1032C000B60E080108014D6F0401040E08014E6F8F -:1032D00035EC3DF08AEF9AF079EF99F008012F0E66 -:1032E000080108014D6F0801080E08014E6F35EC0A -:1032F0003DF0080108013A07D8A03B0708013A2928 -:10330000D8B43B29D8A487EF99F089EF99F06EEFF4 -:1033100099F0080108014407D8A04507080144298D -:10332000D8B44529D8A497EF99F099EF99F0AAEF6E -:1033300098F07AEF9AF0D5EC37F00801330E0801D7 -:1033400008014D6F0801080E08014E6F35EC3DF085 -:103350000801320E080108014D6F0801080E08012E -:103360004E6F35EC3DF00801350E080108014D6F38 -:103370000801080E08014E6F35EC3DF00801340ECF -:10338000080108014D6F0801080E08014E6F35EC69 -:103390003DF00801390E080108014D6F0801080EC3 -:1033A00008014E6F35EC3DF00801380E08010801A8 -:1033B0004D6F0801080E08014E6F35EC3DF0080115 -:1033C000370E080108014D6F0801080E08014E6F05 -:1033D00035EC3DF00801360E080108014D6F08017B -:1033E000080E08014E6F35EC3DF008013B0E080158 -:1033F00008014D6F0801080E08014E6F35EC3DF0D5 -:1034000008013A0E080108014D6F0801080E080175 -:103410004E6F35EC3DF00801080132053311D8A498 -:1034200014EF9AF016EF9AF05DEF9AF00801080198 -:1034300034053511D8A41FEF9AF021EF9AF05DEF13 -:103440009AF0080108013A51040A3B11D8A42BEF65 -:103450009AF02DEF9AF05DEF9AF0070108830401CE -:10346000B30E080108014D6F0401040E08014E6FF0 -:1034700035EC3DF00401B40E080108014D6F040164 -:10348000040E08014E6F35EC3DF00401B50E080145 -:1034900008014D6F0401040E08014E6F35EC3DF03C -:1034A0000401B60E080108014D6F0401040E080165 -:1034B0004E6F35EC3DF08AEF9AF06AEF9AF0080112 -:1034C0002F0E080108014D6F0801080E08014E6F0C -:1034D00035EC3DF0080108013A07D8A03B07080188 -:1034E0003A29D8B43B29D8A478EF9AF07AEF9AF029 -:1034F0005FEF9AF0080108014607D8A047070801C6 -:103500004629D8B44729D8A488EF9AF08AEF9AF0D0 -:103510009BEF99F08FEC41F0A2C74CF8A3EC36F08A -:1035200007010701A2690801486F070E070107019B -:10353000A66F080148510701070108B3A2EF9AF0EE -:10354000A4EF9AF0B1EF9AF0000E04010401B36FFA -:10355000000E0401B46F000E0401B56F000E0401EB -:10356000B66F2DC8E9FF2EC8EAFF0401B3C4EEFF11 -:103570000401B4C4EEFF0401B5C4EEFF0401B6C4F7 -:10358000EEFF010E7FEF9BF0010E0701070138658A -:10359000CCEF9AF0CEEF9AF0DFEF9AF02DC8E9FF6A -:1035A0002EC8EAFF000EEE6E000EEE6E000EEE6EFE -:1035B000000EED6EED52ED52010E7FEF9BF0070114 -:1035C0000701382B00017F517C117D117E11D8B489 -:1035D000ECEF9AF0EEEF9AF06FEF95F0000100013A -:1035E0007C5100010001781B000100017D510001A8 -:1035F0000001791B000100017E51000100017A1BCE -:10360000000100017F51000100017B1B000100014E -:103610007851000100017C1B00010001795100017B -:1036200000017D1B000100017A51000100017E1B99 -:10363000000100017B51000100017F1B000100011E -:103640007C5100010001781B000100017D51000147 -:103650000001791B000100017E51000100017A1B6D -:10366000000100017F51000100017B1B0801486F30 -:10367000000E07010701326F0801485107010701D9 -:10368000A229D8B446EF9BF048EF9BF04FEF9BF098 -:10369000A2C74CF8A3EC36F007010701A2690801A4 -:1036A000486F010E07010701A66F080148517CEF22 -:1036B0009BF007010701A651000A02E1D5EF94F043 -:1036C000010A02E1E5EF94F0030A02E107EF95F049 -:1036D000010A02E181EF95F0070A02E1C0EF95F0DF -:1036E000010A02E191EF96F0030A01E14DD7010AC8 -:1036F00001E121D77CEF9BF0000E7FEF9BF01200E1 -:103700000201730E08010801896F0201020E08010F -:103710008A6F7BC8E9FF7CC8EAFF0801EECF8FF80B -:103720000801EECF90F80801EECF91F80801EECF36 -:1037300092F87DC8E9FF7EC8EAFF0801EECFA3F842 -:103740000801EECFA4F80801EECFA5F80801EECFEE -:10375000A6F87FC8E9FF80C8EAFF0801EECF9BF812 -:103760000801EECF9CF80801EECF9DF80801EECFDE -:103770009EF881C8E9FF82C8EAFF0801EECF9FF8F2 -:103780000801EECFA0F80801EECFA1F80801EECFB6 -:10379000A2F883C8E9FF84C8EAFF0801EECF8BF8DE -:1037A0000801EECF8CF80801EECF8DF80801EECFBE -:1037B0008EF8730E0801AF6F020EB06F080108019A -:1037C0007A510801B01905E1080108017951080191 -:1037D000AF19D8A4EEEF9BF0F0EF9BF070EF9CF0E8 -:1037E0000801AF6F000E08010801886F0801AF5192 -:1037F0000F0E08010801886500EF9CF002EF9CF0B5 -:1038000004EF9CF06EEF9CF0030E0801080179258F -:10381000E96E000E080108017A21EA6EEF500801F6 -:103820000801876F79C8E9FF7AC8EAFF030E08012B -:1038300008017925E16E000E080108017A21E26E87 -:10384000EFCFE7FF79C8E9FF7AC8EAFF080187C828 -:10385000EFFF010E080108017925E96E000E08014D -:1038600008017A21EA6EEF5008010801876F020E05 -:10387000080108017925E96E000E080108017A2186 -:10388000EA6E010E080108017925E16E000E0801BB -:1038900008017A21E26EEFCFE7FF020E080108016E -:1038A0007925E96E000E080108017A21EA6E080107 -:1038B00087C8EFFF040E080108017927000E0801F0 -:1038C0007A2308010801882B0F0E0801080188657A -:1038D0006CEF9CF06EEF9CF004EF9CF026EF9DF0F7 -:1038E0000801AF6F000E08010801886F0801AF5191 -:1038F0000F0E08010801886580EF9CF082EF9CF0B4 -:1039000084EF9CF026EF9DF079C8E9FF7AC8EAFFC2 -:10391000080108018851040DF3CFAFF8030E080128 -:10392000AF270801AF510801080189250801B06FD0 -:10393000E86A0801AFBFE868080108018A210801A8 -:10394000B16FB0C8E1FFB1C8E2FFEFCFE7FF0801F8 -:103950000801794B7A2B79C8E9FF7AC8EAFF080198 -:1039600008018851040DF3CFAFF8020E0801AF270C -:103970000801AF510801080189250801B06FE86A04 -:103980000801AFBFE868080108018A210801B16F8A -:10399000B0C8E1FFB1C8E2FFEFCFE7FF08010801BF -:1039A000794B7A2B79C8E9FF7AC8EAFF0801080148 -:1039B0008851040DF3CFAFF8010E0801AF270801BD -:1039C000AF510801080189250801B06FE86A0801B4 -:1039D000AFBFE868080108018A210801B16FB0C8CB -:1039E000E1FFB1C8E2FFEFCFE7FF08010801794B23 -:1039F0007A2B79C8E9FF7AC8EAFF080108018851E3 -:103A0000040DF3500801080189250801AF6FE86A29 -:103A1000F3BEE868080108018A210801B06FAFC849 -:103A2000E1FFB0C8E2FFEFCFE7FF08010801794BE3 -:103A30007A2B08010801882B0F0E08010801886500 -:103A400024EF9DF026EF9DF084EF9CF00801AF6F0E -:103A50000D0E08010801876F0801AF510801AF6F13 -:103A6000080E08010801866F0801AF510801AF6F09 -:103A7000020E08010801856F0801AF510801AF6F00 -:103A8000000E08010801886F0801AF514F0E0801B0 -:103A9000080188654EEF9DF050EF9DF052EF9DF0CC -:103AA0003FEFA1F0140E0801080188615AEF9DF064 -:103AB0005CEF9DF0D1EF9DF00801A3C8AFF80801BD -:103AC000A4C8B0F80801A5C8B1F80801A6C8B2F8A2 -:103AD0000801AF1FB01FB11FB21F080108019F519D -:103AE0000801AF150801B36F08010801A0510801D2 -:103AF000B0150801B46F08010801A1510801B11502 -:103B00000801B56F08010801A2510801B2150801AA -:103B1000B66F080108019B5108010801A3150801AF -:103B2000B76F080108019C5108010801A41508019C -:103B3000B86F080108019D5108010801A515080189 -:103B4000B96F080108019E5108010801A615080176 -:103B5000BA6F0801B3510801B71108010801936F4A -:103B60000801B4510801B8110801946F0801B5515A -:103B70000801B9110801956F0801B6510801BA1181 -:103B80000801966F990E08010801976F790E0801D8 -:103B9000986F820E0801996F5A0E08019A6F2FEFE5 -:103BA0009FF0130E080108018865D9EF9DF0DBEF47 -:103BB0009DF031EF9EF0280E080108018861E3EFC7 -:103BC0009DF0E5EF9DF031EF9EF0080108019B515B -:103BD00008010801A3190801AF6F080108019C51F1 -:103BE00008010801A4190801B06F080108019D51DE -:103BF00008010801A5190801B16F080108019E51CB -:103C000008010801A6190801B26F080108019F51B7 -:103C10000801AF1908010801936F08010801A051BC -:103C20000801B0190801946F08010801A1510801A9 -:103C3000B1190801956F08010801A2510801B219D4 -:103C40000801966FA10E08010801976FEB0E08019D -:103C5000986FD90E0801996F6E0E08019A6F2FEFB9 -:103C60009FF0270E08010801886539EF9EF03BEFB1 -:103C70009EF0E5EF9EF03C0E08010801886143EFDD -:103C80009EF045EF9EF0E5EF9EF0080108019F5180 -:103C9000080108019B150801AF6F08010801A05138 -:103CA000080108019C150801B06F08010801A15125 -:103CB000080108019D150801B16F08010801A25112 -:103CC000080108019E150801B26F080108019F5103 -:103CD00008010801A3150801B36F08010801A051EC -:103CE00008010801A4150801B46F08010801A151D9 -:103CF00008010801A5150801B56F08010801A251C6 -:103D000008010801A6150801B66F080108019B51BA -:103D100008010801A3150801B76F080108019C51AB -:103D200008010801A4150801B86F080108019D5198 -:103D300008010801A5150801B96F080108019E5185 -:103D400008010801A6150801BA6F0801B35108015E -:103D5000B7110801BB6F0801B4510801B81108017F -:103D6000BC6F0801B5510801B9110801BD6F080108 -:103D7000B6510801BA110801BE6F0801AF51080120 -:103D8000BB1108010801936F0801B0510801BC1173 -:103D90000801946F0801B1510801BD110801956F28 -:103DA0000801B2510801BE110801966FDC0E08012E -:103DB0000801976FBC0E0801986F1B0E0801996FE0 -:103DC0008F0E08019A6F2FEF9FF0080108019B5199 -:103DD00008010801A3190801AF6F080108019C51EF -:103DE00008010801A4190801B06F080108019D51DC -:103DF00008010801A5190801B16F080108019E51C9 -:103E000008010801A6190801B26F080108019F51B5 -:103E10000801AF1908010801936F08010801A051BA -:103E20000801B0190801946F08010801A1510801A7 -:103E3000B1190801956F08010801A2510801B219D2 -:103E40000801966FD60E08010801976FC10E080190 -:103E5000986F620E0801996FCA0E08019A6F0F0ED3 -:103E600008010801886537EF9FF039EF9FF056EFA2 -:103E7000A0F0080108018751040DF3500801080162 -:103E800089250801AF6FE86AF3BEE86808010801F8 -:103E90008A210801B06FAFC8E9FFB0C8EAFF080186 -:103EA000EECFA7F80801EECFA8F80801EECFA9F8E9 -:103EB0000801EECFAAF8080108018651040DF3505D -:103EC0000801080189250801AF6FE86AF3BEE868B8 -:103ED000080108018A210801B06FAFC8E9FFB0C826 -:103EE000EAFF0801EECFABF80801EECFACF808010D -:103EF000EECFADF80801EECFAEF808010801AB51E6 -:103F000008010801A71B08010801AC5108010801BC -:103F1000A81B08010801AD5108010801A91B0801EF -:103F20000801AE5108010801AA1B080108018551CA -:103F3000040DF3500801080189250801AF6FE86AF4 -:103F4000F3BEE868080108018A210801B06FAFC814 -:103F5000E9FFB0C8EAFF0801EECFABF80801EECFE9 -:103F6000ACF80801EECFADF80801EECFAEF80801CD -:103F70000801AB5108010801A71B08010801AC5159 -:103F800008010801A81B08010801AD51080108013A -:103F9000A91B08010801AE5108010801AA1B08016C -:103FA000080188510F0B040DF35008010801892501 -:103FB0000801AF6FE86AF3BEE868080108018A21CA -:103FC0000801B06FAFC8E9FFB0C8EAFF0801EECF43 -:103FD000ABF80801EECFACF80801EECFADF8080160 -:103FE000EECFAEF808010801AB5108010801A71B8C -:103FF00008010801AC5108010801A81B08010801CB -:10400000AD5108010801A91B08010801AE510801C2 -:104010000801AA1B0801AF6F010E08010801C66F55 -:104020000801AF51A7C8C2F8A8C8C3F8A9C8C4F806 -:10403000AAC8C5F814EC33F00801080188510F0B29 -:10404000040DF3500801080189250801B06FE86AE2 -:10405000F3BEE868080108018A210801B16FB0C801 -:10406000E9FFB1C8EAFF0801C2C8EEFF0801C3C8F2 -:10407000EEFF0801C4C8EEFF0801C5C8EDFFED5210 -:10408000ED5208010801872B08010801862B080161 -:104090000801852B0F0E0801080187170F0E080174 -:1040A000080186170F0E080108018517080108018D -:1040B00088510F0B040DF3500801080189250801F0 -:1040C000AF6FE86AF3BEE868080108018A210801B9 -:1040D000B06FAFC8E9FFB0C8EAFFEECFB1F8EECFDE -:1040E000B2F8EECFB3F8EECFB4F80801B56F050E15 -:1040F00008010801C66F0801B5518FC8C2F890C801 -:10410000C3F891C8C4F892C8C5F814EC33F008019C -:10411000B15108010801C2250801B66F0801B2516A -:1041200008010801C3210801B76F0801B351080154 -:104130000801C4210801B86F0801B4510801080141 -:10414000C5210801B96F0801080193510801B6257E -:104150000801BA6F0801080194510801B72108014C -:10416000BB6F0801080195510801B8210801BC6F17 -:104170000801080196510801B9210801BD6F080125 -:1041800008018B510801BA250801BE6F080108011A -:104190008C510801BB210801BF6F080108018D5136 -:1041A0000801BC210801C06F080108018E510801F7 -:1041B000BD210801C16F0801080197510801BE2502 -:1041C00008010801A76F0801080198510801BF21E3 -:1041D0000801A86F0801080199510801C0210801D0 -:1041E000A96F080108019A510801C1210801AA6FAD -:1041F0009FC88BF8A0C88CF8A1C88DF8A2C88EF80B -:104200009BC89FF89CC8A0F89DC8A1F89EC8A2F8BA -:104210000801AF6F1E0E08010801C66F0801AF51FB -:10422000A3C8C2F8A4C8C3F8A5C8C4F8A6C8C5F8EE -:1042300014EC33F0C2C89BF8C3C89CF8C4C89DF8FE -:10424000C5C89EF88FC8A3F890C8A4F891C8A5F86F -:1042500092C8A6F8A7C88FF8A8C890F8A9C891F87E -:10426000AAC892F808010801882B4F0E080108011E -:1042700088653DEFA1F03FEFA1F052EF9DF07BC8C4 -:10428000E9FF7CC8EAFF080108018F51EE2608010A -:104290009051EE2208019151EE2208019251ED2237 -:1042A000ED52ED527DC8E9FF7EC8EAFF0801080122 -:1042B000A351EE260801A451EE220801A551EE22D9 -:1042C0000801A651ED22ED52ED527FC8E9FF80C8EA -:1042D000EAFF080108019B51EE2608019C51EE22DD -:1042E00008019D51EE2208019E51ED22ED52ED5242 -:1042F00081C8E9FF82C8EAFF080108019F51EE2644 -:104300000801A051EE220801A151EE220801A2519C -:10431000ED22ED52ED5283C8E9FF84C8EAFF08019F -:1043200008018B51EE2608018C51EE2208018D51B7 -:10433000EE2208018E51ED22ED52ED521200B7EC43 -:1043400024F00801080172A1A8EFA1F0AAEFA1F0E2 -:10435000AEEFA1F01986080108017291189A189C15 -:10436000189E199219941990B6EFA1F0CBEC3DF07C -:104370000009D8B4BEEFA1F0C0EFA1F0B6EFA1F0F4 -:10438000080108017251060BD8B4C9EFA1F0CBEFB8 -:10439000A1F0D4EFA1F0000E08010801766F000E25 -:1043A0000801776F74EFA3F000EE29F010EE07F02C -:1043B000E652EE52ED50E518EFCFE8FFD8B4E7181B -:1043C000D8A4E5EFA1F0E7EFA1F0F0EFA1F0000E27 -:1043D00008010801766F000E0801776F44EFA3F023 -:1043E00000EE07F010EE29F0E652EE52ED50E55CDB -:1043F00002E1EF50E75CD8B000EFA2F002EFA2F0CC -:1044000057EFA2F02950075C08010801766F2A5087 -:1044100008580801776F0801080176512F5C0801E0 -:10442000080177513058D8B018EFA2F01AEFA2F077 -:104430001EEFA2F02FC076F830C077F8080108010F -:104440007651405C0801080177514158D8B02BEFF4 -:10445000A2F02DEFA2F032EFA2F040C076F841C0FA -:1044600077F8198476C8AAF877C8ABF81CC0A9F801 -:1044700029C0A7F82AC0A8F808019C6F000E0801FF -:104480000801A66F08019C51050E08010801A46FE0 -:104490000B0E0801A56FA0EC23F00801080176516E -:1044A00029260801080177512A2244EFA3F0295058 -:1044B000035C08010801866F2A5004580801876FC1 -:1044C000080108EE86F0EECF9CF8EDCF9DF807507E -:1044D00008019C27085008019D23015008019C5D9C -:1044E00008010801766F025008019D590801776F95 -:1044F0000801080176512F5C0801080177513058F6 -:10450000D8B085EFA2F087EFA2F08BEFA2F02FC01A -:1045100076F830C077F8080108017651405C080150 -:10452000080177514158D8B098EFA2F09AEFA2F065 -:104530009FEFA2F040C076F841C077F819840801D7 -:104540000801865108010801765D080108018751BC -:10455000080108017759D8B0B0EFA2F0B2EFA2F08D -:10456000B6EFA2F076C886F877C887F886C8AAF8AA -:1045700087C8ABF81CC0A9F829C0A7F82AC0A8F8BA -:1045800008019C6F000E08010801A66F08019C51EC -:10459000050E08010801A46F0B0E0801A56FA0EC21 -:1045A00023F008010801865108010801765D080121 -:1045B0000801866F08010801875108010801775931 -:1045C0000801876F0801080187518611D8B4EBEF05 -:1045D000A2F0EDEFA2F018EFA3F086C8AAF887C802 -:1045E000ABF81CC0A9F801C0A7F802C0A8F80801E0 -:1045F0009C6F000E08010801A66F08019C5100EE97 -:1046000003F0EECF9DF8EDCF9EF8295008019D5F95 -:104610002A5008019E5B050E08019D25080108012E -:10462000A46F0B0E08019E210801A56FA0EC23F0DA -:1046300008010801765129260801080177512A222C -:1046400000EE03F010EE29F0E652EE52ED50E55C7C -:1046500002E1EF50E75CD8A030EFA3F032EFA3F017 -:1046600044EFA3F000EE03F0EECF9CF8EDCF9DF801 -:10467000015008019C5F025008019D5B08019C519C -:10468000295E08019D512A5A19A649EFA3F04BEF64 -:10469000A3F074EFA3F000EE2FF00801EE52080132 -:1046A0007751ED18080176C8E8FFD8B4EF18D8B4F0 -:1046B0005CEFA3F05EEFA3F074EFA3F000EE40F028 -:1046C0000801EE5208017751ED18080176C8E8FF9D -:1046D000D8B4EF18D8B46FEFA3F071EFA3F074EF74 -:1046E000A3F00801080172810801080177517611D1 -:1046F000D8A47DEFA3F07FEFA3F08AEFA3F0080129 -:1047000008017251030BD8B488EFA3F08AEFA3F02D -:10471000D0EFA3F00801080176512F5E08010801CF -:104720007751305A0801080177517611D8B49BEFC0 -:10473000A3F09DEFA3F0A0EFA3F00801080172879A -:104740000801080173A1A7EFA3F0A9EFA3F0B7EF49 -:10475000A3F008019C6F000E426E08019C51F20EFE -:104760001D6E9E0E1E6E000E1F6E000E206EC4EC9F -:1047700043F01D5008010801A1250F6E1E500801CD -:104780000801A221106E1F5008010801A321116E1B -:10479000205008010801A421126E18882DEFA4F002 -:1047A0000801080173A3D7EFA3F0D9EFA3F0F9EF45 -:1047B000A3F0010E08019C6F1850070B08019D6FB4 -:1047C00008019C5108019D27185008019D19F80BFC -:1047D00008019D19186E2106000E225A235A245AE8 -:1047E000010E08010801766F000E0801776F2DEFAA -:1047F000A4F018A8FEEFA3F000EFA4F02DEFA4F0B2 -:104800000801080173B107EFA4F009EFA4F017EF56 -:10481000A4F04250D8B40FEFA4F011EFA4F017EFBA -:10482000A4F04206D89020321F321E321D32C4EC52 -:1048300043F01D5008010801A1250F6E1E5008010C -:104840000801A221106E1F5008010801A321116E5A -:10485000205008010801A421126E2DC088F82EC036 -:1048600089F82BC08AF82CC08BF821C08CF822C0A4 -:104870008DF823C08EF824C08FF825C090F826C08C -:1048800091F827C092F828C093F83F0E08019517B9 -:104890000801949108019493080194950801949754 -:1048A0000B000E0072C895F8000E080108019A6FFF -:1048B000000E08019B6F08010801765121260801AE -:1048C000080177512222000E2322000E2422080123 -:1048D000080172A36EEFA4F070EFA4F0A2EFA4F0B1 -:1048E0000801080172B977EFA4F079EFA4F086EF20 -:1048F000A4F0000E08010801906F000E0801916FEE -:10490000000E0801926F000E0801936F3FA28BEF1B -:10491000A4F08DEFA4F099EFA4F0080108018C0732 -:10492000000E08018D5B08018E5B08018F5BA2EF12 -:10493000A4F0010E2126000E2222000E2322000EDA -:1049400024223F820801080172A1A9EFA4F0ABEF75 -:10495000A4F0C7EFA4F03FA0B0EFA4F0B2EFA4F032 -:10496000BEEFA4F0080108018C07000E08018D5B62 -:1049700008018E5B08018F5BC7EFA4F0010E2126B2 -:10498000000E2222000E2322000E24223F8000EE81 -:104990000DF010EE0BF0E652EE52ED50E55C02E148 -:1049A000EF50E75CD8A0D7EFA4F0D9EFA4F000EF68 -:1049B000A5F000EE0BF0EECF9CF8EDCF9DF80D507A -:1049C00008019C5F0E5008019D5B00EE05F0EECFE4 -:1049D0009EF8EDCF9FF8035008019E5F0450080138 -:1049E0009F5B08019C5108019E5D08010801966FBC -:1049F00008019D5108019F590801976F17EFA5F015 -:104A000000EE0DF0EECF9CF8EDCF9DF80B500801B5 -:104A10009C5F0C5008019D5BFF0E08019C2508015E -:104A20000801966FFF0E08019D210801976FC3ECE6 -:104A300025F0A0C874F8A1C875F8400E0801080157 -:104A4000745D000E08017559D8B029EFA5F02BEF61 -:104A5000A5F034EFA5F0000E08010801746F000EF8 -:104A60000801756F3BEFA5F0400E08010801745F67 -:104A7000000E0801755B0801080196510801080144 -:104A8000745D080108019751080108017559D8B0F3 -:104A90004CEFA5F04EEFA5F052EFA5F074C896F8D4 -:104AA00075C897F80801880E08010801A06F080171 -:104AB000080E0801A16FC7EC07F0140E08010801E9 -:104AC0007627000E08017723080194510F0B500937 -:104AD0000801946F0801080172A371EFA5F073EF4C -:104AE000A5F0ABEFA5F0040E080108017627000E33 -:104AF0000801772308019C6F020E08010801786FF6 -:104B000008019C5108019C6F040E08010801796F8F -:104B100008019C51020E080108017A6F180E080165 -:104B20007B6F010E08019C6F0801080194390F0B7F -:104B300008019D6F08019C5108019D2708019D3BBC -:104B400008010801945108019D190F0B08019D19D6 -:104B500008010801946F6CC07CF86DC07DF86EC0D0 -:104B60007EF86FC07FF833C080F834C081F835C05C -:104B700082F836C083F808019C6F000E0801080116 -:104B8000846F08019C5108019C6F060E0801080102 -:104B9000856F08019C5176C886F877C887F886C863 -:104BA000BCF887C8BDF82FEC43F0BCC886F8BDC878 -:104BB00087F80C0E08010801BC6F000E0801BD6FDC -:104BC00008017C0E08010801BA6F0801080E0801EF -:104BD000BB6FF2EC1EF008010801BA1D08010801C4 -:104BE000986F08010801BB1D0801996FDD0E0801CF -:104BF0000801AC6F0A0E0801AD6F0BEC44F076C8EB -:104C0000A3F877C8A4F808019C6F060E08010801F4 -:104C1000A26F08019C51330E08010801A06F000E1D -:104C20000801A16FCAEC18F0140E08010801C26F48 -:104C3000000E0801C36F0801880E08010801C06F4B -:104C40000801080E0801C16FBBEC40F00801080123 -:104C500072A32DEFA6F02FEFA6F041EFA6F0040E01 -:104C600008010801C26F000E0801C36F0801780E29 -:104C700008010801C06F0801080E0801C16FBBECF4 -:104C800040F0F10E08010801AC6F0A0E0801AD6F8B -:104C90002CEC44F076C8A0F877C8A1F80EEC10F020 -:104CA000A0C874F8A1C875F8010E08010801AC6F1E -:104CB0000B0E0801AD6F0BEC44F0020E0801080169 -:104CC000C26F000E0801C36F0801740E08010801CD -:104CD000C06F0801080E0801C16FBBEC40F003EC87 -:104CE00039F0120008011E6F000E080108011D6F47 -:104CF00008011E51000E080108011D6582EFA6F093 -:104D000084EFA6F086EFA6F0C7EFAAF07CEFAAF03A -:104D1000BAEFAAF0430E08010801536F000E080114 -:104D2000546F440E08010801516F000E0801526FC4 -:104D300008011E6F000E08010801506F08011E5186 -:104D4000000E080108014C6F000E08014D6F000EA7 -:104D500008014E6F000E08014F6F22ECD7F0446E31 -:104D60004428D8A4B6EFA6F0B8EFA6F0BAEFA6F0A4 -:104D7000BAEFAAF008011E6F020E00010001456F94 -:104D800008011E51000E000100014B6F000E0001D2 -:104D90004C6F000E00014D6F000E00014E6F3C0E77 -:104DA000000100014F6F000E0001506F000E000166 -:104DB000516F000E0001526F08011E6F000E0001BE -:104DC00000016B6F08011E510001469100014695DC -:104DD00097EC42F00009D8A4F0EFA6F0F2EFA6F0AD -:104DE000F4EFA6F0BAEFAAF044C04CF893EC39F017 -:104DF0002C0E080108014C5D010E08014D59D8B078 -:104E000004EFA7F006EFA7F008EFA7F0BAEFAAF0BB -:104E1000000146790A0E080108015D6F000E0801C5 -:104E20005E6FFF0E080108015B6F000E08015C6FEA -:104E30004450170D0201000EF32408010801596FB8 -:104E400008015A6B0201020E08015A2353EC40F08C -:104E500008011E6F000E08010801236F08011E5192 -:104E600008011F6F010E08010801226F08011F5180 -:104E7000CCECBCF0C4EC43F0A1C847F0A2C848F0A9 -:104E8000A3C849F0A4C84AF000014E514B114C117F -:104E90004D11D8A44EEFA7F050EFA7F05AEFA7F0AE -:104EA000C4EC43F0A1C84BF0A2C84CF0A3C84DF02D -:104EB000A4C84EF008011E6F030E00010001456FEB -:104EC00008011E51BAEFAAF044C04CF8D9EC39F0F1 -:104ED000FA0E080108014C5D000E08014D59D8B0CA -:104EE00074EFA7F076EFA7F0BFEFA7F0C4EC43F0A4 -:104EF00000010001475108010801A15D08011E6F72 -:104F000000010001485108010801A25908011F6F62 -:104F100000010001495108010801A3590801206F4F -:104F2000000100014A5108010801A4590801216F3C -:104F3000E40E1E5D3D0E1F59010E2059000E0801A2 -:104F40002159D8A0A6EFA7F0A8EFA7F088EFA6F008 -:104F500008011E6F020E00010001456F08011E517D -:104F6000000E00010001576F000E0001586F000E87 -:104F70000001596F000E00015A6FBAEFAAF000014C -:104F80004687C8ECAAF0020AD8B4C9EFA7F0CBEF65 -:104F9000A7F0CDEFA7F0BAEFAAF008011E6F040E3C -:104FA00000010001456F08011E51000E00010001C3 -:104FB0004B6F000E00014C6F000E00014D6F000E94 -:104FC00000014E6F44C04CF893EC39F0020E08011A -:104FD00008014C5D010E08014D59D8B0F2EFA7F061 -:104FE000F4EFA7F0F6EFA7F0BAEFAAF00A0E080167 -:104FF00008015D6F000E08015E6FFF0E08010801D9 -:105000005B6F000E08015C6F4450170D0201000E2B -:10501000F32408010801596F08015A6B0201020EBE -:1050200008015A2353EC40F008011E6F000E0801DE -:105030000801236F08011E5108011F6F030E0801AC -:105040000801226F08011F51CCECBCF0C4EC43F006 -:10505000A1C847F0A2C848F0A3C849F0A4C84AF0C4 -:1050600000010001452BBAEFAAF044C04CF8D9EC7E -:1050700039F0FA0E080108014C5D000E08014D5987 -:10508000D8B045EFA8F047EFA8F08FEFA8F0C4EC38 -:1050900043F000010001475108010801A15D08012A -:1050A0001E6F00010001485108010801A2590801C2 -:1050B0001F6F00010001495108010801A3590801AF -:1050C000206F000100014A5108010801A45908019C -:1050D000216F2E0E1E5D500E1F59090E2059000E15 -:1050E00008012159D8A077EFA8F079EFA8F088EF50 -:1050F000A6F0000100EE45F0EF2A0B0EEF6483EFFF -:10510000A8F085EFA8F08DEFA8F008011E6F020E41 -:1051100000010001456F08011E51BAEFAAF01AEF15 -:10512000A9F044C04CF8A3EC36F04468C4EC43F05A -:10513000A1C847F0A2C848F0A3C849F0A4C84AF0E3 -:1051400008011E6F0C0E00010001456F08011E5181 -:105150000001468300014681000100016BA1B3EF0D -:10516000A8F0B5EFA8F0BDEFA8F057C06CF058C09C -:105170006DF059C06EF05AC06FF0000100016BA5D0 -:10518000C4EFA8F0C6EFA8F0CEEFA8F05FC070F0B3 -:1051900060C071F061C072F062C073F00001000184 -:1051A0006BA3D5EFA8F0D7EFA8F0DFEFA8F05BC0B6 -:1051B00074F05CC075F05DC076F05EC077F0000101 -:1051C00000016BA7E6EFA8F0E8EFA8F0F0EFA8F079 -:1051D00063C078F064C079F065C07AF066C07BF097 -:1051E000000E000100017C6F000E00017D6F000EBB -:1051F00000017E6F000E00017F6F000100016BA9AE -:1052000004EFA9F006EFA9F00EEFA9F067C07CF05B -:1052100068C07DF069C07EF06AC07FF088EFA6F0BC -:1052200008011E6F020E00010001456F08011E51AA -:1052300088EFA6F0C8ECAAF0050A01E172D7030ACC -:10524000EFE088EFA6F0C4EC43F000010001475105 -:1052500008010801A15D08011E6F0001000148510D -:1052600008010801A25908011F6F000100014951FE -:1052700008010801A3590801206F000100014A51EB -:1052800008010801A4590801216FF20E1E5D9E0E4F -:105290001F59000E2059000E08012159D8B053EFB4 -:1052A000A9F055EFA9F057EFA9F0BAEFAAF0020E56 -:1052B00000014F5D000E00015059000E00015159D0 -:1052C000000E000100015259D8A069EFA9F06BEF60 -:1052D000A9F084EFA9F0F20E0001000147279E0E0D -:1052E00000014823000E00014923000E00014A235B -:1052F000000100014F07000E0001505B0001515BEF -:105300000001525BBAEFAAF0430E08010801536F87 -:10531000000E0801546F440E08010801516F000E81 -:105320000801526F08011E6F000E08010801506F3E -:1053300008011E51000E080108014C6F000E080103 -:105340004D6F000E08014E6F000E08014F6F22ECEA -:10535000D7F0446E4428D8A4B0EFA9F0B2EFA9F07A -:10536000B4EFA9F0BAEFAAF008011E6F0D0E00010C -:105370000001456F08011E5144C04CF893EC39F010 -:10538000020E080108014C5D010E08014D59D8B00C -:10539000CCEFA9F0CEEFA9F0D0EFA9F0BAEFAAF0C8 -:1053A00008011E6F010E08010801236F08011E513C -:1053B00008011F6F030E08010801226F08011F5129 -:1053C000CCECBCF000014695C4EC43F0A1C847F01A -:1053D000A2C848F0A3C849F0A4C84AF000010001DF -:1053E000452BBAEFAAF044C04CF8D9EC39F0FA0ECC -:1053F000080108014C5D000E08014D59D8B003EFBB -:10540000AAF005EFAAF04DEFAAF0C4EC43F00001BA -:105410000001475108010801A15D08011E6F00014C -:105420000001485108010801A25908011F6F00013D -:105430000001495108010801A3590801206F00012A -:1054400000014A5108010801A4590801216F2E0EDC -:105450001E5D500E1F59090E2059000E08012159DA -:10546000D8A035EFAAF037EFAAF088EFA6F0000138 -:1054700000EE45F0EF2A120EEF6441EFAAF043EF81 -:10548000AAF04BEFAAF008011E6F020E0001000106 -:10549000456F08011E51BAEFAAF074EFAAF044C09C -:1054A0004CF8A3EC36F04468C4EC43F0A1C847F0D4 -:1054B000A2C848F0A3C849F0A4C84AF008011E6F6A -:1054C0000C0E00010001456F08011E5100014683CA -:1054D00088EFA6F008011E6F020E00010001456F63 -:1054E00008011E5188EFA6F0C8ECAAF0050AD7E023 -:1054F000030AF0E088EFA6F0000100014551000A20 -:1055000001E106D4010A01E105D4030A01E147D40F -:10551000010A01E1D9D4070A01E154D5010A01E1E8 -:10552000A4D5030A01E14ED5010A01E19ED50F0A77 -:1055300001E148D5010A01E198D5030A01E142D50C -:10554000010A01E192D5070A01E17DD6010A01E1D4 -:1055500013D7030A01E147D7010A01E10DD71F0A5A -:1055600001E141D7010A01E107D7030A01E13BD775 -:10557000BAEFAAF0080108011D2B000E080108016E -:105580001D65C5EFAAF0C7EFAAF086EFA6F01200DE -:1055900008012B6F000E08010801236F08012B5131 -:1055A0000801250E080108014D6F0801080E0801C9 -:1055B0004E6F35EC3DF0080108012551020AD8A4D0 -:1055C000E4EFAAF0E6EFAAF069EFAEF01C0E0801D6 -:1055D00008014E6F000E08014F6F83EC42F0080186 -:1055E0002B6F000E08010801266F08012B51050ED4 -:1055F000080108012665FFEFAAF001EFABF003EF09 -:10560000ABF036EFABF00801250E080108014D6F35 -:105610000801080E08014E6F35EC3DF026C82BF846 -:105620002D0E08012B2700016C0E08012B25E96EB9 -:10563000EA6A0001000EEA22EF500801080125196C -:10564000D8B425EFABF027EFABF029EFABF0B1EF1B -:10565000AEF008010801262B050E08010801266599 -:1056600034EFABF036EFABF003EFABF0000100012D -:1056700046B53DEFABF03FEFABF05CEFABF0100E9B -:10568000080108014E6F000E08014F6F83EC42F0D5 -:10569000040E080108014F6F000E0801506F000151 -:1056A000570E080108014D6F0001000E08014E6FF2 -:1056B000F8EC2BF000016B81F00E080108014E6F31 -:1056C000000E08014F6F83EC42F008012B6F000EB3 -:1056D00008010801226F08012B510801250E08015D -:1056E00008014D6F0801080E08014E6F35EC3DF0C2 -:1056F0000009D8A47EEFABF080EFABF08AEFABF0FF -:1057000008012B6F010E08010801226F08012B51BF -:1057100069EFAEF045EFAEF00801250E0801080173 -:105720004D6F0801080E08014E6F35EC3DF0080181 -:1057300008012505D8A49FEFABF0A1EFABF0C4EFB3 -:10574000ABF00801230E080108014D6F0801080E97 -:1057500008014E6F35EC3DF00001000146A5B3EFA6 -:10576000ABF0B5EFABF0C2EFABF00801080123518D -:10577000020AD8A4BEEFABF0C0EFABF0C2EFABF0C3 -:10578000B1EFAEF0C6EFABF0B1EFAEF05FEFAEF061 -:105790000801250E080108014D6F0801080E0801D7 -:1057A0004E6F35EC3DF0080108012551040AD8A4DC -:1057B000DCEFABF0DEEFABF0C4EFABF000010001CB -:1057C00046A5E5EFABF0E7EFABF015EFACF0080165 -:1057D0002B6F000E08010801266F08012B51030EE4 -:1057E000080108012665F7EFABF0F9EFABF0FBEF2E -:1057F000ABF013EFACF00801250E080108014D6F66 -:105800000801080E08014E6F35EC3DF00801080153 -:10581000262B030E08010801266511EFACF013EFEB -:10582000ACF0FBEFABF029EFACF0040E080108017F -:105830004F6F000E0801506F00015F0E0801080154 -:105840004D6F0001000E08014E6FF8EC2BF00001C7 -:105850006B85C6EFABF00801240E080108014D6FFF -:105860000801080E08014E6F35EC3DF0030E0801EB -:10587000080124653EEFACF040EFACF0C4EFABF0B4 -:105880000001000146A547EFACF049EFACF077EF1F -:10589000ACF008012B6F000E08010801266F08010B -:1058A0002B51030E08010801266559EFACF05BEFA0 -:1058B000ACF05DEFACF075EFACF00801250E08011F -:1058C00008014D6F0801080E08014E6F35EC3DF0E0 -:1058D00008010801262B030E08010801266573EF55 -:1058E000ACF075EFACF05DEFACF08BEFACF0040E0C -:1058F000080108014F6F000E0801506F00015B0E98 -:10590000080108014D6F0001000E08014E6FF8EC10 -:105910002BF000016B838DEFACF0040E0801080141 -:10592000245F9EEFACF00801250E080108014D6FC1 -:105930000801080E08014E6F35EC3DF00801080122 -:10594000240708012429D8A4A8EFACF0AAEFACF0F2 -:1059500093EFACF05FEFAEF00801240E08010801F0 -:105960004D6F0801080E08014E6F35EC3DF0040E36 -:10597000080108012461BFEFACF0C1EFACF0C3EF48 -:10598000ACF0B1EFAEF00001000146B5CAEFACF0EB -:10599000CCEFACF0E4EFACF0040E080108014F6F5F -:1059A000000E0801506F0001630E080108014D6FE1 -:1059B0000001000E08014E6FF8EC2BF000016B8720 -:1059C000040E08010801245F030E08010801246584 -:1059D000ECEFACF0EEEFACF00FEFADF0000100013A -:1059E00046B5F5EFACF0F7EFACF00FEFADF0040E0D -:1059F000080108014F6F000E0801506F0001670E8B -:105A0000080108014D6F0001000E08014E6FF8EC0F -:105A10002BF000016B89040E08010801245F1CEFC4 -:105A2000ADF00801250E080108014D6F0801080EB0 -:105A300008014E6F35EC3DF008010801240708010C -:105A40002429D8A426EFADF028EFADF011EFADF08A -:105A50005FEFAEF00801250E080108014D6F080147 -:105A6000080E08014E6F35EC3DF008010801255184 -:105A7000040AD8A43EEFADF040EFADF0C4EFABF0B8 -:105A800008012A0E080108014D6F0801080E0801DF -:105A90004E6F35EC3DF00801290E080108014D6FED -:105AA0000801080E08014E6F35EC3DF00801280E84 -:105AB000080108014D6F0801080E08014E6F35EC12 -:105AC0003DF00801270E080108014D6F0801080E7E -:105AD00008014E6F35EC3DF0C6EFABF008012B6FBF -:105AE000010E08010801226F08012B515FEFAEF093 -:105AF0000801250E080108014D6F0801080E080174 -:105B00004E6F35EC3DF0080108012551040AD8A478 -:105B10008CEFADF08EEFADF0C4EFABF00001000103 -:105B200046A595EFADF097EFADF0C5EFADF00801EC -:105B30002B6F000E08010801266F08012B51030E80 -:105B4000080108012665A7EFADF0A9EFADF0ABEFB6 -:105B5000ADF0C3EFADF00801250E080108014D6F4F -:105B60000801080E08014E6F35EC3DF008010801F0 -:105B7000262B030E080108012665C1EFADF0C3EF27 -:105B8000ADF0ABEFADF01DEFAEF00001520E08012D -:105B900008014D6F0001000E08014E6F35EC3DF01D -:105BA0000001510E080108014D6F0001000E0801AF -:105BB0004E6F35EC3DF00001500E080108014D6FAD -:105BC0000001000E08014E6F35EC3DF000014F0E54 -:105BD000080108014D6F0001000E08014E6F35EC01 -:105BE0003DF000014FC02BF8000150C02CF800011F -:105BF00051C02DF8000152C02EF8060E06EFAEF08F -:105C0000D89008012E332D332C332B33E82E00EFA0 -:105C1000AEF008012B51000100014F5F08012C512B -:105C200000010001505B08012D5100010001515B92 -:105C300008012E5100010001525BC6EFABF00801D4 -:105C4000240E080108014D6F0801080E08014E6F6F -:105C500035EC3DF037EFAEF00801250E08010801E4 -:105C60004D6F0801080E08014E6F35EC3DF008013C -:105C70000801240708012429D8A441EFAEF043EF1E -:105C8000AEF02CEFAEF05FEFAEF008010801255149 -:105C9000010A01E17DD5020A01E1DDD5050A01E134 -:105CA0005BD6350A01E124D7060A01E135D5030A9E -:105CB00001E1D0D6C90A01E111D71FEFAEF008010A -:105CC00008012251D8B467EFAEF069EFAEF06DEF86 -:105CD000ABF0080108012351020AD8A472EFAEF01C -:105CE00074EFAEF080EFAEF027C853F028C854F040 -:105CF00029C855F02AC856F000014685AAEFAEF033 -:105D0000080108012A5100010001561914E1080197 -:105D1000080129510001000155190DE10801080190 -:105D2000285100010001541906E10801080127511A -:105D3000000100015319D8B4A0EFAEF0A2EFAEF00D -:105D4000AAEFAEF008012B6F000E08010801236FC7 -:105D500008012B518FEC41F0080108012351B6EFE7 -:105D6000AEF08FEC41F0000EB6EFAEF01200DDEFBA -:105D7000B0F0080108010D51D8B4C1EFAEF0C3EF87 -:105D8000AEF0DFEFAEF0550E080108010E65CBEF67 -:105D9000AEF0CDEFAEF0DFEFAEF05C0E0801080123 -:105DA0000E61D5EFAEF0D7EFAEF0DFEFAEF0080149 -:105DB0001F6F010E070107010A6F08011F51F4EF61 -:105DC000B0F01B0E080108010E65E9EFAEF0EBEF35 -:105DD000AEF0FFEFAEF0200E080108010E61F3EF08 -:105DE000AEF0F5EFAEF0FFEFAEF008011F6F030E5F -:105DF000070107010A6F08011F51F4EFB0F02A0EE6 -:105E0000080108010E6507EFAFF009EFAFF01DEFD5 -:105E1000AFF02F0E080108010E6111EFAFF013EF84 -:105E2000AFF01DEFAFF008011F6F040E070107016F -:105E30000A6F08011F51F4EFB0F005EC36F0F4EFF3 -:105E4000B0F01A0E080108010E6529EFAFF02BEF34 -:105E5000AFF01DEFAFF0200E080108010E6133EF27 -:105E6000AFF035EFAFF01DEFAFF008011F6F050E7B -:105E7000070107010A6F08011F51F4EFB0F0030E8C -:105E8000080108010E6547EFAFF049EFAFF01DEFD5 -:105E9000AFF0090E080108010E6151EFAFF053EFAA -:105EA000AFF01DEFAFF008011F6F070E07010701EC -:105EB0000A6F08011F51F4EFB0F006010601D66722 -:105EC00064EFAFF066EFAFF0A6EFAFF0010E0801A0 -:105ED00008010E656EEFAFF070EFAFF084EFAFF03A -:105EE000050E080108010E6178EFAFF07AEFAFF010 -:105EF00084EFAFF008011F6F010E06010601D66F97 -:105F000008011F51F4EFB0F0040E080108010E65FE -:105F10008CEFAFF08EEFAFF0A2EFAFF0080E0801FC -:105F200008010E6196EFAFF098EFAFF0A2EFAFF07F -:105F300008011F6F020E06010601D66F08011F51EE -:105F4000F4EFB0F005EC36F0F4EFB0F00601060126 -:105F5000D605D8A4AEEFAFF0B0EFAFF0DCEFAFF006 -:105F6000040E080108010E65B8EFAFF0BAEFAFF00C -:105F70001DEFAFF0080E080108010E61C2EFAFF08F -:105F8000C4EFAFF01DEFAFF008011F6F000E060168 -:105F90000601D66F08011F5107010701164B172B89 -:105FA0000701D89007019037070191370701923711 -:105FB00007019337F4EFB0F006010601D651020A4B -:105FC000D8A4E5EFAFF0E7EFAFF019EFB0F0010EB6 -:105FD000080108010E65EFEFAFF0F1EFAFF01DEF34 -:105FE000AFF0050E080108010E61F9EFAFF0FBEF0D -:105FF000AFF01DEFAFF008011F6F000E06010601A4 -:10600000D66F08011F5107010701164B172B070117 -:1060100007019051070107010C130701D8900701F0 -:106020009037070191370701923707019337F4EF53 -:10603000B0F005EC36F0F4EFB0F006010601D667DB -:1060400024EFB0F026EFB0F066EFB0F0030E0801D9 -:1060500008010E652EEFB0F030EFB0F044EFB0F075 -:10606000090E080108010E6138EFB0F03AEFB0F008 -:1060700044EFB0F008011F6F010E06010601D66F54 -:1060800008011F51F4EFB0F0080E080108010E6579 -:106090004CEFB0F04EEFB0F062EFB0F0100E080130 -:1060A00008010E6156EFB0F058EFB0F062EFB0F0BB -:1060B00008011F6F020E06010601D66F08011F516D -:1060C000F4EFB0F005EC36F0F4EFB0F006010601A5 -:1060D000D605D8A46EEFB0F070EFB0F09CEFB0F042 -:1060E000080E080108010E6578EFB0F07AEFB0F005 -:1060F0001DEFAFF0100E080108010E6182EFB0F045 -:1061000084EFB0F01DEFAFF008011F6F000E060125 -:106110000601D66F08011F5107010701164B172B07 -:106120000701D8900701903707019137070192378F -:1061300007019337F4EFB0F006010601D651020AC9 -:10614000D8A4A5EFB0F0A7EFB0F0D9EFB0F0030EF0 -:10615000080108010E65AFEFB0F0B1EFB0F01DEF30 -:10616000AFF0090E080108010E61B9EFB0F0BBEF06 -:10617000B0F01DEFAFF008011F6F000E0601060121 -:10618000D66F08011F5107010701164B172B070196 -:1061900007019051070107010C130701D89007016F -:1061A0009037070191370701923707019337F4EFD2 -:1061B000B0F005EC36F0F4EFB0F0070107010A513A -:1061C000000A01E1D6D5010A01E1FBD5020A01E18D -:1061D00074D6070A01E135D6010A01E150D6020A58 -:1061E00001E12BD7F4EFB0F0070107011651080ABF -:1061F0001711D8A4FEEFB0F000EFB1F07CEFB1F0D2 -:1062000006010601E82B050E06010601E8610BEF09 -:10621000B1F00DEFB1F068EFB1F0070107010C51DB -:1062200005010501FC2505010501FC6F000E0501B6 -:106230000501FD210501FD6F000E05010501FE218F -:106240000501FE6F000E05010501FF210501FF6F2D -:10625000040E06010601E86130EFB1F032EFB1F053 -:1062600045EFB1F00501FCC520F80501FDC521F899 -:106270000501FEC522F808011F6B1FC8FCF520C8E8 -:10628000FDF521C8FEF522C8FFF5070107010C51F5 -:1062900006010601CA2506010601CA6F000E0601A5 -:1062A0000601CB210601CB6F000E06010601CC21B1 -:1062B0000601CC6F000E06010601CD210601CD6F4F -:1062C00008011F6F000E070107010C6F08011F5125 -:1062D000000E07010701166F000E0701176F010E70 -:1062E00007010701906F000E0701916F000E070173 -:1062F000926F000E0701936F070107010A51030A0D -:10630000D8A485EFB1F087EFB1F0DBEFB1F0060173 -:106310000601E851040AD8A490EFB1F092EFB1F071 -:10632000DBEFB1F0FCC50FF8FDC510F8FEC511F8A4 -:10633000FFC512F805EC36F00BEC43F0A50E080192 -:1063400008012E6FFF0E08012F6F2D0E08010801A6 -:106350002C6FFF0E08012D6FF5EC43F0E60E0801DF -:1063600008012E6FFE0E08012F6FAB0E0801080109 -:106370002C6FFF0E08012D6FF5EC43F00FC82EF8BF -:1063800010C82FF811C830F812C831F8B10E080142 -:1063900008012C6FFF0E08012D6F71EC43F008010E -:1063A0001F6F010E080108012C6F08011F515CECE2 -:1063B00041F090EFB2F0070107010A51070AD8A493 -:1063C000E4EFB1F0E6EFB1F08EEFB2F006010601B6 -:1063D000E851050AD8A4EFEFB1F0F1EFB1F08EEF7C -:1063E000B2F0070107010C5108010801136F080101 -:1063F000146B0801156B0801166BCAC617F8CBC6DB -:1064000018F8CCC619F8CDC61AF8FCC51BF8FDC59E -:106410001CF8FEC51DF8FFC51EF805EC36F0080196 -:106420000801135108010801172508011F6F080111 -:10643000080114510801080118210801206F080102 -:10644000080115510801080119210801216F0801EF -:1064500008011651080108011A210801226FFF0ED8 -:1064600008011F150801236F000E080120150801FF -:10647000246F000E080121150801256F000E080188 -:1064800022150801266F0801230524112511261164 -:10649000D8B44DEFB2F04FEFB2F051EFB2F090EF51 -:1064A000B2F00BEC43F0A50E080108012E6FFF0EB1 -:1064B00008012F6F2D0E080108012C6FFF0E080137 -:1064C0002D6FF5EC43F0BB0E080108012E6FFE0E98 -:1064D00008012F6FAB0E080108012C6FFF0E080199 -:1064E0002D6FF5EC43F01BC82EF81CC82FF81DC803 -:1064F00030F81EC831F8B10E080108012C6FFF0EEC -:1065000008012D6F71EC43F008011F6F010E0801A7 -:1065100008012C6F08011F515CEC41F090EFB2F0C4 -:106520001200020E080108014A25E96E000E08015A -:1065300008014B21EA6EEE50ED10D8A4A2EFB2F0A4 -:10654000A4EFB2F0A7EFB2F0000E18EFB6F008011A -:10655000546FFE0E080108014E6F08015451020EDF -:10656000080108014A25E96E000E080108014B21C7 -:10657000EA6EEECF54F8EDCF55F84AC8E9FF4BC8A4 -:10658000EAFFEECF56F8EDCF57F84CC8E9FF4DC8FB -:10659000EAFFEECF58F8EDCF59F8020E08010801D6 -:1065A0004C25E96E000E080108014D21EA6EEECF80 -:1065B0005AF8EDCF5BF80801585108015A25080137 -:1065C0005C6F0801595108015B2108015D6F0801EA -:1065D000565108015C2508015E6F080157510801FA -:1065E0005D2108015F6F0801545108015E1908011F -:1065F0000801506F0801555108015F190801516FDA -:106600000801546F000E080108014F6F0801545132 -:10661000000E080108014F6510EFB3F012EFB3F060 -:1066200014EFB3F0C4EFB3F04FC871F81DEC2BF0CA -:1066300017500D0AD8A41FEFB3F021EFB3F023EFEA -:10664000B3F0B7EFB3F01750040AD8A42AEFB3F0B1 -:106650002CEFB3F04BEFB3F0020E080108014A250E -:10666000E96E000E080108014B21EA6E10EE1AF0E7 -:10667000E652EE52ED50E518EFCFE8FFD8B4E71838 -:10668000D8A445EFB3F047EFB3F049EFB3F04FC8EC -:106690004EF8B7EFB3F000EE1AF00801EE52080121 -:1066A0005151ED18080150C8E8FFD8B4EF18D8B41C -:1066B0005CEFB3F05EEFB3F060EFB3F0B7EFB3F0C1 -:1066C000B7EC24F000EE2DF0020E080108014A2577 -:1066D000E16E000E080108014B21E26EE652EE5217 -:1066E000ED50E518EFCFE8FFD8B4E718D8A47BEF5A -:1066F000B3F07DEFB3F0B7EFB3F000EE2BF04AC884 -:10670000E1FF4BC8E2FFE652EE52ED50E518EFCF45 -:10671000E8FFD8B4E718D8A490EFB3F092EFB3F045 -:10672000B7EFB3F04CC8E9FF4DC8EAFFEECF54F81D -:10673000EECF55F8EECF56F8EECF57F836500801A9 -:1067400057190BE135500801561907E1345008017B -:10675000551903E1335008015419D8A4B2EFB3F02E -:10676000B4EFB3F0B7EFB3F0010E18EFB6F00801D5 -:1067700008014F2B000E080108014F65C2EFB3F06E -:10678000C4EFB3F014EFB3F0080108014E51FE0A54 -:10679000D8B4CDEFB3F0CFEFB3F015EFB4F04EC8EF -:1067A00071F81DEC2BF0B7EC24F0080108014E51F4 -:1067B000FE0AD8B4DEEFB3F0E0EFB3F015EFB4F0BB -:1067C00050C81AF051C81BF00A0E08010801B06F3A -:1067D000000E0801B16F4CC8AEF84DC8AFF8330ECB -:1067E00008010801AC6F000E0801AD6F58EC3AF0DB -:1067F0004AC8E9FF4BC8EAFFEECF2BF0EDCF2CF0F3 -:10680000020E080108014A25E96E000E0801080180 -:106810004B21EA6EEECF2DF0EDCF2EF001C029F026 -:1068200002C02AF0010E18EFB6F00D0E08010801A3 -:106830004A25E96E000E080108014B21EA6EEF506F -:106840000801546F080154B328EFB4F02AEFB4F0F4 -:106850002DEFB4F0000E18EFB6F000010001D85192 -:10686000D711D8B436EFB4F038EFB4F03BEFB4F052 -:10687000000E18EFB6F0000E08010801526F000E6E -:106880000801536F030E08010801525D000E080154 -:106890005359D8A04EEFB4F050EFB4F052EFB4F02B -:1068A0002EEFB5F0080108015251140DF3CF54F842 -:1068B000100E0801542700019F0E08015425E96EAF -:1068C000EA6A0001000EEA22EE50ED10D8A46BEF48 -:1068D000B4F06DEFB4F06FEFB4F02EEFB5F0020E40 -:1068E000080108014A25E96E000E080108014B2144 -:1068F000EA6E080108015251140DF3CF54F8100E3E -:106900000801542700019F0E08015425E16EE26A38 -:106910000001000EE222E652EE52ED50E518EFCFF4 -:10692000E8FFD8B4E718D8B498EFB4F09AEFB4F011 -:106930009CEFB4F01CEFB5F04AC8E9FF4BC8EAFF82 -:10694000080108015251140DF3CF54F80A0E080142 -:10695000542700019F0E08015425E16EE26A0001F0 -:10696000000EE222E652EE52ED50E518EFCFE8FFBE -:10697000D8B4E718D8B4BFEFB4F0C1EFB4F0C3EFA8 -:10698000B4F01CEFB5F04CC8E9FF4DC8EAFFEECFFC -:1069900054F8EECF55F8EECF56F8EECF57F8080181 -:1069A00008015251140D00019F0EF324E96EEA6AAA -:1069B0000001000EEA22EECF58F8EECF59F8EECFE4 -:1069C0005AF8EECF5BF80801575108015B190EE148 -:1069D0000801565108015A1909E1080155510801E9 -:1069E000591904E10801545108015819D8B4FBEFB2 -:1069F000B4F0FDEFB4F0FFEFB4F01CEFB5F05AECDB -:106A000042F0080108015251140DF3CF54F8120E50 -:106A10000801542700019F0E08015425E96EEA6A17 -:106A20000001000EEA220801A1C8EEFF0801A2C879 -:106A3000EDFF000E18EFB6F008010801524B532B82 -:106A4000030E08010801525D000E08015359D8A039 -:106A50002CEFB5F02EEFB5F052EFB4F00801546F03 -:106A6000000E080108014F6F08015451000E080183 -:106A700008014F653EEFB5F040EFB5F042EFB5F0DD -:106A800015EFB6F04FC871F81DEC2BF018B64BEFB0 -:106A9000B5F04DEFB5F04FEFB5F008EFB6F0B7EC4D -:106AA00024F0020E080108014A25E96E000E0801D3 -:106AB00008014B21EA6E10EE2DF0E652EE52ED5039 -:106AC000E518EFCFE8FFD8B4E718D8B46AEFB5F00F -:106AD0006CEFB5F06EEFB5F008EFB6F00A0E0801F6 -:106AE0000801B06F000E0801B16F4CC8AEF84DC878 -:106AF000AFF8080108015251140D00019F0EF32454 -:106B000008010801AC6F0801AD6B0001000E08011F -:106B1000AD2358EC3AF04AC8E9FF4BC8EAFF080138 -:106B200008015251140DF3CF54F80A0E08015427EE -:106B300000019F0E08015425E16EE26A0001000E7B -:106B4000E222EECFE6FFEDCFE5FF040E08010801DB -:106B50004A25E96E000E080108014B21EA6E080182 -:106B600008015251140DF3CF54F80C0E08015427AC -:106B700000019F0E08015425E16EE26A0001000E3B -:106B8000E222EECFE6FFEECFE6FFEECFE6FFEDCF5F -:106B9000E5FFE552E552020E080108014A25E96EBB -:106BA000000E080108014B21EA6E0801080152514C -:106BB000140DF3CF54F8100E0801542700019F0E56 -:106BC00008015425E16EE26A0001000EE222EECFD8 -:106BD000E6FFEDCFE5FF5AEC42F008010801525103 -:106BE000140DF3CF54F8120E0801542700019F0E24 -:106BF00008015425E96EEA6A0001000EEA22080144 -:106C0000A1C8EEFF0801A2C8EDFF000E18EFB6F014 -:106C1000080108014F2B000E080108014F6513EF12 -:106C2000B6F015EFB6F042EFB5F0000E18EFB6F083 -:106C300012000801096F000E080108011D6F08010C -:106C4000095153EC44F00009D8A429EFB6F02BEF1A -:106C5000B6F063EFB6F00801096F000E08010801F5 -:106C60000D6F08010951EAEC43F00801096FFF0EAE -:106C7000080108010D6F0801095100EC44F00601FC -:106C80000601E551D8B447EFB6F049EFB6F061EF31 -:106C9000B6F0A1C72DF895EC12F0A1C70DF8EEECF7 -:106CA00041F00801096FFE0E07010701A16F0801FD -:106CB00009510801096F000E06010601E56F080180 -:106CC000095188EFB9F0A1C70DF83DEC41F000097A -:106CD000D8A46DEFB6F06FEFB6F08BEFB6F0010E03 -:106CE00006010601E56577EFB6F079EFB6F08BEFB8 -:106CF000B6F0060E06010601E56181EFB6F083EFFE -:106D0000B6F08BEFB6F00801096F060E060106011A -:106D1000E56F0801095169EFB9F059EC44F0000939 -:106D2000D8A495EFB6F097EFB6F0ADEFB6F0080146 -:106D3000096FFF0E080108010D6F08010951EAEC07 -:106D400043F00801096FFF0E080108010D6F0801EB -:106D5000095100EC44F088EFB9F00801096FFF0E0B -:106D6000080108010D6F08010951EAEC43F0080120 -:106D7000096F000E080108010D6F0801095100ECB0 -:106D800044F00801096F000E08010801146F0801A2 -:106D9000095127C712F828C713F808010A6F010E16 -:106DA00008010801116F08010A51C80E08010B6F94 -:106DB000010E0C6F08010BC80DF808010CC80EF885 -:106DC000080108010F6B0801106B3FECDAF00701B6 -:106DD0000701A16F0801096F010E06010601E56FA9 -:106DE00008010951C4EC43F0A1C8C0F6A2C8C1F61D -:106DF000A3C8C2F6A4C8C3F688EFB9F0A1C70DF8BE -:106E00003DEC41F00009D8A408EFB7F00AEFB7F065 -:106E100046EFB7F0C4EC43F006010601C05108018B -:106E20000801A15D0801096F06010601C1510801B1 -:106E30000801A25908010A6F06010601C2510801A2 -:106E40000801A35908010B6F06010601C35108018F -:106E50000801A45908010C6F5D0E095DA00E0A59C6 -:106E6000120E0B59000E08010C59D8A03AEFB7F0DA -:106E70003CEFB7F044EFB7F00801096F060E0601CA -:106E80000601E56F0801095188EFB9F0C4EC43F041 -:106E9000A1C802F7A2C803F7A3C804F7A4C805F75E -:106EA0000801096F020E06010601E56F080109518C -:106EB00088EFB9F00801096F000E080108010D6F95 -:106EC00008010951EAEC43F00801096F000E0801BE -:106ED00008010D6F0801095100EC44F0C0ECE4F02A -:106EE0000801096F030E06010601E56F080109514B -:106EF00088EFB9F0C4EC43F006010601E95108013E -:106F00000801A15D0801096F06010601EA510801A7 -:106F10000801A25908010A6F06010601EB51080198 -:106F20000801A35908010B6F06010601EC51080185 -:106F30000801A45908010C6F710E095D810E0A59F0 -:106F40004A0E0B59000E08010C59D8A0AAEFB7F051 -:106F5000ACEFB7F0B0EFB7F077EC40F088EFB9F0F6 -:106F6000C4EC43F007010701025108010801A15DCB -:106F70000801096F07010701035108010801A2591F -:106F800008010A6F07010701045108010801A3590C -:106F900008010B6F07010701055108010801A459F9 -:106FA00008010C6F510E095D840E0A59DF0E0B5952 -:106FB000000E08010C59D8A0E0EFB7F0E2EFB7F0EF -:106FC000ECEFB7F00801096F080E06010601E56F46 -:106FD0000801095188EFB9F0A1C713F894EC2DF01E -:106FE000080114511311D8B4F8EFB7F0FAEFB7F065 -:106FF0000EEFB8F0C4EC43F0A1C8C0F6A2C8C1F6C9 -:10700000A3C8C2F6A4C8C3F60801096F040E06019E -:107010000601E56F0801095188EFB9F088EFB9F072 -:10702000C4EC43F006010601C05108010801A15D4E -:107030000801096F06010601C15108010801A259A2 -:1070400008010A6F06010601C25108010801A3598F -:1070500008010B6F06010601C35108010801A4597C -:1070600008010C6FE50E095D3D0E0A59010E0B5922 -:10707000000E08010C59D8A040EFB8F042EFB8F06C -:107080004EEFB8F065EC3FF00801096F030E060102 -:107090000601E56F0801095188EFB9F0A1C713F89F -:1070A00094EC2DF0080114511311D8A45AEFB8F044 -:1070B0005CEFB8F05EEFB8F088EFB9F0A1C713F855 -:1070C00094EC2DF0080114511311D8A46AEFB8F014 -:1070D0006CEFB8F06EEFB8F00EEFB8F00801080EE4 -:1070E000080108010E6F0801080E08010F6FA1C703 -:1070F0000DF84BEC28F00009D8A481EFB8F083EF2D -:10710000B8F085EFB8F00EEFB8F008C80DF8C1EC94 -:10711000DBF0C4EC43F0A1C8C0F6A2C8C1F6A3C816 -:10712000C2F6A4C8C3F661EC43F00009D8B49BEFE3 -:10713000B8F09DEFB8F0A7EFB8F00801096F050EA1 -:1071400006010601E56F080109510EEFB8F05EEF88 -:10715000B8F0C4EC43F0A1C802F7A2C803F7A3C873 -:1071600004F7A4C805F7C8EC15F065EC3FF008017A -:10717000096F030E06010601E56F0801095188EF4A -:10718000B9F0A1C72DF895EC12F0A1C70DF8EEECFF -:1071900041F00801096F080E06010601E56F0801BC -:1071A000095188EFB9F09BEC03F07F0E080108014C -:1071B0001617000E080117170A0E080108011625F8 -:1071C00007010701246F000E0801080117210701BC -:1071D000256FC4EC43F0A1C8C0F6A2C8C1F6A3C88D -:1071E000C2F6A4C8C3F6D7EC41F00801096F000E3F -:1071F000080108010D6F0801095100EC44F0080175 -:10720000096F090E06010601E56F0801095188EFB3 -:10721000B9F0C4EC43F006010601C05108010801B1 -:10722000A15D0801096F06010601C15108010801AD -:10723000A25908010A6F06010601C251080108019E -:10724000A35908010B6F06010601C351080108018B -:10725000A45908010C6FF20E08010801116F9E0E6F -:107260000801126F000E0801136F000E0801146F61 -:107270000701080124C70DF80701080125C70EF80A -:107280000801000E08010EBFFF0E08010F6F080174 -:10729000106FBBEC32F008010951080108010D5DC7 -:1072A00008010A51080108010E5908010B51080193 -:1072B00008010F5908010C51080108011059D8B0F4 -:1072C00064EFB9F066EFB9F00EEFB8F0FF0088EFA9 -:1072D000B9F006010601E551000A01E11ED5010AD7 -:1072E00001E18CD5030A01E1E5D5010A01E102D6ED -:1072F000070A01E195D6010A01E12BD7030A01E152 -:1073000040D70E0A01E14FD7010A83E088EFB9F0B8 -:10731000120058C8E9FF59C8EAFF0801EECF61F82A -:107320000801EECF62F80801EECF63F80801EECF56 -:1073300064F8040E080108015825E96E000E0801E2 -:1073400008015921EA6E0801EECF65F80801EECF79 -:1073500066F80801EECF67F80801EECF68F8080E6E -:10736000080108015825E96E000E0801080159219D -:10737000EA6E0801EECF69F80801EECF6AF808015D -:10738000EECF6BF80801EECF6CF80C0E0801080187 -:107390005825E96E000E080108015921EA6E08011E -:1073A000EECF6DF80801EECF6EF80801EECF6FF862 -:1073B0000801EECF70F8100E080108015825E96E9B -:1073C000000E080108015921EA6E0801EECF71F89C -:1073D0000801EECF72F80801EECF73F80801EECF86 -:1073E00074F8180E080108015825080108015F6F9C -:1073F000000E0801080159210801606F140E0801F0 -:1074000008015825E96E000E080108015921EA6EAD -:10741000EF500801756F3F0E08017517080175518F -:10742000080108015F250801766FE86A080175BF49 -:10743000E8680801080160210801776F76C85DF8E7 -:1074400077C85EF80801756F000E080108015C6FCF -:107450000801755143EFBAF05FC8E9FF60C8EAFF61 -:107460000201730E080108015C25E16EE26A020167 -:10747000020EE222EFCFE7FF080108015F4B602B0D -:10748000080108015C2B080108015E510801080190 -:10749000601906E1080108015D51080108015F1942 -:1074A000D8A455EFBAF057EFBAF02CEFBAF00201BA -:1074B000730E080108015C25E96EEA6A0201020EFA -:1074C000EA22800EEF6E080108015C2B380E0801DD -:1074D00008015C656EEFBAF070EFBAF0D5EFBAF064 -:1074E0003F0E080108015C6578EFBAF07AEFBAF058 -:1074F0007CEFBAF095EFBAF00201730E08010801B3 -:107500005C25E96EEA6A0201020EEA22000EEF6EC5 -:10751000080108015C2B3F0E080108015C6593EF30 -:10752000BAF095EFBAF07CEFBAF00801710E0801DD -:107530000801836F0801080E0801846F08016D0EB1 -:1075400008010801816F0801080E0801826F080117 -:10755000690E080108017F6F0801080E0801806F9D -:107560000801650E080108017D6F0801080E080179 -:107570007E6F0801610E080108017B6F0801080E8B -:1075800008017C6F0201730E08010801796F020186 -:10759000020E08017A6F80EC9BF00801756F000EF7 -:1075A000080108015C6F08017551370E08010801D8 -:1075B0005C65DDEFBAF0DFEFBAF0E1EFBAF0FAEFB9 -:1075C000BAF00201730E080108015C25E96EEA6A4F -:1075D0000201020EEA22000EEF6E080108015C2B88 -:1075E000370E080108015C65F8EFBAF0FAEFBAF05F -:1075F000E1EFBAF0140E080108015825E96E000EFB -:10760000080108015921EA6EEF500801756F080161 -:10761000D89075370801D89075370801D89075351E -:1076200002010201B26F140E080108015825E96E2B -:10763000000E080108015921EA6EEECF75F8EECF71 -:1076400076F8EECF77F8EECF78F8060E2EEFBBF097 -:10765000D89008017833773376337533E82E28EFE6 -:10766000BBF00801755102010201B16F140E08014F -:1076700008015825E96E000E080108015921EA6E3B -:10768000EECF75F8EECF76F8EECF77F8EECF78F84C -:107690000E0E51EFBBF0D890080178337733763374 -:1076A0007533E82E4BEFBBF0080175510201020162 -:1076B000B06F140E080108015825E96E000E08018C -:1076C00008015921EA6EEECF75F8EECF76F8EECFCD -:1076D00077F8EECF78F8160E74EFBBF0D89008016B -:1076E0007833773376337533E82E6EEFBBF00801CD -:1076F000755102010201AF6F140E080108015825EF -:10770000E96E000E080108015921EA6EEECF75F806 -:10771000EECF76F8EECF77F8EECF78F81E0E97EF33 -:10772000BBF0D89008017833773376337533E82E81 -:1077300091EFBBF00801755102010201AE6F080123 -:10774000756F000E02010201AD6F0801755108014D -:10775000756F000E02010201AC6F0801755108013E -:10776000756F000E02010201AB6F0801755108012F -:10777000710E08010801836F0801080E0801846F6B -:1077800008016D0E08010801816F0801080E08014B -:10779000826F0801690E080108017F6F0801080E59 -:1077A0000801806F0801650E080108017D6F08015E -:1077B000080E08017E6F0801610E080108017B6F49 -:1077C0000801080E08017C6F0201730E0801080110 -:1077D000796F0201020E08017A6F80EC9BF05AC8A3 -:1077E000E9FF5BC8EAFF080164C8EFFF0801080170 -:1077F0005A4B5B2B5AC8E9FF5BC8EAFF080163C814 -:10780000EFFF080108015A4B5B2B5AC8E9FF5BC820 -:10781000EAFF080162C8EFFF080108015A4B5B2B21 -:107820005AC8E9FF5BC8EAFF080161C8EFFF080119 -:1078300008015A4B5B2B5AC8E9FF5BC8EAFF0801F5 -:1078400068C8EFFF080108015A4B5B2B5AC8E9FFD3 -:107850005BC8EAFF080167C8EFFF080108015A4B3F -:107860005B2B5AC8E9FF5BC8EAFF080166C8EFFF57 -:10787000080108015A4B5B2B5AC8E9FF5BC8EAFFB5 -:10788000080165C8EFFF080108015A4B5B2B5AC875 -:10789000E9FF5BC8EAFF08016CC8EFFF08010801B7 -:1078A0005A4B5B2B5AC8E9FF5BC8EAFF08016BC85B -:1078B000EFFF080108015A4B5B2B5AC8E9FF5BC870 -:1078C000EAFF08016AC8EFFF080108015A4B5B2B69 -:1078D0005AC8E9FF5BC8EAFF080169C8EFFF080161 -:1078E00008015A4B5B2B5AC8E9FF5BC8EAFF080145 -:1078F00070C8EFFF080108015A4B5B2B5AC8E9FF1B -:107900005BC8EAFF08016FC8EFFF080108015A4B86 -:107910005B2B5AC8E9FF5BC8EAFF08016EC8EFFF9E -:10792000080108015A4B5B2B5AC8E9FF5BC8EAFF04 -:1079300008016DC8EFFF080108015A4B5B2B5AC8BC -:10794000E9FF5BC8EAFF080174C8EFFF08010801FE -:107950005A4B5B2B5AC8E9FF5BC8EAFF080173C8A2 -:10796000EFFF080108015A4B5B2B5AC8E9FF5BC8BF -:10797000EAFF080172C8EFFF080108015A4B5B2BB0 -:107980005AC8E9FF5BC8EAFF080171C8EFFF0801A8 -:1079900008015A4B5B2B1200000E08010801296FE9 -:1079A000000E08012A6F000E08012B6F000E08015F -:1079B0002C6F00014E514B114C114D11D8B4E3EF17 -:1079C000BCF0E5EFBCF01FEFBDF0C4EC43F00001EC -:1079D00000014B5108010801A15D080108012E6F4B -:1079E000000100014C5108010801A25908012F6F44 -:1079F000000100014D5108010801A3590801306F31 -:107A0000000100014E5108010801A4590801316F1D -:107A1000F20E08010801326F9E0E0801336F000E4E -:107A20000801346F000E0801356F90EC1FF02EC86E -:107A300029F82FC82AF830C82BF831C82CF80801CB -:107A40002D6F010E08010801536F08012D5167ECDD -:107A50003DF008012D6F010E08010801536F080168 -:107A60002D5167EC3DF008012D6F060E080108014D -:107A7000536F08012D5167EC3DF008012D6F000E8A -:107A800008010801536F08012D5167EC3DF0080112 -:107A90002D6F120E08010801536F08012D5167EC7C -:107AA0003DF008012D6F230E08010801536F0801F6 -:107AB0002D5167EC3DF008012D6F340E08010801CF -:107AC000536F08012D5167EC3DF008012D6F560EE4 -:107AD00008010801536F08012D5167EC3DF02AC8D9 -:107AE00053F867EC3DF029C853F867EC3DF0080106 -:107AF0002D6F800E08010801536F08012D51000100 -:107B0000000146A986EFBDF088EFBDF090EFBDF013 -:107B100008012D6F000E08010801536F08012D5157 -:107B200067EC3DF008012D6F000E08010801536F4E -:107B300008012D5167EC3DF0080108012251030AAC -:107B4000D8A4A5EFBDF0A7EFBDF0C5EFBDF00801CB -:107B500008012351D8B4AFEFBDF0B1EFBDF0C5EFD0 -:107B6000BDF0040E08010801556F000E0801566FA4 -:107B70000001570E08010801536F0001000E0801B3 -:107B8000546FF9EC30F0EDEFBDF008012D6F000EF1 -:107B900008010801536F08012D5167EC3DF0080101 -:107BA0002D6F000E08010801536F08012D5167EC7D -:107BB0003DF008012D6F000E08010801536F080108 -:107BC0002D5167EC3DF008012D6F000E08010801F2 -:107BD000536F08012D5167EC3DF008012D6F000E29 -:107BE00008010801246F08012D510B0E080108013E -:107BF0002465FDEFBDF0FFEFBDF001EFBEF018EF23 -:107C0000BEF008012D6F000E08010801536F080136 -:107C10002D5167EC3DF008010801242B0B0E0801E3 -:107C20000801246516EFBEF018EFBEF001EFBEF0BC -:107C3000060E08010801556F000E0801566F00017D -:107C4000990E08010801536F0001000E0801546FDE -:107C5000F9EC30F008012D6F000E08010801246FC7 -:107C600008012D51C90E0801080124653AEFBEF044 -:107C70003CEFBEF03EEFBEF055EFBEF008012D6FB9 -:107C8000000E08010801536F08012D5167EC3DF00B -:107C900008010801242BC90E08010801246553EFCF -:107CA000BEF055EFBEF03EEFBEF008012D6F630E43 -:107CB00008010801536F08012D5167EC3DF00801E0 -:107CC0002D6F820E08010801536F08012D5167ECDA -:107CD0003DF008012D6F530E08010801536F080194 -:107CE0002D5167EC3DF008012D6F630E080108016E -:107CF000536F08012D5167EC3DF008012D6F350ED3 -:107D000008010801536F08012D5167EC3DF008018F -:107D10002D6F010E08010801536F08012D5167EC0A -:107D20003DF022C853F867EC3DF008010801220538 -:107D3000D8A49DEFBEF09FEFBEF0A1EFBEF0000112 -:107D40004695080108012251030AD8A4AAEFBEF003 -:107D5000ACEFBEF0D9EFBEF0080108012367B3EF26 -:107D6000BEF0B5EFBEF0D9EFBEF008012D6F360EB4 -:107D700008010801536F08012D5167EC3DF008011F -:107D80002D6F040E08010801536F08012D5167EC97 -:107D90003DF056C053F867EC3DF055C053F867EC22 -:107DA0003DF054C053F867EC3DF053C053F867EC16 -:107DB0003DF008012D6F370E08010801536F0801CF -:107DC0002D5167EC3DF008012D6F040E08010801EC -:107DD000536F08012D5167EC3DF008012D6F010E26 -:107DE00008010801536F08012D5167EC3DF00801AF -:107DF0002D6F030E08010801536F08012D5167EC28 -:107E00003DF008012D6F060E08010801536F0801AF -:107E10002D5167EC3DF008012D6F0C0E0801080193 -:107E2000536F08012D5167EC3DF008010801225104 -:107E3000030AD8A41EEFBFF020EFBFF02AEFBFF077 -:107E4000080108012351D8B428EFBFF02AEFBFF092 -:107E500040EFBFF0080108012205D8A432EFBFF0BF -:107E600034EFBFF066EFBFF000015A5157115811BF -:107E70005911D8B43EEFBFF040EFBFF066EFBFF04E -:107E800008012D6F320E08010801536F08012D51B2 -:107E900067EC3DF008012D6F040E08010801536FD7 -:107EA00008012D5167EC3DF0040E08010801556FE3 -:107EB000000E0801566F0001570E08010801536FAC -:107EC0000001000E0801546FF9EC30F008012D6F2D -:107ED000FF0E08010801536F08012D5167EC3DF0BA -:107EE0007CEFBFF008012D6F000E08010801536FF1 -:107EF00008012D5167EC3DF02C0E06010601BC5D1A -:107F0000010E0601BD59D8A088EFBFF08AEFBFF07F -:107F100072EFBFF06CC025F86DC026F86EC027F870 -:107F20006FC028F808010801236799EFBFF09BEFA5 -:107F3000BFF0A8EFBFF0000E000100016C6F000E53 -:107F400000016D6F000E00016E6F000E00016F6F7B -:107F500053EC21F025C86CF026C86DF027C86EF0F0 -:107F600028C86FF012000801226F000E08010801F6 -:107F70001D6F08012251040E080108011D65C3EFA1 -:107F8000BFF0C5EFBFF0C7EFBFF071EFC2F008015F -:107F900008011D51170DF3CF22F80E0E08012227FC -:107FA0000201000E08012225E96EEA6A0201020EB2 -:107FB000EA22EF50050AD8B4E0EFBFF0E2EFBFF0DD -:107FC000FCEFBFF0080108011D51170DF3CF22F897 -:107FD0000E0E080122270201000E08012225E96E7B -:107FE000EA6A0201020EEA22040EEF62FAEFBFF023 -:107FF000FCEFBFF0FEEFBFF064EFC2F03EEFC2F067 -:108000001DEC43F00009D8B408EFC0F00AEFC0F04F -:1080100075EFC0F0080108011D51170DF3CF22F8CC -:108020000E0E080122270201000E08012225E96E2A -:10803000EA6A0201020EEA22000EEF6E0801080150 -:108040001D51170DF3CF22F8140E0801222702014B -:10805000000E08012225E96EEA6A0201020EEA22F8 -:10806000EF500801236F080123A139EFC0F03BEF67 -:10807000C0F059EFC0F00801226F010E080108019D -:108080002F6F08012251080108011D51170D02012F -:10809000000EF324E96EEA6A0201020EEA220801E8 -:1080A000EECF2DF80801EDCF2EF848EC3BF075EF40 -:1080B000C0F00801226F010E080108012F6F0801AE -:1080C0002251080108011D51170D0201000EF32471 -:1080D000E96EEA6A0201020EEA220801EECF2DF8EB -:1080E0000801EDCF2EF80DEC3BF064EFC2F0080173 -:1080F0001E0E080108012D6F0801080E08012E6FE1 -:10810000D3EC94F00009D8B488EFC0F08AEFC0F047 -:1081100075EFC0F0DCEC40F00009D8B492EFC0F08D -:1081200094EFC0F0F2EFC0F0080108011D51170DE7 -:108130000201000EF324E96EEA6A0201020EEA224D -:1081400008011EC8EEFF08011FC8EEFF080120C885 -:10815000EEFF080121C8EEFF080108011D51170DAF -:10816000F3CF22F80E0E080122270201000E0801AB -:108170002225E96EEA6A0201020EEA22020EEF6E81 -:10818000080108011D51170DF3CF22F8130E080145 -:1081900022270201000E08012225E96EEA6A020187 -:1081A000020EEA22000EEF6E080108011D51170DA4 -:1081B000F3CF22F80F0E080122270201000E08015A -:1081C0002225E96EEA6A0201020EEA22270EEE6E0D -:1081D000000EEE6E000EEE6E000EED6EED52ED52E4 -:1081E00006EFC1F0080108011D51170DF3CF22F869 -:1081F0000E0E080122270201000E08012225E96E59 -:10820000EA6A0201020EEA22010EEF6E64EFC2F08A -:108210005AEC42F0080108011D51170DF3CF22F866 -:10822000150E080122270201000E08012225E96E21 -:10823000EA6A0201020EEA220801A1C8EEFF080163 -:10824000A2C8EDFF080108011D51170D0201000E23 -:10825000F324080108014C6F08014D6B0201020E66 -:1082600008014D230EEC23F0080108011D51170DE4 -:10827000F3CF22F80E0E080122270201000E08019A -:108280002225E96EEA6A0201020EEA22030EEF6E6F -:1082900064EFC2F0080108011D51170DF3CF22F859 -:1082A000040E080122270201000E08012225080100 -:1082B00008014E6F08014F6B0201020E08014F23A7 -:1082C000080108011D51170D0201000EF3240801D9 -:1082D00008014C6F08014D6B0201020E08014D238D -:1082E000E7EC1AF00009D8A478EFC1F07AEFC1F0FA -:1082F00026EFC2F0080108011D51170DF3CF22F837 -:10830000150E080122270201000E08012225E96E40 -:10831000EA6A0201020EEA22EECF23F8EDCF24F83A -:108320005AEC42F00801235108010801A15D08013F -:10833000256F0801245108010801A2590801266F80 -:10834000080108011D51170DF3CF27F80F0E080182 -:1083500027270201000E08012725E96EEA6A0201BB -:10836000020EEA22EECF28F8EDCF29F808012551B8 -:108370000801285D0801265108012959D8B0C3EF2A -:10838000C1F0C5EFC1F024EFC2F0080108011D5192 -:10839000170DF3CF22F8130E080122270201000E59 -:1083A00008012225E96EEA6A0201020EEA22EF5074 -:1083B0000801236F060E0801235DD8B0E2EFC1F07B -:1083C000E4EFC1F010EFC2F0080108011D51170DD4 -:1083D000F3CF22F8130E080122270201000E080134 -:1083E0002225E96EEA6A0201020EEA22EF2A08015A -:1083F00008011D51170DF3CF22F80F0E0801222797 -:108400000201000E08012225E96EEA6A0201020E4D -:10841000EA22D890EE36EE36EE36ED36ED52ED52DB -:10842000080108011D51170DF3CF22F80E0E0801A7 -:1084300022270201000E08012225E96EEA6A0201E4 -:10844000020EEA22020EEF6E75EFC0F0080108017D -:108450001D51170DF3CF22F80E0E0801222702013D -:10846000000E08012225E96EEA6A0201020EEA22E4 -:10847000050EEF6E64EFC2F064EFC2F00801080170 -:108480001D51170DF3CF22F80E0E0801222702010D -:10849000000E08012225E96EEA6A0201020EEA22B4 -:1084A000EF50000A01E123D6010A01E1A9D5030A30 -:1084B00001E1AED6010A01E1EDD6070A01E115D6C8 -:1084C000010ADAE03CEFC2F0080108011D2B040E9E -:1084D000080108011D656FEFC2F071EFC2F0C7EF30 -:1084E000BFF01200080108010D51D8B47AEFC2F0B4 -:1084F0007CEFC2F081EFC2F0080108010E2B84EF7F -:10850000C2F0080108010E07DDEFC4F0050E0801F6 -:1085100008010E658EEFC2F090EFC2F09FEFC2F03F -:108520000C0E080108010E6198EFC2F09AEFC2F03C -:108530009FEFC2F007010701102BEEEFC4F00D0E04 -:10854000080108010E65A7EFC2F0A9EFC2F0CFEF56 -:10855000C2F0160E080108010E61B1EFC2F0B3EFD0 -:10856000C2F0CFEFC2F0140E070107011065BBEF98 -:10857000C2F0BDEFC2F0CFEFC2F008010F6F010EE5 -:10858000070107012A6F08010F5108010F6F030E41 -:1085900007010701106F08010F51EEEFC4F0E0EC86 -:1085A0003FF0EEEFC4F00D0E080108010E65DBEFA1 -:1085B000C2F0DDEFC2F0CFEFC2F0160E08010801E5 -:1085C0000E61E5EFC2F0E7EFC2F0CFEFC2F00701B6 -:1085D00007011007070107011067F1EFC2F0F3EF81 -:1085E000C2F002EFC3F0000E06010601E16F000EBB -:1085F0000601E26F08010F6F020E070107012A6FE3 -:1086000008010F51EEEFC4F00EC812F80DC811F8B2 -:108610004CEC1EF011C8BAF612C8BBF606010601F2 -:10862000BB29FE0ED8B4BA19D8A419EFC3F01BEFBA -:10863000C3F01FEFC3F0E0EC3FF0EEEFC4F0060133 -:108640000601BA29D8B4BB29D8A429EFC3F02BEF6F -:10865000C3F02DEFC3F0EEEFC4F006010601E251C6 -:10866000E111D8A436EFC3F038EFC3F042EFC3F006 -:1086700006010601BA5106010601E26F0601E16B2F -:10868000E8EFC3F006010601BA5106010601E11345 -:1086900006010601BB5106010601E2137DEFC3F09E -:1086A00008010F6F070E070107019A6F08010F51AC -:1086B000D8EFC3F008010F6F050E070107019A6F8D -:1086C00008010F51D8EFC3F008010F6F080E070122 -:1086D00007019A6F08010F51D8EFC3F008010F6F1F -:1086E000090E070107019A6F08010F51D8EFC3F077 -:1086F000070107019A69D8EFC3F00601E1C60FF838 -:108700000601E2C610F80801C2EFC3F008010F51DC -:10871000840ADAE0100AD8E078EFC3F008010F51BC -:10872000200ABEE078EFC3F008010F51140ACCE034 -:1087300078EFC3F008010F51100AB2E078EFC3F0F0 -:1087400008010F51600ACAE078EFC3F008010F5129 -:10875000440AB0E078EFC3F008010F51740AAAE0B0 -:1087600078EFC3F008010F51400AA4E0300AA2E0FC -:1087700078EFC3F008010F51240A92E0900A90E0CC -:1087800078EFC3F008011051190AC0E0040AC6E0EE -:10879000340ACAE0040ACEE0700AD2E0950AD6E0B4 -:1087A000100ADAE0340ADEE0140AE4E078EFC3F0FD -:1087B00008010F6F030E070107012A6F08010F510F -:1087C00008010F6F000E070107011C6F08010F5110 -:1087D000EEEFC4F00EC812F80DC811F84CEC1EF004 -:1087E00011C8BAF612C8BBF606010601BB29FE0E77 -:1087F000D8B4BA19D8A4FFEFC3F001EFC4F047EF23 -:10880000C4F0070107019AAF08EFC4F00AEFC4F003 -:10881000CFEFC2F0080108010D6711EFC4F013EFAC -:10882000C4F0CFEFC2F0D89006010601C5310801AF -:10883000106F06010601C43108010F6F380E0801E0 -:108840000F5D000E1059D8A028EFC4F02AEFC4F035 -:10885000CFEFC2F01E0E080108010E6532EFC4F022 -:1088600034EFC4F0CFEFC2F008010F6F000E070124 -:1088700007019A6F08010F51000E06010601BA6F39 -:10888000000E0601BB6F45EFC4F058EFC4F00601BF -:108890000601BA29D8B4BB29D8A451EFC4F053EFCC -:1088A000C4F055EFC4F0EEEFC4F0070107019A07DA -:1088B0000601A90E070107011C25E96EEA6A0601F7 -:1088C000060EEA220601BAC6EFFF070107011C2BBC -:1088D000070107019A676FEFC4F071EFC4F0CBEFA7 -:1088E000C4F0E0EC3FF00BEC43F0850E080108010A -:1088F0002E6FFF0E08012F6F930E080108012C6FD9 -:10890000FF0E08012D6FF5EC43F0700E0801080111 -:108910002E6FFF0E08012F6F2D0E080108012C6F1E -:10892000FF0E08012D6FF5EC43F006010801E1C6CA -:108930002EF806010801E2C62FF808010801306B85 -:108940000801316BAB0E080108012C6FFF0E080106 -:108950002D6F71EC43F01CC726F80601A90E080123 -:108960000801246F0601060E0801256FB10E0801EB -:108970000801226FFF0E0801236FB7EC43F00801D6 -:108980000F6F010E080108012C6F08010F515CECFC -:1089900041F0EEEFC4F0910E06010601C45D010E38 -:1089A0000601C559D8A0D7EFC4F0D9EFC4F002EF43 -:1089B000C3F0E0EC3FF0EEEFC4F0070107012A51ED -:1089C000000A01E1A3D5010A01E1EDD5030A01E1A5 -:1089D0001BD6010A01E1FED6EEEFC4F01200080139 -:1089E000096F000E080108011D6F0801095153ECC1 -:1089F00044F00009D8A4FFEFC4F001EFC5F027EF61 -:108A0000C5F0070107011D51D8B409EFC5F00BEF00 -:108A1000C5F025EFC5F09EC72DF895EC12F09EC766 -:108A20000DF8EEEC41F00801096FFE0E0701070199 -:108A30009E6F08010951BDEC3BF00801096F000E63 -:108A4000070107011D6F0801095119EFC7F006EF73 -:108A5000C7F00801096F010E070107011D6F08012A -:108A600009510801096F000E08010801146F08017F -:108A70000951500E08010801126F000E0801136F12 -:108A800008010A6F010E08010801116F08010A515F -:108A90006A0E08010B6F070E0C6F08010BC80DF86A -:108AA00008010CC80EF8080108010F6B0801106BD3 -:108AB0003FECDAF0070107019E6F070107019E51A5 -:108AC000FE0AD8A466EFC5F068EFC5F072EFC5F0F6 -:108AD0000801096F000E070107011D6F0801095108 -:108AE00019EFC7F0C4EC43F0A1C8F5F6A2C8F6F63A -:108AF000A3C8F7F6A4C8F8F619EFC7F09EC70DF89B -:108B00003DEC41F00009D8A488EFC5F08AEFC5F02C -:108B1000C6EFC5F0C4EC43F006010601F5510801AB -:108B20000801A15D0801096F06010601F65108015F -:108B30000801A25908010A6F06010601F751080150 -:108B40000801A35908010B6F06010601F85108013D -:108B50000801A45908010C6F5D0E095DA00E0A59A9 -:108B6000120E0B59000E08010C59D8A0BAEFC5F02F -:108B7000BCEFC5F0C4EFC5F00801096F040E070192 -:108B800007011D6F0801095119EFC7F00801096FAE -:108B9000020E070107011D6F0801095119EFC7F007 -:108BA0009EC768F8BEEC20F07D0E08010801685DE4 -:108BB000000E08016959D8B0E0EFC5F0E2EFC5F04A -:108BC000E4EFC5F019EFC7F0D90E08010801576F9F -:108BD000FF0E0801586F9EC756F830EC42F0160E93 -:108BE00008010801576FFE0E0801586F9EC756F81E -:108BF00030EC42F00801096F000E06010601E76F34 -:108C000008010951050E06010601E7650AEFC6F0E5 -:108C10000CEFC6F00EEFC6F049EFC6F00001DB0E18 -:108C200006010601E725E96EEA6A0001000EEA2264 -:108C3000EF5008010801586F0DEC3FF008010801E2 -:108C4000576F9EC756F801EC15F00001DB0E0601C8 -:108C50000601E725E96EEA6A0001000EEA22EF50FC -:108C600008010801646FE1EC3EF008010801576F4C -:108C70009EC756F801EC15F006010601E72B050E1C -:108C800006010601E76547EFC6F049EFC6F00EEFB3 -:108C9000C6F0A90E08010801576FFE0E0801586FB3 -:108CA0009EC756F830EC42F007016A0E0801080131 -:108CB000576F0701070E0801586F9EC756F845EC1D -:108CC00042F0910E08010801576FFE0E0801586F1F -:108CD0009EC756F830EC42F09EC768F8F6EC3BF0C1 -:108CE0000801096F000E06010601E76F080109512E -:108CF0000801096F030E070107011D6F08010951E3 -:108D000019EFC7F00801080E080108010E6F0801ED -:108D1000080E08010F6F9EC70DF84BEC28F00009F4 -:108D2000D8A495EFC6F097EFC6F099EFC6F0CEEF56 -:108D3000C6F0030E06010601E765A1EFC6F0A3EF3A -:108D4000C6F0A9EFC6F008C80DF86CEC0DF0CCEF3A -:108D5000C6F00801080108510A0AD8B4B2EFC6F0FB -:108D6000B4EFC6F0BFEFC6F00801080108510D0AC4 -:108D7000D8A4BDEFC6F0BFEFC6F0C4EFC6F0060141 -:108D80000601E72BCCEFC6F00801096F000E0601C3 -:108D90000601E76F0801095182EFC6F09EC70DF882 -:108DA0003DEC41F00009D8A4D8EFC6F0DAEFC6F0E8 -:108DB000E2EFC6F00801096F040E070107011D6FFD -:108DC0000801095119EFC7F09EC72DF895EC12F074 -:108DD0009EC70DF8EEEC41F00801096FFE0E070189 -:108DE00007019E6F080109510801096F010E070173 -:108DF00007012E6F080109510801096F050E0701CF -:108E000007011D6F0801095119EFC7F0070107019C -:108E10001D51000A01E11DD6010A01E16FD6030AC6 -:108E200001E1BED6010A01E16DD7070ACDE019EFD5 -:108E3000C7F0120008010C6F000E08010801086F4E -:108E400008010C5133EFC8F09BC735F8BEC633F8A4 -:108E5000BFC634F887EC3EF0D8A031EFC7F033EF4F -:108E6000C7F086EFC7F0960E06010601D4653BEF0A -:108E7000C7F03DEFC7F043EFC7F0BEC696F7BFC6D9 -:108E800097F79BC79CF706010601D451D8B44BEF66 -:108E9000C7F04DEFC7F071EFC7F0D4C60EF8080168 -:108EA0000C6F000E080108010D6F08010C5155EC04 -:108EB000D0F0D4C60EF808010C6F000E08010801AE -:108EC0000D6F08010C5172ECC2F0D4C60EF8080107 -:108ED0000C6F000E080108010D6F08010C51B7EC72 -:108EE000AEF006010601FB2B08010C6F000E060117 -:108EF0000601D46F08010C5108010C6F000E070128 -:108F00000701376F08010C51CEEFC7F006010601CB -:108F1000D4678DEFC7F08FEFC7F095EFC7F0BEC6EF -:108F200094F7BFC695F79BC7DAF606010601FB5119 -:108F3000D8B49DEFC7F09FEFC7F0C3EFC7F0FBC6F3 -:108F40000EF808010C6F010E080108010D6F0801F1 -:108F50000C5155ECD0F0FBC60EF808010C6F010E59 -:108F6000080108010D6F08010C5172ECC2F0FBC63C -:108F70000EF808010C6F010E080108010D6F0801C1 -:108F80000C51B7ECAEF006010601D42B08010C6FB2 -:108F9000000E06010601FB6F08010C510701D89075 -:108FA0009B33070107019B67D8EFC7F0DAEFC7F0E3 -:108FB000F9EFC7F008010C6F800E070107019B6FE6 -:108FC00008010C5106010601BE4BBF2B060106012C -:108FD000BF51020ABE11D8A4F0EFC7F0F2EFC7F0FC -:108FE000F9EFC7F0000E06010601BE6F000E060184 -:108FF000BF6F06010601BF5107010701971906E17E -:1090000006010601BE51070107019619D8A40BEF0E -:10901000C8F00DEFC8F01EEFC8F0070107019B5123 -:10902000070107019C6317EFC8F019EFC8F01EEFA6 -:10903000C8F0070107019669070197690601060153 -:10904000D451960AD8A427EFC8F029EFC8F033EF1F -:10905000C8F008010C6F010E08010801086F080133 -:109060000C5147EFC8F006010601D951060106016F -:10907000BF1906E106010601D85106010601BE1915 -:10908000D8A445EFC8F047EFC8F024EFC7F00801B7 -:10909000080108674EEFC8F050EFC8F052EFC8F073 -:1090A00010EFC9F0070107013751D8B45AEFC8F0E3 -:1090B0005CEFC8F05EEFC8F010EFC9F094C70FF88E -:1090C00095C710F896C70DF897C70EF8E1EC2FF08A -:1090D0000DC80AF80EC80BF8080108010BBF73EFA2 -:1090E000C8F075EFC8F086EFC8F0080108010B5111 -:1090F000800A800F320ED8B40A5DD8B082EFC8F073 -:1091000084EFC8F086EFC8F010EFC9F0080108013D -:109110000B51800A800F9E0ED8B40A5DD8A093EF41 -:10912000C8F095EFC8F0A4EFC8F0080108010B5192 -:10913000800A800FA30ED8B40A5DD8A0A2EFC8F0B1 -:10914000A4EFC8F0A4EFC8F008010C6F000E0801EE -:109150000801096F08010C51DAC60FF894C70DF821 -:1091600095C70EF8F8ECCAF0080108010927DAC61D -:109170000FF894C70DF895C70EF80FECE1F0080151 -:1091800008010927DAC60FF894C70DF895C70EF83D -:10919000B8ECD8F0080108010927DAC60FF894C71F -:1091A0000DF895C70EF8EBECE5F00801080109276A -:1091B000DAC60FF894C70DF895C70EF881ECD5F014 -:1091C000080108010927DAC60FF894C70DF895C7FA -:1091D0000EF811ECC9F008010801092708010C6F0D -:1091E000010E07010701376F08010C510801080142 -:1091F0000951D8B4FEEFC8F000EFC9F00EEFC9F086 -:10920000000E06010601BE6F000E0601BF6F000EC4 -:1092100006010601D86F000E0601D96F10EFC9F0E4 -:109220001200000E08010801146F000E0801156FEE -:10923000000E0801166F000E0801176F08010F0ECF -:1092400008010801356F0801080E0801366F080192 -:109250000D0E08010801336F0801080E0801346F74 -:1092600099EC3CF008010F0E080108012E6F08016F -:10927000080E08012F6F08010D0E080108012C6F60 -:109280000801080E08012D6FACEC2AF0010E080150 -:109290000801106F000E0801116F000E0801126F17 -:1092A000000E0801136F000E08010801186F000E70 -:1092B0000801196F080108011951800A800F200E5A -:1092C000D8B4185DD8A067EFC9F069EFC9F06BEFAB -:1092D000C9F0E3EFC9F008010F0E080108012E6F75 -:1092E0000801080E08012F6F08010D0E0801080182 -:1092F0002C6F0801080E08012D6FACEC2AF0080154 -:1093000008011A6F08010F0E080108012E6F0801ED -:10931000080E08012F6F08010D0E080108012C6FBF -:109320000801080E08012D6FACEC2AF008010801B5 -:109330001B6FBAEFC9F0C6EFC9F008010801105160 -:10934000080108011413080108011151080108015E -:10935000151308010801125108010801161308012C -:1093600008011351080108011713C6EFC9F0000ED8 -:10937000F7EFCAF01BC82DF81AC82CF899EC3DF08D -:10938000000AD9E0010AD9E0B7EFC9F00801D89086 -:109390000801103708011137080112370801133787 -:1093A00008010801184B192B080108011951800AFE -:1093B000800F200ED8B4185DD8A0E1EFC9F0E3EF1C -:1093C000C9F06BEFC9F0080114C81CF8080115C8F2 -:1093D0001DF8080116C81EF8080117C81FF8080173 -:1093E0001C1F1D1F1E1F1F1F110EFDEFC9F0D8905F -:1093F00008011F331E331D331C33E82EF7EFC9F06D -:10940000FF0E08011C150801206F000E08011D1534 -:109410000801216F000E08011E150801226F000EC1 -:1094200008011F150801236F080114C824F808015A -:1094300015C825F8080116C826F8080117C827F826 -:10944000190E29EFCAF0D8900801273326332533A7 -:109450002433E82E23EFCAF0FF0E0801241508017B -:10946000286F000E080125150801296F000E08015C -:10947000261508012A6F000E0801271508012B6F19 -:109480000801235108012B190EE10801225108019E -:109490002A1909E1080121510801291904E10801EB -:1094A000205108012819D8B458EFCAF05AEFCAF071 -:1094B0005DEFCAF0000EF7EFCAF0FF0E080114C806 -:1094C0001CF8080115C81DF8080116C81EF8080187 -:1094D00017C81FF808011C1F1D1F1E1F1F1F080192 -:1094E0001C150801206F000E08011D150801216FD1 -:1094F000000E08011E150801226F000E08011F153D -:109500000801236FFF0E080114C824F8080115C8CC -:1095100025F8080116C826F8080117C827F825C835 -:1095200024F826C825F827C826F80801276B080163 -:1095300024150801286F000E080125150801296F60 -:10954000000E0801261508012A6F000E08012715D4 -:1095500008012B6F0801235108012B190EE10801A6 -:10956000225108012A1909E108012151080129198C -:1095700004E10801205108012819D8B4C2EFCAF04B -:10958000C4EFCAF0C7EFCAF0000EF7EFCAF00BEC59 -:1095900043F0EE0E080108012E6FFF0E08012F6F39 -:1095A0002D0E080108012C6FFF0E08012D6FF5EC40 -:1095B00043F014C82EF815C82FF816C830F817C88D -:1095C00031F8B10E080108012C6FFF0E08012D6F54 -:1095D00071EC43F008011C6F020E080108012C6FAA -:1095E00008011C515CEC41F0010EF7EFCAF01200CB -:1095F000000E08010801186F000E0801196F000E17 -:1096000008011A6F000E08011B6F010E0801080106 -:10961000146F000E0801156F000E0801166F000E82 -:109620000801176F000E08010801106F000E0801F5 -:10963000116F000E08010801126F000E0801136F70 -:1096400008010F0E08010801356F0801080E080116 -:10965000366F08010D0E08010801336F0801080E6E -:109660000801346F99EC3CF008010F0E0801080165 -:109670002E6F0801080E08012F6F08010D0E08015A -:1096800008012C6F0801080E08012D6FACEC2AF0C0 -:10969000080108011351800A800F240ED8B4125D0E -:1096A000D8A055EFCBF057EFCBF059EFCBF08AEFC6 -:1096B000CCF008010F0E080108012E6F0801080EFA -:1096C00008012F6F08010D0E080108012C6F080119 -:1096D000080E08012D6FACEC2AF0080108011C6F80 -:1096E00008010F0E080108012E6F0801080E08017D -:1096F0002F6F08010D0E080108012C6F0801080EDC -:1097000008012D6FACEC2AF0080108011D6F08015B -:109710000F0E080108012E6F0801080E08012F6FB7 -:1097200008010D0E080108012C6F0801080E080140 -:109730002D6FACEC2AF0080108011E6F08010F0E16 -:10974000080108012E6F0801080E08012F6F08019B -:109750000D0E080108012C6F0801080E08012D6F7D -:10976000ACEC2AF0080108011F6F40EFCCF00801B3 -:1097700008011351800A800F200ED8B4125DD8A0C2 -:10978000C4EFCBF0C6EFCBF0E0EFCBF0080118C888 -:1097900020F8080119C821F808011AC822F80801A0 -:1097A0001BC823F8D89008012333223321332033F8 -:1097B00020C818F821C819F822C81AF823C81BF8BD -:1097C00051EFCCF0080108011351800A800F200EE0 -:1097D000D8B4125DD8A0EFEFCBF0F1EFCBF00BEFE8 -:1097E000CCF0080118C820F8080119C821F80801B0 -:1097F0001AC822F808011BC823F8D890080123339F -:1098000022332133203320C818F821C819F822C880 -:109810001AF823C81BF808010801145108010801AF -:10982000181308010801155108010801191308014E -:1098300008011651080108011A13080108011751FF -:10984000080108011B1351EFCCF008010801135166 -:10985000800A800F1F0ED8B4125DD8A032EFCCF072 -:1098600034EFCCF03DEFCCF0010E08010801106F91 -:10987000000E0801116F51EFCCF0000ECAEFCCF0D2 -:109880001FC827F81EC826F81DC825F81CC824F8CC -:10989000ADEC31F0000A01E16AD7010A93E025EF4F -:1098A000CCF00801080111511011D8B45AEFCCF0D6 -:1098B0005CEFCCF05EEFCCF08AEFCCF00801080151 -:1098C0001351800A800F1F0ED8B4125DD8B06BEF11 -:1098D000CCF06DEFCCF077EFCCF00801D890080118 -:1098E0001437080115370801163708011737080122 -:1098F0000801124B132B080108011351800A800F35 -:10990000240ED8B4125DD8A088EFCCF08AEFCCF04A -:1099100059EFCBF00BEC43F0580E080108012E6F05 -:10992000FF0E08012F6F2D0E080108012C6FFF0E8E -:1099300008012D6FF5EC43F0E60E080108012E6FCB -:10994000FE0E08012F6FAB0E080108012C6FFF0EF1 -:1099500008012D6FF5EC43F018C82EF819C82FF840 -:109960001AC830F81BC831F8B10E080108012C6F75 -:10997000FF0E08012D6F71EC43F00801206F020EFD -:10998000080108012C6F080120515CEC41F0010E28 -:10999000CAEFCCF012000001000198ADD2EFCCF07C -:1099A000D4EFCCF023EFCDF097EC42F008010801A2 -:1099B000106F080108011051070107013119D8B4CF -:1099C000E4EFCCF0E6EFCCF00DEFCDF010C831F7BE -:1099D000080108011067EFEFCCF0F1EFCCF00DEFCC -:1099E000CDF080C06CF081C06DF082C06EF083C09D -:1099F0006FF084C070F085C071F086C072F087C0CF -:109A000073F00001988F0801116F000E0801080122 -:109A10001D6F080111511BEC34F072ECA6F0080127 -:109A2000116F000E080108011D6F0801115153EC60 -:109A300044F00009D8B41FEFCDF021EFCDF023EFB3 -:109A4000CDF00001989FD7EC8DF0B3ECBFF08FEC18 -:109A500041F00801080E080108011F6F0801080EF7 -:109A60000801206F0501DE0E080108011D6F0501C8 -:109A7000050E08011E6F3FEC00F00009D8A443EF6B -:109A8000CDF045EFCDF047EFCDF091EFCEF084EF84 -:109A9000CEF0B1EC0AF08FEFCEF008010A0E08010B -:109AA0000801236F0801080E0801246F0801090E40 -:109AB00008010801216F0801080E0801226F050145 -:109AC000DA0E080108011F6F0501050E0801206F5D -:109AD00008010C0E080108011D6F0801080E08019D -:109AE0001E6F37EC14F00009D8A479EFCDF07BEFAE -:109AF000CDF07DEFCDF08FEFCEF008010801090524 -:109B0000D8A485EFCDF087EFCDF030EFCEF0000197 -:109B100000016F51080108010F1914E10001000153 -:109B20006E51080108010E190DE1000100016D518F -:109B3000080108010D1906E1000100016C5108013E -:109B400008010C19D8B4A7EFCDF0A9EFCDF01FEFA5 -:109B5000CEF008010C29D8B40D29D8B40E29D8B4F8 -:109B60000F29D8B4B6EFCDF0B8EFCDF01FEFCEF09F -:109B7000000170C011F8000171C012F8000172C03C -:109B800013F8000173C014F80801111F121F131FEE -:109B9000141F000100016C51000100017015080143 -:109BA000156F000100016D510001000171150801E0 -:109BB000166F000100016E510001000172150801CD -:109BC000176F000100016F510001000173150801BA -:109BD000186F08011151080115110801196F0801CA -:109BE00012510801161108011A6F080113510801DA -:109BF000171108011B6F0801145108011811080101 -:109C00001C6F080108010F5108011C1911E108011E -:109C100008010E5108011B190BE1080108010D5143 -:109C200008011A1905E1080108010C510801191968 -:109C3000D8A41DEFCEF01FEFCEF02EEFCEF00AC865 -:109C40001FF80BC820F80501DA0E080108011D6F86 -:109C50000501050E08011E6F8DEC16F08FEFCEF09A -:109C6000080108010951060AD8A439EFCEF03BEFEC -:109C7000CEF055EFCEF00AC821F80BC822F8080143 -:109C80000C0E080108011F6F0801080E0801206F63 -:109C90000501DA0E080108011D6F0501050E080116 -:109CA0001E6FC6EC08F08FEFCEF0080108010951D5 -:109CB000110AD8A45EEFCEF060EFCEF02EEFCEF01A -:109CC0000AC821F80BC822F808010C0E0801080187 -:109CD0001F6F0801080E0801206F0501DA0E080148 -:109CE00008011D6F0501050E08011E6FC1EC05F08E -:109CF0000009D8B47EEFCEF080EFCEF082EFCEF048 -:109D000091EFCEF08FEFCEF0080108010851000A64 -:109D100001E1C3D6060A01E1BCD68FEFCEF027EFF2 -:109D2000CDF0120008013C6F000E08010801356FEC -:109D300008013C5108013C6F000E08010801366F14 -:109D400008013C51000E08010801386F000E08019F -:109D5000396F000E08013A6F000E08013B6FBCEF2F -:109D6000CFF0030E080108013665B9EFCEF0BBEF66 -:109D7000CEF0BDEFCEF0DBEFCFF0300E08010801E2 -:109D8000375F080108013567C8EFCEF0CAEFCEF0A3 -:109D9000D9EFCEF0090E080108013765D2EFCEF0F9 -:109DA000D4EFCEF0D7EFCEF0000E54EFD0F0A8EF06 -:109DB000CFF0080108013551030AD8A4E2EFCEF034 -:109DC000E4EFCEF041EFCFF0080108013751FE0A71 -:109DD000D8B4EDEFCEF0EFEFCEF0F2EFCEF0000E14 -:109DE00054EFD0F0060E0801385D050E0801395910 -:109DF000020E08013A59000E080108013B59D8A08B -:109E000004EFCFF006EFCFF009EFCFF0000E54EFE4 -:109E1000D0F0080108013651080108013325E96E28 -:109E20000801000E080108013421EA6E080108014A -:109E300039510A0DF3CF3CF8080108013A51640D7D -:109E4000F35008013C25080108013825EF6E080190 -:109E50000801362B08013C6F000E08010801356F20 -:109E600008013C51000E08010801386F000E08017E -:109E7000396F000E08013A6F000E08013B6FBCEF0E -:109E8000CFF0080108013751FE0AD8A44AEFCFF0FD -:109E90004CEFCFF09BEFCFF0060E0801385D050EBA -:109EA00008013959020E08013A59000E080108014B -:109EB0003B59D8A05EEFCFF060EFCFF063EFCFF06B -:109EC000000E54EFD0F008010801365108010801D6 -:109ED0003325E96E0801000E080108013421EA6EFD -:109EE0000801080139510A0DF3CF3CF808010801B7 -:109EF0003A51640DF35008013C250801080138254A -:109F0000EF6E08010801362B08013C6F000E0801B6 -:109F10000801356F08013C51000E08010801386F37 -:109F2000000E0801396F000E08013A6F000E08019B -:109F30003B6FBCEFCFF0090E080108013765A3EFB6 -:109F4000CFF0A5EFCFF0A8EFCFF0000E54EFD0F098 -:109F500008010801352B080108013AC83BF808013F -:109F6000080139C83AF80801080138C839F8080169 -:109F70000801386B37C838F8080108013151080169 -:109F80003C6F08010801325108013D6F0801314B57 -:109F9000322B3CC8F6FF3DC8F7FF000EF86E0800F4 -:109FA0000801F5CF37F808013767D9EFCFF0DBEFBD -:109FB000CFF0B1EFCEF0080108013751D8B4E3EF8C -:109FC000CFF0E5EFCFF01FEFD0F0080108013751D7 -:109FD0002F0AD8B4EEEFCFF0F0EFCFF01FEFD0F0B4 -:109FE0000801080137510D0AD8B4F9EFCFF0FBEFA3 -:109FF000CFF01FEFD0F00801080137510A0AD8B49A -:10A0000004EFD0F006EFD0F01FEFD0F00801080108 -:10A010003751200AD8B40FEFD0F011EFD0F01FEF76 -:10A02000D0F0080108013751090AD8B41AEFD0F06E -:10A030001CEFD0F01FEFD0F0000E54EFD0F0060E62 -:10A040000801385D050E08013959020E08013A5918 -:10A05000000E080108013B59D8A031EFD0F033EFD2 -:10A06000D0F036EFD0F0000E54EFD0F0030E080120 -:10A0700008013325E96E000E080108013421EA6E5B -:10A080000801080139510A0DF3CF3CF80801080115 -:10A090003A51640DF35008013C25080108013825A8 -:10A0A000EF6E010E54EFD0F01200080108010D51BF -:10A0B000D8B45DEFD0F05FEFD0F065EFD0F0030ED5 -:10A0C000080108010E2769EFD0F0030E080108010E -:10A0D0000E5F03EFD2F00B0E080108010E6573EF5F -:10A0E000D0F075EFD0F084EFD0F0170E0801080122 -:10A0F0000E617DEFD0F07FEFD0F084EFD0F007015C -:10A100000701092B11EFD2F0030E080108010E65BB -:10A110008CEFD0F08EEFD0F0B9EFD0F00E0E08013A -:10A1200008010E6196EFD0F098EFD0F0B9EFD0F0C3 -:10A13000190E070107010965A0EFD0F0A2EFD0F0DA -:10A14000B1EFD0F008010F6F010E070107012B6F6F -:10A1500008010F51000E06010601DF6F000E060117 -:10A16000E06F08010F6F000E07010701096F08017A -:10A170000F5111EFD2F00EC812F80DC811F8C6EC4D -:10A180002CF011C8FDF412C8FEF404010401FE29EC -:10A19000FE0ED8B4FD19D8A4D0EFD0F0D2EFD0F095 -:10A1A000D6EFD0F008EC40F011EFD2F0040104013A -:10A1B000FD29D8B4FE29D8A4E0EFD0F0E2EFD0F02A -:10A1C000E4EFD0F011EFD2F006010601E051DF110B -:10A1D000D8A4EDEFD0F0EFEFD0F0F9EFD0F004011C -:10A1E0000401FD5106010601E06F0601DF6B62EF1D -:10A1F000D1F004010401FD5106010601DF13040141 -:10A200000401FE5106010601E0132DEFD1F0080113 -:10A210000F6F060E07010701346F08010F513F0E43 -:10A2200007010701986F000E0701996F52EFD1F0F7 -:10A2300008010F6F080E07010701346F08010F5165 -:10A240004F0E07010701986F000E0701996F52EF3B -:10A25000D1F008EC40F011EFD2F00601DFC60FF8A4 -:10A260000601E0C610F8080148EFD1F008010F51CF -:10A270004D0ADEE029EFD1F008010F512D0AD8E098 -:10A2800029EFD1F008010F514C0AC1E029EFD1F0BC -:10A29000080110510A0AEAE0100AEEE0F00AF2E0C2 -:10A2A00029EFD1F008010F6F020E070107012B6F94 -:10A2B00008010F5108010F6F000E07010701096F18 -:10A2C00008010F5111EFD2F00EC812F80DC811F8A5 -:10A2D000C6EC2CF011C8FDF412C8FEF40401040110 -:10A2E000FE29FE0ED8B4FD19D8A479EFD1F07BEF8A -:10A2F000D1F07FEFD1F008EC40F011EFD2F0040183 -:10A300000401FD29D8B4FE29D8A489EFD1F08BEF40 -:10A31000D1F08DEFD1F011EFD2F00601B20E0701AE -:10A3200007010925E96EEA6A0601060EEA22040120 -:10A33000FDC4EFFF07010701092B070107013407DF -:10A34000070107013467A7EFD1F0A9EFD1F0B9EF0A -:10A35000D0F008EC40F00BEC43F0850E080108014A -:10A360002E6FFF0E08012F6F930E080108012C6F4E -:10A37000FF0E08012D6FF5EC43F0700E0801080187 -:10A380002E6FFF0E08012F6F2D0E080108012C6F94 -:10A39000FF0E08012D6FF5EC43F006010801DFC642 -:10A3A0002EF806010801E0C62FF808010801306BFD -:10A3B0000801316BAB0E080108012C6FFF0E08017C -:10A3C0002D6F71EC43F009C726F80601B20E0801A3 -:10A3D0000801246F0601060E0801256FB10E080161 -:10A3E0000801226FFF0E0801236FB7EC43F008014C -:10A3F0000F6F010E080108012C6F08010F515CEC72 -:10A4000041F011EFD2F0070107012B51000A01E1E1 -:10A4100062D6010A01E1AFD6030A01E155D711EF77 -:10A42000D2F0120008013C6F000E08010801356FE0 -:10A4300008013C5108013C6F000E08010801366F0D -:10A4400008013C51000E08010801386F000E080198 -:10A45000396F000E08013A6F000E08013B6F3CEFA8 -:10A46000D3F0030E08010801366539EFD2F03BEF57 -:10A47000D2F03DEFD2F052EFD3F0300E08010801D8 -:10A48000375F08010801356748EFD2F04AEFD2F094 -:10A4900059EFD2F0090E08010801376552EFD2F0EA -:10A4A00054EFD2F057EFD2F0000ECBEFD3F028EFFD -:10A4B000D3F0080108013551030AD8A462EFD2F0A5 -:10A4C00064EFD2F0C1EFD2F0080108013751FE0A63 -:10A4D000D8B46DEFD2F06FEFD2F072EFD2F0000E81 -:10A4E000CBEFD3F0060E0801385D050E080139598F -:10A4F000020E08013A59000E080108013B59D8A084 -:10A5000084EFD2F086EFD2F089EFD2F0000ECBEFDD -:10A51000D3F0080108013651080108013325E96E1E -:10A520000801000E080108013421EA6E0801080143 -:10A5300039510A0DF3CF3CF8080108013A51640D76 -:10A54000F35008013C25080108013825EF6E080189 -:10A550000801362B08013C6F000E08010801356F19 -:10A5600008013C51000E08010801386F000E080177 -:10A57000396F000E08013A6F000E08013B6F3CEF87 -:10A58000D3F0080108013751FE0AD8A4CAEFD2F06F -:10A59000CCEFD2F01BEFD3F0060E0801385D050EAC -:10A5A00008013959020E08013A59000E0801080144 -:10A5B0003B59D8A0DEEFD2F0E0EFD2F0E3EFD2F0DB -:10A5C000000ECBEFD3F00801080136510801080155 -:10A5D0003325E96E0801000E080108013421EA6EF6 -:10A5E0000801080139510A0DF3CF3CF808010801B0 -:10A5F0003A51640DF35008013C2508010801382543 -:10A60000EF6E08010801362B08013C6F000E0801AF -:10A610000801356F08013C51000E08010801386F30 -:10A62000000E0801396F000E08013A6F000E080194 -:10A630003B6F3CEFD3F0090E08010801376523EFAB -:10A64000D3F025EFD3F028EFD3F0000ECBEFD3F00B -:10A6500008010801352B080108013AC83BF8080138 -:10A66000080139C83AF80801080138C839F8080162 -:10A670000801386B37C838F8080131C8E9FF08010C -:10A6800032C8EAFF08010801314B322BEF500801B4 -:10A690000801376F0801376750EFD3F052EFD3F05E -:10A6A00031EFD2F0080108013751D8B45AEFD3F096 -:10A6B0005CEFD3F096EFD3F00801080137512F0A71 -:10A6C000D8B465EFD3F067EFD3F096EFD3F008017D -:10A6D000080137510D0AD8B470EFD3F072EFD3F000 -:10A6E00096EFD3F00801080137510A0AD8B47BEF7E -:10A6F000D3F07DEFD3F096EFD3F008010801375186 -:10A70000200AD8B486EFD3F088EFD3F096EFD3F0D9 -:10A71000080108013751090AD8B491EFD3F093EF3B -:10A72000D3F096EFD3F0000ECBEFD3F0060E080176 -:10A73000385D050E08013959020E08013A59000E1C -:10A74000080108013B59D8A0A8EFD3F0AAEFD3F035 -:10A75000ADEFD3F0000ECBEFD3F0030E08010801EC -:10A760003325E96E000E080108013421EA6E080164 -:10A77000080139510A0DF3CF3CF8080108013A519C -:10A78000640DF35008013C25080108013825EF6EDF -:10A79000010ECBEFD3F012000801526F0B0E08012F -:10A7A0000801226F080152510801526F0A0E080178 -:10A7B0000801236F0801525106EE6DF018EE3CF0CF -:10A7C000140EEECFE6FFE82EE1EFD3F006EE81F0B7 -:10A7D00018EE28F0140EEECFE6FFE82EEBEFD3F0E4 -:10A7E000FDEC40F00009D8A4F8EFD3F0FAEFD3F075 -:10A7F000FCEFD3F080EFD5F0FA0E08010801566F98 -:10A80000FF0E0801576F4CEC27F00009D8B40BEF8E -:10A81000D4F00DEFD4F015EFD4F0C9EC26F0080118 -:10A820000801655108010801226FF80E08010801AE -:10A83000566FFF0E0801576F4CEC27F00009D8B493 -:10A8400024EFD4F026EFD4F02EEFD4F0C9EC26F0AC -:10A8500008010801655108010801236F2D0E080148 -:10A860000801566FFF0E0801576F4CEC27F00009E6 -:10A87000D8B43DEFD4F03FEFD4F0B4EFD4F00801FA -:10A88000526F140E08010801676F08015251080148 -:10A890003C0E08010801656F0801080E0801666F8B -:10A8A0000EEC18F0AB0E08010801566FFF0E080100 -:10A8B000576F4CEC27F00009D8B461EFD4F063EF88 -:10A8C000D4F076EFD4F00801526F140E080108019D -:10A8D000676F080152510801280E08010801656FD1 -:10A8E0000801080E0801666F0EEC18F0580E0801FA -:10A8F0000801676FFF0E0801686F08013C0E080130 -:10A900000801656F0801080E0801666F49EC29F01F -:10A91000080166516511D8A490EFD4F092EFD4F0FD -:10A92000AEEFD4F0E60E08010801676FFE0E0801D5 -:10A93000686F0801280E08010801656F0801080EFC -:10A940000801666F49EC29F0080166516511D8B419 -:10A95000ACEFD4F0AEEFD4F0B0EFD4F080EFD5F0A0 -:10A96000F4EC1CF080EFD5F0FC0E08010801566FE6 -:10A97000FF0E0801576F4CEC27F00009D8A4C3EF75 -:10A98000D4F0C5EFD4F0C7EFD4F080EFD5F00801D4 -:10A99000526FC80E08010801676F08015251050186 -:10A9A000000E08010801656F0501050E0801666FBC -:10A9B0000EEC18F00009D8A4E0EFD4F0E2EFD4F0E8 -:10A9C000E4EFD4F080EFD5F0EA0E08010801566FED -:10A9D000FF0E0801576F4CEC27F00009D8B4F3EFD5 -:10A9E000D4F0F5EFD4F028EFD5F0C9EC26F065C827 -:10A9F00024F866C825F867C826F868C827F8A1C7EC -:10AA000068F8BEEC20F07D0E08010801685D000EBC -:10AA100008016959D8A00FEFD5F011EFD5F028EF54 -:10AA2000D5F065EC3FF0EA0E08010801536FFF0E08 -:10AA30000801546FB6EC35F024C853F825C854F813 -:10AA400026C855F827C856F866EC13F04DEC0EF002 -:10AA50006DEC44F00801526F000E08010801506FC0 -:10AA60000801525171EFD5F00801526F020E080132 -:10AA70000801566F0801525177EC44F00501000EB1 -:10AA800008010801536F0501050E0801546FCAEC57 -:10AA900028F00801526F000E08010801516F0801EB -:10AAA000525161EFD5F00E0E0801526F850EE82E5F -:10AAB00057EFD5F0522F57EFD5F000D0080108011D -:10AAC000512B08010801225108010801515DD8A04D -:10AAD0006CEFD5F06EEFD5F053EFD5F0080108011B -:10AAE000502B08010801235108010801505DD8A02E -:10AAF0007CEFD5F07EEFD5F034EFD5F05FEC44F08D -:10AB000012000801236F000E08010801106F0801F0 -:10AB10002351000E08010801156F000E0801166F81 -:10AB2000000E0801176F000E0801186F010E0801D2 -:10AB30000801196F000E08011A6F000E08011B6F43 -:10AB4000000E08011C6F08010F0E08010801356F87 -:10AB50000801080E0801366F08010D0E08010801F2 -:10AB6000336F0801080E0801346F99EC3CF00801BE -:10AB70000F0E080108012E6F0801080E08012F6F43 -:10AB800008010D0E080108012C6F0801080E0801CC -:10AB90002D6FACEC2AF00DC813F80EC814F808019C -:10ABA00008010FC811F808010801126B000E080116 -:10ABB00008011D6F000E08011E6F080108011E51DB -:10ABC000800A800F200ED8B41D5DD8A0EAEFD5F022 -:10ABD000ECEFD5F0EEEFD5F052EFD6F008010F0E06 -:10ABE00008010801276F0801080E0801286F0801F5 -:10ABF0000D0E08010801256F0801080E0801266FD7 -:10AC0000C2EC2EF008010801216F08010801215152 -:10AC1000020AD8A40EEFD6F010EFD6F013EFD6F05C -:10AC2000000E21EFD7F0080108012151D8B41BEF25 -:10AC3000D6F01DEFD6F035EFD6F008010801195116 -:10AC4000080108011513080108011A51080108013B -:10AC50001613080108011B51080108011713080108 -:10AC600008011C510801080118130801D8900801B7 -:10AC7000193708011A3708011B3708011C3708016A -:10AC800008011D4B1E2B080108011E51800A800F70 -:10AC9000200ED8B41D5DD8A050EFD6F052EFD6F0FC -:10ACA000EEEFD5F0000E080108011F6F000E08013D -:10ACB000206F080108012051800A800F040ED8B4CB -:10ACC0001F5DD8A066EFD6F068EFD6F06AEFD6F039 -:10ACD000C1EFD6F008010F0E08010801276F080127 -:10ACE000080E0801286F08010D0E08010801256FE4 -:10ACF0000801080E0801266FC2EC2EF008010801B9 -:10AD0000226F080108012251020AD8A48AEFD6F066 -:10AD10008CEFD6F08FEFD6F0000E21EFD7F00801C0 -:10AD200008012251D8B497EFD6F099EFD6F0AEEFE4 -:10AD3000D6F01FC823F8010E0801246F0801232B49 -:10AD4000A5EFD6F0D890080124370801232FA2EFF1 -:10AD5000D6F0080124510801080110130801080168 -:10AD60001F4B202B080108012051800A800F040E80 -:10AD7000D8B41F5DD8A0BFEFD6F0C1EFD6F06AEF10 -:10AD8000D6F00801080110510C0AD8B4CAEFD6F069 -:10AD9000CCEFD6F0CFEFD6F0000E21EFD7F00BECD2 -:10ADA00043F0850E080108012E6FFF0E08012F6F7A -:10ADB000930E080108012C6FFF0E08012D6FF5ECB2 -:10ADC00043F03F0E080108012E6FFF0E08012F6FA0 -:10ADD0002D0E080108012C6FFF0E08012D6FF5ECF8 -:10ADE00043F00701560E080108012E6F0701070EF8 -:10ADF00008012F6FAB0E080108012C6FFF0E080130 -:10AE00002D6FF5EC43F015C82EF816C82FF817C8AB -:10AE100030F818C831F8B10E080108012C6FFF0E88 -:10AE200008012D6F71EC43F00801236F010E08013A -:10AE300008012C6F080123515CEC41F0010E21EF59 -:10AE4000D7F012000201000E08010801566F02013E -:10AE5000020E0801576F0801586F000E0801080123 -:10AE6000556F08015851040E0801080155653BEF64 -:10AE7000D7F03DEFD7F03FEFD7F0B4EFD8F00C0E9E -:10AE8000080108015625E96E000E08010801572146 -:10AE9000EA6EEE50ED10D8A450EFD7F052EFD7F095 -:10AEA000A0EFD8F00C0E080108015625E96E000E3F -:10AEB000080108015721EA6E080151C8EEFF080198 -:10AEC00052C8EDFF0801080152515111D8A46BEF8F -:10AED000D7F06DEFD7F0A4EFD7F0010E0601060111 -:10AEE000DD5D200E0601DE59D8B079EFD7F07BEF9B -:10AEF000D7F089EFD7F0000E06010601DD5D100ED8 -:10AF00000601DE59D8B087EFD7F089EFD7F090EF80 -:10AF1000D7F0000E06010601DD6F100E0601DE6F90 -:10AF20000C0E080108015625E96E000E0801080103 -:10AF30005721EA6E0601DDC6EEFF0601DEC6EDFF13 -:10AF400006010601DD4BDE2B080108015051D8B483 -:10AF5000ACEFD7F0AEEFD7F0BAEFD7F008014F5112 -:10AF60004C114D114E11D8A4B8EFD7F0BAEFD7F06D -:10AF7000DCEFD7F00A0E080108015D6F000E080132 -:10AF80005E6FFF0E080108015B6F000E08015C6F29 -:10AF900056C859F857C85AF853EC40F00E0E08013D -:10AFA00008015625E96E000E080108015721EA6ED6 -:10AFB000050EEF6E89EFD8F07AEFD8F056C8E9FFAA -:10AFC00057C8EAFF08014CC8EEFF08014DC8EEFF64 -:10AFD00008014EC8EEFF08014FC8EEFF0801080146 -:10AFE0005051020AD8B4F7EFD7F0FAEFD7F0010EBC -:10AFF000FBEFD7F0000E0801586F140E080108018E -:10B000005625E96E000E080108015721EA6EEF503F -:10B0100008015819FE0B5819EF6E0E0E08010801B1 -:10B020005625E96E000E080108015721EA6E010E4F -:10B03000EF6E89EFD8F056C8E9FF57C8EAFF08015C -:10B040004CC8EEFF08014DC8EEFF08014EC8EEFFE8 -:10B0500008014FC8EEFF130E080108015625E96EDE -:10B06000000E080108015721EA6E000EEF6E0F0E68 -:10B07000080108015625E96E000E08010801572154 -:10B08000EA6E270EEE6E000EEE6E000EEE6E000EF5 -:10B09000ED6EED52ED520E0E080108015625E96ED7 -:10B0A000000E080108015721EA6E020EEF6E89EFCB -:10B0B000D8F00A0E08010801B06F000E0801B16F48 -:10B0C0004CC8AEF84DC8AFF856C8ACF857C8ADF884 -:10B0D00058EC3AF00E0E080108015625E96E000EF4 -:10B0E000080108015721EA6E050EEF6E89EFD8F0CE -:10B0F00089EFD8F0080108015051010A01E15ED73B -:10B10000030A01E15BD7010A96E0070AD2E078EF73 -:10B11000D8F00A0E080108015625E96E000E080154 -:10B1200008015721EA6E080153C8EEFF080154C810 -:10B13000EDFF55C80DF7080108015551B7EFD8F0DC -:10B14000170E080108015627000E080157230801B1 -:10B150000801552B040E080108015565B2EFD8F01F -:10B16000B4EFD8F03FEFD7F0FF0EB7EFD8F01200F2 -:10B1700008010F0E08010801356F0801080E0801CB -:10B18000366F08010D0E08010801336F0801080E23 -:10B190000801346F99EC3CF00801206F000E0801A3 -:10B1A0000801106F08012051040E08010801186FF2 -:10B1B000000E0801196F0801080119AFE2EFD8F07D -:10B1C000E4EFD8F0E6EFD8F086EFD9F00801206F71 -:10B1D000000E080108011C6F08012051000E080133 -:10B1E00008011D6F000E08011E6F080108011E51A5 -:10B1F000800A800F080ED8B41D5DD8A002EFD9F0E8 -:10B2000004EFD9F006EFD9F05DEFD9F008010F0E89 -:10B2100008010801246F0801080E0801256F0801C4 -:10B220000D0E08010801226F0801080E0801236FA6 -:10B2300021EC38F0080108011F6F080108011F51B7 -:10B24000020AD8A426EFD9F028EFD9F02BEFD9F0D5 -:10B25000000E3EEFDAF0080108011F51D8B433EFB9 -:10B26000D9F035EFD9F04AEFD9F01DC820F8010E1A -:10B270000801216F0801202B41EFD9F0D890080177 -:10B2800021370801202F3EEFD9F008012151080194 -:10B2900008011C13080108011D4B1E2B08010801A1 -:10B2A0001E51800A800F080ED8B41D5DD8A05BEF38 -:10B2B000D9F05DEFD9F006EFD9F008010801185177 -:10B2C000040A1911D8A467EFD9F069EFD9F06BEF30 -:10B2D000D9F01CC810F80801130E08010801182540 -:10B2E000E96EEA6A0801080EEA2208011CC8EFFFAD -:10B2F000080108011807D8A019070801080119AFAB -:10B3000084EFD9F086EFD9F0E6EFD8F0000E08010F -:10B310000801116F000E0801126F000E08010801EC -:10B320001A6F000E08011B6F080108011B51800AEB -:10B33000800F040ED8B41A5DD8A0A1EFD9F0A3EF06 -:10B34000D9F0A5EFD9F0DBEFD9F00801206F310E6D -:10B3500008010801246F080120510801130E08019B -:10B3600008011A25E96EEA6A0801080EEA22EF5080 -:10B3700008010801236F11C822F85FEC2EF00801C4 -:10B38000216F0801215108010801116F0801126B9A -:10B39000080108011A4B1B2B080108011B51800AE8 -:10B3A000800F040ED8B41A5DD8A0D9EFD9F0DBEF26 -:10B3B000D9F0A5EFD9F0080110C820F80801216BD9 -:10B3C0000801080112510801211905E108010801CD -:10B3D000115108012019D8B4F0EFD9F0F2EFD9F0EB -:10B3E000F5EFD9F0000E3EEFDAF00BEC43F0850EEE -:10B3F000080108012E6FFF0E08012F6F930E080140 -:10B4000008012C6FFF0E08012D6FF5EC43F0170EAD -:10B41000080108012E6FFF0E08012F6F2D0E080185 -:10B4200008012C6FFF0E08012D6FF5EC43F00801A9 -:10B43000206F050E08010801266F08012051080140 -:10B44000130E08010801246F0801080E0801256F7A -:10B45000B10E08010801226FFF0E0801236FB7EC3F -:10B4600043F00801206F010E080108012C6F08014C -:10B4700020515CEC41F0010E3EEFDAF012000801C1 -:10B48000166F000E08010801156F08011651000E15 -:10B490000801080115654FEFDAF051EFDAF053EFCC -:10B4A000DAF0BDEFDBF015C871F81DEC2BF017508A -:10B4B0000D0AD8B45EEFDAF060EFDAF062EFDAF09E -:10B4C000B0EFDBF0B7EC24F0435008010801141989 -:10B4D000D8B46DEFDAF06FEFDAF071EFDAF0B0EFC9 -:10B4E000DBF0180E406E020E416E08010801116774 -:10B4F0007CEFDAF07EEFDAF08FEFDAF012C82DF0A1 -:10B5000013C82EF018860801166F040E176E080176 -:10B51000165112C81AF013C81BF0ABEFDBF0000E87 -:10B5200006010601D05D040E0601D159D8A09BEF9B -:10B53000DAF09DEFDAF0ABEFDAF0890E06010601E2 -:10B54000D05D130E0601D159D8A0A9EFDAF0ABEF08 -:10B55000DAF0B2EFDAF0000E06010601D06F040E49 -:10B560000601D16FD0C62DF0D1C62EF0060106011E -:10B57000D04BD12B12C82BF013C82CF0C4EC43F0E5 -:10B58000A1C80FF0A2C810F0A3C811F0A4C812F00F -:10B5900018889BEFDBF00DC833F00EC834F00FC8ED -:10B5A00035F010C836F0080108011151020AD8B46C -:10B5B000DCEFDAF0DFEFDAF0010EE0EFDAF0000EA8 -:10B5C0000801166F0801164716473F500801161963 -:10B5D000FB0B16193F6E0801166F000E176E08015F -:10B5E0001651ABEFDBF0080108EE0FF0EECF16F8C6 -:10B5F000EDCF17F8080108010D51080116270801C1 -:10B6000008010E5108011723080108011251080111 -:10B610001627080108011351080117232D500801AE -:10B6200016191A6E2E50080117191B6E0DC833F02B -:10B630000EC834F00FC835F010C836F00801166F88 -:10B64000000E426E08011651270E1D6E000E1E6E72 -:10B65000000E1F6E000E206E0801166F020E176E90 -:10B6600008011651ABEFDBF008010DC8F6FF080129 -:10B670000EC8F7FF000EF86E0900F5CF16F80900A6 -:10B68000F5CF17F8080100EE02F008010D51E92688 -:10B6900008010E51EA22EECF18F8EDCF19F8080193 -:10B6A00016510801182508011A6F080117510801E1 -:10B6B000192108011B6F08010801125108011A27FE -:10B6C00008010801135108011B232D5008011A1904 -:10B6D0001A6E2E5008011B191B6E0A0E0801080174 -:10B6E000B06F000E0801B16F0DC8AEF80EC8AFF80C -:10B6F000330E08010801AC6F000E0801AD6F58EC65 -:10B700003AF00801166F050E176E08011651080170 -:10B71000166F010E08010801736F08011651080128 -:10B72000176F020E08010801726F080117519FEC94 -:10B73000A1F0ABEFDBF0080108011151010A01E1B2 -:10B740002AD7030A01E127D7010A01E14CD7070AEA -:10B750008BE0ABEFDBF0080108011551C0EFDBF027 -:10B7600008010801152B000E080108011565BBEF43 -:10B77000DBF0BDEFDBF053EFDAF0FE0EC0EFDBF0F5 -:10B78000120006010601D767C8EFDBF0CAEFDBF055 -:10B7900013EFDCF00DC864F88FEC3FF0030E0801E6 -:10B7A0000801176F000E0801186FE20E080108016A -:10B7B000156FFF0E0801166F0101000E0801080148 -:10B7C000136F0101010E0801146FFAEC2DF008014E -:10B7D00014511311D8A4EFEFDBF0F1EFDBF0FBEF26 -:10B7E000DBF008010F6F010E06010601D76F08019B -:10B7F0000F5111EFDCF0010101010251D8B403EF48 -:10B80000DCF005EFDCF011EFDCF001C100F102C16A -:10B8100001F108010F6F000E01010101026F080123 -:10B820000F513BEFDDF006010601D705D8A41BEF51 -:10B83000DCF01DEFDCF0C0EFDCF00DC864F88FEC3D -:10B840003FF00101000E08010801596F0101010ECE -:10B8500008015A6F3DEC37F0080159512B0A5A1173 -:10B86000D8A435EFDCF037EFDCF0BEEFDCF00801F8 -:10B870000F6F030E080108010E6F08010F512A0E09 -:10B88000080108010E6547EFDCF049EFDCF04BEFF3 -:10B89000DCF0ACEFDCF0020E08010801156F000EC1 -:10B8A0000801166FFD0E080108010E2508010801A8 -:10B8B000136F0801146BFF0E0801142347EC1CF0F2 -:10B8C0000501E40E080108011325E96EEA6A050185 -:10B8D000050EEA2208010EC80FF80801106B010ED0 -:10B8E00008010F27000E10230101000E08010F258B -:10B8F000E16E0101010E08011021E26EE75008011E -:10B900000801726F2DEC2DF00801116F0101000E7E -:10B91000080108010E25E16EE26A0101010EE22232 -:10B92000E75008010801726F2DEC2DF00801126F2D -:10B9300008011239F00B08011111EF6E020E080117 -:10B9400008010E272A0E080108010E65AAEFDCF097 -:10B95000ACEFDCF04BEFDCF065EC3FF008010F6F73 -:10B96000020E06010601D76F08010F5108010F6F83 -:10B97000000E070107013D6F08010F513BEFDDF09D -:10B9800006010601D751020AD8A4C9EFDCF0CBEFBB -:10B99000DCF0EFEFDCF0080108010D513A0AD8A401 -:10B9A000D4EFDCF0D6EFDCF0E2EFDCF065EC3FF05A -:10B9B00008010F6F030E06010601D76F08010F5132 -:10B9C000EDEFDCF007013D3BF00E3D170DC872F8BE -:10B9D0002DEC2DF0070107013D133BEFDDF00601D3 -:10B9E0000601D751030AD8A4F8EFDCF0FAEFDCF037 -:10B9F00022EFDDF00DC864F88FEC3FF0070107017E -:10BA00003D07070107013D6708EFDDF00AEFDDF0B4 -:10BA100020EFDDF0B8EC38F00009D8B412EFDDF01B -:10BA200014EFDDF01EEFDDF008010F6F040E0601CC -:10BA30000601D76F08010F5120EFDDF065EC3FF0F4 -:10BA40003BEFDDF006010601D751040AD8A42BEF25 -:10BA5000DDF02DEFDDF03BEFDDF065EC3FF00DC8E4 -:10BA600064F88FEC3FF008010F6F010E060106012C -:10BA7000D76F08010F5112000801B86F000E0801BE -:10BA80000801B36F0801B8510801B86F000E080132 -:10BA90000801B26F0801B85108010801AC29D8B4F7 -:10BAA000AD29D8A456EFDDF058EFDDF064EFDDF0FE -:10BAB0000801B86F010E08010801B36F0801B85101 -:10BAC000E2CEACF8E3CEADF808010801AE29D8B457 -:10BAD000AF29D8A46EEFDDF070EFDDF07CEFDDF084 -:10BAE0000801B86F010E08010801B26F0801B851D2 -:10BAF000E0CEAEF8E1CEAFF8020E08010801B05D6D -:10BB0000000E0801B159D8B088EFDDF08AEFDDF002 -:10BB1000CFEFDDF0E0CEB4F8E1CEB5F8E2CEB6F886 -:10BB2000E3CEB7F8AEC8E0FEAFC8E1FEACC8E2FEB7 -:10BB3000ADC8E3FEA3EFDDF04BEC44F008010801D3 -:10BB4000C06F64EC44F008010801B007D8A0B10749 -:10BB50000801B029D8B4B129D8A4B1EFDDF0B3EF12 -:10BB6000DDF09CEFDDF008010801B267BAEFDDF00F -:10BB7000BCEFDDF0C0EFDDF0B4C8E0FEB5C8E1FE1B -:10BB800008010801B367C7EFDDF0C9EFDDF0CDEFC5 -:10BB9000DDF0B6C8E2FEB7C8E3FE82EFDEF00801D2 -:10BBA0000801B351D8B4D7EFDDF0D9EFDDF0EEEFF7 -:10BBB000DDF008010801B05108010801AC250801B9 -:10BBC0000801B66F08010801B15108010801AD2153 -:10BBD0000801B76FB6C8E2FEB7C8E3FEFF0E080162 -:10BBE0000801AE250801B86FFF0E08010801AF215A -:10BBF0000801B96F0801B85108010801B027080110 -:10BC0000B95108010801B12306EFDEF00E010E0163 -:10BC1000DFBB0DEFDEF00FEFDEF006EFDEF0AEC8BB -:10BC2000F0FEAFC8F1FEACC8F4FEADC8F5FECE0E16 -:10BC300008010801AE5D0A0E0801AF59D8B023EF24 -:10BC4000DEF025EFDEF03AEFDEF0CE0E080108015F -:10BC5000B05D0A0E0801B159D8A031EFDEF033EF24 -:10BC6000DEF03AEFDEF00801CE0E0801B05F0A0EFA -:10BC70000801B15BB0C8F2FEB1C8F3FE0E01DF9956 -:10BC80000E01DF8B44EFDEF00E010E01DFBB4BEF48 -:10BC9000DEF04DEFDEF044EFDEF008010801B251B6 -:10BCA000D8B455EFDEF057EFDEF082EFDEF008019A -:10BCB0000801B04BB12BCE0E08010801AE5D0A0E93 -:10BCC0000801AF59D8B067EFDEF069EFDEF07EEF24 -:10BCD000DEF0CE0E08010801B05D0A0E0801B15970 -:10BCE000D8A075EFDEF077EFDEF07EEFDEF0080132 -:10BCF000CE0E0801B05F0A0E0801B15BB0C8E0FECD -:10BD0000B1C8E1FE1200000E08010801606F000ECC -:10BD10000801616F000E08010801596592EFDEF01D -:10BD200094EFDEF09DEFDEF0000E08010801596F80 -:10BD3000000E08015A6FC8EFDFF059C871F81DEC0A -:10BD40002BF059C868F8BEEC20F068C85EF869C8E6 -:10BD50005FF8080108015F515E11D8A4B2EFDEF070 -:10BD6000B4EFDEF0C1EFDEF059C868F8F6EC3BF056 -:10BD7000000E08010801596F000E08015A6FC8EF44 -:10BD8000DFF05EC862F85FC863F8080108015E5121 -:10BD9000080108015C5D080108015F510801080104 -:10BDA0005D59D8B0D6EFDEF0D8EFDEF0DCEFDEF094 -:10BDB0005CC862F85DC863F819B0E1EFDEF0E3EF4C -:10BDC000DEF00EEFDFF000EE03F0EECF64F8EDCF23 -:10BDD00065F801500801645F02500801655BD89066 -:10BDE000080165310801676F080164310801666F59 -:10BDF000080108015E510801665D080108015F51F4 -:10BE000008016759D8A007EFDFF009EFDFF00EEF68 -:10BE1000DFF059C868F8F6EC3BF0198000EE07F047 -:10BE2000EECF64F8EDCF65F8080108016251080112 -:10BE300064270801080163510801652303500801C4 -:10BE4000645D045008016559D8A029EFDFF02BEF9D -:10BE5000DFF068EFDFF00750035C08010801606F56 -:10BE6000085004580801616F60C8AAF861C8ABF8AF -:10BE70000801646F010E08010801A96F08016451EF -:10BE80005AC8A7F85BC8A8F81CC0A6F807C0A4F851 -:10BE900008C0A5F8A0EC23F00801080160510801D2 -:10BEA00008015A27080108016151080108015B23B4 -:10BEB00008010801605108010801625F08010801DA -:10BEC000615108010801635B01C007F002C008F07E -:10BED00062C8AAF863C8ABF80801646F010E0801D4 -:10BEE0000801A96F080164515AC8A7F85BC8A8F8EF -:10BEF0001CC0A6F807C0A4F808C0A5F8A0EC23F061 -:10BF0000080108016251072608010801635108224F -:10BF1000080108015E51080108015C5D0801080183 -:10BF20005F51080108015D59D8A099EFDFF09BEF40 -:10BF3000DFF0A1EFDFF059C868F8F6EC3BF0B5EFA1 -:10BF4000DFF018BAA6EFDFF0A8EFDFF0B5EFDFF013 -:10BF5000188A5AEC42F0060E08010801A125136E5A -:10BF6000000E08010801A221146E080108016051A9 -:10BF700008010801622508010801596F080108013C -:10BF8000615108010801632108015A6FC8EFDFF011 -:10BF90001200C00E08010801126F100E0801136F85 -:10BFA00006010601D151D011D8A4D9EFDFF0DBEFA3 -:10BFB000DFF0F4EFDFF09BEC03F0FF0E0801080167 -:10BFC00016150801146F070E08010801171508015E -:10BFD000156F000E0801142506010601D06F040E2E -:10BFE000080115210601D16F3C0E080108015D6FA3 -:10BFF000000E08015E6F000E080108015B6F000E65 -:10C0000008015C6F00019F0E08010801596F0001D3 -:10C01000000E08015A6F53EC40F00801146F000E37 -:10C0200008010801096F080114510801146F000E7E -:10C03000080108010B6F08011451000E08010801E6 -:10C040000B6525EFE0F027EFE0F029EFE0F00EEFD1 -:10C05000E1F00BC871F81DEC2BF0080108010B5141 -:10C06000060DF3CF14F8010E08011427680E08011D -:10C070001425F66EF76AFE0EF722F86A000EF82213 -:10C0800008000801F5CF0AF8080108010B51060D58 -:10C09000F3CF14F8020E08011427680E08011425C6 -:10C0A000F66EF76AFE0EF722F86A000EF822090013 -:10C0B0000801F5CF10F80A000801F5CF11F80801C2 -:10C0C00008010B51060DF3CF14F8040E08011427D4 -:10C0D000680E08011425F66EF76AFE0EF722F86A5C -:10C0E000000EF82209000801F5CF0EF80A00080139 -:10C0F000F5CF0FF8B3EFE0F012C80CF813C80DF845 -:10C10000080110C814F8080111C815F80801080141 -:10C110000E5108011427080108010F5108011523C9 -:10C12000290E08011427000E1523080114510801D7 -:10C130000801122708011551080108011323A1EF76 -:10C14000E0F0FD0E08010801125D1F0E08011359F1 -:10C15000D8B0ADEFE0F0AFEFE0F0A1EFE0F0BAEF74 -:10C16000E0F0B1EFE0F0080108010A51000AC4E074 -:10C17000B1EFE0F00AC81CF0270E080108010C25F9 -:10C18000016E000E080108010D21026E01C014F8B5 -:10C1900002C015F808010801105108011427080110 -:10C1A0000801115108011523010E08011425036E21 -:10C1B000000E08011521046E080108010E51032428 -:10C1C000056E080108010F510420066E0801146F66 -:10C1D0000D0E176E080114511896B7EC24F00801E3 -:10C1E00008010B51060D680EF324F66EF76AFE0E79 -:10C1F000F722F86A000EF8220800F5CF43F06CEC45 -:10C2000033F0080108010B2B000E080108010B6533 -:10C210000CEFE1F00EEFE1F029EFE0F01200000E7C -:10C2200008010801146F000E0801156F000E0801C7 -:10C23000166F000E0801176F010E08010801106F3C -:10C24000000E0801116F000E0801126F000E0801A8 -:10C25000136F08010F0E08010801356F0801080E61 -:10C260000801366F08010D0E08010801336F08013F -:10C27000080E0801346F99EC3CF008010F0E08011C -:10C2800008012E6F0801080E08012F6F08010D0E1E -:10C29000080108012C6F0801080E08012D6FACEC95 -:10C2A0002AF0000E08010801186F000E0801196F2E -:10C2B000080108011951800A800F0C0ED8B4185DCE -:10C2C000D8A065EFE1F067EFE1F069EFE1F000EF92 -:10C2D000E2F008010F0E080108012E6F0801080E98 -:10C2E00008012F6F08010D0E080108012C6F0801CD -:10C2F000080E08012D6FACEC2AF0080108011A6F36 -:10C3000008010F0E080108012E6F0801080E080130 -:10C310002F6F08010D0E080108012C6F0801080E8F -:10C3200008012D6FACEC2AF0080108011B6F080111 -:10C330000F0E080108012E6F0801080E08012F6F6B -:10C3400008010D0E080108012C6F0801080E0801F4 -:10C350002D6FACEC2AF0080108011C6F08010F0ECC -:10C36000080108012E6F0801080E08012F6F08014F -:10C370000D0E080108012C6F0801080E08012D6F31 -:10C38000ACEC2AF0080108011D6F0801D8900801E3 -:10C390001437080115370801163708011737DBEF86 -:10C3A000E1F0EDEFE1F0080108011481EDEFE1F0BB -:10C3B000000E4FEFE2F01DC822F81CC821F81BC880 -:10C3C00020F81AC81FF807EC32F0000AEAE0010A68 -:10C3D000EAE0030AEDE0EDEFE1F008010801184B97 -:10C3E000192B080108011951800A800F0C0ED8B4CE -:10C3F000185DD8A0FEEFE1F000EFE2F069EFE1F0A8 -:10C4000008011751141115111611D8A40AEFE2F002 -:10C410000CEFE2F00FEFE2F0000E4FEFE2F00BEC6A -:10C4200043F0580E080108012E6FFF0E08012F6F10 -:10C430002D0E080108012C6FFF0E08012D6FF5EC81 -:10C4400043F0220E080108012E6FFF0E08012F6F26 -:10C45000AB0E080108012C6FFF0E08012D6FF5ECE3 -:10C4600043F014C82EF815C82FF816C830F817C8AE -:10C4700031F8B10E080108012C6FFF0E08012D6F75 -:10C4800071EC43F008011E6F020E080108012C6FC9 -:10C4900008011E515CEC41F0010E4FEFE2F012007A -:10C4A0007AEFE3F05F0E08010801536F760E080182 -:10C4B000546F5F0E08010801516F760E0801526F2C -:10C4C0000801096F040E08010801506F08010951A5 -:10C4D000000E080108014C6F000E08014D6F000EA0 -:10C4E00008014E6F000E08014F6F22ECD7F00601D5 -:10C4F0000601F96F06010601F929D8A482EFE2F0DE -:10C5000084EFE2F086EFE2F08BEFE3F00701070142 -:10C51000302B8BEFE3F0F9C64CF8D9EC39F0080179 -:10C520004D514C11D8A497EFE2F099EFE2F09BEF58 -:10C53000E2F08BEFE3F00801080E080108014D6FEF -:10C540000801080E08014E6F35EC3DF08FEC41F00C -:10C55000080108010851440AD8B4B1EFE2F0B3EF82 -:10C56000E2F0B5EFE2F08BEFE3F007010701302BCB -:10C570000A0E08010801B06F000E0801B16F050135 -:10C58000DA0E08010801AE6F0501050E0801AF6F54 -:10C5900006010601F951170D0201000EF3240801EE -:10C5A0000801AC6F0801AD6B0201020E0801AD235A -:10C5B00058EC3AF0F9C64CF893EC39F008014D51BB -:10C5C0004C11D8A4E6EFE2F0E8EFE2F0EAEFE2F097 -:10C5D0008BEFE3F0CA0E080108010A6FFE0E080196 -:10C5E0000B6FE6EC42F00801096F000E080108012C -:10C5F000086F08010951050E08010801086503EFDD -:10C60000E3F005EFE3F007EFE3F046EFE3F008C8EF -:10C6100009F82D0E0801092700016C0E08010925F3 -:10C62000E96EEA6A0001000EEA22EF5008010801F3 -:10C63000586F0DEC3FF008010801536F67EC3DF0B7 -:10C6400008C809F82D0E0801092700016C0E080121 -:10C650000925E96EEA6A0001000EEA22EF5008019E -:10C660000801646FE1EC3EF008010801536F67ECCC -:10C670003DF008010801082B050E080108010865B6 -:10C6800044EFE3F046EFE3F007EFE3F00801096F52 -:10C690003A0E08010801536F0801095167EC3DF09B -:10C6A0000001E10E080108010A6F0001000E0801F7 -:10C6B0000B6FD3EC42F00801096F3A0E0801080134 -:10C6C000536F0801095167EC3DF0F20E08010801B3 -:10C6D0000A6FFF0E08010B6FE6EC42F053EC21F0FD -:10C6E0000801096F010E07010701306F08010951A8 -:10C6F0008BEFE3F0070107013051000A01E1D2D6C8 -:10C70000010A01E108D7030A01E154D7010A01E156 -:10C7100000D78BEFE3F01200000E08010801606FF4 -:10C72000000E0801616F000E0801080159659BEFBA -:10C73000E3F09DEFE3F0A6EFE3F0000E080108013F -:10C74000596F000E08015A6FBFEFE4F059C871F835 -:10C750001DEC2BF059C868F8BEEC20F068C85EF8F4 -:10C7600069C85FF8080108015F515E11D8A4BBEFEA -:10C77000E3F0BDEFE3F0CAEFE3F059C868F8F6EC78 -:10C780003BF0000E08010801596F000E08015A6FB6 -:10C79000BFEFE4F019B0CFEFE3F0D1EFE3F0FCEF3F -:10C7A000E3F000EE03F0EECF64F8EDCF65F8015052 -:10C7B0000801645F02500801655BD890080165318B -:10C7C0000801676F080164310801666F08010801FC -:10C7D0005E510801665D080108015F510801675953 -:10C7E000D8A0F5EFE3F0F7EFE3F0FCEFE3F059C882 -:10C7F00068F8F6EC3BF019805EC862F85FC863F831 -:10C80000080108015E51080108015C5D080108018A -:10C810005F51080108015D59D8B011EFE4F013EF42 -:10C82000E4F017EFE4F05CC862F85DC863F800EE6E -:10C8300007F0EECF64F8EDCF65F80801080162510A -:10C8400008016427080108016351080165230350AA -:10C850000801645D045008016559D8A032EFE4F086 -:10C8600034EFE4F067EFE4F00750035C08010801DF -:10C87000606F085004580801616F60C86DF861C8A6 -:10C880006EF85AC86BF85BC86CF81CC06AF807C031 -:10C8900068F808C069F8E7EC21F008010801605168 -:10C8A000080108015A27000E080108015B2308014E -:10C8B0000801605108010801625F08010801615127 -:10C8C00008010801635B01C007F002C008F062C8FC -:10C8D0006DF863C86EF85AC86BF85BC86CF81CC07A -:10C8E0006AF807C068F808C069F8E7EC21F00801A9 -:10C8F0000801625107260801080163510822080156 -:10C9000008015E51080108015C5D080108015F51E2 -:10C91000080108015D59D8A090EFE4F092EFE4F02F -:10C9200098EFE4F059C868F8F6EC3BF0ACEFE4F0AF -:10C9300018BA9DEFE4F09FEFE4F0ACEFE4F0188A52 -:10C940005AEC42F0060E08010801A125136E000EF4 -:10C9500008010801A221146E0801080160510801B4 -:10C960000801622508010801596F08010801615199 -:10C9700008010801632108015A6FBFEFE4F01200BB -:10C98000000E080108010D6F000E08010E6FA1C70F -:10C9900068F8BEEC20F07D0E08010801685D000E0D -:10C9A00008016959D8B0D7EFE4F0D9EFE4F0DBEF34 -:10C9B000E4F0EAEFE5F0120E080108015D6F000EE9 -:10C9C00008015E6F000E080108015B6F000E080190 -:10C9D0005C6F0501C80E08010801596F0501050EBD -:10C9E00008015A6F53EC40F0080108010E51800A0B -:10C9F000800F060ED8B40D5DD8A001EFE5F003EF6F -:10CA0000E5F005EFE5F05BEFE5F00801D8900801EF -:10CA10000D3508010F6F0501C80E08010F25E96EDD -:10CA2000EA6A0501050EEA220001DB0E0801080191 -:10CA30000D25E16EE26A0001000EE222E7500801D6 -:10CA40000801586F0DEC3FF0EF6E0801D890080117 -:10CA50000D3508010F6F010E08010F270501C80EE3 -:10CA600008010F25E96EEA6A0501050EEA220001B8 -:10CA7000DB0E080108010D25E16EE26A0001000EDF -:10CA8000E222E75008010801646FE1EC3EF0EF6E2E -:10CA9000080108010D4B0E2B080108010E51800AF8 -:10CAA000800F060ED8B40D5DD8A059EFE5F05BEF0E -:10CAB000E5F005EFE5F065EC3FF0360E0801080102 -:10CAC000536FFF0E0801546FB6EC35F021EC44F0C3 -:10CAD000700E08010801326FFE0E0801336FE60E7A -:10CAE00008010801306FFF0E0801316FAAEC43F016 -:10CAF0000501C80E08010801326F0501050E080185 -:10CB0000336FDE0E08010801306FFF0E0801316F30 -:10CB1000AAEC43F0E10E08010F6F000E106F0FC872 -:10CB200032F810C833F87E0E08010801306FFF0E8E -:10CB30000801316FAAEC43F0CA0E08010801326FF8 -:10CB4000FF0E0801336FC00E08010801306FFF0EA1 -:10CB50000801316FAAEC43F037EC44F021EC44F0CB -:10CB6000020E08010801346F000E0801356F000E37 -:10CB70000801366F000E0801376F2D0E08010801FD -:10CB8000326FFF0E0801336F40EC43F0F20E0801E4 -:10CB90000801326FFF0E0801336F480E08010801CB -:10CBA000306FFF0E0801316FAAEC43F0D80E080178 -:10CBB0000801326FFE0E0801336FF50E08010801FF -:10CBC000306FFF0E0801316FAAEC43F037EC44F0F0 -:10CBD0004DEC0EF01200000E08010801106F000E5F -:10CBE0000801116F000E0801126F000E0801136F8B -:10CBF000010E08010801146F000E0801156F000EE8 -:10CC00000801166F000E0801176F08010F0E0801CA -:10CC10000801356F0801080E0801366F08010D0E76 -:10CC200008010801336F0801080E0801346F99EC00 -:10CC30003CF0000E08010801186F000E0801196F82 -:10CC4000080108011951800A800F180ED8B4185D28 -:10CC5000D8A02DEFE6F02FEFE6F031EFE6F0DBEFB6 -:10CC6000E6F008010F0E080108012E6F0801080EFA -:10CC700008012F6F08010D0E080108012C6F080133 -:10CC8000080E08012D6FACEC2AF0080108011A6F9C -:10CC900008010F0E080108012E6F0801080E080197 -:10CCA0002F6F08010D0E080108012C6F0801080EF6 -:10CCB00008012D6FACEC2AF0080108011B6F080178 -:10CCC0000F0E080108012E6F0801080E08012F6FD2 -:10CCD00008010D0E080108012C6F0801080E08015B -:10CCE0002D6FACEC2AF0080108011C6F08010F0E33 -:10CCF000080108012E6F0801080E08012F6F0801B6 -:10CD00000D0E080108012C6F0801080E08012D6F97 -:10CD1000ACEC2AF0080108011D6FAEEFE6F0BEEFA3 -:10CD2000E6F0080108011451080108011013080178 -:10CD300008011551080108011113080108011651D5 -:10CD40000801080112130801080117510801080120 -:10CD50001313BEEFE6F0000E0BEFE7F01DC822F84C -:10CD60001CC821F81BC820F81AC81FF861EC32F063 -:10CD7000000AD5E0010AD5E0ABEFE6F00801D89053 -:10CD8000080114370801153708011637080117374D -:10CD900008010801184B192B080108011951800AD4 -:10CDA000800F180ED8B4185DD8A0D9EFE6F0DBEFED -:10CDB000E6F031EFE6F00BEC43F0F30E080108016A -:10CDC0002E6FFE0E08012F6F2D0E080108012C6F2B -:10CDD000FF0E08012D6FF5EC43F010C82EF811C8B6 -:10CDE0002FF812C830F813C831F8B10E0801080145 -:10CDF0002C6FFF0E08012D6F71EC43F008011E6FC0 -:10CE0000020E080108012C6F08011E515CEC41F074 -:10CE1000010E0BEFE7F01200070107010B6713EF9C -:10CE2000E7F015EFE7F036EFE7F0030E0801080131 -:10CE300016651DEFE7F01FEFE7F029EFE7F00D0EA5 -:10CE400008010801166527EFE7F029EFE7F02CEF5E -:10CE5000E7F0FE0EFDEFE7F00801176F010E070186 -:10CE600007010B6F08011751FAEFE7F007010701FF -:10CE70000B05D8A43EEFE7F040EFE7F08AEFE7F0CC -:10CE80000B0E08010801166548EFE7F04AEFE7F0DE -:10CE900054EFE7F0160E08010801166552EFE7F0AF -:10CEA00054EFE7F076EFE7F0070129C717F808011C -:10CEB000186B0701070199510801181905E10701CD -:10CEC0000701985108011719D8B469EFE7F06BEF23 -:10CED000E7F076EFE7F00801176F000E0701070192 -:10CEE0000B6F08011751FE0EFDEFE7F000900801EF -:10CEF000080115A17DEFE7F000800801176F020E11 -:10CF0000070107010B6F08011751000E00B0010E59 -:10CF1000FDEFE7F0070107010B51020AD8A493EFD8 -:10CF2000E7F095EFE7F0FAEFE7F008010801155197 -:10CF3000D8B49DEFE7F09FEFE7F0BDEFE7F0030E09 -:10CF4000080108011665A7EFE7F0A9EFE7F0BDEFCC -:10CF5000E7F00E0E080108011661B1EFE7F0B3EF3C -:10CF6000E7F0BDEFE7F00801176F000E07010701BA -:10CF70000B6F08011751F7EFE7F00B0E08010801DE -:10CF80001665C5EFE7F0C7EFE7F0DBEFE7F0170E48 -:10CF9000080108011661CFEFE7F0D1EFE7F0DBEF12 -:10CFA000E7F00801176F010E070107010B6F080179 -:10CFB0001751F7EFE7F0030E080108011665E3EFDC -:10CFC000E7F0E5EFE7F0F7EFE7F00E0E08010801F4 -:10CFD0001661EDEFE7F0EFEFE7F0F7EFE7F00801AC -:10CFE000176F000E070107010B6F08011751FF0EA5 -:10CFF000FDEFE7F0FF0EFDEFE7F01200D180120029 -:04FFF8009EF7FDFF74 -:00000001FF diff --git a/telldus-gui/Plugins/Controllers/header_bg.png b/telldus-gui/Plugins/Controllers/header_bg.png deleted file mode 100644 index 564a158b..00000000 Binary files a/telldus-gui/Plugins/Controllers/header_bg.png and /dev/null differ diff --git a/telldus-gui/Plugins/Controllers/icon.png b/telldus-gui/Plugins/Controllers/icon.png deleted file mode 100644 index a71ba880..00000000 Binary files a/telldus-gui/Plugins/Controllers/icon.png and /dev/null differ diff --git a/telldus-gui/Plugins/Controllers/main.qml b/telldus-gui/Plugins/Controllers/main.qml deleted file mode 100644 index fb8f164b..00000000 --- a/telldus-gui/Plugins/Controllers/main.qml +++ /dev/null @@ -1,30 +0,0 @@ -import QtQuick 1.1 - -//import QtDesktop 0.1 - -Item { - width: 500 //Minimum width - - Column { - spacing: 1 - anchors.fill: parent - - BorderImage { - id: header - source: "header_bg.png" - width: parent.width; height: 40 - border.left: 5; border.top: 5 - border.right: 5; border.bottom: 5 - - HeaderTitle { - text: "Controllers" - anchors.left: parent.left - anchors.leftMargin: 15 - } - } - Repeater { - model: controllerModel - delegate: ControllerView {} - } - } -} diff --git a/telldus-gui/Plugins/Controllers/osx/WinTypes.h b/telldus-gui/Plugins/Controllers/osx/WinTypes.h deleted file mode 100644 index e8b5b090..00000000 --- a/telldus-gui/Plugins/Controllers/osx/WinTypes.h +++ /dev/null @@ -1,87 +0,0 @@ -#ifndef __WINDOWS_TYPES__ -#define __WINDOWS_TYPES__ - -#define MAX_NUM_DEVICES 50 -#include - -typedef unsigned int DWORD; -typedef unsigned int ULONG; -typedef unsigned short USHORT; -typedef unsigned short SHORT; -typedef unsigned char UCHAR; -typedef unsigned short WORD; -typedef unsigned char BYTE; -typedef BYTE *LPBYTE; -typedef unsigned int BOOL; -typedef unsigned char BOOLEAN; -typedef unsigned char CHAR; -typedef BOOL *LPBOOL; -typedef UCHAR *PUCHAR; -typedef const char *LPCSTR; -typedef char *PCHAR; -typedef void *PVOID; -typedef void *HANDLE; -typedef unsigned int LONG; -typedef int INT; -typedef unsigned int UINT; -typedef char *LPSTR; -typedef char *LPTSTR; -typedef DWORD *LPDWORD; -typedef WORD *LPWORD; -typedef ULONG *PULONG; -typedef PVOID LPVOID; -typedef void VOID; -typedef unsigned long long int ULONGLONG; - -typedef struct _OVERLAPPED { - DWORD Internal; - DWORD InternalHigh; - DWORD Offset; - DWORD OffsetHigh; - HANDLE hEvent; -} OVERLAPPED, *LPOVERLAPPED; - -typedef struct _SECURITY_ATTRIBUTES { - DWORD nLength; - LPVOID lpSecurityDescriptor; - BOOL bInheritHandle; -} SECURITY_ATTRIBUTES , *LPSECURITY_ATTRIBUTES; - -typedef struct timeval SYSTEMTIME; -typedef struct timeval FILETIME; -#ifndef TRUE -#define TRUE 1 -#endif -#ifndef FALSE -#define FALSE 0 -#endif - -// -// Modem Status Flags -// -#define MS_CTS_ON ((DWORD)0x0010) -#define MS_DSR_ON ((DWORD)0x0020) -#define MS_RING_ON ((DWORD)0x0040) -#define MS_RLSD_ON ((DWORD)0x0080) - -// -// Error Flags -// - -#define CE_RXOVER 0x0001 // Receive Queue overflow -#define CE_OVERRUN 0x0002 // Receive Overrun Error -#define CE_RXPARITY 0x0004 // Receive Parity Error -#define CE_FRAME 0x0008 // Receive Framing error -#define CE_BREAK 0x0010 // Break Detected -#define CE_TXFULL 0x0100 // TX Queue is full -#define CE_PTO 0x0200 // LPTx Timeout -#define CE_IOE 0x0400 // LPTx I/O Error -#define CE_DNS 0x0800 // LPTx Device not selected -#define CE_OOP 0x1000 // LPTx Out-Of-Paper -#define CE_MODE 0x8000 // Requested mode unsupported - -#ifndef INVALID_HANDLE_VALUE -#define INVALID_HANDLE_VALUE 0xFFFFFFFF -#endif - -#endif diff --git a/telldus-gui/Plugins/Controllers/osx/ftd2xx.h b/telldus-gui/Plugins/Controllers/osx/ftd2xx.h deleted file mode 100644 index 04b65274..00000000 --- a/telldus-gui/Plugins/Controllers/osx/ftd2xx.h +++ /dev/null @@ -1,1008 +0,0 @@ -/*++ - - Copyright (c) 2001-2011 Future Technology Devices International Limited - - THIS SOFTWARE IS PROVIDED BY FUTURE TECHNOLOGY DEVICES INTERNATIONAL LIMITED "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL - FUTURE TECHNOLOGY DEVICES INTERNATIONAL LIMITED BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - OF SUBSTITUTE GOODS OR SERVICES LOSS OF USE, DATA, OR PROFITS OR BUSINESS INTERRUPTION) - HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR - TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, - EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - FTDI DRIVERS MAY BE USED ONLY IN CONJUNCTION WITH PRODUCTS BASED ON FTDI PARTS. - - FTDI DRIVERS MAY BE DISTRIBUTED IN ANY FORM AS LONG AS LICENSE INFORMATION IS NOT MODIFIED. - - IF A CUSTOM VENDOR ID AND/OR PRODUCT ID OR DESCRIPTION STRING ARE USED, IT IS THE - RESPONSIBILITY OF THE PRODUCT MANUFACTURER TO MAINTAIN ANY CHANGES AND SUBSEQUENT WHQL - RE-CERTIFICATION AS A RESULT OF MAKING THESE CHANGES. - - - Module Name: - - ftd2xx.h - - Abstract: - - Native USB device driver for FTDI FT232x, FT245x, FT2232x and FT4232x devices - FTD2XX library definitions - - Environment: - - user mode - - - --*/ - - -#ifndef FTD2XX_H -#define FTD2XX_H - -#ifndef _WINDOWS -#include -#define WINAPI -#endif - -// The following ifdef block is the standard way of creating macros -// which make exporting from a DLL simpler. All files within this DLL -// are compiled with the FTD2XX_EXPORTS symbol defined on the command line. -// This symbol should not be defined on any project that uses this DLL. -// This way any other project whose source files include this file see -// FTD2XX_API functions as being imported from a DLL, whereas this DLL -// sees symbols defined with this macro as being exported. - -#ifdef FTD2XX_EXPORTS -#define FTD2XX_API __declspec(dllexport) -#else -#define FTD2XX_API __declspec(dllimport) -#endif - -#ifndef _WINDOWS -#include "WinTypes.h" - -#ifdef FTD2XX_API -#undef FTD2XX_API -#define FTD2XX_API -#endif -#endif -typedef struct _EVENT_HANDLE{ - pthread_cond_t eCondVar; - pthread_mutex_t eMutex; - int iVar; -} EVENT_HANDLE; - -typedef PVOID FT_HANDLE; -typedef ULONG FT_STATUS; - -// -// Device status -// -enum { - FT_OK, - FT_INVALID_HANDLE, - FT_DEVICE_NOT_FOUND, - FT_DEVICE_NOT_OPENED, - FT_IO_ERROR, - FT_INSUFFICIENT_RESOURCES, - FT_INVALID_PARAMETER, - FT_INVALID_BAUD_RATE, //7 - - FT_DEVICE_NOT_OPENED_FOR_ERASE, - FT_DEVICE_NOT_OPENED_FOR_WRITE, - FT_FAILED_TO_WRITE_DEVICE, - FT_EEPROM_READ_FAILED, - FT_EEPROM_WRITE_FAILED, - FT_EEPROM_ERASE_FAILED, - FT_EEPROM_NOT_PRESENT, - FT_EEPROM_NOT_PROGRAMMED, - FT_INVALID_ARGS, - FT_NOT_SUPPORTED, - FT_OTHER_ERROR -}; - - -#define FT_SUCCESS(status) ((status) == FT_OK) - -// -// FT_OpenEx Flags -// - -#define FT_OPEN_BY_SERIAL_NUMBER 1 -#define FT_OPEN_BY_DESCRIPTION 2 -#define FT_OPEN_BY_LOCATION 4 - -// -// FT_ListDevices Flags (used in conjunction with FT_OpenEx Flags -// - -#define FT_LIST_NUMBER_ONLY 0x80000000 -#define FT_LIST_BY_INDEX 0x40000000 -#define FT_LIST_ALL 0x20000000 - -#define FT_LIST_MASK (FT_LIST_NUMBER_ONLY|FT_LIST_BY_INDEX|FT_LIST_ALL) - -// -// Baud Rates -// - -#define FT_BAUD_300 300 -#define FT_BAUD_600 600 -#define FT_BAUD_1200 1200 -#define FT_BAUD_2400 2400 -#define FT_BAUD_4800 4800 -#define FT_BAUD_9600 9600 -#define FT_BAUD_14400 14400 -#define FT_BAUD_19200 19200 -#define FT_BAUD_38400 38400 -#define FT_BAUD_57600 57600 -#define FT_BAUD_115200 115200 -#define FT_BAUD_230400 230400 -#define FT_BAUD_460800 460800 -#define FT_BAUD_921600 921600 - -// -// Word Lengths -// - -#define FT_BITS_8 (UCHAR) 8 -#define FT_BITS_7 (UCHAR) 7 - -// -// Stop Bits -// - -#define FT_STOP_BITS_1 (UCHAR) 0 -#define FT_STOP_BITS_2 (UCHAR) 2 - -// -// Parity -// - -#define FT_PARITY_NONE (UCHAR) 0 -#define FT_PARITY_ODD (UCHAR) 1 -#define FT_PARITY_EVEN (UCHAR) 2 -#define FT_PARITY_MARK (UCHAR) 3 -#define FT_PARITY_SPACE (UCHAR) 4 - -// -// Flow Control -// - -#define FT_FLOW_NONE 0x0000 -#define FT_FLOW_RTS_CTS 0x0100 -#define FT_FLOW_DTR_DSR 0x0200 -#define FT_FLOW_XON_XOFF 0x0400 - -// -// Purge rx and tx buffers -// -#define FT_PURGE_RX 1 -#define FT_PURGE_TX 2 - -// -// Events -// - -typedef void (*PFT_EVENT_HANDLER)(DWORD,DWORD); - -#define FT_EVENT_RXCHAR 1 -#define FT_EVENT_MODEM_STATUS 2 -#define FT_EVENT_LINE_STATUS 4 - -// -// Timeouts -// - -#define FT_DEFAULT_RX_TIMEOUT 300 -#define FT_DEFAULT_TX_TIMEOUT 300 - -// -// Device types -// - -typedef ULONG FT_DEVICE; - -enum { - FT_DEVICE_BM, - FT_DEVICE_AM, - FT_DEVICE_100AX, - FT_DEVICE_UNKNOWN, - FT_DEVICE_2232C, - FT_DEVICE_232R, - FT_DEVICE_2232H, - FT_DEVICE_4232H - }; - -// -// Bit Modes -// - -#define FT_BITMODE_RESET 0x00 -#define FT_BITMODE_ASYNC_BITBANG 0x01 -#define FT_BITMODE_MPSSE 0x02 -#define FT_BITMODE_SYNC_BITBANG 0x04 -#define FT_BITMODE_MCU_HOST 0x08 -#define FT_BITMODE_FAST_SERIAL 0x10 -#define FT_BITMODE_CBUS_BITBANG 0x20 -#define FT_BITMODE_SYNC_FIFO 0x40 - - -#ifdef __cplusplus -extern "C" { -#endif - -FTD2XX_API -FT_STATUS WINAPI FT_Open( - int deviceNumber, - FT_HANDLE *pHandle - ); - -FTD2XX_API -FT_STATUS WINAPI FT_OpenEx( - PVOID pArg1, - DWORD Flags, - FT_HANDLE *pHandle - ); - -FTD2XX_API -FT_STATUS WINAPI FT_ListDevices( - PVOID pArg1, - PVOID pArg2, - DWORD Flags - ); - -FTD2XX_API -FT_STATUS FT_SetVIDPID( - DWORD dwVID, - DWORD dwPID - ); - -FTD2XX_API -FT_STATUS FT_GetVIDPID( - DWORD * pdwVID, - DWORD * pdwPID - ); - -FTD2XX_API -FT_STATUS WINAPI FT_Close( - FT_HANDLE ftHandle - ); - -FTD2XX_API -FT_STATUS WINAPI FT_Read( - FT_HANDLE ftHandle, - LPVOID lpBuffer, - DWORD nBufferSize, - LPDWORD lpBytesReturned - ); - -FTD2XX_API -FT_STATUS WINAPI FT_Write( - FT_HANDLE ftHandle, - LPVOID lpBuffer, - DWORD nBufferSize, - LPDWORD lpBytesWritten - ); - -FTD2XX_API -FT_STATUS WINAPI FT_IoCtl( - FT_HANDLE ftHandle, - DWORD dwIoControlCode, - LPVOID lpInBuf, - DWORD nInBufSize, - LPVOID lpOutBuf, - DWORD nOutBufSize, - LPDWORD lpBytesReturned, - LPOVERLAPPED lpOverlapped - ); - -FTD2XX_API -FT_STATUS WINAPI FT_SetBaudRate( - FT_HANDLE ftHandle, - ULONG BaudRate - ); - -FTD2XX_API -FT_STATUS WINAPI FT_SetDivisor( - FT_HANDLE ftHandle, - USHORT Divisor - ); - -FTD2XX_API -FT_STATUS WINAPI FT_SetDataCharacteristics( - FT_HANDLE ftHandle, - UCHAR WordLength, - UCHAR StopBits, - UCHAR Parity - ); - -FTD2XX_API -FT_STATUS WINAPI FT_SetFlowControl( - FT_HANDLE ftHandle, - USHORT FlowControl, - UCHAR XonChar, - UCHAR XoffChar - ); - -FTD2XX_API -FT_STATUS WINAPI FT_ResetDevice( - FT_HANDLE ftHandle - ); - -FTD2XX_API -FT_STATUS WINAPI FT_SetDtr( - FT_HANDLE ftHandle - ); - -FTD2XX_API -FT_STATUS WINAPI FT_ClrDtr( - FT_HANDLE ftHandle - ); - -FTD2XX_API -FT_STATUS WINAPI FT_SetRts( - FT_HANDLE ftHandle - ); - -FTD2XX_API -FT_STATUS WINAPI FT_ClrRts( - FT_HANDLE ftHandle - ); - -FTD2XX_API -FT_STATUS WINAPI FT_GetModemStatus( - FT_HANDLE ftHandle, - ULONG *pModemStatus - ); - -FTD2XX_API -FT_STATUS WINAPI FT_SetChars( - FT_HANDLE ftHandle, - UCHAR EventChar, - UCHAR EventCharEnabled, - UCHAR ErrorChar, - UCHAR ErrorCharEnabled - ); - -FTD2XX_API -FT_STATUS WINAPI FT_Purge( - FT_HANDLE ftHandle, - ULONG Mask - ); - -FTD2XX_API -FT_STATUS WINAPI FT_SetTimeouts( - FT_HANDLE ftHandle, - ULONG ReadTimeout, - ULONG WriteTimeout - ); - -FTD2XX_API -FT_STATUS WINAPI FT_GetQueueStatus( - FT_HANDLE ftHandle, - DWORD *dwRxBytes - ); - -FTD2XX_API -FT_STATUS WINAPI FT_SetEventNotification( - FT_HANDLE ftHandle, - DWORD Mask, - PVOID Param - ); - -FTD2XX_API -FT_STATUS WINAPI FT_GetStatus( - FT_HANDLE ftHandle, - DWORD *dwRxBytes, - DWORD *dwTxBytes, - DWORD *dwEventDWord - ); - -FTD2XX_API -FT_STATUS WINAPI FT_SetBreakOn( - FT_HANDLE ftHandle - ); - -FTD2XX_API -FT_STATUS WINAPI FT_SetBreakOff( - FT_HANDLE ftHandle - ); - -FTD2XX_API -FT_STATUS WINAPI FT_SetWaitMask( - FT_HANDLE ftHandle, - DWORD Mask - ); - -FTD2XX_API -FT_STATUS WINAPI FT_WaitOnMask( - FT_HANDLE ftHandle, - DWORD *Mask - ); - -FTD2XX_API -FT_STATUS WINAPI FT_GetEventStatus( - FT_HANDLE ftHandle, - DWORD *dwEventDWord - ); - -FTD2XX_API -FT_STATUS WINAPI FT_ReadEE( - FT_HANDLE ftHandle, - DWORD dwWordOffset, - LPWORD lpwValue - ); - -FTD2XX_API -FT_STATUS WINAPI FT_WriteEE( - FT_HANDLE ftHandle, - DWORD dwWordOffset, - WORD wValue - ); - -FTD2XX_API -FT_STATUS WINAPI FT_EraseEE( - FT_HANDLE ftHandle - ); - -// -// structure to hold program data for FT_Program function -// -typedef struct ft_program_data { - - DWORD Signature1; // Header - must be 0x00000000 - DWORD Signature2; // Header - must be 0xffffffff - DWORD Version; // Header - FT_PROGRAM_DATA version - // 0 = original - // 1 = FT2232C extensions - // 2 = FT232R extensions - // 3 = FT2232H extensions - // 4 = FT4232H extensions - WORD VendorId; // 0x0403 - WORD ProductId; // 0x6001 - char *Manufacturer; // "FTDI" - char *ManufacturerId; // "FT" - char *Description; // "USB HS Serial Converter" - char *SerialNumber; // "FT000001" if fixed, or NULL - WORD MaxPower; // 0 < MaxPower <= 500 - WORD PnP; // 0 = disabled, 1 = enabled - WORD SelfPowered; // 0 = bus powered, 1 = self powered - WORD RemoteWakeup; // 0 = not capable, 1 = capable - // - // Rev4 (FT232B) extensions - // - UCHAR Rev4; // non-zero if Rev4 chip, zero otherwise - UCHAR IsoIn; // non-zero if in endpoint is isochronous - UCHAR IsoOut; // non-zero if out endpoint is isochronous - UCHAR PullDownEnable; // non-zero if pull down enabled - UCHAR SerNumEnable; // non-zero if serial number to be used - UCHAR USBVersionEnable; // non-zero if chip uses USBVersion - WORD USBVersion; // BCD (0x0200 => USB2) - // - // Rev 5 (FT2232) extensions - // - UCHAR Rev5; // non-zero if Rev5 chip, zero otherwise - UCHAR IsoInA; // non-zero if in endpoint is isochronous - UCHAR IsoInB; // non-zero if in endpoint is isochronous - UCHAR IsoOutA; // non-zero if out endpoint is isochronous - UCHAR IsoOutB; // non-zero if out endpoint is isochronous - UCHAR PullDownEnable5; // non-zero if pull down enabled - UCHAR SerNumEnable5; // non-zero if serial number to be used - UCHAR USBVersionEnable5; // non-zero if chip uses USBVersion - WORD USBVersion5; // BCD (0x0200 => USB2) - UCHAR AIsHighCurrent; // non-zero if interface is high current - UCHAR BIsHighCurrent; // non-zero if interface is high current - UCHAR IFAIsFifo; // non-zero if interface is 245 FIFO - UCHAR IFAIsFifoTar; // non-zero if interface is 245 FIFO CPU target - UCHAR IFAIsFastSer; // non-zero if interface is Fast serial - UCHAR AIsVCP; // non-zero if interface is to use VCP drivers - UCHAR IFBIsFifo; // non-zero if interface is 245 FIFO - UCHAR IFBIsFifoTar; // non-zero if interface is 245 FIFO CPU target - UCHAR IFBIsFastSer; // non-zero if interface is Fast serial - UCHAR BIsVCP; // non-zero if interface is to use VCP drivers - // - // Rev 6 (FT232R) extensions - // - UCHAR UseExtOsc; // Use External Oscillator - UCHAR HighDriveIOs; // High Drive I/Os - UCHAR EndpointSize; // Endpoint size - UCHAR PullDownEnableR; // non-zero if pull down enabled - UCHAR SerNumEnableR; // non-zero if serial number to be used - UCHAR InvertTXD; // non-zero if invert TXD - UCHAR InvertRXD; // non-zero if invert RXD - UCHAR InvertRTS; // non-zero if invert RTS - UCHAR InvertCTS; // non-zero if invert CTS - UCHAR InvertDTR; // non-zero if invert DTR - UCHAR InvertDSR; // non-zero if invert DSR - UCHAR InvertDCD; // non-zero if invert DCD - UCHAR InvertRI; // non-zero if invert RI - UCHAR Cbus0; // Cbus Mux control - UCHAR Cbus1; // Cbus Mux control - UCHAR Cbus2; // Cbus Mux control - UCHAR Cbus3; // Cbus Mux control - UCHAR Cbus4; // Cbus Mux control - UCHAR RIsD2XX; // non-zero if using D2XX drivers - // - // Rev 7 (FT2232H) Extensions - // - UCHAR PullDownEnable7; // non-zero if pull down enabled - UCHAR SerNumEnable7; // non-zero if serial number to be used - UCHAR ALSlowSlew; // non-zero if AL pins have slow slew - UCHAR ALSchmittInput; // non-zero if AL pins are Schmitt input - UCHAR ALDriveCurrent; // valid values are 4mA, 8mA, 12mA, 16mA - UCHAR AHSlowSlew; // non-zero if AH pins have slow slew - UCHAR AHSchmittInput; // non-zero if AH pins are Schmitt input - UCHAR AHDriveCurrent; // valid values are 4mA, 8mA, 12mA, 16mA - UCHAR BLSlowSlew; // non-zero if BL pins have slow slew - UCHAR BLSchmittInput; // non-zero if BL pins are Schmitt input - UCHAR BLDriveCurrent; // valid values are 4mA, 8mA, 12mA, 16mA - UCHAR BHSlowSlew; // non-zero if BH pins have slow slew - UCHAR BHSchmittInput; // non-zero if BH pins are Schmitt input - UCHAR BHDriveCurrent; // valid values are 4mA, 8mA, 12mA, 16mA - UCHAR IFAIsFifo7; // non-zero if interface is 245 FIFO - UCHAR IFAIsFifoTar7; // non-zero if interface is 245 FIFO CPU target - UCHAR IFAIsFastSer7; // non-zero if interface is Fast serial - UCHAR AIsVCP7; // non-zero if interface is to use VCP drivers - UCHAR IFBIsFifo7; // non-zero if interface is 245 FIFO - UCHAR IFBIsFifoTar7; // non-zero if interface is 245 FIFO CPU target - UCHAR IFBIsFastSer7; // non-zero if interface is Fast serial - UCHAR BIsVCP7; // non-zero if interface is to use VCP drivers - UCHAR PowerSaveEnable; // non-zero if using BCBUS7 to save power for self-powered designs - // - // Rev 8 (FT4232H) Extensions - // - UCHAR PullDownEnable8; // non-zero if pull down enabled - UCHAR SerNumEnable8; // non-zero if serial number to be used - UCHAR ASlowSlew; // non-zero if AL pins have slow slew - UCHAR ASchmittInput; // non-zero if AL pins are Schmitt input - UCHAR ADriveCurrent; // valid values are 4mA, 8mA, 12mA, 16mA - UCHAR BSlowSlew; // non-zero if AH pins have slow slew - UCHAR BSchmittInput; // non-zero if AH pins are Schmitt input - UCHAR BDriveCurrent; // valid values are 4mA, 8mA, 12mA, 16mA - UCHAR CSlowSlew; // non-zero if BL pins have slow slew - UCHAR CSchmittInput; // non-zero if BL pins are Schmitt input - UCHAR CDriveCurrent; // valid values are 4mA, 8mA, 12mA, 16mA - UCHAR DSlowSlew; // non-zero if BH pins have slow slew - UCHAR DSchmittInput; // non-zero if BH pins are Schmitt input - UCHAR DDriveCurrent; // valid values are 4mA, 8mA, 12mA, 16mA - UCHAR ARIIsTXDEN; // non-zero if port A uses RI as RS485 TXDEN - UCHAR BRIIsTXDEN; // non-zero if port B uses RI as RS485 TXDEN - UCHAR CRIIsTXDEN; // non-zero if port C uses RI as RS485 TXDEN - UCHAR DRIIsTXDEN; // non-zero if port D uses RI as RS485 TXDEN - UCHAR AIsVCP8; // non-zero if interface is to use VCP drivers - UCHAR BIsVCP8; // non-zero if interface is to use VCP drivers - UCHAR CIsVCP8; // non-zero if interface is to use VCP drivers - UCHAR DIsVCP8; // non-zero if interface is to use VCP drivers - -} FT_PROGRAM_DATA, *PFT_PROGRAM_DATA; - - -FTD2XX_API -FT_STATUS WINAPI FT_EE_Program( - FT_HANDLE ftHandle, - PFT_PROGRAM_DATA pData - ); - -FTD2XX_API -FT_STATUS WINAPI FT_EE_ProgramEx( - FT_HANDLE ftHandle, - PFT_PROGRAM_DATA lpData, - char *Manufacturer, - char *ManufacturerId, - char *Description, - char *SerialNumber - ); - -FTD2XX_API -FT_STATUS WINAPI FT_EE_Read( - FT_HANDLE ftHandle, - PFT_PROGRAM_DATA pData - ); - -FTD2XX_API -FT_STATUS WINAPI FT_EE_ReadEx( - FT_HANDLE ftHandle, - PFT_PROGRAM_DATA lpData, - char *Manufacturer, - char *ManufacturerId, - char *Description, - char *SerialNumber - ); - -FTD2XX_API -FT_STATUS WINAPI FT_EE_UASize( - FT_HANDLE ftHandle, - LPDWORD lpdwSize - ); - -FTD2XX_API -FT_STATUS WINAPI FT_EE_UAWrite( - FT_HANDLE ftHandle, - PUCHAR pucData, - DWORD dwDataLen - ); - -FTD2XX_API -FT_STATUS WINAPI FT_EE_UARead( - FT_HANDLE ftHandle, - PUCHAR pucData, - DWORD dwDataLen, - LPDWORD lpdwBytesRead - ); - -FTD2XX_API -FT_STATUS WINAPI FT_SetLatencyTimer( - FT_HANDLE ftHandle, - UCHAR ucLatency - ); - -FTD2XX_API -FT_STATUS WINAPI FT_GetLatencyTimer( - FT_HANDLE ftHandle, - PUCHAR pucLatency - ); - -FTD2XX_API -FT_STATUS WINAPI FT_SetBitMode( - FT_HANDLE ftHandle, - UCHAR ucMask, - UCHAR ucEnable - ); - -FTD2XX_API -FT_STATUS WINAPI FT_GetBitMode( - FT_HANDLE ftHandle, - PUCHAR pucMode - ); - -FTD2XX_API -FT_STATUS WINAPI FT_SetUSBParameters( - FT_HANDLE ftHandle, - ULONG ulInTransferSize, - ULONG ulOutTransferSize - ); - -FTD2XX_API -FT_STATUS WINAPI FT_GetDeviceInfo( - FT_HANDLE ftHandle, - FT_DEVICE *lpftDevice, - LPDWORD lpdwID, - PCHAR SerialNumber, - PCHAR Description, - LPVOID Dummy - ); - -FTD2XX_API -FT_STATUS WINAPI FT_GetDeviceLocId( - FT_HANDLE ftHandle, - LPDWORD lpdwLocId - ); - -FTD2XX_API -FT_STATUS WINAPI FT_StopInTask( - FT_HANDLE ftHandle - ); - -FTD2XX_API -FT_STATUS WINAPI FT_RestartInTask( - FT_HANDLE ftHandle - ); - -FTD2XX_API -FT_STATUS WINAPI FT_SetResetPipeRetryCount( - FT_HANDLE ftHandle, - DWORD dwCount - ); - -FTD2XX_API -FT_STATUS WINAPI FT_ResetPort( - FT_HANDLE ftHandle - ); - - -// -// Win32-type functions -// - -FTD2XX_API -FT_HANDLE WINAPI FT_W32_CreateFile( - LPCSTR lpszName, - DWORD dwAccess, - DWORD dwShareMode, - LPSECURITY_ATTRIBUTES lpSecurityAttributes, - DWORD dwCreate, - DWORD dwAttrsAndFlags, - HANDLE hTemplate - ); - -FTD2XX_API -BOOL WINAPI FT_W32_CloseHandle( - FT_HANDLE ftHandle - ); - -FTD2XX_API -BOOL WINAPI FT_W32_ReadFile( - FT_HANDLE ftHandle, - LPVOID lpBuffer, - DWORD nBufferSize, - LPDWORD lpBytesReturned, - LPOVERLAPPED lpOverlapped - ); - -FTD2XX_API -BOOL WINAPI FT_W32_WriteFile( - FT_HANDLE ftHandle, - LPVOID lpBuffer, - DWORD nBufferSize, - LPDWORD lpBytesWritten, - LPOVERLAPPED lpOverlapped - ); - -FTD2XX_API -DWORD WINAPI FT_W32_GetLastError( - FT_HANDLE ftHandle - ); - -FTD2XX_API -BOOL WINAPI FT_W32_GetOverlappedResult( - FT_HANDLE ftHandle, - LPOVERLAPPED lpOverlapped, - LPDWORD lpdwBytesTransferred, - BOOL bWait - ); - -FTD2XX_API -BOOL WINAPI FT_W32_CancelIo( - FT_HANDLE ftHandle - ); - - -// -// Win32 COMM API type functions -// -typedef struct _FTCOMSTAT { - DWORD fCtsHold : 1; - DWORD fDsrHold : 1; - DWORD fRlsdHold : 1; - DWORD fXoffHold : 1; - DWORD fXoffSent : 1; - DWORD fEof : 1; - DWORD fTxim : 1; - DWORD fReserved : 25; - DWORD cbInQue; - DWORD cbOutQue; -} FTCOMSTAT, *LPFTCOMSTAT; - -typedef struct _FTDCB { - DWORD DCBlength; /* sizeof(FTDCB) */ - DWORD BaudRate; /* Baudrate at which running */ - DWORD fBinary: 1; /* Binary Mode (skip EOF check) */ - DWORD fParity: 1; /* Enable parity checking */ - DWORD fOutxCtsFlow:1; /* CTS handshaking on output */ - DWORD fOutxDsrFlow:1; /* DSR handshaking on output */ - DWORD fDtrControl:2; /* DTR Flow control */ - DWORD fDsrSensitivity:1; /* DSR Sensitivity */ - DWORD fTXContinueOnXoff: 1; /* Continue TX when Xoff sent */ - DWORD fOutX: 1; /* Enable output X-ON/X-OFF */ - DWORD fInX: 1; /* Enable input X-ON/X-OFF */ - DWORD fErrorChar: 1; /* Enable Err Replacement */ - DWORD fNull: 1; /* Enable Null stripping */ - DWORD fRtsControl:2; /* Rts Flow control */ - DWORD fAbortOnError:1; /* Abort all reads and writes on Error */ - DWORD fDummy2:17; /* Reserved */ - WORD wReserved; /* Not currently used */ - WORD XonLim; /* Transmit X-ON threshold */ - WORD XoffLim; /* Transmit X-OFF threshold */ - BYTE ByteSize; /* Number of bits/byte, 4-8 */ - BYTE Parity; /* 0-4=None,Odd,Even,Mark,Space */ - BYTE StopBits; /* 0,1,2 = 1, 1.5, 2 */ - char XonChar; /* Tx and Rx X-ON character */ - char XoffChar; /* Tx and Rx X-OFF character */ - char ErrorChar; /* Error replacement char */ - char EofChar; /* End of Input character */ - char EvtChar; /* Received Event character */ - WORD wReserved1; /* Fill for now. */ -} FTDCB, *LPFTDCB; - -typedef struct _FTTIMEOUTS { - DWORD ReadIntervalTimeout; /* Maximum time between read chars. */ - DWORD ReadTotalTimeoutMultiplier; /* Multiplier of characters. */ - DWORD ReadTotalTimeoutConstant; /* Constant in milliseconds. */ - DWORD WriteTotalTimeoutMultiplier; /* Multiplier of characters. */ - DWORD WriteTotalTimeoutConstant; /* Constant in milliseconds. */ -} FTTIMEOUTS,*LPFTTIMEOUTS; - - -FTD2XX_API -BOOL WINAPI FT_W32_ClearCommBreak( - FT_HANDLE ftHandle - ); - -FTD2XX_API -BOOL WINAPI FT_W32_ClearCommError( - FT_HANDLE ftHandle, - LPDWORD lpdwErrors, - LPFTCOMSTAT lpftComstat - ); - -FTD2XX_API -BOOL WINAPI FT_W32_EscapeCommFunction( - FT_HANDLE ftHandle, - DWORD dwFunc - ); - -FTD2XX_API -BOOL WINAPI FT_W32_GetCommModemStatus( - FT_HANDLE ftHandle, - LPDWORD lpdwModemStatus - ); - -FTD2XX_API -BOOL WINAPI FT_W32_GetCommState( - FT_HANDLE ftHandle, - LPFTDCB lpftDcb - ); - -FTD2XX_API -BOOL WINAPI FT_W32_GetCommTimeouts( - FT_HANDLE ftHandle, - FTTIMEOUTS *pTimeouts - ); - -FTD2XX_API -BOOL WINAPI FT_W32_PurgeComm( - FT_HANDLE ftHandle, - DWORD dwMask - ); - -FTD2XX_API -BOOL WINAPI FT_W32_SetCommBreak( - FT_HANDLE ftHandle - ); - -FTD2XX_API -BOOL WINAPI FT_W32_SetCommMask( - FT_HANDLE ftHandle, - ULONG ulEventMask - ); - -FTD2XX_API -BOOL WINAPI FT_W32_SetCommState( - FT_HANDLE ftHandle, - LPFTDCB lpftDcb - ); - -FTD2XX_API -BOOL WINAPI FT_W32_SetCommTimeouts( - FT_HANDLE ftHandle, - FTTIMEOUTS *pTimeouts - ); - -FTD2XX_API -BOOL WINAPI FT_W32_SetupComm( - FT_HANDLE ftHandle, - DWORD dwReadBufferSize, - DWORD dwWriteBufferSize - ); - -FTD2XX_API -BOOL WINAPI FT_W32_WaitCommEvent( - FT_HANDLE ftHandle, - PULONG pulEvent, - LPOVERLAPPED lpOverlapped - ); - -// -// Device information -// - -typedef struct _ft_device_list_info_node { - ULONG Flags; - ULONG Type; - ULONG ID; - DWORD LocId; - char SerialNumber[16]; - char Description[64]; - FT_HANDLE ftHandle; -} FT_DEVICE_LIST_INFO_NODE; - -// Device information flags -enum { - FT_FLAGS_OPENED = 1, - FT_FLAGS_HISPEED = 2 -}; - -FTD2XX_API -FT_STATUS WINAPI FT_CreateDeviceInfoList( - LPDWORD lpdwNumDevs - ); - -FTD2XX_API -FT_STATUS WINAPI FT_GetDeviceInfoList( - FT_DEVICE_LIST_INFO_NODE *pDest, - LPDWORD lpdwNumDevs - ); - -FTD2XX_API -FT_STATUS WINAPI FT_GetDeviceInfoDetail( - DWORD dwIndex, - LPDWORD lpdwFlags, - LPDWORD lpdwType, - LPDWORD lpdwID, - LPDWORD lpdwLocId, - LPVOID lpSerialNumber, - LPVOID lpDescription, - FT_HANDLE *pftHandle - ); - - -// -// Version information -// - -FTD2XX_API -FT_STATUS WINAPI FT_GetDriverVersion( - FT_HANDLE ftHandle, - LPDWORD lpdwVersion - ); - -FTD2XX_API -FT_STATUS WINAPI FT_GetLibraryVersion( - LPDWORD lpdwVersion - ); - -// -// Events -// - -#define EV_RXCHAR 0x0001 // Any Character received -#define EV_RXFLAG 0x0002 // Received certain character -#define EV_TXEMPTY 0x0004 // Transmitt Queue Empty -#define EV_CTS 0x0008 // CTS changed state -#define EV_DSR 0x0010 // DSR changed state -#define EV_RLSD 0x0020 // RLSD changed state -#define EV_BREAK 0x0040 // BREAK received -#define EV_ERR 0x0080 // Line status error occurred -#define EV_RING 0x0100 // Ring signal detected -#define EV_PERR 0x0200 // Printer error occured -#define EV_RX80FULL 0x0400 // Receive buffer is 80 percent full -#define EV_EVENT1 0x0800 // Provider specific event 1 -#define EV_EVENT2 0x1000 // Provider specific event 2 - -// -// Escape Functions -// - -#define SETXOFF 1 // Simulate XOFF received -#define SETXON 2 // Simulate XON received -#define SETRTS 3 // Set RTS high -#define CLRRTS 4 // Set RTS low -#define SETDTR 5 // Set DTR high -#define CLRDTR 6 // Set DTR low -#define RESETDEV 7 // Reset device if possible -#define SETBREAK 8 // Set the device break line. -#define CLRBREAK 9 // Clear the device break line. - -// -// PURGE function flags. -// -#define PURGE_TXABORT 0x0001 // Kill the pending/current writes to the comm port. -#define PURGE_RXABORT 0x0002 // Kill the pending/current reads to the comm port. -#define PURGE_TXCLEAR 0x0004 // Kill the transmit queue if there. -#define PURGE_RXCLEAR 0x0008 // Kill the typeahead buffer if there. - -#ifdef __cplusplus -} -#endif - - -#endif /* FTD2XX_H */ - - - - - - diff --git a/telldus-gui/Plugins/Controllers/qmldir b/telldus-gui/Plugins/Controllers/qmldir deleted file mode 100644 index dee0f82e..00000000 --- a/telldus-gui/Plugins/Controllers/qmldir +++ /dev/null @@ -1,4 +0,0 @@ -HeaderTitle 1.0 HeaderTitle.qml -ControllerView 1.0 ControllerView.qml -ControllerUpgradeDialog 1.0 ControllerUpgradeDialog.qml -StateLabel 1.0 StateLabel.qml diff --git a/telldus-gui/Plugins/Controllers/row_bg.png b/telldus-gui/Plugins/Controllers/row_bg.png deleted file mode 100644 index 06f9d82d..00000000 Binary files a/telldus-gui/Plugins/Controllers/row_bg.png and /dev/null differ diff --git a/telldus-gui/Plugins/Controllers/tellstick.cpp b/telldus-gui/Plugins/Controllers/tellstick.cpp deleted file mode 100644 index a541dfc2..00000000 --- a/telldus-gui/Plugins/Controllers/tellstick.cpp +++ /dev/null @@ -1,339 +0,0 @@ -#include "tellstick.h" -#include -#include -#include -#include -#include - -#ifdef _WINDOWS -#include -#else -#include -#endif -#include "ftd2xx.h" - -inline void msleep( const int msec) { -#ifdef _WINDOWS - Sleep(msec); -#else - usleep(msec*1000); -#endif -} - -class TellStick::PrivateData { -public: - FT_HANDLE ftHandle; -}; - -TellStick::TellStick(int id, int type, const QString &name, QObject *parent) : - Controller(id, type, name, parent) -{ - d = new PrivateData; -} - -TellStick::~TellStick() { - delete d; -} - -void TellStick::setAvailable(bool available) { - Controller::setAvailable(available); - if (!available && upgradeStep() == 0) { - //Doing firmware upgrade - setUpgradeStep(1); - QTimer::singleShot(1000, this, SLOT(aquireTellStick())); //Allow for widget updates - } -} - -bool TellStick::isUpgradable() const { - QString fw = firmware(); - if (fw == "?") { - return false; - } - int firmware = fw.toInt(); - if (type() == 1) { - //TellStick - if (firmware <= 3) { - return false; - } - if (firmware < 6) { - return true; - } - - } else if (type() == 2) { - //TellStick Duo - if (firmware < 10) { - return true; - } - } - return false; -} - -void TellStick::aquireTellStick() { - char *tempSerial = new char[serial().size()+1]; -#ifdef _WINDOWS - strcpy_s(tempSerial, serial().size()+1, serial().toLocal8Bit()); -#else - strcpy(tempSerial, serial().toLocal8Bit()); - int pid = 0x0C30; - if (type() == 2) { - pid = 0x0C31; - } - FT_SetVIDPID(0x1781, pid); -#endif - FT_STATUS ftStatus = FT_OpenEx(tempSerial, FT_OPEN_BY_SERIAL_NUMBER, &d->ftHandle); - delete tempSerial; - if (ftStatus != FT_OK) { - return; - } - //open = true; - - if (type() == 2) { - FT_SetBaudRate(d->ftHandle, 115200); - } else { - FT_SetBaudRate(d->ftHandle, 9600); - } - FT_SetFlowControl(d->ftHandle, FT_FLOW_NONE, 0, 0); - FT_SetTimeouts(d->ftHandle,1000,0); - - setUpgradeStep(2); - QTimer::singleShot(0, this, SLOT(enterBootloader())); -} - -void TellStick::enterBootloader() { - FT_Purge(d->ftHandle, FT_PURGE_RX | FT_PURGE_TX); - - FT_STATUS ftStatus = FT_SetBitMode(d->ftHandle, 0xff, 0x20); - for (int i = 0; i < 100; ++i) { - msleep(1); - QApplication::processEvents(); - } - ftStatus = FT_SetBitMode(d->ftHandle, 0xf0, 0x20); - - char buf = 0; - while(1) { //TODO: Make it possible to bail! - QApplication::processEvents(); - buf = getCh(); - if (buf == 'g') { - break; - } - } - send('r'); - setUpgradeStep(3); - QTimer::singleShot(1000, this, SLOT(downloadFirmware())); -} - -void TellStick::downloadFirmware() { - QString filename = "TellStick"; - int bootloaderStart = 0x3A00; - if (type() == 2) { - filename = "TellStickDuo"; - bootloaderStart = 0x7A00; - } - QString path; - //if (QApplication::arguments().count() > 1) { - // path = QApplication::arguments().at(1); - //} else { - path = QString(":/firmware/%1.hex").arg(filename); - //} - - QByteArray data = readHex(path, bootloaderStart); - int bytesLeft = 0, i = 0; - char byte; - - while (i < data.length()) { - QApplication::processEvents(); - byte = getCh(); - QApplication::processEvents(); - if (byte == 'b') { - bytesLeft = data.length() - i; - if (bytesLeft > 0xFF) { - bytesLeft = 0xFF; - } - send(bytesLeft); - } else if (byte == 'd') { - send(data[i]); - --bytesLeft; - ++i; - this->setUpgradeProgress( (qreal)i/(qreal)data.length()*100.0 ); - } - } - setUpgradeStep(4); - QTimer::singleShot(0, this, SLOT(rebootTellStick())); -} - -void TellStick::rebootTellStick() { - FT_STATUS ftStatus = FT_SetBitMode(d->ftHandle, 0xff, 0x20); - for (int i = 0; i < 100; ++i) { - msleep(1); - QApplication::processEvents(); - } - ftStatus = FT_SetBitMode(d->ftHandle, 0xf0, 0x20); - FT_Close(d->ftHandle); - QApplication::processEvents(); - setUpgradeStep(5); - QTimer::singleShot(0, this, SLOT(connectTellStick())); -} - -void TellStick::connectTellStick() { - int pid = 0x0C30; - if (type() == 2) { - pid = 0x0C31; - } - tdConnectTellStickController(0x1781, pid, this->serial().toUtf8()); - setUpgradeStep(-1); - emit upgradableChanged(); - emit upgradeDone(); -} - -char TellStick::getCh() { - char buf = 0; - DWORD dwBytesRead = 0; - FT_Read(d->ftHandle, &buf, sizeof(buf), &dwBytesRead); - return buf; -} - -void TellStick::send(uchar ch) { - DWORD bytesWritten; - FT_Write(d->ftHandle, &ch, sizeof(ch), &bytesWritten); -} - -QByteArray TellStick::readHex(const QString &filename, int maxAddress) { - QByteArray data; - - QFile file(filename); - if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { - return ""; - } - while( !file.atEnd() ) { - QByteArray fileLine = file.readLine(); - - if (fileLine[0] != ':' || fileLine.length() < 11) { - // skip line if not hex line entry,or not minimum length ":BBAAAATTCC" - continue; - } - - int byteCount = parseHex(fileLine, 1, 2); - int startAddress = parseHex(fileLine, 3, 4); - int recordType = parseHex(fileLine, 7, 2); - - if (recordType == 1) { - //End of file, break - break; - } - if (recordType == 2) { - //Not implemented yet - } else if (recordType == 4) { - //Extended Linear Address Record not supported - break; - } else if (recordType == 0) { //Data record - if (fileLine.length() < (11+ (2*byteCount))) { - // skip if line isn't long enough for bytecount. - continue; - } - //Protect us from overwriting the bootloader - if (startAddress >= maxAddress) { - continue; - } - //Pad with empty data when needed - if ((startAddress > data.size())) { - while (startAddress > data.size()) { - data.append((char)0xFF); - } - } - - for (int lineByte = 0; lineByte < byteCount; lineByte++) { - unsigned char hex = (unsigned char)parseHex(fileLine, 9 + (2 * lineByte), 2); - data.append(hex); - } - } - } - for (int i = 0; i < 64; ++i) { //At least 64-bytes extra so the last block will be written to the memory - data.append((char)0xff); - } - return data; -} - -int TellStick::parseHex(const QByteArray &characters, int start, int length) { - int integer = 0; - - for (int i = 0; i < length; i++) { - integer *= 16; - switch(characters[start + i]) { - case '1': - integer += 1; - break; - - case '2': - integer += 2; - break; - - case '3': - integer += 3; - break; - - case '4': - integer += 4; - break; - - case '5': - integer += 5; - break; - - case '6': - integer += 6; - break; - - case '7': - integer += 7; - break; - - case '8': - integer += 8; - break; - - case '9': - integer += 9; - break; - - case 'A': - case 'a': - integer += 10; - break; - - case 'B': - case 'b': - integer += 11; - break; - - case 'C': - case 'c': - integer += 12; - break; - - case 'D': - case 'd': - integer += 13; - break; - - case 'E': - case 'e': - integer += 14; - break; - - case 'F': - case 'f': - integer += 15; - break; - } - } - return integer; -} - -void TellStick::upgrade() { - setUpgradeStep(0); - int pid = 0x0C30; - if (type() == 2) { - pid = 0x0C31; - } - tdDisconnectTellStickController(0x1781, pid, serial().toUtf8()); //TODO: Make dynamic for TellStick Duo -} diff --git a/telldus-gui/Plugins/Controllers/tellstick.h b/telldus-gui/Plugins/Controllers/tellstick.h deleted file mode 100644 index ee0af52e..00000000 --- a/telldus-gui/Plugins/Controllers/tellstick.h +++ /dev/null @@ -1,56 +0,0 @@ -#ifndef TELLSTICK_H -#define TELLSTICK_H - -#include "controller.h" - -class TellStick : public Controller -{ - Q_OBJECT - -public: - explicit TellStick(int id = 0, int type = 1, const QString &name = "", QObject *parent = 0); - virtual ~TellStick(); - - //bool available() const; - virtual void setAvailable(bool available); - - /*QString firmware() const; - void setFirmware(const QString &version); - - int id() const; - - QString name() const; - void setName(const QString &name); - - void save(); - - QString serial() const; - - Q_INVOKABLE void tryRemove(); - - int type() const;*/ - - Q_INVOKABLE virtual void upgrade(); - -protected: - virtual bool isUpgradable() const; - -private slots: - void aquireTellStick(); - void enterBootloader(); - void downloadFirmware(); - void rebootTellStick(); - void connectTellStick(); - -private: - char getCh(); - void send(uchar ch); - - static QByteArray readHex(const QString &filename, int maxAddress); - static int parseHex( const QByteArray &characters, int start, int length ); - - class PrivateData; - PrivateData *d; -}; - -#endif // TELLSTICK_H diff --git a/telldus-gui/Plugins/Controllers/tellstick.png b/telldus-gui/Plugins/Controllers/tellstick.png deleted file mode 100644 index b437a369..00000000 Binary files a/telldus-gui/Plugins/Controllers/tellstick.png and /dev/null differ diff --git a/telldus-gui/Plugins/Controllers/tellstick_duo.png b/telldus-gui/Plugins/Controllers/tellstick_duo.png deleted file mode 100644 index c3a4513a..00000000 Binary files a/telldus-gui/Plugins/Controllers/tellstick_duo.png and /dev/null differ diff --git a/telldus-gui/Plugins/Devices/CMakeLists.txt b/telldus-gui/Plugins/Devices/CMakeLists.txt deleted file mode 100644 index aad4306d..00000000 --- a/telldus-gui/Plugins/Devices/CMakeLists.txt +++ /dev/null @@ -1,41 +0,0 @@ -SET( Plugin_NAME "Devices" ) - -SET( Plugin_SRCS - devicesplugin.cpp -) - -SET( Plugin_HDRS - devicesplugin.h -) - -SET( Plugin_MOC_HDRS -) - -SET( Plugin_PATH "com.telldus.gui" ) - -IF (WIN32) - SET( Plugin_LIBRARIES - ${LIBRARY_OUTPUT_PATH}/${CMAKE_CFG_INTDIR}/TelldusGui.lib - ) -ELSEIF (APPLE) - FIND_PACKAGE(TelldusCore REQUIRED) - SET( Plugin_LIBRARIES - ${TELLDUSCORE_LIBRARY} - TelldusGui - ) - -ELSE (WIN32) - FIND_PACKAGE(TelldusCore REQUIRED) - - SET( Plugin_LIBRARIES - ${TELLDUSGUI_LIBRARY} - ${CMAKE_BINARY_DIR}/TelldusGui/libtelldus-gui.so - ) -ENDIF (WIN32) - -INCLUDE_DIRECTORIES( - ${TELLDUSCORE_INCLUDE_DIR} -) - - -INCLUDE( ../TelldusCenterPlugin.cmake NO_POLICY_SCOPE ) diff --git a/telldus-gui/Plugins/Devices/Devices.pro b/telldus-gui/Plugins/Devices/Devices.pro deleted file mode 100644 index a8392cea..00000000 --- a/telldus-gui/Plugins/Devices/Devices.pro +++ /dev/null @@ -1,21 +0,0 @@ -# ------------------------------------------------- -# Project created by QtCreator 2009-03-10T12:16:44 -# ------------------------------------------------- -CONFIG += release -QT += core \ - gui -TARGET = Devices -TEMPLATE = lib -CONFIG += plugin -SOURCES += devicesplugin.cpp -HEADERS += devicesplugin.h -#RESOURCES += Devices.qrc -macx { - LIBS += -F../../TelldusCenter/TelldusCenter.app/Contents/Frameworks -framework \ - TelldusGui -framework TelldusCore - DESTDIR = ../../TelldusCenter/TelldusCenter.app/Contents/Plugins -} -!macx { - LIBS += -ltelldus-gui - DESTDIR = ../../TelldusCenter/Plugins -} diff --git a/telldus-gui/Plugins/Devices/__init__.js b/telldus-gui/Plugins/Devices/__init__.js deleted file mode 100644 index e217c508..00000000 --- a/telldus-gui/Plugins/Devices/__init__.js +++ /dev/null @@ -1,133 +0,0 @@ -/** TELLDUS GUI **/ - -var devices = new Array(); -var methodsSupported = com.telldus.core.TELLSTICK_TURNON - | com.telldus.core.TELLSTICK_TURNOFF - | com.telldus.core.TELLSTICK_BELL - | com.telldus.core.TELLSTICK_DIM - | com.telldus.core.TELLSTICK_UP - | com.telldus.core.TELLSTICK_DOWN - | com.telldus.core.TELLSTICK_STOP; - -__postInit__ = function() { - com.telldus.core.deviceChange.connect(deviceChange); - application.allDoneLoading.connect( allDone ); - application.addWidget("devices.default", ":/images/devices.png", com.telldus.gui); -} - -function down() { - com.telldus.core.down( this.id ); -} - -function stop() { - com.telldus.core.stop( this.id ); -} - -function turnOn() { - com.telldus.core.turnOn( this.id ); -} - -function turnOff() { - com.telldus.core.turnOff( this.id ); -} - -function up() { - com.telldus.core.up( this.id ); -} - -function dim() { - com.telldus.core.dim( this.id, this.value ); -} - -function bell() { - com.telldus.core.bell( this.id ); -} - -function allDone() { - if (com.telldus.systray) { - var count = com.telldus.core.getNumberOfDevices(); - for (var i = 0; i < count; ++i) { - var obj = { id: com.telldus.core.getDeviceId(i) }; - var name = com.telldus.core.getName(obj.id); - obj.menuId = com.telldus.systray.addMenuItem( name ); - - devices.push(obj); - - addMethodsSubmenu(obj); - } - - com.telldus.systray.addSeparator(); - } -} - -function deviceChange( deviceId, eventType ) { - if (eventType == com.telldus.core.TELLSTICK_DEVICE_ADDED) { - var lastIndex = devices.length-1; - var obj = { id: deviceId }; - var name = com.telldus.core.getName(obj.id); - obj.menuId = com.telldus.systray.addMenuItemAfter( name, devices[lastIndex].menuId ); - devices.push(obj); - addMethodsSubmenu(obj); - return; - } - - var index = -1; - //Find the device - for (var i=0; i < devices.length; ++i) { - if (devices[i].id == deviceId) { - index = i; - break; - } - } - //Device not found, return - if (index < 0) { - return; - } - - if (eventType == com.telldus.core.TELLSTICK_DEVICE_CHANGED) { - var name = com.telldus.core.getName(deviceId); - var menuItem = com.telldus.systray.menuItem( devices[index].menuId ); - if (menuItem) { - menuItem.text = name; - com.telldus.systray.clear( devices[index].menuId ); - addMethodsSubmenu( devices[index] ); - } - } else if (eventType == com.telldus.core.TELLSTICK_DEVICE_REMOVED) { - com.telldus.systray.removeMenuItem( devices[index].menuId ); - devices.splice(index, 1); - } -} - -function addMethodsSubmenu( obj ) { - var methods = com.telldus.core.methods( obj.id, methodsSupported ); - if (methods & com.telldus.core.TELLSTICK_TURNON) { - com.telldus.systray.menuItem(com.telldus.systray.addMenuItem( qsTr("On"), obj.menuId )).triggered.connect( obj, turnOn ); - } - if (methods & com.telldus.core.TELLSTICK_UP) { - com.telldus.systray.menuItem(com.telldus.systray.addMenuItem( qsTr("Up"), obj.menuId )).triggered.connect( obj, up ); - } - if (methods & com.telldus.core.TELLSTICK_DIM) { - com.telldus.systray.menuItem(com.telldus.systray.addMenuItem( "90%", obj.menuId )).triggered.connect( {id: obj.id, value: 230}, dim ); - com.telldus.systray.menuItem(com.telldus.systray.addMenuItem( "80%", obj.menuId )).triggered.connect( {id: obj.id, value: 204}, dim ); - com.telldus.systray.menuItem(com.telldus.systray.addMenuItem( "70%", obj.menuId )).triggered.connect( {id: obj.id, value: 179}, dim ); - com.telldus.systray.menuItem(com.telldus.systray.addMenuItem( "60%", obj.menuId )).triggered.connect( {id: obj.id, value: 153}, dim ); - com.telldus.systray.menuItem(com.telldus.systray.addMenuItem( "50%", obj.menuId )).triggered.connect( {id: obj.id, value: 128}, dim ); - com.telldus.systray.menuItem(com.telldus.systray.addMenuItem( "40%", obj.menuId )).triggered.connect( {id: obj.id, value: 102}, dim ); - com.telldus.systray.menuItem(com.telldus.systray.addMenuItem( "30%", obj.menuId )).triggered.connect( {id: obj.id, value: 77}, dim ); - com.telldus.systray.menuItem(com.telldus.systray.addMenuItem( "20%", obj.menuId )).triggered.connect( {id: obj.id, value: 51}, dim ); - com.telldus.systray.menuItem(com.telldus.systray.addMenuItem( "10%", obj.menuId )).triggered.connect( {id: obj.id, value: 25}, dim ); - } - if (methods & com.telldus.core.TELLSTICK_STOP) { - com.telldus.systray.menuItem(com.telldus.systray.addMenuItem( qsTr("Stop"), obj.menuId )).triggered.connect( obj, stop ); - } - if (methods & com.telldus.core.TELLSTICK_TURNOFF) { - com.telldus.systray.menuItem(com.telldus.systray.addMenuItem( qsTr("Off"), obj.menuId )).triggered.connect( obj, turnOff ); - } - if (methods & com.telldus.core.TELLSTICK_DOWN) { - com.telldus.systray.menuItem(com.telldus.systray.addMenuItem( qsTr("Down"), obj.menuId )).triggered.connect( obj, down ); - } - if (methods & com.telldus.core.TELLSTICK_BELL) { - com.telldus.systray.menuItem(com.telldus.systray.addMenuItem( qsTr("Bell"), obj.menuId )).triggered.connect( obj, bell ); - } -} - diff --git a/telldus-gui/Plugins/Devices/devicesplugin.cpp b/telldus-gui/Plugins/Devices/devicesplugin.cpp deleted file mode 100644 index 417cc48e..00000000 --- a/telldus-gui/Plugins/Devices/devicesplugin.cpp +++ /dev/null @@ -1,34 +0,0 @@ -#include -#include -#include -#include -#include "devicesplugin.h" - -#include "../../TelldusGui/telldusgui.h" - -DevicesPlugin::DevicesPlugin( QObject * parent ) - :QScriptExtensionPlugin( parent ) -{ -} - -DevicesPlugin::~DevicesPlugin() { -} - -void DevicesPlugin::initialize ( const QString & key, QScriptEngine * engine ) { - if (key == "com.telldus.gui") { - QWidget *deviceWidget = tdDeviceWidget(0); - connect(deviceWidget, SIGNAL(showMessage(const QString &, const QString &, const QString &)), qApp, SIGNAL(showMessage(const QString &, const QString &, const QString &))); - connect(deviceWidget, SIGNAL(eventTriggered(const QString &, const QString &)), qApp, SLOT(eventTriggered(const QString &, const QString &))); - - QScriptValue value = engine->newQObject(deviceWidget); - engine->globalObject().property("com").property("telldus").setProperty("gui", value); - } -} - -QStringList DevicesPlugin::keys () const { - return QStringList() << "com.telldus.gui"; -} - -Q_EXPORT_PLUGIN2(DevicesInterface, DevicesPlugin) - - diff --git a/telldus-gui/Plugins/Devices/devicesplugin.h b/telldus-gui/Plugins/Devices/devicesplugin.h deleted file mode 100644 index 90437147..00000000 --- a/telldus-gui/Plugins/Devices/devicesplugin.h +++ /dev/null @@ -1,16 +0,0 @@ -#ifndef DEVICESPLUGIN_H -#define DEVICESPLUGIN_H - -#include - -class DevicesPlugin : public QScriptExtensionPlugin { -public: - DevicesPlugin ( QObject * parent = 0 ); - ~DevicesPlugin (); - - virtual void initialize ( const QString & key, QScriptEngine * engine ); - virtual QStringList keys () const; - -}; - -#endif // DEVICESPLUGIN_H diff --git a/telldus-gui/Plugins/Devices/translation_sv.ts b/telldus-gui/Plugins/Devices/translation_sv.ts deleted file mode 100644 index 8d4bd2e0..00000000 --- a/telldus-gui/Plugins/Devices/translation_sv.ts +++ /dev/null @@ -1,37 +0,0 @@ - - - - - __init__ - - - On - PÃ¥ - - - - Up - Upp - - - - Stop - Stopp - - - - Off - Av - - - - Down - Ner - - - - Bell - Ring - - - diff --git a/telldus-gui/Plugins/FormLoader/FormLoader.pro b/telldus-gui/Plugins/FormLoader/FormLoader.pro deleted file mode 100644 index c2fce4db..00000000 --- a/telldus-gui/Plugins/FormLoader/FormLoader.pro +++ /dev/null @@ -1,19 +0,0 @@ -# ------------------------------------------------- -# Project created by QtCreator 2009-03-10T12:16:44 -# ------------------------------------------------- -QT += core \ - gui \ - script -TARGET = FormLoader -TEMPLATE = lib -CONFIG += plugin uitools -SOURCES += formloaderplugin.cpp \ - formloaderobject.cpp -HEADERS += formloaderplugin.h \ - formloaderobject.h -macx { - DESTDIR = ../../TelldusCenter/TelldusCenter.app/Contents/Plugins/script -} -!macx { - DESTDIR = ../../TelldusCenter/Plugins/script -} diff --git a/telldus-gui/Plugins/FormLoader/formloaderobject.cpp b/telldus-gui/Plugins/FormLoader/formloaderobject.cpp deleted file mode 100644 index 0d8de860..00000000 --- a/telldus-gui/Plugins/FormLoader/formloaderobject.cpp +++ /dev/null @@ -1,58 +0,0 @@ -#include "formloaderobject.h" -#include -#include -#include -#include -#include -#include -#include - -FormLoaderObject::FormLoaderObject( QScriptEngine *e, QObject * parent ) - : QObject(parent), - engine(e) -{ -} - -FormLoaderObject::~FormLoaderObject() { -} - -QWidget *FormLoaderObject::load( const QString &name ) { - - foreach( QString path, qApp->libraryPaths() ) { - QDir dir(path); - if (!dir.cd("Forms")) { - continue; - } - if (!dir.cd(name)) { - continue; - } - if (!dir.exists( QString("%1.ui").arg(name) )) { - qDebug() << "UI-file not found for form" << name; - continue; - } - if (!dir.exists( QString("%1.js").arg(name) )) { - qDebug() << "JS-file not found for form" << name; - continue; - } - QString scriptFileName( dir.filePath(QString("%1.js").arg(name)) ); - QFile scriptFile(scriptFileName); - scriptFile.open(QIODevice::ReadOnly); - engine->evaluate(scriptFile.readAll(), scriptFileName); - scriptFile.close(); - - QUiLoader loader; - QFile uiFile( dir.filePath(QString("%1.ui").arg(name)) ); - uiFile.open( QIODevice::ReadOnly ); - QWidget *ui = loader.load(&uiFile); - uiFile.close(); - - QScriptValue ctor = engine->evaluate(name); - QScriptValue scriptUi = engine->newQObject(ui, QScriptEngine::ScriptOwnership); - QScriptValue calc = ctor.construct(QScriptValueList() << scriptUi); - - return ui; - } - qDebug() << "Form" << name << "not found!"; - return 0; -} - diff --git a/telldus-gui/Plugins/FormLoader/formloaderobject.h b/telldus-gui/Plugins/FormLoader/formloaderobject.h deleted file mode 100644 index aeff261b..00000000 --- a/telldus-gui/Plugins/FormLoader/formloaderobject.h +++ /dev/null @@ -1,24 +0,0 @@ -#ifndef FORMLOADEROBJECT_H -#define FORMLOADEROBJECT_H - -#include - -class QWidget; - -class QScriptEngine; - -class FormLoaderObject : public QObject -{ - Q_OBJECT -public: - FormLoaderObject( QScriptEngine *engine, QObject * parent = 0 ); - virtual ~FormLoaderObject(); - -public slots: - QWidget *load( const QString &name ); - -private: - QScriptEngine *engine; -}; - -#endif // FORMLOADEROBJECT_H diff --git a/telldus-gui/Plugins/FormLoader/formloaderplugin.cpp b/telldus-gui/Plugins/FormLoader/formloaderplugin.cpp deleted file mode 100644 index 0e215bb9..00000000 --- a/telldus-gui/Plugins/FormLoader/formloaderplugin.cpp +++ /dev/null @@ -1,35 +0,0 @@ -#include "formloaderplugin.h" -#include "formloaderobject.h" -#include -#include - -class FormLoaderPluginPrivate { -public: - FormLoaderObject *formloader; -}; - -FormLoaderPlugin::FormLoaderPlugin ( QObject * parent ) - :QScriptExtensionPlugin( parent ) -{ - d = new FormLoaderPluginPrivate; - d->formloader = 0; -} - -FormLoaderPlugin::~FormLoaderPlugin() { - delete d; -} - -void FormLoaderPlugin::initialize ( const QString & key, QScriptEngine * engine ) { - if (key == "com.telldus.form") { - d->formloader = new FormLoaderObject(engine, this); - - QScriptValue value = engine->newQObject(d->formloader); - engine->globalObject().property("com").property("telldus").setProperty("form", value); - } -} - -QStringList FormLoaderPlugin::keys () const { - return QStringList() << "com.telldus.form"; -} - -Q_EXPORT_PLUGIN2(FormLoaderInterface, FormLoaderPlugin) diff --git a/telldus-gui/Plugins/FormLoader/formloaderplugin.h b/telldus-gui/Plugins/FormLoader/formloaderplugin.h deleted file mode 100644 index 5c3cee85..00000000 --- a/telldus-gui/Plugins/FormLoader/formloaderplugin.h +++ /dev/null @@ -1,21 +0,0 @@ -#ifndef FORMLOADERPLUGIN_H -#define FORMLOADERPLUGIN_H - -#include - -class FormLoaderPluginPrivate; - -class FormLoaderPlugin : public QScriptExtensionPlugin { -public: - FormLoaderPlugin ( QObject * parent = 0 ); - ~FormLoaderPlugin (); - - virtual void initialize ( const QString & key, QScriptEngine * engine ); - virtual QStringList keys () const; - -private: - FormLoaderPluginPrivate *d; -}; - - -#endif // FORMLOADERPLUGIN_H diff --git a/telldus-gui/Plugins/Live/CMakeLists.txt b/telldus-gui/Plugins/Live/CMakeLists.txt deleted file mode 100644 index e0b8c2c2..00000000 --- a/telldus-gui/Plugins/Live/CMakeLists.txt +++ /dev/null @@ -1,45 +0,0 @@ -SET(QT_USE_QTNETWORK TRUE) - -SET( Plugin_NAME "TelldusLive" ) -SET( Plugin_PATH "com.telldus.live" ) - -SET( Plugin_SRCS - LiveMessage.cpp - LiveMessageToken.cpp - LiveObject.cpp - LivePlugin.cpp -) - -SET( Plugin_HDRS - LivePlugin.h - ${CMAKE_CURRENT_SOURCE_DIR}/config.h.in - ${CMAKE_CURRENT_BINARY_DIR}/parsed/config.h -) - -SET( Plugin_MOC_HDRS - LiveMessageToken.h - LiveMessage.h - LiveObject.h -) - -SET( Plugin_RESOURCES - Live.qrc -) - -SET( Plugin_EXTRA - configuration.ui - icon.png -) - -SET(TELLDUS_LIVE_PUBLIC_KEY "" CACHE STRING "Telldus Live! public key") -SET(TELLDUS_LIVE_PRIVATE_KEY "" CACHE STRING "Telldus Live! private key") -SET(TELLDUS_LIVE_URI "https://api.telldus.com/server/assign" CACHE STRING "Telldus Live! Connection URI") - -CONFIGURE_FILE( - ${CMAKE_CURRENT_SOURCE_DIR}/config.h.in - ${CMAKE_CURRENT_BINARY_DIR}/parsed/config.h -) - -INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR}/parsed/) - -INCLUDE( ../TelldusCenterPlugin.cmake NO_POLICY_SCOPE ) diff --git a/telldus-gui/Plugins/Live/Equifax_Secure_CA.pem b/telldus-gui/Plugins/Live/Equifax_Secure_CA.pem deleted file mode 100644 index 676db975..00000000 --- a/telldus-gui/Plugins/Live/Equifax_Secure_CA.pem +++ /dev/null @@ -1,19 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV -UzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2Vy -dGlmaWNhdGUgQXV0aG9yaXR5MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1 -MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoTB0VxdWlmYXgxLTArBgNVBAsTJEVx -dWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCBnzANBgkqhkiG9w0B -AQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPRfM6f -BeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+A -cJkVV5MW8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kC -AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQ -MA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlm -aWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTgw -ODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvSspXXR9gj -IBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQF -MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA -A4GBAFjOKer89961zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y -7qj/WsjTVbJmcVfewCHrPSqnI0kBBIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh -1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee9570+sB3c4 ------END CERTIFICATE----- diff --git a/telldus-gui/Plugins/Live/GeoTrustGlobalCA.pem b/telldus-gui/Plugins/Live/GeoTrustGlobalCA.pem deleted file mode 100644 index bcb25297..00000000 --- a/telldus-gui/Plugins/Live/GeoTrustGlobalCA.pem +++ /dev/null @@ -1,20 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT -MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i -YWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQG -EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMSR2VvVHJ1c3Qg -R2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2swYYzD9 -9BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjoBbdq -fnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDv -iS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU -1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+ -bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoW -MPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTA -ephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1l -uMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKIn -Z57QzxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfS -tQWVYrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF -PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Un -hw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeXxx12E6nV -5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvmMw== ------END CERTIFICATE----- diff --git a/telldus-gui/Plugins/Live/Live.qrc b/telldus-gui/Plugins/Live/Live.qrc deleted file mode 100644 index d9e2d682..00000000 --- a/telldus-gui/Plugins/Live/Live.qrc +++ /dev/null @@ -1,7 +0,0 @@ - - - Equifax_Secure_CA.pem - GeoTrustGlobalCA.pem - RapidSSLCA.pem - - diff --git a/telldus-gui/Plugins/Live/LiveMessage.cpp b/telldus-gui/Plugins/Live/LiveMessage.cpp deleted file mode 100644 index 5a214cdc..00000000 --- a/telldus-gui/Plugins/Live/LiveMessage.cpp +++ /dev/null @@ -1,78 +0,0 @@ -#include "LiveMessage.h" -#include "LiveMessageToken.h" - -#include -#include - -class LiveMessage::PrivateData { -public: - QList args; -}; - -LiveMessage::LiveMessage(const QString &name ) - : QObject() -{ - d = new PrivateData; - this->append(name); -} - -LiveMessage::LiveMessage(const QList &args ) - : QObject() -{ - d = new PrivateData; - d->args = args; -} - -LiveMessage::~LiveMessage() { - delete d; -} - -void LiveMessage::append(const QString &argument) { - this->append(LiveMessageToken(argument)); -} - -void LiveMessage::append(const LiveMessageToken &argument) { - d->args.append(argument); -} - -void LiveMessage::appendToken(LiveMessageTokenScriptWrapper *argument) { - this->append(argument->token()); -} - -LiveMessageToken LiveMessage::arg(int index) const { - if (index + 1 >= d->args.count()) { - return LiveMessageToken(""); - } - return d->args.at(index +1 ); -} - -LiveMessageTokenScriptWrapper *LiveMessage::argument(int index) const { - return new LiveMessageTokenScriptWrapper(arg(index)); -} - - -QString LiveMessage::name() const { - return this->arg(-1).stringVal.toLower(); -} - -QByteArray LiveMessage::toByteArray() const { - QByteArray retval; - foreach(LiveMessageToken arg, d->args) { - retval.append(arg.toByteArray()); - } - return retval; -} - - -LiveMessage *LiveMessage::fromByteArray(const QByteArray &ba) { - int start = 0; - QList list; - while (start < ba.length()) { - LiveMessageToken d = LiveMessageToken::parseToken(ba, &start); - if (d.valueType == LiveMessageToken::Invalid) { - break; - } - list.append(d); - } - return new LiveMessage(list); -} diff --git a/telldus-gui/Plugins/Live/LiveMessage.h b/telldus-gui/Plugins/Live/LiveMessage.h deleted file mode 100644 index 4e38d4a9..00000000 --- a/telldus-gui/Plugins/Live/LiveMessage.h +++ /dev/null @@ -1,38 +0,0 @@ -#ifndef LIVEMESSAGE_H -#define LIVEMESSAGE_H - -#include -#include - -#include "LiveMessageToken.h" - -class LiveMessageTokenScriptWrapper; - -class LiveMessage : public QObject -{ - Q_OBJECT -public: - LiveMessage(const QString &name); - virtual ~LiveMessage(); - - QByteArray toByteArray() const; - - static LiveMessage *fromByteArray(const QByteArray &ba); - LiveMessageToken arg(int index) const; - -public slots: - void append(const QString &argument); - void append(const LiveMessageToken &argument); - void appendToken(LiveMessageTokenScriptWrapper *argument); - LiveMessageTokenScriptWrapper *argument(int index) const; - QString name() const; - -private: - LiveMessage(const QList &args); - class PrivateData; - PrivateData *d; -}; - -Q_DECLARE_METATYPE(LiveMessage*) - -#endif // LIVEMESSAGE_H diff --git a/telldus-gui/Plugins/Live/LiveMessageToken.cpp b/telldus-gui/Plugins/Live/LiveMessageToken.cpp deleted file mode 100644 index 8ef4f84f..00000000 --- a/telldus-gui/Plugins/Live/LiveMessageToken.cpp +++ /dev/null @@ -1,176 +0,0 @@ -#include "LiveMessageToken.h" - -#include - -LiveMessageToken::LiveMessageToken() { - valueType = Invalid; -} - -LiveMessageToken::LiveMessageToken(const QString &value) { - valueType = String; - stringVal = value; -} - -LiveMessageToken::LiveMessageToken(int value) { - valueType = Int; - intVal = value; -} - -QByteArray LiveMessageToken::toByteArray() const { - if (valueType == Int) { - return QString("i%1s").arg(intVal, 0, 16).toUtf8(); - - } else if (valueType == List) { - QByteArray retVal("l"); - foreach(LiveMessageToken token, listVal) { - retVal.append(token.toByteArray()); - } - retVal.append("s"); - return retVal; - - } else if (valueType == Dictionary) { - QByteArray retVal("h"); - QHashIterator it(dictVal); - while(it.hasNext()) { - it.next(); - LiveMessageToken key(it.key()); - retVal.append(key.toByteArray()); - retVal.append(it.value().toByteArray()); - } - retVal.append("s"); - return retVal; - } - //String or Base64 encoded string - QByteArray retVal; - QByteArray string = stringVal.toUtf8(); - if (valueType == Base64) { - string = string.toBase64(); - retVal.append('u'); - } - retVal.append(QByteArray::number(string.length(),16)); - retVal.append(':'); - retVal.append(string); - return retVal; -} - -LiveMessageToken LiveMessageToken::parseToken(const QByteArray &string, int* start) { - LiveMessageToken d; - if ((*start) >= string.length()) { - return d; - } - if (string[(*start)] == 'i') { //Int - ++(*start); - int index = string.indexOf('s', (*start)); - if (index < 0) { - return d; - } - bool ok; - d.intVal = string.mid((*start), index-(*start)).toInt(&ok, 16); - if (!ok) { - return d; - } - d.valueType = LiveMessageToken::Int; - (*start) = index + 1; - return d; - - } else if (string[(*start)] == 'h') { //Dictionary - ++(*start); - while((*start) < string.length() && string[(*start)] != 's') { - LiveMessageToken keyToken(LiveMessageToken::parseToken(string, start)); - if (keyToken.valueType == LiveMessageToken::Invalid) { - break; - } - LiveMessageToken valueToken(LiveMessageToken::parseToken(string, start)); - if (valueToken.valueType == LiveMessageToken::Invalid) { - break; - } - d.valueType = LiveMessageToken::Dictionary; - d.dictVal[keyToken.stringVal] = valueToken; - } - ++(*start); - } else { //String - int index = string.indexOf(':', (*start)); - if (index < 0) { - return d; - } - bool ok; - int length = string.mid((*start), index - (*start)).toInt(&ok, 16); - if (!ok) { - return d; - } - d.stringVal = QString::fromUtf8(string.mid(index+1, length)); - d.valueType = LiveMessageToken::String; - (*start) = index + length + 1; - } - return d; -} - -LiveMessageTokenScriptWrapper::LiveMessageTokenScriptWrapper() - :QObject() -{ -} - -LiveMessageTokenScriptWrapper::LiveMessageTokenScriptWrapper(LiveMessageToken token) - :QObject(), p_token(token) -{ -} - -LiveMessageTokenScriptWrapper::~LiveMessageTokenScriptWrapper() { -} - -LiveMessageToken LiveMessageTokenScriptWrapper::token() const { - return p_token; -} - -void LiveMessageTokenScriptWrapper::add(LiveMessageTokenScriptWrapper *t) { - p_token.valueType = LiveMessageToken::List; - p_token.listVal << t->p_token; -} - -int LiveMessageTokenScriptWrapper::getInt(const QString &key, int defaultValue) const { - if (p_token.valueType != LiveMessageToken::Dictionary) { - return defaultValue; - } - if (!p_token.dictVal.contains(key)) { - return defaultValue; - } - return p_token.dictVal[key].intVal; -} - -QString LiveMessageTokenScriptWrapper::getString(const QString &key, const QString &defaultValue) const { - if (p_token.valueType != LiveMessageToken::Dictionary) { - return defaultValue; - } - if (!p_token.dictVal.contains(key)) { - return defaultValue; - } - return p_token.dictVal[key].stringVal; -} - -int LiveMessageTokenScriptWrapper::intVal() const { - return p_token.intVal; -} - -void LiveMessageTokenScriptWrapper::set(const QString &key, int value) { - p_token.valueType = LiveMessageToken::Dictionary; - LiveMessageToken token; - token.valueType = LiveMessageToken::Int; - token.intVal = value; - p_token.dictVal[key] = token; -} - -void LiveMessageTokenScriptWrapper::set(const QString &key, const QString &value) { - p_token.valueType = LiveMessageToken::Dictionary; - LiveMessageToken token; - token.valueType = LiveMessageToken::Base64; - token.stringVal = value; - p_token.dictVal[key] = token; -} - -void LiveMessageTokenScriptWrapper::set(const QString &key, const QDateTime value) { - p_token.valueType = LiveMessageToken::Dictionary; - LiveMessageToken token; - token.valueType = LiveMessageToken::Int; - token.intVal = value.toMSecsSinceEpoch(); - p_token.dictVal[key] = token; -} diff --git a/telldus-gui/Plugins/Live/LiveMessageToken.h b/telldus-gui/Plugins/Live/LiveMessageToken.h deleted file mode 100644 index 5806ecfe..00000000 --- a/telldus-gui/Plugins/Live/LiveMessageToken.h +++ /dev/null @@ -1,55 +0,0 @@ -#ifndef LIVEMESSAGETOKEN_H -#define LIVEMESSAGETOKEN_H - -#include -#include -#include -#include -#include - -class LiveMessageToken { -public: - enum Type {Invalid, Int, String, Base64, List, Dictionary}; - - LiveMessageToken(); - LiveMessageToken(const QString &value); - LiveMessageToken(int value); - QByteArray toByteArray() const; - static LiveMessageToken parseToken(const QByteArray &string, int* start); - - Type valueType; - int intVal; - QString stringVal; - QList listVal; - QHash dictVal; -}; - -class LiveMessageTokenScriptWrapper : public QObject { - Q_OBJECT -public: - LiveMessageTokenScriptWrapper(); - LiveMessageTokenScriptWrapper(LiveMessageToken token); - virtual ~LiveMessageTokenScriptWrapper(); - - LiveMessageToken token() const; - -public slots: - void add(LiveMessageTokenScriptWrapper *token); - - int getInt(const QString &key, int defaultValue = 0) const; - QString getString(const QString &key, const QString &defaultValue = "") const; - - int intVal() const; - - void set(const QString &key, int value); - void set(const QString &key, const QString &value); - void set(const QString &key, const QDateTime value); - -private: - LiveMessageToken p_token; -}; - -Q_DECLARE_METATYPE(LiveMessageTokenScriptWrapper*) - - -#endif // LIVEMESSAGETOKEN_H diff --git a/telldus-gui/Plugins/Live/LiveObject.cpp b/telldus-gui/Plugins/Live/LiveObject.cpp deleted file mode 100644 index c892ae3f..00000000 --- a/telldus-gui/Plugins/Live/LiveObject.cpp +++ /dev/null @@ -1,349 +0,0 @@ -#include "LiveObject.h" -#include "LiveMessageToken.h" -#include "config.h" -#include -#include -#include -#include - -#include - -class LiveObject::PrivateData { -public: - class Server; - - QSslSocket *socket; - QTimer pingTimer, pongTimer; - bool registered; - QUrl registerUrl; - QString uuid, hashMethod; - QNetworkAccessManager *manager; - QList serverList; - QDateTime serverRefreshTime; -}; - -class LiveObject::PrivateData::Server { -public: - QString address; - int port; -}; - - -LiveObject::LiveObject( QScriptEngine *engine, QObject * parent ) - : QObject(parent) -{ - d = new PrivateData; - d->hashMethod = "sha1"; - d->registered = false; - - QSslSocket::addDefaultCaCertificates(":/Equifax_Secure_CA.pem"); - QSslSocket::addDefaultCaCertificates(":/GeoTrustGlobalCA.pem"); - QSslSocket::addDefaultCaCertificates(":/RapidSSLCA.pem"); - d->socket = new QSslSocket(this); - d->socket->setProtocol( QSsl::TlsV1 ); - connect(d->socket, SIGNAL(encrypted()), this, SLOT(p_connected())); - connect(d->socket, SIGNAL(disconnected()), this, SLOT(p_disconnected())); - connect(d->socket, SIGNAL(readyRead()), this, SLOT(readyRead())); - connect(d->socket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(error(QAbstractSocket::SocketError))); - connect(d->socket, SIGNAL(stateChanged(QAbstractSocket::SocketState)), this, SLOT(stateChanged(QAbstractSocket::SocketState))); - connect(d->socket, SIGNAL(sslErrors(const QList &)), this, SLOT(sslErrors(const QList &))); - - d->pingTimer.setInterval(120000); //Two minutes - d->pongTimer.setInterval(360000); //Six minutes - d->pongTimer.setSingleShot(true); - connect(&d->pingTimer, SIGNAL(timeout()), this, SLOT(pingServer())); - connect(&d->pongTimer, SIGNAL(timeout()), this, SLOT(pongTimeout())); - - d->manager = new QNetworkAccessManager(this); - connect(d->manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(serverAssignReply(QNetworkReply*))); -} - -LiveObject::~LiveObject() { - delete d; -} - -void LiveObject::activate() { - if (d->uuid == "" || d->socket->state() != QAbstractSocket::ConnectedState || !d->registerUrl.isValid()) { - return; - } - if (!QDesktopServices::openUrl(d->registerUrl)) { - QMessageBox msgBox; - msgBox.setIcon(QMessageBox::Information); - msgBox.setTextFormat(Qt::RichText); - msgBox.setWindowTitle(tr("Default browser could not be opened")); - msgBox.setText(tr("We could not open your default internet browser")); - msgBox.setInformativeText(tr("Please copy the following url and enter it in your browser:
%1").arg(d->registerUrl.toString())); - msgBox.setStandardButtons(QMessageBox::Ok); - msgBox.exec(); - } -} - -void LiveObject::connectToServer() { - if (d->serverList.isEmpty()) { - this->refreshServerList(); - } else if (d->serverRefreshTime.secsTo(QDateTime::currentDateTime()) > 300) { //Valid 5 min - this->refreshServerList(); - } else { - d->socket->abort(); - PrivateData::Server server = d->serverList.takeFirst(); - emit errorChanged(""); - emit statusChanged(tr("Connecting to server %1").arg(server.address)); - d->socket->connectToHostEncrypted(server.address, server.port); - } -} - -void LiveObject::disconnect() { - d->socket->disconnectFromHost(); -} - -void LiveObject::readyRead() { - QByteArray ba = d->socket->readAll(); - //qDebug() << ba; - QScopedPointer envelope(LiveMessage::fromByteArray(ba)); - QString signature = envelope->name(); - QScopedPointer msg(LiveMessage::fromByteArray(envelope->arg(0).stringVal.toUtf8())); - - if (signatureForMessage(envelope->arg(0).stringVal.toUtf8()) != signature) { - //qDebug() << "HASH mismatch!" << msg->name(); - return; - } - d->pongTimer.stop(); - d->pongTimer.start(); - - if (msg->name() == "") { - return; - } else if (msg->name() == "disconnect") { - this->disconnect(); - } else if (msg->name() == "registered") { - d->registered = true; - emit registered(msg->argument(0)); - emit errorChanged(tr("Registered")); - } else if (msg->name() == "notregistered") { - LiveMessageToken token = msg->arg(0); - if (token.valueType != LiveMessageToken::Dictionary) { - return; - } - d->registerUrl = token.dictVal["url"].stringVal; - d->uuid = token.dictVal["uuid"].stringVal; - QSettings s; - s.setValue("Live/UUID", d->uuid); - emit notRegistered(); - emit errorChanged(tr("Not registered")); - } else if (msg->name() == "command") { - if (msg->arg(0).valueType == LiveMessageToken::Dictionary && msg->arg(0).dictVal.contains("ACK")) { - int ack = msg->arg(0).dictVal["ACK"].intVal; - LiveMessage msg("ACK"); - msg.append(ack); - this->sendMessage(msg); - } - emit messageReceived(msg.data()); - } else { - emit messageReceived(msg.data()); - } -} - -void LiveObject::refreshServerList() { - emit errorChanged(""); - emit statusChanged(tr("Discover servers")); - d->serverList.clear(); - QUrl url(TELLDUS_LIVE_URI); - QPair version("protocolVersion", "2"); - QList > query; - query.append(version); - url.setQueryItems(query); - d->manager->get(QNetworkRequest(url)); -} - -void LiveObject::pingServer() { - if (d->socket->state() != QAbstractSocket::ConnectedState) { - return; - } - LiveMessage msg("Ping"); - this->sendMessage(msg); -} - - -void LiveObject::sendMessage(const LiveMessage &message) { - //Create a new signed message - QByteArray body = message.toByteArray(); - LiveMessage msg(signatureForMessage(body)); - msg.append(body); - - d->socket->write(msg.toByteArray()); - d->socket->flush(); - d->pingTimer.stop(); - d->pingTimer.start(); -} - -void LiveObject::sendMessage(LiveMessage *message) { - if (!d->registered) { - return; - } - this->sendMessage(*message); -} - -void LiveObject::p_connected() { - //Lets find out our uuid - QSettings settings; - d->uuid = settings.value("Live/UUID", "").toString(); - - d->pingTimer.start(); //For pings - d->pongTimer.start(); //For pongs - LiveMessage msg("Register"); - - LiveMessageToken token; - token.valueType = LiveMessageToken::Dictionary; - token.dictVal["uuid"] = LiveMessageToken(d->uuid); - token.dictVal["key"] = LiveMessageToken(TELLDUS_LIVE_PUBLIC_KEY); - token.dictVal["hash"] = LiveMessageToken(d->hashMethod); - msg.append(token); - msg.append(generateVersionToken()); - - this->sendMessage(msg); - emit errorChanged(""); - emit statusChanged(tr("Connected")); - emit connected(); -} - -void LiveObject::p_disconnected() { - d->pingTimer.stop(); - d->pongTimer.stop(); - if (d->registered) { - //Clear the registered status - emit errorChanged(tr("Disconnected from server")); - } - d->registered = false; -} - -void LiveObject::error( QAbstractSocket::SocketError socketError ) { - emit errorChanged(d->socket->errorString()); -} - -void LiveObject::stateChanged( QAbstractSocket::SocketState socketState ) { - if (socketState == QAbstractSocket::UnconnectedState) { - int timeout = rand() % 40 + 10; //Random timeout from 10-50s to avoid flooding the servers - QTimer::singleShot(timeout*1000, this, SLOT(connectToServer())); - emit statusChanged(tr("Reconnecting in %1 seconds...").arg(QString::number(timeout))); - } else if (socketState == QAbstractSocket::ConnectingState) { - emit statusChanged(tr("Connecting...")); - emit errorChanged(""); - } -} - -void LiveObject::sslErrors( const QList & errors ) { - bool everythingOK = true; - foreach( QSslError error, errors ) { - switch( error.error() ) { - case QSslError::SelfSignedCertificate: - continue; - default: - //qDebug() << "SSL" << error.errorString(); - everythingOK = false; - emit statusChanged(tr("SSL Error")); - emit errorChanged(error.errorString()); - break; - } - } - if (everythingOK) { - d->socket->ignoreSslErrors(); - } -} - -void LiveObject::serverAssignReply( QNetworkReply *r ) { - r->deleteLater(); - if (r->error() != QNetworkReply::NoError) { - int timeout = rand() % 300 + 60; //Random timeout from 60s-6min to avoid flooding the servers - emit errorChanged(r->errorString()); - emit statusChanged(tr("Retrying in %1 seconds...").arg(QString::number(timeout))); - QTimer::singleShot(timeout * 1000, this, SLOT(connectToServer())); - return; - } - QXmlStreamReader xml(r); - xml.readNextStartElement(); // enter - - bool found = false; - while (xml.readNextStartElement()) { - if (xml.name().toString().toUpper() == "SERVER") { - QXmlStreamAttributes attrs = xml.attributes(); - PrivateData::Server server; - server.address = attrs.value("address").toString(); - server.port = attrs.value("port").toString().toInt(); - d->serverList << server; - found = true; - } - xml.skipCurrentElement(); - } - - if (found) { - //qDebug() << "Servers found, retry direct..."; - d->serverRefreshTime = QDateTime::currentDateTime(); - QTimer::singleShot(0, this, SLOT(connectToServer())); - } else { - int timeout = rand() % 300 + 60; //Random timeout from 60-6min to avoid flooding the servers - emit errorChanged(tr("No servers found")); - emit statusChanged(tr("Retrying in %1 seconds...").arg(QString::number(timeout))); - QTimer::singleShot(timeout * 1000, this, SLOT(connectToServer())); - } -} - -QByteArray LiveObject::signatureForMessage( const QByteArray &message ) { - QCryptographicHash signature( QCryptographicHash::Sha1 ); - signature.addData(message); - signature.addData(TELLDUS_LIVE_PRIVATE_KEY); - return signature.result().toHex(); -} - -LiveMessageToken LiveObject::generateVersionToken() { - LiveMessageToken token; - token.valueType = LiveMessageToken::Dictionary; - token.dictVal["protocol"] = LiveMessageToken(2); - token.dictVal["version"] = LiveMessageToken(TELLDUS_CENTER_VERSION); -#if defined(Q_WS_WIN) - token.dictVal["os"] = LiveMessageToken("windows"); - switch (QSysInfo::WindowsVersion) { - case QSysInfo::WV_XP: - token.dictVal["os-version"] = LiveMessageToken("xp"); - break; - case QSysInfo::WV_2003: - token.dictVal["os-version"] = LiveMessageToken("2003"); - break; - case QSysInfo::WV_VISTA: - token.dictVal["os-version"] = LiveMessageToken("vista"); - break; - case QSysInfo::WV_WINDOWS7: - token.dictVal["os-version"] = LiveMessageToken("win7"); - break; - default: - token.dictVal["os-version"] = LiveMessageToken(QString("unknown %1").arg(QSysInfo::WindowsVersion)); - } -#elif defined(Q_OS_MAC) - token.dictVal["os"] = LiveMessageToken("macosx"); - switch (QSysInfo::MacintoshVersion) { - case QSysInfo::MV_LEOPARD: - token.dictVal["os-version"] = LiveMessageToken("leopard"); - break; - case QSysInfo::MV_SNOWLEOPARD: - token.dictVal["os-version"] = LiveMessageToken("snowleopard"); - break; - case QSysInfo::MV_SNOWLEOPARD+1: //TODO: MV_LION when we build against Qt-4.8 - token.dictVal["os-version"] = LiveMessageToken("lion"); - break; - case QSysInfo::MV_SNOWLEOPARD+2: //TODO: MV_MOUNTAINLION? when Qt has it - token.dictVal["os-version"] = LiveMessageToken("mountainlion"); - break; - default: - token.dictVal["os-version"] = LiveMessageToken("unknown"); - } -#elif defined(Q_OS_LINUX) - token.dictVal["os"] = LiveMessageToken("linux"); - token.dictVal["os-version"] = LiveMessageToken("unknown"); -#else - token.dictVal["os"] = LiveMessageToken("unknown"); - token.dictVal["os-version"] = LiveMessageToken(""); -#endif - return token; -} - -void LiveObject::pongTimeout() { - this->disconnect(); -} diff --git a/telldus-gui/Plugins/Live/LiveObject.h b/telldus-gui/Plugins/Live/LiveObject.h deleted file mode 100644 index efa8959f..00000000 --- a/telldus-gui/Plugins/Live/LiveObject.h +++ /dev/null @@ -1,58 +0,0 @@ -#ifndef LIVEOBJECT_H -#define LIVEOBJECT_H - -#include -#include -#include -#include -#include -#include -#include "LiveMessage.h" - -class QNetworkReply; -class LiveMessageToken; - -class LiveObject : public QObject -{ - Q_OBJECT -public: - LiveObject( QScriptEngine *engine, QObject * parent = 0 ); - virtual ~LiveObject(); - -public slots: - void activate(); - void connectToServer(); - void disconnect(); - void pingServer(); - void sendMessage(LiveMessage *message); - -signals: - void connected(); - void disconnected(); - void messageReceived(LiveMessage *message); - void notRegistered(); - void registered(LiveMessageTokenScriptWrapper *params); - void errorChanged(const QString &message); - void statusChanged(const QString &message); - -private slots: - void p_connected(); - void p_disconnected(); - void readyRead(); - void pongTimeout(); - void error( QAbstractSocket::SocketError socketError ); - void stateChanged( QAbstractSocket::SocketState socketState ); - void sslErrors( const QList & errors ); - void serverAssignReply(QNetworkReply*); - -private: - void refreshServerList(); - void sendMessage(const LiveMessage &message); - QByteArray signatureForMessage( const QByteArray &message ); - static LiveMessageToken generateVersionToken(); - - class PrivateData; - PrivateData *d; -}; - -#endif // LIVEOBJECT_H diff --git a/telldus-gui/Plugins/Live/LivePlugin.cpp b/telldus-gui/Plugins/Live/LivePlugin.cpp deleted file mode 100644 index c65e32bf..00000000 --- a/telldus-gui/Plugins/Live/LivePlugin.cpp +++ /dev/null @@ -1,83 +0,0 @@ -#include "LivePlugin.h" -#include "LiveMessage.h" -#include "LiveMessageToken.h" -#include "LiveObject.h" -#include -#include - -QScriptValue LiveSocketCtor(QScriptContext *context, QScriptEngine *engine) -{ - /*if (context->argumentCount() < 2) { - return context->throwError("LiveSocket constructor takes two parameters"); - }*/ - if (context->isCalledAsConstructor()) { - LiveObject *object = new LiveObject(engine); - QScriptValue instanceValue = engine->newQObject(object, QScriptEngine::ScriptOwnership); - context->setThisObject( instanceValue ); - } - return engine->undefinedValue(); -} - -QScriptValue LiveMessageToScriptValue(QScriptEngine *engine, LiveMessage* const &in) { - return engine->newQObject(in); -} - -void LiveMessageFromScriptValue(const QScriptValue &object, LiveMessage* &out) { - out = qobject_cast(object.toQObject()); -} - -QScriptValue LiveMessageCtor(QScriptContext *context, QScriptEngine *engine) -{ - if (context->argumentCount() < 1) { - return context->throwError("LiveSocket constructor takes two parameters"); - } - if (context->isCalledAsConstructor()) { - LiveMessage *msg = new LiveMessage(context->argument(0).toString()); - QScriptValue msgValue = engine->newQObject(msg, QScriptEngine::ScriptOwnership); - context->setThisObject( msgValue ); - } - return engine->undefinedValue(); -} - -QScriptValue LiveMessageTokenToScriptValue(QScriptEngine *engine, LiveMessageTokenScriptWrapper* const &in) { - return engine->newQObject(in); -} - -void LiveMessageTokenFromScriptValue(const QScriptValue &object, LiveMessageTokenScriptWrapper* &out) { - out = qobject_cast(object.toQObject()); -} - -QScriptValue LiveMessageTokenCtor(QScriptContext *context, QScriptEngine *engine) -{ - if (context->isCalledAsConstructor()) { - LiveMessageTokenScriptWrapper *msgToken = new LiveMessageTokenScriptWrapper(); - QScriptValue msgTokenValue = engine->newQObject(msgToken, QScriptEngine::ScriptOwnership); - context->setThisObject( msgTokenValue ); - } - return engine->undefinedValue(); -} - -LivePlugin::LivePlugin ( QObject * parent ) - :QScriptExtensionPlugin( parent ) -{ -} - -LivePlugin::~LivePlugin() { -} - -void LivePlugin::initialize ( const QString & key, QScriptEngine * engine ) { - if (key == "com.telldus.live") { - qScriptRegisterMetaType(engine, LiveMessageToScriptValue, LiveMessageFromScriptValue); - qScriptRegisterMetaType(engine, LiveMessageTokenToScriptValue, LiveMessageTokenFromScriptValue); - - engine->globalObject().setProperty("LiveSocket", engine->newFunction(LiveSocketCtor)); - engine->globalObject().setProperty("LiveMessage", engine->newFunction(LiveMessageCtor)); - engine->globalObject().setProperty("LiveMessageToken", engine->newFunction(LiveMessageTokenCtor)); - } -} - -QStringList LivePlugin::keys () const { - return QStringList() << "com.telldus.live"; -} - -Q_EXPORT_PLUGIN2(LiveInterface, LivePlugin) diff --git a/telldus-gui/Plugins/Live/LivePlugin.h b/telldus-gui/Plugins/Live/LivePlugin.h deleted file mode 100644 index f6290aea..00000000 --- a/telldus-gui/Plugins/Live/LivePlugin.h +++ /dev/null @@ -1,16 +0,0 @@ -#ifndef LIVEPLUGIN_H -#define LIVEPLUGIN_H - -#include - -class LivePlugin : public QScriptExtensionPlugin { -public: - LivePlugin ( QObject * parent = 0 ); - ~LivePlugin (); - - virtual void initialize ( const QString & key, QScriptEngine * engine ); - virtual QStringList keys () const; -}; - - -#endif // LIVEPLUGIN_H diff --git a/telldus-gui/Plugins/Live/RapidSSLCA.pem b/telldus-gui/Plugins/Live/RapidSSLCA.pem deleted file mode 100644 index 71af595e..00000000 --- a/telldus-gui/Plugins/Live/RapidSSLCA.pem +++ /dev/null @@ -1,23 +0,0 @@ ------BEGIN CERTIFICATE----- -MIID1TCCAr2gAwIBAgIDAjbRMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT -MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i -YWwgQ0EwHhcNMTAwMjE5MjI0NTA1WhcNMjAwMjE4MjI0NTA1WjA8MQswCQYDVQQG -EwJVUzEXMBUGA1UEChMOR2VvVHJ1c3QsIEluYy4xFDASBgNVBAMTC1JhcGlkU1NM -IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx3H4Vsce2cy1rfa0 -l6P7oeYLUF9QqjraD/w9KSRDxhApwfxVQHLuverfn7ZB9EhLyG7+T1cSi1v6kt1e -6K3z8Buxe037z/3R5fjj3Of1c3/fAUnPjFbBvTfjW761T4uL8NpPx+PdVUdp3/Jb -ewdPPeWsIcHIHXro5/YPoar1b96oZU8QiZwD84l6pV4BcjPtqelaHnnzh8jfyMX8 -N8iamte4dsywPuf95lTq319SQXhZV63xEtZ/vNWfcNMFbPqjfWdY3SZiHTGSDHl5 -HI7PynvBZq+odEj7joLCniyZXHstXZu8W1eefDp6E63yoxhbK1kPzVw662gzxigd -gtFQiwIDAQABo4HZMIHWMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUa2k9ahhC -St2PAmU5/TUkhniRFjAwHwYDVR0jBBgwFoAUwHqYaI2J+6sFZAwRfap9ZbjKzE4w -EgYDVR0TAQH/BAgwBgEB/wIBADA6BgNVHR8EMzAxMC+gLaArhilodHRwOi8vY3Js -Lmdlb3RydXN0LmNvbS9jcmxzL2d0Z2xvYmFsLmNybDA0BggrBgEFBQcBAQQoMCYw -JAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmdlb3RydXN0LmNvbTANBgkqhkiG9w0B -AQUFAAOCAQEAq7y8Cl0YlOPBscOoTFXWvrSY8e48HM3P8yQkXJYDJ1j8Nq6iL4/x -/torAsMzvcjdSCIrYA+lAxD9d/jQ7ZZnT/3qRyBwVNypDFV+4ZYlitm12ldKvo2O -SUNjpWxOJ4cl61tt/qJ/OCjgNqutOaWlYsS3XFgsql0BYKZiZ6PAx2Ij9OdsRu61 -04BqIhPSLT90T+qvjF+0OJzbrs6vhB6m9jRRWXnT43XcvNfzc9+S7NIgWW+c+5X4 -knYYCnwPLKbK3opie9jzzl9ovY8+wXS7FXI6FoOpC+ZNmZzYV+yoAVHHb1c0XqtK -LEL2TxyJeN4mTvVvk0wVaydWTQBUbHq3tw== ------END CERTIFICATE----- diff --git a/telldus-gui/Plugins/Live/__init__.js b/telldus-gui/Plugins/Live/__init__.js deleted file mode 100644 index f65e4ebf..00000000 --- a/telldus-gui/Plugins/Live/__init__.js +++ /dev/null @@ -1,197 +0,0 @@ -__setupPackage__( __extension__ ); - -com.telldus.live = function() { - var socket = null; - var menuId = 0; - var separatorId = 0; - var isRegistered = false; - var supportedMethods = 0; - var configUI = null; - - function init() { - configUI = application.configuration.addPage('Telldus Live!', 'configuration.ui', 'icon.png'); - socket = new LiveSocket(); - socket.errorChanged.connect(errorChanged); - socket.statusChanged.connect(statusChanged); - socket.notRegistered.connect(notRegistered); - socket.registered.connect(registered); - socket.messageReceived.connect(messageReceived); - socket.connectToServer(); - com.telldus.core.deviceEvent.connect(deviceEvent); - com.telldus.core.deviceChange.connect(sendDevicesReport); - configUI.findChild('registrationLink').clicked.connect(socket.activate); - configUI.findChild('registrationLink').visible = false; - } - - function notRegistered() { - isRegistered = false; - if (com.telldus.systray && !menuId) { - separatorId = com.telldus.systray.addSeparator(); - menuId = com.telldus.systray.addMenuItem( qsTr("Activate Telldus Live!") ); - com.telldus.systray.menuItem(menuId).triggered.connect(socket.activate); - } - registrationLinkVisible(true); - } - - function deviceEvent(deviceId, method, data) { - msg = new LiveMessage("DeviceEvent"); - msg.append(deviceId); - msg.append(method); - msg.append(data); - socket.sendMessage(msg); - } - - function deviceChangeEvent() { - } - - function messageReceived(msg) { - if (msg.name() == "command") { - handleCommand(msg.argument(0)); - } - } - - function handleCommand(msg) { - var action = msg.getString('action'); - if (action == "turnon") { - com.telldus.core.turnOn( msg.getInt('id') ); - } else if (action == "turnoff") { - com.telldus.core.turnOff( msg.getInt('id') ); - } else if (action == "dim") { - com.telldus.core.dim( msg.getInt('id'), msg.getInt('value') ); - } else if (action == "bell") { - com.telldus.core.bell( msg.getInt('id') ); - } else if (action == "up") { - com.telldus.core.up( msg.getInt('id') ); - } else if (action == "down") { - com.telldus.core.down( msg.getInt('id') ); - } else if (action == "stop") { - com.telldus.core.stop( msg.getInt('id') ); - } - } - - function isRegisteredToLive(){ - return isRegistered; - } - - function registered(msg) { - if (menuId > 0) { - com.telldus.systray.removeMenuItem(menuId); - com.telldus.systray.removeMenuItem(separatorId); - menuId = 0; - separatorId = 0; - } - //Mask to lowest common denominator - supportedMethods = - com.telldus.core.TELLSTICK_TURNON | - com.telldus.core.TELLSTICK_TURNOFF | - com.telldus.core.TELLSTICK_DIM | - com.telldus.core.TELLSTICK_BELL | - com.telldus.core.TELLSTICK_UP | - com.telldus.core.TELLSTICK_DOWN | - com.telldus.core.TELLSTICK_STOP; - supportedMethods = supportedMethods & msg.getInt('supportedMethods'); - isRegistered = true; - registrationLinkVisible(false); - sendDevicesReport(); - } - - function registrationLinkVisible(visibleParam){ - configUI.findChild('registrationLink').visible = visibleParam; - if (com.telldus.sensors) { - com.telldus.sensors.showLiveOptions(!visibleParam); - } - } - - function sendDevicesReport() { - if (!isRegistered) { - return; - } - msg = new LiveMessage("DevicesReport"); - var deviceList = com.telldus.core.deviceList.getList(); - list = new LiveMessageToken(); - for( i in deviceList ) { - device = new LiveMessageToken(); - device.set('id', deviceList[i].id); - device.set('name', deviceList[i].name); - device.set('methods', com.telldus.core.methods(deviceList[i].id, supportedMethods) ); - device.set('state', com.telldus.core.lastSentCommand(deviceList[i].id, supportedMethods) ); - device.set('stateValue', com.telldus.core.lastSentValue(deviceList[i].id, supportedMethods) ); - list.add(device); - } - msg.appendToken(list); - socket.sendMessage(msg); - } - - function sendSensorsReport(sensorList) { - if (!isRegistered) { - return; - } - msg = new LiveMessage("SensorsReport"); - - list = new LiveMessageToken(); - for( i in sensorList ) { - sensorFrame = new LiveMessageToken(); - sensor = new LiveMessageToken(); - sensor.set('name', sensorList[i].name); - sensor.set('protocol', sensorList[i].protocol); - sensor.set('model', sensorList[i].model); - sensor.set('sensor_id', sensorList[i].id); - var valueList = new LiveMessageToken(); - for( j in sensorList[i].values ){ - valueElement = new LiveMessageToken() - valueElement.set('type', sensorList[i].values[j].type); - valueElement.set('lastUp', sensorList[i].values[j].lastUpdated); - valueElement.set('value', sensorList[i].values[j].value); - valueList.add(valueElement); - } - sensorFrame.add(sensor); - sensorFrame.add(valueList); - list.add(sensorFrame); - } - msg.appendToken(list); - socket.sendMessage(msg); - } - - function sendSensorValues(sensor, sensorvalues){ - if (!isRegistered) { - return; - } - msg = new LiveMessage("SensorEvent"); - sensortoken = new LiveMessageToken(); - sensortoken.set('protocol', sensor.protocol); - sensortoken.set('model', sensor.model); - sensortoken.set('sensor_id', sensor.id); - var valueList = new LiveMessageToken(); - for( j=0; j - - Form - - - - 0 - 0 - 323 - 251 - - - - - 0 - 0 - - - - Form - - - - - 0 - 0 - 331 - 251 - - - - - - - - - Status: - - - - - - - unknown - - - true - - - - - - - - - - true - - - - - - - Activate Telldus Live! - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - diff --git a/telldus-gui/Plugins/Live/icon.png b/telldus-gui/Plugins/Live/icon.png deleted file mode 100755 index 1686c14f..00000000 Binary files a/telldus-gui/Plugins/Live/icon.png and /dev/null differ diff --git a/telldus-gui/Plugins/Live/translation_sv.ts b/telldus-gui/Plugins/Live/translation_sv.ts deleted file mode 100644 index 24cc7595..00000000 --- a/telldus-gui/Plugins/Live/translation_sv.ts +++ /dev/null @@ -1,109 +0,0 @@ - - - - - Form - - - Form - - - - - Status: - Status: - - - - unknown - - - - - Activate Telldus Live! - Aktivera Telldus Live! - - - - LiveObject - - - Default browser could not be opened - Standardwebbläsaren kunde inte öppnas - - - - We could not open your default internet browser - Vi kunde inte öppna din standardwebbläsare - - - - Please copy the following url and enter it in your browser:<br><a href='%1'>%1</a> - Kopiera följande URL och klistra in i din webbläsare:<br><a href='%1'>%1</a> - - - - Connecting to server %1 - Ansluter till servern %1 - - - - Registered - Registrerad - - - - Not registered - Inte registrerad - - - - Discover servers - Söker servrar - - - - Connected - Ansluten - - - - Disconnected from server - Bortkopplad från server - - - - Reconnecting in %1 seconds... - Återansluter om %1 sekunder... - - - - Connecting... - Ansluter... - - - - SSL Error - SSL-fel - - - - - Retrying in %1 seconds... - Försöker igen om %1 sekunder... - - - - No servers found - Inga servrar kunde hittas - - - - __init__ - - - Activate Telldus Live! - Aktivera Telldus Live! - - - diff --git a/telldus-gui/Plugins/Plugins.pro b/telldus-gui/Plugins/Plugins.pro deleted file mode 100644 index 2f207a5f..00000000 --- a/telldus-gui/Plugins/Plugins.pro +++ /dev/null @@ -1,6 +0,0 @@ -TEMPLATE=subdirs -SUBDIRS = Devices \ - FormLoader \ - Systray \ - TouchInterface - diff --git a/telldus-gui/Plugins/QML/CMakeLists.txt b/telldus-gui/Plugins/QML/CMakeLists.txt deleted file mode 100644 index 6098a415..00000000 --- a/telldus-gui/Plugins/QML/CMakeLists.txt +++ /dev/null @@ -1,38 +0,0 @@ -SET(QT_USE_QTDECLARATIVE TRUE) - -SET( Plugin_NAME "QMLLoader" ) - -if(COMMAND cmake_policy) - cmake_policy(SET CMP0005 NEW) -endif(COMMAND cmake_policy) - -SET( Plugin_SRCS - scriptfunctionwrapper.cpp - qmlarray.cpp - qmlplugin.cpp - qmlview.cpp -) - -SET( Plugin_HDRS - qmlplugin.h -) - -SET( Plugin_MOC_HDRS - scriptfunctionwrapper.h - qmlarray.h - qmlview.h -) - -SET( Plugin_PATH "com.telldus.qml" ) - -INCLUDE( ../TelldusCenterPlugin.cmake NO_POLICY_SCOPE ) - -IF (WIN32) - SET(QT_COMPONENTS_OUTPUT_DIR "${LIBRARY_OUTPUT_PATH}/${CMAKE_CFG_INTDIR}/Plugins/declarative") -ELSEIF (APPLE) - SET(QT_COMPONENTS_OUTPUT_DIR "${CMAKE_BINARY_DIR}/${CMAKE_CFG_INTDIR}/TelldusCenter.app/Contents/Plugins/declarative") -ELSE() - SET(QT_COMPONENTS_OUTPUT_DIR "${CMAKE_BINARY_DIR}/TelldusCenter/Plugins/declarative") - ADD_DEFINITIONS( -DPLUGIN_LIB_PATH=${CMAKE_INSTALL_PREFIX}/${PLUGIN_LIB_FULL_PATH}/declarative ) -ENDIF() -INCLUDE( ${CMAKE_SOURCE_DIR}/3rdparty/qt-components-desktop.cmake NO_POLICY_SCOPE ) diff --git a/telldus-gui/Plugins/QML/__init__.js b/telldus-gui/Plugins/QML/__init__.js deleted file mode 100644 index c368546c..00000000 --- a/telldus-gui/Plugins/QML/__init__.js +++ /dev/null @@ -1,5 +0,0 @@ - -__setupPackage__( __extension__ ); - -__postInit__ = function() { -} diff --git a/telldus-gui/Plugins/QML/qmlarray.cpp b/telldus-gui/Plugins/QML/qmlarray.cpp deleted file mode 100644 index fa306fea..00000000 --- a/telldus-gui/Plugins/QML/qmlarray.cpp +++ /dev/null @@ -1,51 +0,0 @@ -#include "qmlarray.h" -#include - -class QMLArray::PrivateData { -public: - QList list; -}; - -QMLArray::QMLArray(QObject *parent) : - QAbstractListModel(parent) -{ - d = new PrivateData; - - QHash roles; - roles[Qt::UserRole+1] = "modelData"; - setRoleNames(roles); -} - -QMLArray::~QMLArray() { - delete d; -} - -QVariant QMLArray::data(const QModelIndex &index, int role) const { - return d->list.at(index.row()).toVariant(); -} - -QVariant QMLArray::get(int index) const { - return this->data(this->index(index), Qt::DisplayRole); -} - -void QMLArray::push(const QScriptValue &v) { - beginInsertRows( QModelIndex(), d->list.size(), d->list.size() ); - d->list << v; - endInsertRows(); -} - -void QMLArray::remove(int index) { - beginRemoveRows( QModelIndex(), index, index ); - d->list.takeAt(index); - endRemoveRows(); -} - -void QMLArray::removeLater(int index) { - int methodIndex = this->metaObject()->indexOfMethod(QMetaObject::normalizedSignature("remove(int)")); - QMetaMethod method = this->metaObject()->method(methodIndex); - method.invoke(this, Qt::QueuedConnection, Q_ARG(int, index)); -} - -int QMLArray::rowCount(const QModelIndex &parent) const { - return d->list.size(); -} diff --git a/telldus-gui/Plugins/QML/qmlarray.h b/telldus-gui/Plugins/QML/qmlarray.h deleted file mode 100644 index d9da42e1..00000000 --- a/telldus-gui/Plugins/QML/qmlarray.h +++ /dev/null @@ -1,33 +0,0 @@ -#ifndef QMLARRAY_H -#define QMLARRAY_H - -#include -#include - -class QMLArray : public QAbstractListModel -{ - Q_OBJECT - Q_PROPERTY(int length READ rowCount) -public: - explicit QMLArray(QObject *parent = 0); - ~QMLArray(); - - virtual int rowCount(const QModelIndex &parent = QModelIndex()) const; - virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const; - -signals: - -public slots: - void push(const QScriptValue &v); - void remove(int index); - void removeLater(int index); - QVariant get(int index) const; - - -private: - class PrivateData; - PrivateData *d; - -}; - -#endif // QMLARRAY_H diff --git a/telldus-gui/Plugins/QML/qmlplugin.cpp b/telldus-gui/Plugins/QML/qmlplugin.cpp deleted file mode 100644 index c30e442b..00000000 --- a/telldus-gui/Plugins/QML/qmlplugin.cpp +++ /dev/null @@ -1,51 +0,0 @@ -#include "qmlplugin.h" -#include "qmlarray.h" -#include "qmlview.h" -#include -#include -#include -#include - -#include - -QMLPlugin::QMLPlugin ( QObject * parent ) - :QScriptExtensionPlugin( parent ) -{ -} - -QMLPlugin::~QMLPlugin() { -} - -QScriptValue QMLLoadFunction(QScriptContext *context, QScriptEngine *engine) { - if (!context->isCalledAsConstructor()) { - return engine->undefinedValue(); - } - - //Find out the filename so we have a relative directory to load from - QScriptContextInfo info(context->parentContext()); - QFileInfo fileinfo(info.fileName()); - QDir dir = fileinfo.dir(); - - return engine->newQObject(new QMLView(dir, context->argument(0)), QScriptEngine::ScriptOwnership); -} - -QScriptValue QMLArrayFunction(QScriptContext *context, QScriptEngine *engine) { - if (!context->isCalledAsConstructor()) { - return engine->undefinedValue(); - } - return engine->newQObject(new QMLArray(), QScriptEngine::ScriptOwnership); -} - -void QMLPlugin::initialize ( const QString & key, QScriptEngine * engine ) { - if (key == "com.telldus.qml") { - QScriptValue qml = engine->globalObject().property("com").property("telldus").property("qml"); - qml.setProperty("view", engine->newFunction(QMLLoadFunction)); - qml.setProperty("array", engine->newFunction(QMLArrayFunction)); - } -} - -QStringList QMLPlugin::keys () const { - return QStringList() << "com.telldus.qml"; -} - -Q_EXPORT_PLUGIN2(QMLInterface, QMLPlugin) diff --git a/telldus-gui/Plugins/QML/qmlplugin.h b/telldus-gui/Plugins/QML/qmlplugin.h deleted file mode 100644 index 2ee2c6d3..00000000 --- a/telldus-gui/Plugins/QML/qmlplugin.h +++ /dev/null @@ -1,19 +0,0 @@ -#ifndef QMLPLUGIN_H -#define QMLPLUGIN_H - -#include - -class QMLPlugin : public QScriptExtensionPlugin { -public: - QMLPlugin ( QObject * parent = 0 ); - ~QMLPlugin (); - - virtual void initialize ( const QString & key, QScriptEngine * engine ); - virtual QStringList keys () const; - -private: - -}; - - -#endif // SYSTRAYPLUGIN_H diff --git a/telldus-gui/Plugins/QML/qmlview.cpp b/telldus-gui/Plugins/QML/qmlview.cpp deleted file mode 100644 index 09849f85..00000000 --- a/telldus-gui/Plugins/QML/qmlview.cpp +++ /dev/null @@ -1,86 +0,0 @@ -#include "qmlview.h" -#include "scriptfunctionwrapper.h" -#include -#include -#include -#include -#include - -#define DEFINE_STRING_HELPER(X) #X -#define DEFINE_STRING(X) DEFINE_STRING_HELPER(X) - -class QMLView::PrivateData { -public: - QDir baseDir; - QScriptValue object; -}; - -QMLView::QMLView(const QDir &dir, const QScriptValue &object) : - QDeclarativeView() -{ - setAttribute(Qt::WA_TranslucentBackground); - setStyleSheet("background:transparent;"); - - QDeclarativeEngine *eng = this->engine(); - QStringList paths(eng->importPathList()); - QDir pluginsDir = QDir(qApp->applicationDirPath()); - -#if defined(Q_OS_MAC) - if (pluginsDir.dirName() == "MacOS") { - pluginsDir.cdUp(); - } -#endif - - if (pluginsDir.cd("Plugins/declarative")) { - paths << pluginsDir.absolutePath(); - } - -#if defined(Q_OS_UNIX) - paths << DEFINE_STRING(PLUGIN_LIB_PATH); -#endif - - eng->setImportPathList(paths); - - d = new PrivateData; - d->baseDir = dir; - d->object = object; - - QScriptValueIterator it(object); - - while (it.hasNext()) { - it.next(); - this->setProperty(it.name(), it.value()); - } -} - -QMLView::~QMLView() { - delete d; -} - -void QMLView::load(const QString &filename) { - this->setSource(d->baseDir.filePath(filename)); - QSize size = this->initialSize(); - if (size.isNull()) { - this->setResizeMode(QDeclarativeView::SizeRootObjectToView); - } else { - this->setResizeMode(QDeclarativeView::SizeViewToRootObject); - this->setMinimumSize(size); - } -} - -void QMLView::setProperty( const QString & name, const QScriptValue &value ) { - QDeclarativeContext *context = this->rootContext(); - if (value.isFunction()) { - context->setContextProperty(name, new ScriptFunctionWrapper(d->object, name, this)); - } else { - context->setContextProperty(name, value.toVariant()); - } -} - -void QMLView::sizeRootObjectToView(bool enable) { - if (enable) { - this->setResizeMode(QDeclarativeView::SizeRootObjectToView); - } else { - this->setResizeMode(QDeclarativeView::SizeViewToRootObject); - } -} diff --git a/telldus-gui/Plugins/QML/qmlview.h b/telldus-gui/Plugins/QML/qmlview.h deleted file mode 100644 index adbb97bc..00000000 --- a/telldus-gui/Plugins/QML/qmlview.h +++ /dev/null @@ -1,28 +0,0 @@ -#ifndef QMLVIEW_H -#define QMLVIEW_H - -#include -#include -#include - -class QMLView : public QDeclarativeView -{ - Q_OBJECT -public: - QMLView(const QDir &dir, const QScriptValue &object); - virtual ~QMLView(); - -signals: - -public slots: - void load(const QString &url); - void setProperty( const QString & name, const QScriptValue &value ); - void sizeRootObjectToView(bool enable); - -private: - class PrivateData; - PrivateData *d; - -}; - -#endif // QMLVIEW_H diff --git a/telldus-gui/Plugins/QML/scriptfunctionwrapper.cpp b/telldus-gui/Plugins/QML/scriptfunctionwrapper.cpp deleted file mode 100644 index 5ed58a5e..00000000 --- a/telldus-gui/Plugins/QML/scriptfunctionwrapper.cpp +++ /dev/null @@ -1,39 +0,0 @@ -#include "scriptfunctionwrapper.h" - -#include -#include -#include - -class ScriptFunctionWrapper::PrivateData { -public: - QScriptValue object; - QString name; -}; - -ScriptFunctionWrapper::ScriptFunctionWrapper(const QScriptValue &object, const QString &name, QObject *parent) : - QObject(parent) -{ - d = new PrivateData; - d->object = object; - d->name = name; -} - -ScriptFunctionWrapper::~ScriptFunctionWrapper() { - delete d; -} - -QScriptValue ScriptFunctionWrapper::call() { - return d->object.property(d->name).call(); -} - -QScriptValue ScriptFunctionWrapper::callWith(const QScriptValue &val) { - //qDebug() << "Call called" << d->name; - QScriptEngine *eng = val.engine(); - if (!eng) { - qDebug() << "We cannot access the script-engine, fail!"; - return QScriptValue(); - } - QScriptContext *ctx = eng->currentContext(); - return d->object.property(d->name).call(QScriptValue(), ctx->argumentsObject()); -} - diff --git a/telldus-gui/Plugins/QML/scriptfunctionwrapper.h b/telldus-gui/Plugins/QML/scriptfunctionwrapper.h deleted file mode 100644 index db5cae83..00000000 --- a/telldus-gui/Plugins/QML/scriptfunctionwrapper.h +++ /dev/null @@ -1,27 +0,0 @@ -#ifndef SCRIPTFUNCTIONWRAPPER_H -#define SCRIPTFUNCTIONWRAPPER_H - -#include -#include - -class ScriptFunctionWrapper : public QObject -{ - Q_OBJECT -public: - explicit ScriptFunctionWrapper(const QScriptValue &object, const QString &name, QObject *parent = 0); - virtual ~ScriptFunctionWrapper(); - -signals: - void titleChanged(); - -public slots: - QScriptValue call(); - QScriptValue callWith(const QScriptValue &val); - - -private: - class PrivateData; - PrivateData *d; -}; - -#endif // SCRIPTFUNCTIONWRAPPER_H diff --git a/telldus-gui/Plugins/Scheduler/CMakeLists.txt b/telldus-gui/Plugins/Scheduler/CMakeLists.txt deleted file mode 100644 index 80f57939..00000000 --- a/telldus-gui/Plugins/Scheduler/CMakeLists.txt +++ /dev/null @@ -1,13 +0,0 @@ -SET(REQUIRE_PLUGIN_QML TRUE PARENT_SCOPE) -SET(REQUIRE_PLUGIN_SETTINGS TRUE PARENT_SCOPE) -SET(REQUIRE_PLUGIN_SUNCALCULATOR TRUE PARENT_SCOPE) - -SET( Plugin_NAME "scheduler" ) - -SET( Plugin_PATH "com.telldus.scheduler" ) -SET( Plugin_EXTRA - "DaylightSavingTime.js" - "DefaultJobTypes.js" - ) - -INCLUDE( ../TelldusCenterPlugin.cmake NO_POLICY_SCOPE ) diff --git a/telldus-gui/Plugins/Scheduler/DaylightSavingTime.js b/telldus-gui/Plugins/Scheduler/DaylightSavingTime.js deleted file mode 100644 index d5f439ae..00000000 --- a/telldus-gui/Plugins/Scheduler/DaylightSavingTime.js +++ /dev/null @@ -1,113 +0,0 @@ -/* -Copyright (C) 2009 by Michael Khalili - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -*/ - -function TimezoneDetect(){ - var dtDate = new Date('1/1/' + (new Date()).getUTCFullYear()); - var intOffset = 10000; //set initial offset high so it is adjusted on the first attempt - var intMonth; - var intHoursUtc; - var intHours; - var intDaysMultiplyBy; - - //go through each month to find the lowest offset to account for DST - for (intMonth=0;intMonth<12;intMonth++){ - //go to the next month - dtDate.setUTCMonth(dtDate.getUTCMonth() + 1); - - //To ignore daylight saving time look for the lowest offset. - //Since, during DST, the clock moves forward, it'll be a bigger number. - if (intOffset > (dtDate.getTimezoneOffset() * (-1))){ - intOffset = (dtDate.getTimezoneOffset() * (-1)); - } - } - - return intOffset; -} - -//Find start and end of DST -function DstDetect(){ - var dtDstDetect = new Date(); - var dtDstStart = ''; - var dtDstEnd = ''; - var dtDstStartHold = ''; //Temp date hold - var intYearDayCount = 732; //366 (include leap year) * 2 (for two years) - var intHourOfYear = 1; - var intDayOfYear; - var intOffset = TimezoneDetect(); //Custom function. Make sure you include it. - - //Start from a year ago to make sure we include any previously starting DST - dtDstDetect = new Date() - dtDstDetect.setUTCFullYear(dtDstDetect.getUTCFullYear() - 1); - dtDstDetect.setUTCHours(0,0,0,0); - - //Going hour by hour through the year will detect DST with shorter code but that could result in 8760 - //FOR loops and several seconds of script execution time. Longer code narrows this down a little. - //Go one day at a time and find out approx time of DST and if there even is DST on this computer. - //Also need to make sure we catch the most current start and end cycle. - for(intDayOfYear = 1; intDayOfYear <= intYearDayCount; intDayOfYear++){ - dtDstDetect.setUTCDate(dtDstDetect.getUTCDate() + 1); - - if ((dtDstDetect.getTimezoneOffset() * (-1)) != intOffset && dtDstStartHold == ''){ - dtDstStartHold = new Date(dtDstDetect); - } - if ((dtDstDetect.getTimezoneOffset() * (-1)) == intOffset && dtDstStartHold != ''){ - dtDstStart = new Date(dtDstStartHold); - dtDstEnd = new Date(dtDstDetect); - dtDstStartHold = ''; - - //DST is being used in this timezone. Narrow the time down to the exact hour the change happens - //Remove 48 hours (a few extra to be on safe side) from the start/end date and find the exact change point - //Go hour by hour until a change in the timezone offset is detected. - dtDstStart.setUTCHours(dtDstStart.getUTCHours() - 48); - dtDstEnd.setUTCHours(dtDstEnd.getUTCHours() - 48); - - //First find when DST starts - for(intHourOfYear=1; intHourOfYear <= 48; intHourOfYear++){ - dtDstStart.setUTCHours(dtDstStart.getUTCHours() + 1); - - //If we found it then exit the loop. dtDstStart will have the correct value left in it. - if ((dtDstStart.getTimezoneOffset() * (-1)) != intOffset){ - break; - } - } - - //Now find out when DST ends - for(intHourOfYear=1; intHourOfYear <= 48; intHourOfYear++){ - dtDstEnd.setUTCHours(dtDstEnd.getUTCHours() + 1); - - //If we found it then exit the loop. dtDstEnd will have the correct value left in it. - if ((dtDstEnd.getTimezoneOffset() * (-1)) != (intOffset + 60)){ - break; - } - } - - //Check if DST is currently on for this time frame. If it is then return these values. - //If not then keep going. The function will either return the last values collected - //or another value that is currently in effect - if ((new Date()).getTime() >= dtDstStart.getTime() && (new Date()).getTime() <= dtDstEnd.getTime()){ - return new Array(dtDstStart,dtDstEnd); - } - - } - } - return new Array(dtDstStart,dtDstEnd); -} \ No newline at end of file diff --git a/telldus-gui/Plugins/Scheduler/DefaultJobTypes.js b/telldus-gui/Plugins/Scheduler/DefaultJobTypes.js deleted file mode 100644 index 4f4dcd2d..00000000 --- a/telldus-gui/Plugins/Scheduler/DefaultJobTypes.js +++ /dev/null @@ -1,432 +0,0 @@ -com.telldus.scheduler.JOBTYPE_ABSOLUTE = 0; -com.telldus.scheduler.JOBTYPE_RECURRING_DAY = 1; -com.telldus.scheduler.JOBTYPE_RECURRING_WEEK = 2; -com.telldus.scheduler.JOBTYPE_RECURRING_MONTH = 3; - -com.telldus.scheduler.EVENTTYPE_ABSOLUTE = 0; -com.telldus.scheduler.EVENTTYPE_SUNRISE = 1; -com.telldus.scheduler.EVENTTYPE_SUNSET = 2; - - -function getEventRunTime(event, date, lastRun){ - var currentEventRuntimeTimestamp = null; - var offset = event.d.offset; - if(isNaN(offset)){ - offset = 0; - } - if(event.d.type == com.telldus.scheduler.EVENTTYPE_ABSOLUTE){ - if(isNaN(date)){ - date = 0; - } - currentEventRuntimeTimestamp = (event.d.time * 1000) + date; - //print("currentEventRuntimeTimestamp: " + new Date(currentEventRuntimeTimestamp)); - currentEventRuntimeTimestamp += (offset * 1000); //this is really not useful for absolute values, but exists for consistency - //print("currentEventRuntimeTimestamp1: " + new Date(currentEventRuntimeTimestamp)); - currentEventRuntimeTimestamp = com.telldus.scheduler.fuzzify(currentEventRuntimeTimestamp, parseInt(event.d.fuzzinessBefore), parseInt(event.d.fuzzinessAfter), lastRun); - //print("currentEventRuntimeTimestamp2: " + new Date(currentEventRuntimeTimestamp)); - } - else if(event.d.type == com.telldus.scheduler.EVENTTYPE_SUNRISE || event.d.type == com.telldus.scheduler.EVENTTYPE_SUNSET){ - currentEventRuntimeTimestamp = getSunUpDownForDate(date, parseInt(event.d.type)); - currentEventRuntimeTimestamp += (offset * 1000); - currentEventRuntimeTimestamp = com.telldus.scheduler.fuzzify(currentEventRuntimeTimestamp, parseInt(event.d.fuzzinessBefore), parseInt(event.d.fuzzinessAfter), lastRun); - } - - return currentEventRuntimeTimestamp; -} - -function getGracePeriod(v){ - var pastGracePeriod = 0; - var lastRun = 0; - if(v.lastRun){ - lastRun = v.lastRun; - } - if(v.pastGracePeriod){ - var timeSinceLastRun = (new Date().getTime() - lastRun); - if(timeSinceLastRun > (v.pastGracePeriod * 1000)){ - pastGracePeriod = (v.pastGracePeriod * 1000); - } - else{ - pastGracePeriod = timeSinceLastRun; - } - } - - return pastGracePeriod; -} - - -function getJob(jobdata){ - //factory function... typ - var job; - var type = parseInt(jobdata.type); - switch(type){ - case com.telldus.scheduler.JOBTYPE_ABSOLUTE: - job = new com.telldus.scheduler.JobAbsolute(jobdata); - break; - case com.telldus.scheduler.JOBTYPE_RECURRING_DAY: - job = new com.telldus.scheduler.JobRecurringDay(jobdata); - break; - case com.telldus.scheduler.JOBTYPE_RECURRING_WEEK: - job = new com.telldus.scheduler.JobRecurringWeek(jobdata); - break; - case com.telldus.scheduler.JOBTYPE_RECURRING_MONTH: - job = new com.telldus.scheduler.JobRecurringMonth(jobdata); - break; - default: - job = new com.telldus.scheduler.Job(jobdata); - break; - } - - return job; -} - -/* -* pastGracePeriod - optional, run events that should have been run, for example, 5 minutes ago, -* but wasn't, because of a reboot or similar (in seconds) -* note, must in that case have checked last run -*/ -function getNextEventRunTime(nextRunTime, event, date, pastGracePeriod, lastRun){ - - if(!pastGracePeriod){ - var pastGracePeriod = 0; - } - - var currentEventRuntimeTimestamp = getEventRunTime(event, date, lastRun); - print("EventRunTime: " + new Date(currentEventRuntimeTimestamp)); - - if((nextRunTime === null || currentEventRuntimeTimestamp < nextRunTime) && currentEventRuntimeTimestamp > (new Date().getTime() - pastGracePeriod)){ //earlier than other events, but later than "now" - nextRunTime = currentEventRuntimeTimestamp; - } - - return nextRunTime; -} - -function getNextLeapYearSafeDate(year, month, day, event){ - if(month == 1 && day == 29){ - //get leap year - for(var i=0;i<5;i++){ - if(new Date(year+i,1,29).getDate() == 29){ - //this is a leap year - datetimestamp = getEventRunTime(event, new Date(year+1, 1, 29).getTime()); - if(datetimestamp > new Date().getTime()){ //else, this was a leap year, but already passed for this year - return datetimestamp; - } - } - } - } - else{ - var date = new Date(year, month, day); - return getEventRunTime(event, date.getTime()); - } -} - -function getSunUpDownForDate(datetimestamp, sun){ - date = new Date(datetimestamp); - var timevalues = com.telldus.suncalculator.riseset(date); - if(timevalues[2] && timevalues[2] != ""){ - return ""; //no sun up or down this day, do nothing - } - var hourminute; - if(sun == com.telldus.scheduler.EVENTTYPE_SUNRISE){ - hourminute = timevalues[0].split(':'); - } - else{ - hourminute = timevalues[1].split(':'); - } - date.setHours(hourminute[0]); - date.setMinutes(hourminute[1]); - return date.getTime(); -} - -/* -function loadJobs(){ - print("Loading jobs"); - //TODO detta ska inte göras från denna plugin, utan från respektive... - //TODO temp - creating events - var now = new Date(); - var time1 = now.getHours() * 3600 + now.getMinutes() * 60 + now.getSeconds(); - print(time1); // 48880 - time2 = time1 + 30; - time3 = time1 - 60; - time1 = time1 + 50; - - var startdate1 = new Date(2011,0,5).getTime(); - var startdate2 = new Date(2011,0,5).getTime(); - - //ID = ID for storage - //Key is position in list, returned from "addJob" - var execFunc = function(job){ print("Custom execute function running"); print("Job: " + job.v.name); return 42; }; - var newRecurringMonthJob = getJob({id: 4, executeFunc: execFunc, name: "testnamn14", type: com.telldus.scheduler.JOBTYPE_ABSOLUTE, startdate: startdate1, lastRun: 0, device: 1, method: 1, value: ""}); - newRecurringMonthJob.addEvent(new Event({id: 0, value: "", fuzzinessBefore: 0, fuzzinessAfter: 0, type: com.telldus.scheduler.EVENTTYPE_ABSOLUTE, offset: 10, time: (new Date().getTime())/1000 + 20})); - com.telldus.scheduler.addJob(newRecurringMonthJob); - //newRecurringMonthJob.save(); - - var newAbsoluteJob = getJob({id: 5, name: "testnamn15", type: com.telldus.scheduler.JOBTYPE_RECURRING_MONTH, startdate: startdate2, lastRun: 0, device: 1, method: 1, value: "", pastGracePeriod: 90}); - newAbsoluteJob.addEvent(new Event({id: 1, value: "00-05", fuzzinessBefore: 0, fuzzinessAfter: 0, type: com.telldus.scheduler.EVENTTYPE_ABSOLUTE, offset: 0, time: time2})); - newAbsoluteJob.addEvent(new Event({id: 2, value: "00-05", fuzzinessBefore: 0, fuzzinessAfter: 0, type: com.telldus.scheduler.EVENTTYPE_ABSOLUTE, offset: 0, time: time3})); - //newAbsoluteJob.save(); - com.telldus.scheduler.addJob(newAbsoluteJob); - - - /* - //get all jobs from permanent storage - var settings = new com.telldus.settings(); - var storedJobsData = settings.value("jobs", ""); - - for(var key in storedJobsData){ - var jobdata = storedJobsData[key]; - var job = getJob(jobdata); - var tempkey = com.telldus.scheduler.addJob(job); //TODO, use different function than this = only sort list afterwards (one time) and dont start timer until all initial are added - } - */ -//} - - -/* - * updateLastRun-example: - Job.prototype.updateJobLastRun(){ - var timestamp = new Date().getTime(); - com.telldus.scheduler.updateLastRun(this.key, timestamp); - //override this to save last run to storage too, but don't forget to call the above method too - var jobs = settings.value("jobs", ""); - jobs[this.v.id].v.lastRun = timestamp; - settings.setValue("jobs", jobs); -} -*/ - -function zeroTime(date){ - date.setHours(0); - date.setMinutes(0); - date.setSeconds(0); - date.setMilliseconds(0); - return date; -} - - -com.telldus.scheduler.Job.prototype.addEvent = function(event){ - if(!this.v.events){ - this.v.events = {}; - } - this.v.events[event.d.id] = event; -} - -com.telldus.scheduler.Job.prototype.save = function(){ - //TODO set properties - var settings = new com.telldus.settings(); - var jobs = settings.value("jobs", ""); - - if(!jobs){ - jobs = {}; //initialize new - } - - jobs[this.v.id] = this.v; - - settings.setValue("jobs", jobs); -} - -/* - * Job for device manipulation on absolute run times (i.e. one time jobs). Job will run at one or several occations, where each occation is added as a separate event - * To control more than one device, create a scene and run that one in the job. - * Job properties: - * id - id for storage purposes (e.g. removal/update), name - optional, - * lastRun - 0 for all new jobs, device - id of device to perform action on, - * method - action to perform on device, value - optional value to pass to method, - * pastGracePeriod - if job run time has been missed (for example due to a reboot), run it on program startup, if it should have run - * within the last "pastGracePeriod" seconds - * executeFunc - optional, override default execute function with this one - * type is com.telldus.scheduler.JOBTYPE_ABSOLUTE - * Event properties: - * id - for storage purposes (e.g. removal/update) - * fuzzinessBefore/fuzzinessAfter - an interval (in seconds) in which the runtime will be randomized, if the job should run at slightly different times each time - * type - EVENTTYPE_ABSOLUTE, EVENTTYPE_SUNRISE or EVENTTYPE_SUNSET - * time - time and date for event run, in seconds since 1970-01-01 - * offset - time (in seconds, positive or negative) to adjust the runtime, useful if something for example should occur 20 minutes past sunrise - */ -com.telldus.scheduler.JobAbsolute = function(jobdata){ com.telldus.scheduler.Job.call(this, jobdata); } - -/* - * Recurring job for device manipulation, same time every day or every x day ("value") - * To control more than one device, create a scene and run that one in the job. - * Schedule will not come into effect until "startdate" (timestamp) is passed - * Extra/different job properties: - * startdate - when schedule will come into effect, - * pastGracePeriod - if job run time has been missed (for example due to a reboot), run it on program startup, if it should have run - * within the last "pastGracePeriod" seconds - * type is com.telldus.scheduler.JOBTYPE_RECURRING_DAY - * Extra/different event properties: - * value - repeat every "value" day, starting from startdate, - */ -com.telldus.scheduler.JobRecurringDay = function(jobdata){ com.telldus.scheduler.Job.call(this, jobdata); } - -/* - * Recurring job for device manipulation, can have several events, each event has a time of day ("time") and weekday ("value", 0-6) when to run - * To control more than one device, create a scene and run that one in the job. - * If a job should run every weekday, 5 events are needed with values from 1-5 - * Schedule will not come into effect until "startdate" (timestamp) is passed - * Extra/different job properties: - * type is com.telldus.scheduler.JOBTYPE_RECURRING_WEEK - * Extra/different event properties: - * value - day of week - * time - seconds into the day - */ -com.telldus.scheduler.JobRecurringWeek = function(jobdata){ com.telldus.scheduler.Job.call(this, jobdata); } - -/* - * Recurring job for device manipulation, each event runs on a certain date of a certain month (i.e. next run for an event will be a year later) - * To control more than one device, create a scene and run that one in the job. - * If a job should run on a special day each month, 12 events will have to be created - * Event value should be stored in the format "00-05", 00 being the month (January, 0-11) and 05 the day of the month - * Schedule will not come into effect until "startdate" (timestamp) is passed - * Extra/different job properties: - * type is com.telldus.scheduler.JOBTYPE_RECURRING_MONTH - * Extra/different event properties: - * value - "month-day" - */ -com.telldus.scheduler.JobRecurringMonth = function(jobdata){ com.telldus.scheduler.Job.call(this, jobdata); } - -com.telldus.scheduler.JobAbsolute.prototype = new com.telldus.scheduler.Job(); -com.telldus.scheduler.JobRecurringDay.prototype = new com.telldus.scheduler.Job(); -com.telldus.scheduler.JobRecurringWeek.prototype = new com.telldus.scheduler.Job(); -com.telldus.scheduler.JobRecurringMonth.prototype = new com.telldus.scheduler.Job(); - -com.telldus.scheduler.JobAbsolute.prototype.getNextRunTime = function(){ - print("getNextRunTime absolute"); - var nextRunTime = null; - - if(!this.v.events){ - return null; - } - - var pastGracePeriod = getGracePeriod(this.v); - - for(var key in this.v.events){ - nextRunTime = getNextEventRunTime(nextRunTime, this.v.events[key], 0, pastGracePeriod, this.v.lastRun); - } - return nextRunTime; -} - -com.telldus.scheduler.JobRecurringDay.prototype.getNextRunTime = function(){ - print("getNextRunTime day"); - //Recurring day (every day, every other day or every x day) - //only one event/job (at the moment at least) - var nextRunTime = null; - var pastGracePeriod = getGracePeriod(this.v); - var date; - - if(this.v.lastRun > 0){ - var lastRunDate = new Date(this.v.lastRun); //TEST changed from this.lastRun, test this! - date = new Date(lastRunDate.getFullYear(), lastRunDate.getMonth(), lastRunDate.getDate()); - date = date.getTime() + this.v.events[0].d.value; //add interval - } - else{ - var startTime = new Date(); //Now - var minStartTime = new Date(this.v.startdate); - - if(minStartTime > startTime){ - //next run not until startTime is passed - startTime = minStartTime; - } - date = new Date(startTime.getFullYear(), startTime.getMonth(), startTime.getDate()); - } - nextRunTime = getNextEventRunTime(null, this.v.events[0], date.getTime(), pastGracePeriod, this.v.lastRun); - if(nextRunTime < new Date().getTime()){ - var runTime = new Date(date); - runTime.setDate(runTime.getDate() + parseInt(this.v.events[0].d.value)); - nextRunTime = getNextEventRunTime(null, this.v.events[0], runTime.getTime(), pastGracePeriod, this.v.lastRun); //already passed this time today, try again after "interval" days - } - - return nextRunTime; -} - -com.telldus.scheduler.JobRecurringWeek.prototype.getNextRunTime = function(){ - print("getNextRunTime week"); - var nextRunTime = null; - if(!this.v.events){ - return null; - } - - var pastGracePeriod = getGracePeriod(this.v); - for(var key in this.v.events){ - //get next correct day of week, may be today too - var weekday = parseInt(this.v.events[key].d.value); - if(weekday > 6 || weekday <0){ - print("Incorrect weekday value"); - continue; - } - print("Weekday... " + weekday); - var returnDate = new Date(); - var minStartTime = new Date(this.v.startdate); - if(minStartTime > returnDate){ - //next run not until startTime is passed - returnDate = minStartTime; - } - var returnDay = returnDate.getDay(); - if (weekday !== returnDay) { - returnDate.setDate(returnDate.getDate() + (weekday + (7 - returnDay)) % 7); - } - - returnDate = zeroTime(returnDate); - - nextTempRunTime = getNextEventRunTime(nextRunTime, this.v.events[key], returnDate.getTime(), pastGracePeriod, this.v.lastRun); - if(nextTempRunTime < new Date().getTime()){ //event happened today, already passed, add to next week instead - returnDate.setDate(returnDate.getDate() + 7); - nextRunTime = getNextEventRunTime(nextRunTime, this.v.events[key], returnDate.getTime(), pastGracePeriod, this.v.lastRun); - } - else{ - nextRunTime = nextTempRunTime; - } - } - return nextRunTime; -} - -com.telldus.scheduler.JobRecurringMonth.prototype.getNextRunTime = function(){ - print("getNextRunTime month"); - var nextRunTime = null; - if(!this.v.events){ - return null; - } - - var pastGracePeriod = getGracePeriod(this.v); - - for(var key in this.v.events){ - //get next x day of month, may be today, for the current month - if(!this.v.events[key].d.value || this.v.events[key].d.value.toString().indexOf("-") == -1){ //make sure value is of correct format - continue; - } - var daymonth = this.v.events[key].d.value.split('-'); //month-day - var month = daymonth[0]; - var day = daymonth[1]; - var startTime = new Date(); //Now - var minStartTime = new Date(this.v.startdate); - - if((32 - new Date(startTime.getFullYear(), month, 32).getDate()) < day){ //check that day exists for this month - if(month != 1 && day != 29){ - break; //this day doesn't exist for this month (at least not this year (leap year...)) - } - } - var nextdate = getNextLeapYearSafeDate(startTime.getFullYear(), month, day, this.v.events[key]); - - if((nextdate + pastGracePeriod) < new Date().getTime() || (nextdate + pastGracePeriod) < minStartTime){ //event already happened this year, or startTime not reached yet, add to next year instead - var tempdate = new Date(nextdate); - tempdate.setYear(startTime.getFullYear() + 1); - if(tempdate < minStartTime){ - tempdate.setYear(tempdate.getFullYear() + 1); //no need to check if start date is reached this time, will always be recalculated before that, if nothing else at least by daylight saving time - } - nextdate = tempdate.getTime(); - } - print("Candidate date: " + new Date(nextdate)); - if(nextRunTime === null || nextRunTime > nextdate){ - nextRunTime = nextdate; - } - } - - return nextRunTime; -} - -function Event(data){ - if(data){ - this.d = data; - } - else{ - this.d = {}; - } -} diff --git a/telldus-gui/Plugins/Scheduler/__init__.js b/telldus-gui/Plugins/Scheduler/__init__.js deleted file mode 100644 index 2cfeba79..00000000 --- a/telldus-gui/Plugins/Scheduler/__init__.js +++ /dev/null @@ -1,373 +0,0 @@ -__setupPackage__( __extension__ ); - -__postInit__ = function() { - application.allDoneLoading.connect( com.telldus.scheduler.init ); -} - -com.telldus.scheduler = function() { - - var storedJobs = new MappedList(); //all jobs, added by "addJob" - var joblist; //sorted list containing next run time (and id) for all storedJobs - var timerid = null; //id of currently running timer, used when timer should be aborted - var queuedJob; //job currently in running timer, is already removed from joblist - - //TODO (perhaps) run something on the LAST day of the month? - //TODO remove absolute events after being run... Cannot do that from here, must be done from loading/saving plugin - //TODO Logic in future extended scenes/macros (not here, but somewhere in telldus center): Delays - job that then continues a scene from a certain step after the delay - //TODO Logic in future extended scenes/macros (not here, but somewhere in telldus center): Conditions, see if certain condition is fulfilled when the schedule should - // run, for example engine heater if the temperature is below 5 degrees, or turn on light if it is cloudy (if not cloudy, wait 20 minutes - // Not only for schedule, other input (for example motion detectors) can be conditioned in the same way (for example, house inhabitants are set as "Gone"). - // Repeat, if condition is not fulfilled, try again in x seconds - //TODO Logic in future extended scenes/macros (not here, but somewhere in telldus center): "Stop scene", i. e. when device is turned on, automatically turn it off again after x seconds - - function init(){ - JobDaylightSavingReload.prototype = new com.telldus.scheduler.Job(); - setDaylightSavingJobFunctions(); - } - - - function addJob(job){ - if(storedJobs.length == 0){ - print("Adding daylight saving time"); - var daylightSavingReloadKey = storedJobs.push(getDaylightSavingReloadJob()); - updateJobInList(daylightSavingReloadKey); - } - var key = storedJobs.push(job); - job.key = key; - updateJobInList(key); - return key; - } - - //add several jobs at once, withou recalculating timer between each - function addJobs(jobs){ - var returnKeys = new Array(); - if(jobs == undefined || jobs.length == 0){ - return returnKeys; - } - if(storedJobs.length == 0){ - print("Adding daylight saving time"); - var daylightSavingReloadKey = storedJobs.push(getDaylightSavingReloadJob()); - updateJobInList(daylightSavingReloadKey, true); //waitForMore = don't sort array and recalculate timer yet - } - for(var i=0;i= (currentTimestamp - fuzzinessBeforeOrig)){ - //print("JUST RETURNING"); - return 0; //job already run in this interval, don't run it again... - } - //print("CONTINUING HAPPILY"); - var interval = fuzzinessAfter + fuzzinessBefore; - var rand = Math.random(); //Random enough at the moment - var fuzziness = Math.floor((interval+1) * rand); - fuzziness = fuzziness - fuzzinessBefore; - currentTimestamp += (fuzziness * 1000); - } - return currentTimestamp; - } - - function getDaylightSavingReloadJob(){ - return new JobDaylightSavingReload(); - } - - function recalculateAllJobs(){ - print("Recalculating all jobs"); - - joblist = new Array(); - - for(var key in storedJobs.container){ - var job = storedJobs.get(key); - var nextRunTime = job.getNextRunTime(); - print("Run time: " + new Date(nextRunTime)); - if(nextRunTime === null){ - print("Will not run"); - continue; - } - joblist.push(new RunJob(key, nextRunTime)); - } - - joblist.sort(compareTime); - runNextJob(); - } - - function removeFromJobList(id){ - if(!joblist){ - return; - } - for(i=0;i time){ - //already passed - time = dst[1].getTime(); - } - return time; - } - } - - function MappedList() { - this.container = {}; - this.length = 0; - } - - MappedList.prototype.contains = function(key){ - return !(this.container[key] === undefined); - } - - MappedList.prototype.get = function(key){ - return this.container[key]; - } - - MappedList.prototype.push = function(element){ - //TODO reusing keys at the moment, that's ok, right? - var length = this.length; - this.container[length] = element; - this.length = length + 1; - return length; - } - - MappedList.prototype.remove = function(key){ - delete this.container[key]; - this.length--; - } - - MappedList.prototype.update = function(key, element){ - this.container[key] = element; - } - - function RunJob(id, nextRunTime){ //, type, device, method, value){ - this.id = id; - this.nextRunTime = nextRunTime; - } - - return { //Public functions - addJob: addJob, //job, returns: storage id - addJobs: addJobs, //jobs (array), returns: storage id's in array - fuzzify: fuzzify, //timestamp, max fuzziness before, max fuzziness after, returns: new random timestamp within min/max fuzziness-boundries - removeJob: removeJob, //storage id - updateJob: updateJob, //storage id, job - updateLastRun: updateLastRun, //id, datetimestamp - init:init - } -}(); - -function compareTime(a, b) { - return a.nextRunTime - b.nextRunTime; -} - -com.telldus.scheduler.Job = function(jobdata) { - if(jobdata){ - this.v = jobdata; - } - else{ - this.v = {}; - } -} - -com.telldus.scheduler.Job.prototype.execute = function(){ - //may be overridden if other than device manipulation should be performed - var success = 0; - if(this.v.executeFunc != null){ - success = this.v.executeFunc(this); - this.updateJobLastRun(); - return success; - } - - success = this.executeDefault(); - - //if(success){ - //update last run even if not successful, else it may become an infinite loop (if using pastGracePeriod) - this.updateJobLastRun(); - //} - return success; -}; - -com.telldus.scheduler.Job.prototype.executeDefault = function(){ - var success = 0; - deviceid = this.v.device; - var method = parseInt(this.v.method); - //print("Job id: " + this.v.device + " Method: " + method); - switch(method){ - case com.telldus.core.TELLSTICK_TURNON: - success = com.telldus.core.turnOn(deviceid); - break; - case com.telldus.core.TELLSTICK_TURNOFF: - success = com.telldus.core.turnOff(deviceid); - break; - case com.telldus.core.TELLSTICK_DIM: - success = com.telldus.core.dim(deviceid, this.v.value); - break; - case com.telldus.core.TELLSTICK_BELL: - success = com.telldus.core.bell(deviceid); - break; - default: - break; - } - return success; -}; - -com.telldus.scheduler.Job.prototype.getNextRunTime = function(){ - print("getNextRunTime default"); - return null; //default -} - -com.telldus.scheduler.Job.prototype.updateJobLastRun = function(){ - var timestamp = new Date().getTime(); - com.telldus.scheduler.updateLastRun(this.key, timestamp); - //override this to save last run to storage too, but don't forget to call the above method too -} - -include("DefaultJobTypes.js"); -include("DaylightSavingTime.js"); \ No newline at end of file diff --git a/telldus-gui/Plugins/SchedulerGUISimple/ActionBar.qml b/telldus-gui/Plugins/SchedulerGUISimple/ActionBar.qml deleted file mode 100644 index 7b44bebc..00000000 --- a/telldus-gui/Plugins/SchedulerGUISimple/ActionBar.qml +++ /dev/null @@ -1,53 +0,0 @@ -import Qt 4.7 -import "schedulerscripts.js" as Scripts - -Rectangle{ - id: barRectangle - property variant hangOnToPoint - property color prevDayColor: "white" //default - property double prevDayOpacity: 0 //default - property int prevDayWidth: 0 //default - property string firstBar: "false" - - height: constBarHeight - z: 110 - - color: barRectangle.prevDayColor - opacity: barRectangle.prevDayOpacity - width: barRectangle.prevDayWidth - - onStateChanged: { - //cannot bind these values as state change properties for some reason (will generate anchor-to-null-item warnings), do it here instead - if(state == "pointLoaded"){ - anchors.verticalCenter = hangOnToPoint.verticalCenter; - anchors.left = hangOnToPoint.horizontalCenter; - } - else if(state == "continuingWithLimitedWidth"){ - anchors.verticalCenter = hangOnToPoint.verticalCenter; - anchors.left = hangOnToPoint.left; - } - else if(state == "continuing"){ - anchors.verticalCenter = hangOnToPoint.verticalCenter - anchors.left = hangOnToPoint.left - } - } - - states: [ - State{ - name: "continuingWithLimitedWidth" - PropertyChanges { - target: barRectangle - width: Scripts.getFirstPointWidth(hangOnToPoint) - } - }, - State{ - name: "pointLoaded" - PropertyChanges { - target: barRectangle - color: hangOnToPoint.actionTypeColor - opacity: hangOnToPoint.actionTypeOpacity - width: hangOnToPoint.parent == null ? 0 : Scripts.getBarWidth(barRectangle, hangOnToPoint, hangOnToPoint.parent.children) - } - } - ] -} diff --git a/telldus-gui/Plugins/SchedulerGUISimple/ActionPoint.qml b/telldus-gui/Plugins/SchedulerGUISimple/ActionPoint.qml deleted file mode 100644 index e81795c6..00000000 --- a/telldus-gui/Plugins/SchedulerGUISimple/ActionPoint.qml +++ /dev/null @@ -1,502 +0,0 @@ -import Qt 4.7 -import "schedulerscripts.js" as Scripts -import "actionpointscripts.js" as ActionPointScripts - -Rectangle{ - id: pointRect - property string actionTypeColor: "blue" //TODO default value - property int actionType: 1 //TODO default value - property int dimvalue: 50 //percent, recalucluate it before use - property double actionTypeOpacity: 1 - property string actionTypeImage: imageActionOn - property string isPoint: "true" - property variant isLoaded - //property int xvalue - property int fuzzyBefore: 0 - property int fuzzyAfter: 0 - property int offset: -100 - property int absoluteHour: parseInt(dialog.absoluteHour, 10) - property int absoluteMinute: parseInt(dialog.absoluteMinute, 10) - property alias triggerstate: trigger.state - property variant parentPoint: undefined - property variant pointId - property variant lastRun: 0; - property alias deviceRow: pointRect.parent - property variant selectedDate: (deviceRow == null || deviceRow == undefined) ? new Date() : deviceRow.selectedDate - property int daydate: (deviceRow == null || deviceRow == undefined || deviceRow.parent == undefined || deviceRow.parent.parent == undefined) ? -1 : deviceRow.parent.parent.daydate.getDay() - - - Component.onCompleted: { - //TODO useless really, still gets Cannot anchor to a null item-warning... - isLoaded = "true" - var actionBar = Qt.createComponent("ActionBar.qml") - var dynamicBar = actionBar.createObject(pointRect) - dynamicBar.hangOnToPoint = pointRect - dynamicBar.state = "pointLoaded" - } - - //use item instead of rectangle (no border then though) to make it invisible (opacity: 0) - width: constPointWidth - height: constDeviceRowHeight - border.color: "black" - opacity: 1 //0.8 - z: 100 - state: "on" - focus: true - - //reflect changes on parent/siblings: - onAbsoluteHourChanged: { - updateChanges(); - } - - onAbsoluteMinuteChanged: { - updateChanges(); - } - - onFuzzyBeforeChanged: { - updateChanges(); - } - - onFuzzyAfterChanged: { - updateChanges(); - } - - onOffsetChanged: { - updateChanges(); - } - - onDimvalueChanged: { - updateChanges(); - updateBars(); - } - - onStateChanged: { - updateChanges(); - } - - MouseArea { - id: pointRectMouseArea - acceptedButtons: Qt.LeftButton | Qt.RightButton - - onClicked: { - if (mouse.button == Qt.RightButton){ - pointRect.toggleType() - } - } - - onPositionChanged: { - var rootCoordinates = pointRect.mapToItem(pointRect.parent, mouse.x, mouse.y); - var hourMinute = getTimeFromPosition(rootCoordinates.x - mouse.x + pointRect.width/2) - if((hourMinute[0] >= 0) && hourMinute[0] < 24){ - pointRect.absoluteHour = hourMinute[0] - pointRect.absoluteMinute = hourMinute[1] - } - } - - onReleased: { - pointRect.deviceRow.setChanged(); - pointRect.deviceRow.updateContinuingBars() - dialog.show(pointRect) //TODO not pointRect, but parentPoint if such exists - dialog.absoluteHour = Scripts.pad(pointRect.absoluteHour, 2) - dialog.absoluteMinute = Scripts.pad(pointRect.absoluteMinute, 2) - - if(parentPoint != undefined){ - parentPoint.absoluteHour = parseInt(dialog.absoluteHour, 10); - parentPoint.absoluteMinute = parseInt(dialog.absoluteMinute, 10); - } - } - - anchors.fill: parent - drag.target: pointRect - drag.axis: Drag.XAxis - drag.minimumX: -1 * pointRect.width/2 - drag.maximumX: pointRect.parent == null ? 0 : pointRect.parent.width - pointRect.width/2 - drag.filterChildren: true - //TODO make it impossible to overlap (on release) (why?) - //TODO drag to most right - jumps back, why? - - states: State{ - id: "hidden"; when: pointRectMouseArea.drag.active - PropertyChanges { target: pointRect; opacity: 0.5; } - } - } - - Column{ - spacing: 10 - anchors.horizontalCenter: parent.horizontalCenter - - Image { - //opacity: 1 - id: actionImage - width: 20; height: 20 - source: pointRect.actionTypeImage - } - - Rectangle{ - id: trigger - anchors.horizontalCenter: parent.horizontalCenter - - state: "absolute" - width: 20; height: 20 - - //TODO state should move the point to correct place... (sunrisetime, sunsettime or absolute (stored value, the one that is dragged) - states: [ - State { - //TODO if no sunrise/sunset exists (arctic circle...), check so it works anyway - name: "sunrise" - PropertyChanges { target: triggerImage; source: imageTriggerSunrise; opacity: 1 } - PropertyChanges { target: triggerTime; opacity: 0 } - PropertyChanges { target: pointRectMouseArea; drag.target: undefined } - PropertyChanges { target: pointRect; x: getSunRiseTime.callWith(pointRect.parent.width, pointRect.width, pointRect.selectedDate) + minutesToTimelineUnits(pointRect.offset) } - }, - State { - name: "sunset" - PropertyChanges { target: triggerImage; source: imageTriggerSunset; opacity: 1 } - PropertyChanges { target: triggerTime; opacity: 0 } - PropertyChanges { target: pointRectMouseArea; drag.target: undefined } - PropertyChanges { target: pointRect; x: getSunSetTime.callWith(pointRect.parent.width, pointRect.width, pointRect.selectedDate) + minutesToTimelineUnits(pointRect.offset) } - }, - State { - name: "absolute"; when: !pointRectMouseArea.drag.active - PropertyChanges { target: triggerImage; opacity: 0; } - PropertyChanges { target: triggerTime; opacity: 1 } - PropertyChanges { target: pointRectMouseArea; drag.target: parent } - //PropertyChanges { target: pointRect; x: xvalue } - PropertyChanges { target: pointRect; x: getAbsoluteXValue() } - } - ] - - Rectangle{ - id: triggerTime - opacity: 1 - width: 20; height: 20 - anchors.centerIn: parent - Text{ - text: getTime(pointRect.x, pointRect.width); font.pointSize: 6; horizontalAlignment: Text.AlignHCenter; verticalAlignment: Text.AlignBottom - } - } - - Image { - id: triggerImage - opacity: 0 - anchors.fill: parent - width: 20; height: 20 - source: imageTriggerAbsolute - } - } - } - - states: [ - State { - name: "on" - PropertyChanges { target: pointRect; actionTypeColor: "blue"; actionTypeOpacity: 1 } - PropertyChanges { target: pointRect; actionTypeImage: imageActionOn } - StateChangeScript{ name: "updateBars"; script: updateBars(); } - }, - State{ - name: "off" - PropertyChanges { target: pointRect; actionTypeColor: "gainsboro"; actionTypeOpacity: 0 } - PropertyChanges { target: pointRect; actionTypeImage: imageActionOff } - StateChangeScript{ name: "updateBars"; script: updateBars(); } - }, - State{ - name: "dim" - PropertyChanges { target: pointRect; actionTypeColor: "green"; actionTypeOpacity: dimvalue/100 } - PropertyChanges { target: pointRect; actionTypeImage: imageActionDim } - StateChangeScript{ name: "updateBars"; script: updateBars(); } - }, - State{ - name: "bell" - PropertyChanges { target: pointRect; actionTypeColor: getLastPointColor() } - PropertyChanges { target: pointRect; actionTypeImage: imageActionBell } - StateChangeScript{ name: "updateBars"; script: updateBars(); } - } - ] - - Rectangle{ - //TODO continue fuzzy too into next/prev day - width: minutesToTimelineUnits(fuzzyAfter + fuzzyBefore) - height: constBarHeight - anchors.verticalCenter: parent.verticalCenter - x: parent.width/2 - minutesToTimelineUnits(fuzzyBefore) - opacity: 0.2 - z: 140 - - Image{ - anchors.fill: parent - fillMode: Image.Tile - source: "fuzzy.png" - } - } - - function updateBars(){ - if(pointRect.deviceRow != undefined){ - pointRect.deviceRow.updateContinuingBars(); - } - } - - function getAbsoluteXValue(){ - if(pointRect.parent == null){ - return 0; - } - var hourSize = pointRect.parent.width / 24; - var point = pointRect; - if(pointRect.parentPoint != undefined){ - point = pointRect.parentPoint; - } - //print("ABSOLUTE X-value: " + (point.absoluteHour * hourSize + hourSize * (point.absoluteMinute/60) - point.width/2)); - //print("AbsoluteHour: " +point.absoluteHour+ " hourSize: " + hourSize + " AbsoluteMinute: " + point.absoluteMinute + " Width: " + point.width); - return point.absoluteHour * hourSize + hourSize * (point.absoluteMinute/60) - point.width/2; - } - - function toggleType(){ //TODO other kind of selection method - var index = 0; - var activeStates = ActionPointScripts.getActiveStates(); - if(activeStates == undefined || activeStates.length == 0){ - return; - } - - for(var i=0;i prevPoint.x)){ - prevPoint = pointList[i]; - } - } - } - - if(prevPoint == null || prevPoint.actionTypeOpacity == 0){ - //no point before, no bar after either - actionTypeOpacity = 0 - return "papayawhip" //just return a color, will not be used - } - - actionTypeOpacity = prevPoint.actionTypeOpacity - return prevPoint.actionTypeColor - } - - function getTime(){ - if(pointRect.parent == null){ - return ""; - } - - var hours = Scripts.pad(pointRect.absoluteHour, 2); - var minutes = Scripts.pad(pointRect.absoluteMinute, 2); - return hours + ":" + minutes; - } - - function getTimeFromPosition(mouseX){ - if(pointRect.parent == null){ - return [0,0]; - } - var timeOfDay = mouseX; - var hourSize = pointRect.parent.width / 24; - var hours = Math.floor(timeOfDay / hourSize); - var partOfHour = ((timeOfDay - (hourSize * hours))/hourSize) * 60 - partOfHour = Math.floor(partOfHour); - partOfHour = Scripts.pad(partOfHour, 2); - hours = Scripts.pad(hours, 2); - return [hours, partOfHour]; - } - - function addActiveState(state){ - ActionPointScripts.addActiveState(state); - } - - function setActiveStates(activeStates){ - ActionPointScripts.setActiveStates(activeStates); - } - - function getActiveStates(){ - return ActionPointScripts.getActiveStates(); - } - - function setFirstState(firstState){ - - var activeStates = ActionPointScripts.getActiveStates(); - - if(activeStates == null || activeStates.length == 0){ - //nothing to do - return; - } - - //state may already be set: - if(firstState != undefined && firstState != ""){ - pointRect.state = firstState; - return; - } - - //check that device has the "off" state: - var exists = false; - for(var i=1;i