ubuntu-make-18.09+disco1/0000755000000000000000000000000013415342711012035 5ustar ubuntu-make-18.09+disco1/.dockerignore0000644000000000000000000000021513352651520014510 0ustar .dockerignore Dockerfile db.sqlite3 **__pycache__ *.pyc *.pyo *.pyd .Python env .coverage .coverage.* .cache coverage.xml *,cover *.log .git ubuntu-make-18.09+disco1/.pep80000644000000000000000000000017613352651520012717 0ustar [pep8] exclude = env/ max-line-length = 120 # ignore "Identation is not multiple of 4" for continuation line ignore = "E111" ubuntu-make-18.09+disco1/.travis.yml0000644000000000000000000000152413352651520014151 0ustar language: python sudo: required dist: trusty python: - "3.4" before_install: - sudo add-apt-repository -y ppa:ubuntu-desktop/ubuntu-make - sudo add-apt-repository -y ppa:ubuntu-desktop/ubuntu-make-builddeps - sudo apt-get update # install binary deps - sudo apt-get install -y $(tests/daily_runs/get_binary_depends ubuntu-make) # install tests requirements - sudo tests/daily_runs/install_build_tests_depends install: "" # we don't want to use virtualenv (see below) # as we can't use a system virtualenv anymore in travis CI and that # python-gobject isn't installable in pypy, we have to use system libraries # instead for both uncompiled and compiled modules. # The easiest way without hacking PYTHONPATH, PYTHONHOME is to use the system # python version by prepending it in the PATH. script: PATH="/usr/bin:$PATH" ./runtests pep8 small ubuntu-make-18.09+disco1/COPYING0000644000000000000000000010451313352651520013075 0ustar 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 . ubuntu-make-18.09+disco1/Dockerfile0000644000000000000000000001053613352651520014035 0ustar # Docker container for Ubuntu Make # this installs a full ubuntu desktop environment in an # unprivileged container, and adds a passwordless sudo user. # This enables running medium tests of umake. FROM ubuntu:14.04 MAINTAINER Didier Roche # Set the env variable DEBIAN_FRONTEND to noninteractive ENV DEBIAN_FRONTEND noninteractive #Set default locale ENV LANG C.UTF-8 RUN locale-gen en_US.UTF-8 ADD debian/control /tmp/ ADD docker/umake_docker.pub /tmp/ ADD tests/data/developer.android.com.crt /usr/local/share/ca-certificates/ ADD tests/data/www.eclipse.org.crt /usr/local/share/ca-certificates/ ADD tests/data/data.services.jetbrains.com.crt /usr/local/share/ca-certificates/ ADD tests/data/golang.org.crt /usr/local/share/ca-certificates/ ADD tests/data/www.mozilla.org.crt /usr/local/share/ca-certificates/ ADD tests/data/code.visualstudio.com.crt /usr/local/share/ca-certificates/ ADD tests/data/api.dartlang.org.crt /usr/local/share/ca-certificates/ ADD tests/data/storage.googleapis.com.crt /usr/local/share/ca-certificates/ ADD tests/data/netbeans.org.crt /usr/local/share/ca-certificates/ ADD tests/data/www.rust-lang.org.crt /usr/local/share/ca-certificates/ ADD tests/data/static.rust-lang.org.crt /usr/local/share/ca-certificates/ ADD tests/data/swift.org.crt /usr/local/share/ca-certificates/ ADD tests/data/nodejs.org.crt /usr/local/share/ca-certificates/ ADD tests/data/github.com.crt /usr/local/share/ca-certificates/ ADD tests/data/api.github.com.crt /usr/local/share/ca-certificates/ ADD tests/data/spring.io.crt /usr/local/share/ca-certificates/ ADD tests/data/dl.google.com.crt /usr/local/share/ca-certificates/ ADD tests/data/sublimetext.com.crt /usr/local/share/ca-certificates/ ADD tests/data/download.sublimetext.com.crt /usr/local/share/ca-certificates/ ADD tests/data/forum.unity3d.com.crt /usr/local/share/ca-certificates/ ADD tests/data/beta.unity3d.com.crt /usr/local/share/ca-certificates/ ADD tests/data/bitbucket.org.crt /usr/local/share/ca-certificates/ ADD tests/data/go.microsoft.com.crt /usr/local/share/ca-certificates/ ADD tests/data/download.jetbrains.com.crt /usr/local/share/ca-certificates/ ADD tests/data/www.apache.org.crt /usr/local/share/ca-certificates/ ADD tests/data/maven.apache.org.crt /usr/local/share/ca-certificates/ ADD tests/data/www.blender.org.crt /usr/local/share/ca-certificates/ ADD tests/data/download.blender.org.crt /usr/local/share/ca-certificates/ ADD tests/data/twinery.org.crt /usr/local/share/ca-certificates/ ADD tests/data/eagle-updates.circuits.io.crt /usr/local/share/ca-certificates/ ADD tests/data/godotengine.org.crt /usr/local/share/ca-certificates/ ADD tests/data/downloads.tuxfamily.org.crt /usr/local/share/ca-certificates/ ADD tests/data/www.arduino.cc.crt /usr/local/share/ca-certificates/ ADD tests/data/downloads.arduino.cc.crt /usr/local/share/ca-certificates/ ADD docker/create_packages.sh /tmp/ # Refresh the image RUN \ apt-get update && \ apt-get dist-upgrade -y && \ # install add-apt-repository and tools to create build-deps apt-get install -y software-properties-common devscripts equivs dpkg-dev && \ # add umake ppa add-apt-repository -y ppa:ubuntu-desktop/ubuntu-make && \ apt-get update && \ # install umake build-deps mk-build-deps /tmp/control -i --tool 'apt-get --yes' && \ # for running it as a daemon (and ssh requires the sshd directory) apt-get install openssh-server -y && \ mkdir /var/run/sshd && \ # disable DNS to not wait on host name resolution (delay when working offline) echo "UseDNS no" >> /etc/ssh/sshd_config && \ echo 'EXTRA_GROUPS="adm cdrom sudo dip plugdev fuse"' >> /etc/adduser.conf && \ echo 'ADD_EXTRA_GROUPS=1' >> /etc/adduser.conf && \ echo "user ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/bar && \ adduser --disabled-password --gecos "" user && \ echo user:user | chpasswd && \ # add the ubuntu make ssh key to the list of authorized ones mkdir -p /home/user/.ssh && \ cat /tmp/umake_docker.pub >> /home/user/.ssh/authorized_keys && \ chown -R user:user /home/user/ && \ # Twisted for a mock FTP server. apt-get install python-twisted-core -y && \ # add certificates update-ca-certificates && \ # finally remove all ppas and add local repository rm /etc/apt/sources.list.d/* && \ /tmp/create_packages.sh /apt-fake-repo && \ # clean up stuff apt-get clean -y && \ apt-get remove --purge -y software-properties-common devscripts equivs ubuntu-make-18.09+disco1/ISSUE_TEMPLATE.md0000644000000000000000000000120713352651520014543 0ustar Make sure you try the following before submitting the issue, thank you! - Check that umake is the latest version (https://github.com/ubuntu/ubuntu-make/releases) - If you're not running the latest development version of Ubuntu, or a flavor based on it, add the ppa as described in the README. Maybe the bug is fixed in the master branch? If you have all dependencies installed, you can run `umake` easily from it: ``` $ git clone https://github.com/ubuntu/ubuntu-make $ cd ubuntu-make $ bin/umake ``` If all this doesn't solve the problem you're having, please submit the issue including the version of ubuntu and umake itself. ubuntu-make-18.09+disco1/README.md0000644000000000000000000001754013352651520013324 0ustar # Ubuntu Make Ubuntu Make is a project designed to enable quick and easy setup of common needs for developers on Ubuntu. [![Snap Status](https://build.snapcraft.io/badge/ubuntu/ubuntu-make.svg)](https://build.snapcraft.io/user/ubuntu/ubuntu-make) More information on what this snap is available at https://didrocks.fr/2017/07/05/ubuntu-make-as-a-classic-snap-intro/ ## Current project health [![Build Status](https://travis-ci.org/ubuntu/ubuntu-make.svg?branch=master)](https://travis-ci.org/ubuntu/ubuntu-make) (pep8 and small tests) [All test results](https://jenkins.qa.ubuntu.com/job/udtc-trusty-tests/) and [Coverage report](https://jenkins.qa.ubuntu.com/job/udtc-trusty-tests-collect/label=ps-trusty-desktop-amd64-1/lastSuccessfulBuild/artifact/html-coverage/index.html) ## Installing We recommend to use the Ubuntu Make snap to ensure you always have the latest and greatest version, even on older supported releases. ```sh $ snap install ubuntu-make --classic ``` If installed via the snap it can be run as `ubuntu-make.umake`, or via the alias `umake` ### Attention The snap currently in the store is known to work on releases up to 16.04 (Xenial). For later releases there are compatibility issues, so it is recommended to install via the ppa. If the snap does not work there is a daily build ppa: ``` sudo add-apt-repository ppa:lyzardking/ubuntu-make sudo apt-get update sudo apt-get install ubuntu-make ``` ## Listing Umake has three listing options: - `--list` to show all the frameworks - `--list-available` to show the available frameworks - `--list-installed` to show the installed frameworks ## Running the command line tool To run the tool: ```sh $ ./umake ``` You can use `--help` to get more information and change the verbosity of the output with `-v`, `-vv`. ## Requirements > Note that this project uses python3 and requires at least python 3.3. All commands use the python 3 version. There are directions later on explaining how to install the corresponding virtualenv. ## Shell completion To enable shell completion on bash or zsh, just run: ```sh $ . enable_completion ``` ## Different level of logging Multiple logging profiles are available in *confs/* to be able to have different traces of your execution (particularly useful for debugging). For instance, you will find: * **debug.logcfg**: Similar to using -vv, but also puts logs in a *debug.log*. * **debug_network.logcfg**: The root logging level is INFO (-v), the network activities are in DEBUG mode and will be logged in *debug_network.log*. * **testing.logcfg**: Mostly for coverage tests, do not set any logging config on stdout, but: * DEBUG logs and above are available in *debug.log*. * INFO logs and above are available in *info.log*. * WARNING and ERROR logs are available in *error.log*. Under normal circumstances, we expect *error.log* to remain empty../ To load one of those logging profiles: ```sh $ LOG_CFG=confs/debug.logcfg bin/umake ``` ## Development ### Providing user's framework It's possible for anyone to have local frameworks for either development purposes or for special local or team use-cases. * Any files in a directory set with the "UMAKE_FRAMEWORKS" environment variable will be loaded first. * Any files inside ~/.umake/frameworks will be loaded next. Any file should eventually contain a category or frameworks like the ones in umake/frameworks/*. If category names are duplicated only one will be loaded. Ubuntu Make will first load the one controlled by the environment variable, then the one located in the home based directory, and finally, the system one. Note that duplicate filenames are supported but not encouraged. ### Style guide and checking We are running pep8, but the max line length has been relaxed to 120. env/ is excluded from the pep8 check as well. Running this test, in particular: ```sh $ ./runtests pep8 ``` This will run those pep8 checks on the code. You can also run the pep8 tool directly from the project directory: ```sh $ pep8 . ``` ### Tests #### Types of tests There are four types of tests that can be combined in runtests: * **pep8**: Run the pep8 tests on all the umake and test code. * **small**: Tests modules and components with mock content around them. Note that this uses a local webserver (http and https) to serve mock content. * **medium**: Tests the whole workflow. It directly calls end user tools from the command line, but without affecting the local system. Requirements like installing packages are mocked, as well as the usage of a local webserver serving (smaller) content similar to what will be fetched in a real use case. The assets have the same formats and layout. * **large**: Runs the same tests as the medium test, but with real server downloads and installation of dpkg packages. Most of these tests need root privileges. Be aware that these tests only run on a graphical environment. It will interfere with it and it is likely to install or remove packages on your system. To run all the tests, with coverage report, like in our jenkins infra: ```sh $ ./runtests ``` Use `--no-config` to disable the coverage report selection. #### Running some tests with all debug infos By default, **runtests** will not display any debug output if the tests are successful, similar to Nose. However, if only some tests are selected, runtests will a display full debug log, ```sh $ ./runtests tests/small/test_tools.py:TestConfigHandler ``` Use `--no-config` to disable the debug output selection. #### More information on runtests **runtests** is a small nose wrapper used to simplify the testing process. By default, if no arguments are supplied or if "all" is supplied, runtests will run all available tests on the project using the production nose configuration. It is possible to run only some types of tests: ```sh $ ./runtests small medium ``` This will only run small and medium tests, with all nose defaults (no profile is selected). Finally, you can run a selection of one or more tests: ```sh $ ./runtests tests/small/test_tools.py:TestConfigHandler ``` This enables the debug profile by default, to display all outputs and logging information (at debug level). You can activate/disable/change any of those default selected configurations with **--config/--coverage/--debug/--no-config** (see `runtests --help` for more information) #### Nose configurations Some nose configurations are available in **confs/**. You will find: * **debug.nose**: this profile shows all outputs and logging information while turning debug logging on. * **prod.nose**: this profile keeps all outputs captured, but display tests coverage results. #### Check for Python warnings: **runtests** is compatible with showing the Python warnings: ```sh $ PYTHONWARNINGS=d ./runtests ``` ### Create your own environment and run from it For an easier development workflow, we encourage the use of virtualenv to test and iterate on the project rather than installing all the requirements on your machine. In the project root directory run (env/ is already in .gitignore and excluded from pep8 checking): ```sh $ virtualenv --python=python3 --system-site-packages env $ sudo apt-get install -qq apt apt-utils libapt-pkg-dev # those are the requirements to compile python-apt $ sudo apt-get install -qq python3-gi # not installable with pypi $ sudo apt-get install -qq bzr python3-dev # requires for pip install -r $ env/bin/pip install -r requirements.txt $ source env/bin/activate $ bin/umake ``` ### Developing using system package Instead of using a virtual environment, you can install system packages to be able to run the Ubuntu Make tests. The build dependencies are listed in *debian/control* and should be available in latest development Ubuntu version. If you are using the latest LTS, you should find them in a dedicated [Ubuntu Make Build-dep ppa](https://launchpad.net/~ubuntu-desktop/+archive/ubuntu/ubuntu-make-builddeps). ## Release management Refresh .pot files: ```sh $ ./setup.py update_pot ``` ubuntu-make-18.09+disco1/TODO0000644000000000000000000000004413352651520012524 0ustar - shell complete tests in runtests ubuntu-make-18.09+disco1/bin/0000755000000000000000000000000013352651520012606 5ustar ubuntu-make-18.09+disco1/bin/umake0000755000000000000000000000205213352651520013635 0ustar #!/usr/bin/env python3 # -*- coding: utf-8 -*- # Copyright (C) 2014 Canonical # # Authors: # Didier Roche # # 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; version 3. # # 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 import os import sys # Run local umake from this helper root_dir = os.path.dirname(os.path.abspath(os.path.dirname(__file__))) sys.path.insert(0, root_dir) from umake import main # Stamp that we are running a local version from umake import settings settings.from_dev = True if __name__ == '__main__': main() ubuntu-make-18.09+disco1/confs/0000755000000000000000000000000013352651520013146 5ustar ubuntu-make-18.09+disco1/confs/completions/0000755000000000000000000000000013352651520015502 5ustar ubuntu-make-18.09+disco1/confs/completions/_umake0000644000000000000000000000017413352651520016670 0ustar #compdef umake # we use bash global completion autoload -Uz bashcompinit bashcompinit source /etc/bash_completion.d/umake ubuntu-make-18.09+disco1/confs/coverage.cov0000644000000000000000000000011613352651520015450 0ustar # coverage should export html to coverage-html [html] directory=html-coverage ubuntu-make-18.09+disco1/confs/debug.logcfg0000644000000000000000000000121113352651520015412 0ustar version: 1 disable_existing_loggers: False formatters: simple: format: "[%(name)s] %(levelname)s: %(message)s" with_time: format: "%(asctime)s [%(name)s] %(levelname)s: %(message)s" handlers: console: class: logging.StreamHandler level: DEBUG formatter: simple stream: ext://sys.stdout debug_file_handler: class: logging.handlers.RotatingFileHandler level: DEBUG formatter: with_time filename: debug.log maxBytes: 10485760 # 10MB backupCount: 20 encoding: utf8 root: level: DEBUG handlers: [console, debug_file_handler] ubuntu-make-18.09+disco1/confs/debug.nose0000644000000000000000000000005013352651520015115 0ustar [nosetests] nocapture=1 nologcapture=1 ubuntu-make-18.09+disco1/confs/debug_network.logcfg0000644000000000000000000000140213352651520017165 0ustar version: 1 disable_existing_loggers: False formatters: simple: format: "[%(name)s] %(levelname)s: %(message)s" with_time: format: "%(asctime)s [%(name)s] %(levelname)s: %(message)s" handlers: console: class: logging.StreamHandler level: DEBUG formatter: simple stream: ext://sys.stdout debug_network_file_handler: class: logging.handlers.RotatingFileHandler level: DEBUG formatter: with_time filename: debug_network.log maxBytes: 10485760 # 10MB backupCount: 20 encoding: utf8 loggers: umake.network: level: DEBUG handlers: [console, debug_network_file_handler] propagate: no root: level: INFO handlers: [console] ubuntu-make-18.09+disco1/confs/githooks/0000755000000000000000000000000013352651520014775 5ustar ubuntu-make-18.09+disco1/confs/githooks/post-commit0000755000000000000000000000124013352651520017173 0ustar #!/bin/sh # # Amend and tag releasing commit to take into account added autogenerated # or updated files in the pre commit hooks. git log -1 HEAD | grep -qi "releasing package" found=$? set -e # we are on a release commit, add missing files and tag if [ $found -eq 0 ]; then rootdir="$(dirname $(readlink -f $0))/../.." releasingfile="$rootdir/.git/releasing" # if we are already releasing (and so, amending the commit), don't redo anything (avoid loop) if [ -f $releasingfile ]; then rm $releasingfile exit 0 fi touch $releasingfile git commit --amend -C HEAD --no-verify git tag -f $(cat ${rootdir}/umake/version) fi ubuntu-make-18.09+disco1/confs/githooks/pre-commit0000755000000000000000000000316513352651520017004 0ustar #!/bin/sh # # only have this pre-commit check on master if [ "`git name-rev --name-only HEAD`" != "master" ]; then exit 0 fi if git rev-parse --verify HEAD >/dev/null 2>&1 then against=HEAD else # Initial commit: diff against an empty tree object against=4b825dc642cb6eb9a060e54bf8d69288fbee4904 fi # If you want to allow non-ASCII filenames set this variable to true. allownonascii=$(git config --bool hooks.allownonascii) # Redirect output to stderr. exec 1>&2 # Cross platform projects tend to avoid non-ASCII filenames; prevent # them from being added to the repository. We exploit the fact that the # printable range starts at the space character and ends with tilde. if [ "$allownonascii" != "true" ] && # Note that the use of brackets around a tr range is ok here, (it's # even required, for portability to Solaris 10's /usr/bin/tr), since # the square bracket bytes happen to fall in the designated range. test $(git diff --cached --name-only --diff-filter=A -z $against | LC_ALL=C tr -d '[ -~]\0' | wc -c) != 0 then cat <<\EOF Error: Attempt to add a non-ASCII file name. This can cause problems if you want to work with people on other platforms. To be portable it is advisable to rename the file. If you know what you are doing you can disable this check using: git config hooks.allownonascii true EOF exit 1 fi # If there are whitespace errors, print the offending file names and fail. ##We let download page being offending #git diff-index --check --cached $against -- # Run pep8 and small tests ##git stash -q --keep-index ./runtests pep8 small RESULT=$? ##git stash pop -q [ $RESULT -ne 0 ] && exit 1 exit 0 ubuntu-make-18.09+disco1/confs/githooks/prepare-commit-msg0000755000000000000000000000263713352651520020443 0ustar #!/bin/sh # # We ensure we bump everything needed when doing a release. # We do not use debcommit, but just put "releasing" in the changelog, # we match "releas", ignoring the case and change+tag version # 0. Ensuring that we have some UNRELEASED content in debian/changelog # 1. Compute the new release number, based on older umake/version # 2. We update umake/version with the new release number # 3. Bumping debian/changelog version as well # 4. Then, modifying the commit message itself to match the correct version grep -qi "create release" $1 found=$? set -e # we are releasing a version, generate the version if [ $found -eq 0 ]; then scriptdir=$(dirname $(readlink -f $0)) rootdir="$scriptdir/../.." releasingfile="$rootdir/.git/releasing" # if we are already releasing (and so, amending the commit), don't redo anything (avoid loop) if [ -f $releasingfile ]; then exit 0 fi head -1 ${rootdir}/debian/changelog | grep -q UNRELEASED if [ $? -ne 0 ]; then echo "This commits says that it's releasing, but no UNRELEASED in debian/changelog, exiting" exit 1 fi # get a new valid version. This updates umake/version as well version=$(${scriptdir}/update_version git add ${rootdir}/umake/version) dch -v ${version} "" dch -r "" --distribution zesty git add ${rootdir}/debian/changelog echo "releasing package ubuntu-make ${version}" > $1 fi ubuntu-make-18.09+disco1/confs/githooks/update_version0000755000000000000000000000344713352651520017762 0ustar #!/usr/bin/python3 # -*- coding: utf-8 -*- # Copyright (C) 2015 Canonical # # Authors: # Didier Roche # # 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; version 3. # # 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 import datetime import os import sys if __name__ == '__main__': version_file_path = os.path.join(os.path.dirname(__file__), "..", "..", "umake", "version") version_tempfile_path = "{}.new".format(version_file_path) version = '{:%y.%m}'.format(datetime.datetime.now()) old_version = open(version_file_path, 'r', encoding='utf-8').read().strip() if old_version[0:5] == version: minor = old_version[6:] # need to bump to a minor version if minor: try: minor = int(minor) + 1 version += ".{}".format(minor) except ValueError: print("{} hasn't the expected format: YY.MM.".format(old_version)) sys.exit(1) # there was no minor version, so add first one else: version += ".1" # write new version file with open(version_tempfile_path, 'w', encoding="utf-8") as f: f.write(version) f.flush() os.fsync(f.fileno()) os.rename(version_tempfile_path, version_file_path) print(version) ubuntu-make-18.09+disco1/confs/info.logcfg0000644000000000000000000000046413352651520015270 0ustar version: 1 disable_existing_loggers: True formatters: simple: format: "[%(name)s] %(levelname)s: %(message)s" handlers: console: class: logging.StreamHandler level: INFO formatter: simple stream: ext://sys.stdout root: level: INFO handlers: [console] ubuntu-make-18.09+disco1/confs/prod.nose0000644000000000000000000000014013352651520014773 0ustar [nosetests] with-cov=1 cov=umake cov-report=term-missing,html,xml cov-config=confs/coverage.cov ubuntu-make-18.09+disco1/confs/testing.logcfg0000644000000000000000000000200513352651520016003 0ustar version: 1 disable_existing_loggers: False formatters: simple: format: "[%(name)s] %(levelname)s: %(message)s" with_time: format: "%(asctime)s [%(name)s] %(levelname)s: %(message)s" handlers: debug_file_handler: class: logging.handlers.RotatingFileHandler level: DEBUG formatter: with_time filename: debug.log maxBytes: 10485760 # 10MB backupCount: 20 encoding: utf8 info_file_handler: class: logging.handlers.RotatingFileHandler level: INFO formatter: with_time filename: info.log maxBytes: 10485760 # 10MB backupCount: 20 encoding: utf8 warn_error_file_handler: class: logging.handlers.RotatingFileHandler level: WARNING formatter: with_time filename: errors.log maxBytes: 10485760 # 10MB backupCount: 20 encoding: utf8 root: level: DEBUG handlers: [debug_file_handler, info_file_handler, warn_error_file_handler] ubuntu-make-18.09+disco1/confs/testingsubprocess.logcfg0000644000000000000000000000222213352651520020115 0ustar version: 1 disable_existing_loggers: False formatters: simple: format: "[%(name)s] %(levelname)s: %(message)s" with_time: format: "%(asctime)s [%(name)s] %(levelname)s: %(message)s" handlers: console: class: logging.StreamHandler level: WARNING formatter: simple stream: ext://sys.stdout debug_file_handler: class: logging.handlers.RotatingFileHandler level: DEBUG formatter: with_time filename: debug.log maxBytes: 10485760 # 10MB backupCount: 20 encoding: utf8 info_file_handler: class: logging.handlers.RotatingFileHandler level: INFO formatter: with_time filename: info.log maxBytes: 10485760 # 10MB backupCount: 20 encoding: utf8 warn_error_file_handler: class: logging.handlers.RotatingFileHandler level: WARNING formatter: with_time filename: errors.log maxBytes: 10485760 # 10MB backupCount: 20 encoding: utf8 root: level: DEBUG handlers: [console, debug_file_handler, info_file_handler, warn_error_file_handler] ubuntu-make-18.09+disco1/debian/0000755000000000000000000000000013415342711013257 5ustar ubuntu-make-18.09+disco1/debian/changelog0000644000000000000000000011176713415342614015150 0ustar ubuntu-make (18.09+disco1) disco; urgency=medium * tests/small/test_download_center.py: - fix disco autopkgtests failing due to newer python. -- Didier Roche Wed, 09 Jan 2019 10:58:33 +0100 ubuntu-make (18.09) cosmic; urgency=medium [ Galileo Sartor ] * New upstream release (LP: #1794737) * Add json parser to baseinstaller * Remove frameworks overriding base * android: Add Android Platform Tools * Fix frameworks [ Didier Roche ] * Ignore data files for incorrect language attribution * Enable autopkgtests on artful+ [ Brendad McGrath ] * ide: Fix Eclipse checksum test [ Anton Patsev ] * ide: Add DBeaver support -- Galileo Sartor Wed, 26 Sep 2018 11:37:20 +0200 ubuntu-make (18.05) cosmic; urgency=medium [ Galileo Sartor ] * Use symlinks for exec * games: Add Godot * games: Add GDevelop * games: Add Blender * games: Reenable Unity3D * electronics: Add category * electronics: Add Eagle * crystal: Add Crystal Lang * maven: add Maven * ide: Reenable Spring Tools * ide: Add Eclipse Javascript * ide: Add Atom Beta * ide: Add Processing * ide: Add GoLand * ide: Fix vscode dependencies (libgconf) * ide: Add vscode insiders * web: Add PhantomJS [ Kevin McCormack ] * web: Add StartupWMClass to firefox-dev [ Tito Brasolin ] * android: Add env variables to Android Studio [ Tankypon ] * Add Listing support [ Valerio Mariani ] * ide: Add StartupWMClass to Visual Studio Code [ Alexander Sidorenko ] * ide: Add Rider [ Ruoshi Li ] * fix clean exec_path And a lot more fixes! -- Galileo Sartor Mon, 14 May 2018 19:36:48 +0200 ubuntu-make (17.03) zesty; urgency=medium [ Galileo Sartor ] * Fix android sdk and android studio * Fix unity3D download page * Fix for never rust download page * Change phpstorm icon * Changed icon in rubymine to svg * Add apm to bin folder * Check when there is a failure if people are using the latest Ubuntu Make version. Direct them to the ppa otherwise. * Fix some tests * Return the pexpect reply so we can use multiple option expect * Add issue template [ Didier Roche ] * Add running from master instructions in issue template * Some small tests refactoring * Support running VCS umake version without being in root directory -- Didier Roche Fri, 10 Mar 2017 15:43:42 +0100 ubuntu-make (16.11.1) zesty; urgency=medium * Enable small tests passing on yakkety+ with a more modern trusted local repository layout. -- Didier Roche Fri, 18 Nov 2016 12:08:37 +0100 ubuntu-make (16.11) zesty; urgency=medium [ Galileo Sartor ] * Removed jayatana dependency from android-studio * Change netbeans link * Support incorrect use of download_url when using GitHub API * Change superpowers repo [ Mehmet Keçeci ] * Update tr.po * Update ubuntu-make.pot [ Hannes De Valkeneer ] * Change netbeans checksum from md5 to sha256 [ Michael Chou ] * Android Studio duplicate icons in launcher fix [ Trent Schafer ] * Update post install message for all frameworks when needing to relogging [ Wilsen Hernandez ] * Spanish translation strings updated [ Didier Roche ] * Fix regression where Exec wasn't pointing at the correct install path when using a custom location * Decompress even slightly corrupted tar files. (latest golang release can now be uncompressed) * Prepare for zesty releases -- Didier Roche Fri, 18 Nov 2016 09:31:22 +0100 ubuntu-make (16.09) yakkety; urgency=medium [ Galileo Sartor ] * Add Sublime Text 3 support * Add Atom Support * Fix node_modules folder setting for respecting npmrc and add Node LTS * Fix eclipse download url * Change eclipse download-keyword to avoid conflicts * Fix firefox-dev install and exec * Fix unity 3D url * Adapt to new VSCode binary path [ Igor Vuk ] * Fix a few typos in README.md [ neopi21 ] * French translation update [ Jared Ravetch ] * Update Rust download url, add SSL cert for static.rust-lang.org, update tests [ Didier Roche ] * Have autopkgtest depend on libjs-jquery-throttle-debounce -- Didier Roche Thu, 22 Sep 2016 09:22:13 +0200 ubuntu-make (16.05) yakkety; urgency=medium [ Galileo Sartor ] * Fix Android-Studio and Android-SDK frameworks with newer website * Use github api for LightTable and superpowers frameworks * Add openjdk-8-jdk to android studio/sdk * Remove openjdk dependency for arduino [ Fabio Colella ] * Updated requirements for Netbeans to work on Xenial [ Jared Ravetch ] * Fix locale in tests [ Didier Roche ] * Done misc reviews on previous contributions * Change release hook to point to yakkety -- Didier Roche Wed, 04 May 2016 13:40:18 +0200 ubuntu-make (16.04) xenial; urgency=medium [ Galileo Sartor ] * Fix Xenial by adding an openjdk-8-jdk as a dependency to eclipse and intellij. (Fixes: #279) * Add language dependencies on IDEs specific to one language only (pycharm, rubymine…) [ Didier Roche ] * Write some future test strategy for pycharm/python medium tests -- Didier Roche Tue, 05 Apr 2016 09:24:55 +0200 ubuntu-make (16.03.2) xenial; urgency=medium * Fixup number for xenial -- Didier Roche Wed, 30 Mar 2016 09:15:03 +0200 ubuntu-make (16.03.1) xenial; urgency=medium * Fix test as python 3.5 downloader can return bigger size (on xenial) -- Didier Roche Wed, 30 Mar 2016 08:59:37 +0200 ubuntu-make (16.03) xenial; urgency=medium [ Galileo Sartor ] * Add Eclipse JEE support * Add Intellij EAP support * Fix Unity3D on lts mesa * Fix VSCode license page due to server changes * Fix Android-NDK due to server changes * Fix Clang support due to server changes * Fix Intellij .desktop file * Add a "or" package logic to the dependency check and install * Remove jayatana from intellij * Adapt large and medium tests to those changes [ Tankypon ] * Add Superpowers game editor framework [ Omer Sheikh ] * Add Kotlin compiler support * Remove openjdk from datagrip requirements [ Eakkapat Pattarathamrong ] * Add more test for Visual Studio Code [ Almeida ] * Update pt_BR translation [ Didier Roche ] * Change StartupWMClass to match the one Android Studio creates * Fix EULA acceptance translations in pt * Add more tests on symlinks creation and removal * Fix and make more reliable test infrastructure + some cleanup logic * Adapt large and medium tests to those changes -- Didier Roche Wed, 30 Mar 2016 08:22:24 +0200 ubuntu-make (16.02.1) xenial; urgency=medium [ Galileo Sartor ] [ Didier Roche ] * Fix Visual Studio Code to use permanent links as the website changed. Adapt tests to it. -- Didier Roche Wed, 10 Feb 2016 09:43:20 +0100 ubuntu-make (16.02) xenial; urgency=medium [ Galileo Sartor ] * Add Nodejs support with always latest node and npm now available! * Add Lighttable IDE support. * Create symlinks in a bin/ directory which is now added to user's PATH for each .desktop file created. That way, people can run their app from the command line as well. * All of those covered by small medium and large tests. [ Patricio Pérez ] * Add Spring Tools Suite and its testsuite. [ Omer Sheikh ] * Add JetBrains Datagrip with tests * Add python-gnupg to requirements.txt. [ Didier Roche ] * Disable Visual Studio Code installation for now. Adapt tests for that change. -- Didier Roche Tue, 09 Feb 2016 08:47:49 +0100 ubuntu-make (16.01.2) xenial; urgency=medium [ Galileo Sartor ] * Add swift lang support with according tests. * Add support for Eclipse php with tests. * Add support for Eclipse cpp with tests. [ Evan McIntire ] * dd manpage that is generated from the --help text. [ Didier Roche ] * Fix, and implements some testing for Swift, Eclipse php and cpp. * Add gpg key support so that we can mock and add it to frameworks, working around some uid != euid limitations. * Compile local python file under current user name in tests. -- Didier Roche Wed, 20 Jan 2016 17:38:39 -0800 ubuntu-make (16.01.1) xenial; urgency=medium * Fix Go support as of 1.5.3, they now publishes a sha256 instead of a sha1 checksum. * Adapt tests to it. * A lot of work on tests: - add local/vm/remote args to runtests to easily run tests in locally, in an adt environment or remotely on the official infrastructure. - minimizing autopkgtests installation - docker fixes with proxy for medium tests - ensure we run with a dummy xorg driver - ensure compiz is running before running large and custom tests - fix TESTS=all triggering custom tests - fix not installing ubuntu-make package itself for git tests -- Didier Roche Thu, 14 Jan 2016 12:26:52 +0100 ubuntu-make (16.01) xenial; urgency=medium [ Galileo Sartor ] * Always deliver the latest Unity3D version (beta) to our users. * Ensure we always download latest available eclipse java IDE version. This enables users to now get eclipse Mars from Ubuntu Make! [ Didier Roche ] * Enable setting up Firefox Dev as default browser. * Move Visual Studio Code to IDE category. Keep it still on the web category for backward compatiblity. Adapts tests to ensure both category works (with a warning on the web one). * Move the testing infrastructure from jenkins to ubuntu autopkgtests: - create pep8/small/medium/large/all targets to mimic runautopkgtests behavior. - add a setup test bed, installing an ubuntu-desktop image, grabbing git branch or system package and generating stats info. - add another collecting coverage test to generate and copy stats to artefacts directory. - a custom target is triggered when one or more specific tests are desired like --env="TESTS=tests/small/.py tests.small.foo:TestClass:test_bar". - all those tests are handled by a TESTS env variable. If not set, we run pep8 and small tests. - creating utils and scripts to factorize most of the logic. * Protect against invalid tar archive that can be opened but not fully extracted. * Remove libxp6 dep from Stencyl as optional and not available from wily. * Install test dependencies from package and autopkgtests list. Use that logic in both autopkgtest infra and jenkins. * Make test_install_progress more robust as apt 1.1.5 changed its update signaling behavior. * Add in baseinstaller some way to only match last link when parsing. * Rework foreign architecture addition and detection to ensure we only call it once (we were calling them once per package previously), fix some races in cache handling. Move this facility to tools and restructure tests for this, while adding some more. * Add locks to avoid a race condition when creating temp file (to not create them as root) and add a new contextwrapper for as_root() with its tests. * Drop sshpass in favor of ssh key for docker image connection. * Some misc fixes: - Change some error messages and making them localizable. - fix an issue to avoid nested fakeroot calls. - Ensure we always kill children process and not the wrapper in container. - Add a fallback when os.getlogin() returns transient errors. - Normalize end of line tests comparaison. - Fix some possible failure when issuing a progressbar update. - Restructure, decouple and grab additional mocks for tests - Restore properly the initial environment in test_settings to avoid env leaks bugs. - Import cleanups. -- Didier Roche Tue, 12 Jan 2016 09:39:08 +0100 ubuntu-make (15.12.1) xenial; urgency=medium [ Eldar Khayrullin ] * Update Unity3D link to latest [ Didier Roche ] * Fix rust for their latest release as they changed rustlib directory * Adapt rust medium assets * Fix medium tests by changing unity server host * Some tidy up on BeautifulSoup latest release -- Didier Roche Thu, 17 Dec 2015 07:36:45 +0100 ubuntu-make (15.12) xenial; urgency=medium * Fix JetBrain's based IDE due to their new website deployement: - Use now their API directly. - Adapt medium tests and assets to follow that new structure. * Add a deprecation warning on udtc command (will be removed after 16.04 LTS) -- Didier Roche Fri, 11 Dec 2015 10:52:53 +0100 ubuntu-make (15.11.2) xenial; urgency=medium [ Abigail Buccaneer ] * Add JetBrains CLion C/C++ IDE support. [ Eldar Khayrullin ] * Complete Russian translation. [ Translation team ] * Refresh po files with latest community translations. Thanks to all our translator community! [ Didier Roche ] * Add Twine game editor support. * Ensure --help always show category help when following category, even if it has default frameworks. * Add tests (small/medium/large) to cover those. * Add ZSH completion to the same level as bash completion. * Fix visual studio icon which changed its path (detected thanks to our testsuite). * Add medium and large tests for CLion. * Fallback to plain english if language support isn't fully installed. * Fix incorrect pt_BR translations. * Add better description for jetbrain IDEs. * Create and move a bunch of Android tests to a mock BaseInstaller based one. This enables us to cut large test time by a magnitude of 2. Using that opportunity to add more tests and complete existing ones. * Standardize language test bed to run in plain english whatever your configuration is. * Misc. tests enhancements and tools fixes. * Move build dependencies only needed for tests to another ppa (ppa:ubuntu-desktop/ubuntu-make-builddeps) and add it in jenkins tests. This way, people using Ubuntu Make on older release are not impacted by the need of newer version of tests frameworks like pexpect and won't install them. Hook that ppa in Travis CI, our jenkins infra and refresh contributor intro to ask adding that ppa for testing. * Enhance our jenkins job for testing a pull request branch and other minor test job enhancements. * Update French translations. * Update translation template for new and updated frameworks. -- Didier Roche Tue, 24 Nov 2015 08:06:03 +0100 ubuntu-make (15.11.1) xenial; urgency=medium [ Fabio Colella ] * Added support for Netbeans IDE, with possibility of extension to support its flavours. * Add large and initial support for medium tests. [ Jared Ravetch ] * Add Rust support, installing the latest rust compiler and tools version. * Initial support for medium and large tests. * Override GOROOT value instead of appending it (Go doesn't support GOROOT having multiple values). [ Eldar Khayrullin ] * Update unity3d version up to 5.1.0f3+2015091501. [ Sebastian Schuberth ] * Change android NDK env variable to use NDK_ROOT instead of ANDROID_NDK. [ Didier Roche ] * Fix webstorm icon renamed upstream. * Ship version file as part of the install (Now --version really works on packaged flavor as well) + stamp generated binary with correct version. * Fix BaseInstaller to not crash when all downloads assets are 404 + add medium tests for this. * Ensure -r global option behave like --remove. * Some style, refactoring and formatting tidy up for recent merges and changes. * Add medium assets, certificates and additional failure test cases for netbeans and rust. * Update docker container for medium tests with new certificates. * Readd Travis CI integration running pep8 and small tests (with badge status and updated wording in README). New pushes and pull requests are now automatically tested on those 2 kinds of tests. * Fix and updates dependencies for package and pip virtualenv deps. * Standardize the test environment so that people running tests using for instance zsh are not impacted. * Finish up shipping static files support for future frameworks. * Using scala framework for loading tests and making autopkgtests pass on armel64 (android not available on this arch). * Improve releasing script and migrate gbp config to new headers. [ Translators ] * Refreshed translation template and updated translations. Thanks to all our translators! - new supported languages: fa, pt_BR - Updating the following languages: de, en_AU, en_CA, en_GB, eu, hr, it, pl, ru, te, zh_CN, zh_HK -- Didier Roche Tue, 10 Nov 2015 09:12:26 +0100 ubuntu-make (15.11) xenial; urgency=medium [ Omer Sheikh ] * Change default install path to ~/.local/share/umake/, depending on $XDG_DATA_HOME. * Add tests for those. * Improve tests stability in different environment (particularly jenkins) by creating wrapper around pexpect.spawnu. The wrapper sets the virtual terminal dimensions before calling pexpect.spawnu. This is to solve the problem of newline and carriage returns appearing in the stdout of created processes when testing under jenkins. [ Sebastian Schuberth ] * Fix changelog name. * Set the ANDROID_HOME and NDK_ROOT environment variables for android NDK frameworks. [ Jared Ravetch ] * Fix user message when prompting user to restart shell session. [ Didier Roche ] * Add a --version option to print current ubuntu make version. The rules are: - if the user is on a released version, then print this version - if the user is on a git branch, use: - version-#commits-shortsha1 if there is no local or staged changes - version-#commits-shortsha1-dirty if there is some locals or staged changes - finally, if the user is a local checkout, but without git history, just print: version+unknown * Fix --remove when used before a category name. Now, you can properly umake --remove and the framework will be removed. * Fix framework env variables not removed for zsh shells on --remove. * Fix cmd list mangling for large Android NDK tests. * Add some autoreleasing script, to bump version, add them to stage, tag and commit. * Enable multiple decompressions to end up in same directory and adapt frameworks to this new framework API. * Adjust DownloadCenter number of threads to match number of assets to download. * Make BaseInstaller supporting multiple assets downloads and fix it to only reflect download progress when we have all download size data. We could have one download finishing up (and so global being at 100%) while other downloads didn't start yet. Ensure we have all assets size before reporting first download global progress. * Fix as well cleaned path to not be removed. * Filter in BaseInstaller to not decompress assets that are files to copy. * Add a bunch of small, medium and large tests for versioning, removal, env variable cleanups, parallel decompressions in the same directory, done callback counts for decompression and downloads. * Add a way to specify multiple ports (and hosts) in medium tests. This will be used in future frameworks which rely both on https and http downloads. Test tools can now expose multiple ports inside the container. Changed as well all medium tests to adapt to this new API. * Ensure we source .profile when executing command in container. * Various changes to run medium tests even on system installed version. * Save new jenkins jobs enabling medium tests and add branch-targeted jenkins job to test branches not merged yet into master. * Better medium tests stability support and optimization. * Package new version of pexpect and add dependency markers. * Some PR post-merge fixes and various refactoring. * Remove WIP marker in README. -- Didier Roche Tue, 03 Nov 2015 10:39:04 +0100 ubuntu-make (15.10) wily; urgency=medium * Fix Dartlang download due to its new website layout. * Fix pycharm educational link as their linux download returned some windows binary. * Adapt medium tests assets to those new website layouts and new certificates. * Add support for frameworks to poke for download on multiple hosts (needed for the Dartlang case). * Add support for medium tests to have a SNI server to cope with requests on multiple hosts when faking server inside the container, including delivering the correct content and certificate. * Ensure that probing for reinstall in frameworks is only requiring the right engagement level from the user (and add tests for this). * Add some generic frameworks functionality for detecting intallation state, enabling to remove a lot of similar code in all frameworks. * Handle properly directory which doesn't exists in archive to decompress. * Ensure that a logging config selection via conffile display the selected logging level. * Enhance logging and debugging support. * Add a bunch of new tests and raised the test coverage to reach 93%. * Add missing requirements from contributor documentation. Big thanks to aung for this! * Make CI jenkins jobs being more resilient to random failures (distro, network…). * Test jenkins jobs are now archived. * Misc code cleanups and dead code removal. -- Didier Roche Thu, 08 Oct 2015 10:19:14 +0200 ubuntu-make (15.09.2) wily; urgency=medium * Ignore continuation line having to be a multiple of 4 in older pep8 release (making identation not aligned with above line). * This then trigger new warnings for double spaces, fix them. -- Didier Roche Thu, 10 Sep 2015 08:00:33 +0200 ubuntu-make (15.09.1) wily; urgency=medium * Add support for installing android SDK only by Sebastian Schuberth - add associated set of medium and large tests. * Rationalize exit status of umake by Omer Sheikh - every error now, in addition to print some errors, exits as expect with an exit code of 1. - add and modify large tests, to ensure that each framework (those using BaseInstaller and those having some dedicated code path) are behaving the same for errors. - mock in medium tests bad page download to exercise the error code path here as well. * Fix some pep8 issues (trusty only), some small tests broken by previous merges. -- Didier Roche Thu, 10 Sep 2015 07:24:23 +0200 ubuntu-make (15.09) wily; urgency=medium * Unity 3D editor experimental support. You can install it through: umake games unity3d. Only amd64 is currently supported upstream. * Fix Arduino download as upstream web pages changes. Support more release version format and ensure we don't raise an exception but only log an error. * Add license support to Android NDK. * Adapt and add large and medium tests for both Unity 3D and Android NDK. * Various enhancements to enable decompressing shell-embedded archives without copying entire files. Add corresponding tests. * Refactor Android license parsing to be reusable to future Android SDK support. * Fix a bug where if license was after the download links, we wouldn't find the license. * Better add_to_user_env API for contributors. * Minor cosmetic and small bug fixes. -- Didier Roche Tue, 01 Sep 2015 10:51:32 +0200 ubuntu-make (15.08) wily; urgency=medium * Add scala support and add related medium and large tests. (Igor Vuk) * Fix Visual Studio Code download URL as VSCode updated their download mechanism on their website. (Vartan Simonian) * Fix progress bar out of range exception. (Anton Antonov) * Change medium VSC assets to match new download page. * Do some pep8 fixes triggered by new pep8 version. -- Didier Roche Thu, 13 Aug 2015 07:43:12 +0200 ubuntu-make (0.9.2) wily; urgency=medium * Enable language selection in firefox developer tools (thanks to Omer Sheikh): - Now the installation of firefox developer tools enable to choose interactively one of the available language (default being US). - add a --lang= parameter to switch to another language in non interactive mode. - additional tests and mocks for the new options and capability * Prevent double error logging when a TextWithChoice doesn't get the correct user's input. Adapt tests to it. * Fix a double empty [] when no shortcut is present. * Updated README to improve readability. Moved to more passive language. (thanks Brian P. Sizemore) -- Didier Roche Tue, 04 Aug 2015 09:06:57 +0200 ubuntu-make (0.9.1) wily; urgency=medium * Change test to prevent FTBFS with 3.5: assert_has_calls() * Print whole process output before getting the pexpect exception to get more info when a medium or large test is failing -- Didier Roche Fri, 24 Jul 2015 11:59:57 +0200 ubuntu-make (0.9.0) wily; urgency=medium * Force depending only on default python3 for the current ubuntu version. -- Didier Roche Tue, 21 Jul 2015 10:21:29 +0200 ubuntu-make (0.9) wily; urgency=medium * New arduino support. Thanks to Tin Tvrtković to have provided most of the work. * Fix parsing for Visual Studio Code 32 bits as upstream page changed. * Deprecate Dart Editor framework (marked for remove only) and add Dart SDK new framework as per Dart 1.11, the Editor is not supported anymore. * Added or adapt tests for those new cases. * Refresh and add helpers to large and medium tests to factorize them much more and aligning information we check from the .desktop files (exec and icon paths). * Remove tests data from umake runtime. * Some test cleanups and mock refresh (android studio, Visual Studio Code, Android NDK). -- Didier Roche Tue, 21 Jul 2015 09:34:45 +0200 ubuntu-make (0.8.2) wily; urgency=medium * Fix Visual Studio Code support due to new upstream archive layout and web page content. * Add support for 32 bits installation of VSC as now supported upstream. * Refresh and adapt large and medium tests to reflect those changes. -- Didier Roche Wed, 10 Jun 2015 09:41:49 +0200 ubuntu-make (0.8.1) wily; urgency=medium * Match Android NDK with new download URL. * Adapt medium test accordingly. * Fix one failing Android large test. -- Didier Roche Mon, 08 Jun 2015 08:59:30 +0200 ubuntu-make (0.8) wily; urgency=medium * Fix icon name that changed in Android Studio 1.2. Thanks Mark Trolley for this contribution! * Add tests to ensure that we are checking icon file name for android frameworks as well. * Rewrite the access in tests for icons and executables to read directly from the optional installed desktop file. Keep a way to override it for frameworks without desktop file. * Ensure we can remove deprecated frameworks. They only appear in shell completion and --help only if you had them installed. Prevent any reinstallation but only get a removal option. * Addition of a full non interactive installation mode. * Add tests for all those new features and fix some previous failing tests. -- Didier Roche Thu, 07 May 2015 11:13:09 +0200 ubuntu-make (0.7) vivid; urgency=medium * Add Visual Studio Code support (under the "web" category) * Fix an error message printing for the eclipse framework if the server doesn't return a success code -- Didier Roche Thu, 30 Apr 2015 13:06:50 +0200 ubuntu-make (0.6.2) vivid; urgency=medium * New translations: - Greek, Indonesian * Updated translations: - German, Spanish, French -- Didier Roche Thu, 02 Apr 2015 09:56:30 +0200 ubuntu-make (0.6.1) vivid; urgency=medium * Set dart-editor as the command to install the editor and adapt the tests to this * Fix some strings not marked for translations * Print help for category with no default framework * Fix get binary depends with empty starting line in debian/control * Add missing tests deps in debian/tests/control -- Didier Roche Thu, 12 Mar 2015 08:14:02 +0100 ubuntu-make (0.6) vivid; urgency=medium * New IDEs support and various cleanups by Anton Antonov: - rubymine - pycharm educational - pycharm professional - webstorm - phpstorm * All of those covered by medium and large tests * Add zsh support + tests (thanks Anton Antonov again) * Various small code enhancements -- Didier Roche Wed, 18 Feb 2015 09:47:08 +0100 ubuntu-make (0.5) vivid; urgency=medium * Add Idea Ultimate support, thanks to Tin Tvrtković. * Add Android NDK support. * Add Dartlang support. * Add Firefox Developer Edition support. * Get new ftp download support as Intellij downloads can redirect to ftp download based on location. Thank to Tin Tvrtković. * Refresh de and es translations. Thanks to all contributors! * Rationalize what is up for translations and refresh i18n templates for new strings. * Fix some is_installed() detection. * Workaround a glib issue when some Unity launcher icon doesn't appear. * Some tests enhancements, cleanups and fixes. -- Didier Roche Thu, 12 Feb 2015 10:48:20 +0100 ubuntu-make (0.4.1) vivid; urgency=medium * Fix for Intellij IDEA download page, thanks to Tin Tvrtković. * Add jayatana dependency for ides based on intellij so that even older releases than vivid get appmenu support. * Some misc test and docker container fixes. -- Didier Roche Thu, 22 Jan 2015 09:00:45 +0100 ubuntu-make (0.4) vivid; urgency=medium * Add go support from the golang google compiler * Add a game category with stencyl support * Refactor and add some tests for those -- Didier Roche Tue, 06 Jan 2015 10:49:58 +0100 ubuntu-make (0.3) vivid; urgency=medium * New release featuring intellij IDEA and Pycharm support (from jetbrain) in their community edition. Thanks to Tin Tvrtković for this work. They both are covered by new tests. * Add dependency on beautifulsoup for easier html parsing by Tin Tvrtković. * Ensure we download Android Studio over https. * Miscellaneous medium tests fixes. -- Didier Roche Tue, 16 Dec 2014 09:33:21 +0100 ubuntu-make (0.2) vivid; urgency=medium * Releasing under new name: ubuntu-make. Handle transition by shipping a temporary binary under the older name (udtc). New command is umake. Note as well that the new framework environment variable is UMAKE_FRAMEWORKS. * Provide compatibility binary (udtc) for now in the transitional package. Also move previous configuration file location to the new one. * Update Standards-Version * Fix Android Studio installation, now that it reached 1.0 milestone. * Removing Android Eclipse (adt) from Ubuntu Make: upstream doesn't provide any bundle anymore as this tools is deprecated in favor of Android Studio. -- Didier Roche Tue, 09 Dec 2014 08:23:33 +0100 ubuntu-developer-tools-center (0.1.1-0ubuntu1) vivid; urgency=medium * Bug-fix release as Google changed their android-studio checksum from md5sum to sha1sum. Implementing sha1sum largely thanks to Tin Tvrtković work! * Adapt tests + new tests for sha1sum. * Note that the new Android Studio doesn't ship the sdk with it anymore. You need to download it manually and set the path to it. Will try to get in touch with the android studio developer team for this. -- Didier Roche Tue, 04 Nov 2014 09:55:41 +0100 ubuntu-developer-tools-center (0.1-0ubuntu1) vivid; urgency=medium * Add eclipse support as a standalone IDE. Usage is: udtc ide eclipse. Thanks to Tin Tvrtković for his excellent work and tests implementation. * Add android adt support (through eclipse). Usage is: udtc android eclipse-adt. Added tests for it as well * adb and other android tools are now added to user path while installing an android framework * Support removal of framework. If you installed a framework and want to remove it, just use: udtc android android-studio --remove * Numerous typo fixes thanks to Igor Vuk * Enable loading of local framework. They are controlled by UDTC_FRAMEWORKS env variable which can point to any path containing local frameworks * Support reinstallation in different folder than the origin one, cleaning the original directory. * DownloadCenter now support redirections. Thanks Tin Tvrtković for this work * Add support for decompressing zip files in Decompressor * New and refresh translations: de, en_AU, en_CA, en_GB, es, eu, fr, hr, it, pl, ru, te, zh_CN, zh_HK. Thanks to all translators for their hard work! * Improve i18n support * Protect against mistyping with multiple frameworks * Framework support refactoring to avoid code duplication * Tests fixes and refactoring for better scalability * Fix logging support during test runs * Reshape docker files to have fewer layers * Don't raise any Exception for unexpected CLI args -- Didier Roche Wed, 29 Oct 2014 10:21:01 +0100 ubuntu-developer-tools-center (0.0.5) utopic; urgency=medium * Addition for the test jenkins server: - Add helper to display binary depends - Output xml tests and coverage report - Add xunit artefacts support in runtests * Some tests enhancement for working in the daily jenkins environment: - Change installing in conflict package prediction. - Give some time for the container in medium tests to start - Remove full install timeout logic. Instead, have a timeout if there is no new stdout/progress report change for a while. This ensure less flakyness in case of really slow network. - Remove on output testing first INFO message detection as it's a false positive. * No output by default when running tests: - Coverage tests doesn't print any stdout or logging info unless a tests is failing. - Debug profile is using the debug logging configuraiton as well. - Don't rely on importing tests/__init__.py to define logging format for nose. - Ensure subprocess (medium/large tests) set the same logging level as well. - Add a stdout hanlder in subprocess as well while testing (using the correct profile and be able to detect warning/errors) * debian/rules: - no need for --no-config for running tests anymore * Misc cleanups: - some refactoring of runtests - remove unusued imports - removed unused profile options - update documentation for the new logging profiles change. * Have pep8 tests passing on system version as well. * Add Spanish, Basque and Chinese (Hong Kong) translations. Thanks to all translators! -- Didier Roche Tue, 09 Sep 2014 16:48:12 +0200 ubuntu-developer-tools-center (0.0.4.1) utopic; urgency=medium * GSettings:schema has been deprecated and glib shows a warning about it. Fix the deprecation by switching to schema-id which is supported in 14.04. -- Didier Roche Mon, 01 Sep 2014 17:14:06 +0200 ubuntu-developer-tools-center (0.0.4) utopic; urgency=medium * Enhance some tests by adding more info in case of failure and decouple some concerns. * Fix medium tests in using server name back as sbuild supports it again. * Refreshed certificates which expired and document how to get longer ones. * First trial to get medium tests running as autopkgtests, but disabled for now (Docker permission error inside the autopkg chroot) * Refactor i18n support with dropping babel and automatically run the commands when setuptools is building. * Add fr and zh_CN translations. -- Didier Roche Thu, 28 Aug 2014 11:03:09 +0200 ubuntu-developer-tools-center (0.0.3) utopic; urgency=medium * Fix coverage reports by importing tested modules only when needed and when overriding "packages" and "__files__", by reloading the module * Some cleanups (removed unused imports) * Add allow-stderr for adt tests: as nose-cov print some debug output at start which makes adt failing then. As we control, stderr and warnings during tests, disable this check. -- Didier Roche Thu, 28 Aug 2014 08:12:31 +0200 ubuntu-developer-tools-center (0.0.2.2) utopic; urgency=medium * debian/control: - add XS-Testsuite as some uploads may happen from trusty -- Didier Roche Wed, 27 Aug 2014 15:24:18 +0200 ubuntu-developer-tools-center (0.0.2.1) utopic; urgency=medium * Rebuild to run autopkgtests * Fix some pep8 issues on utopic and enable them during package build -- Didier Roche Wed, 27 Aug 2014 15:00:29 +0200 ubuntu-developer-tools-center (0.0.2) utopic; urgency=medium * Adapt one test as we disabled the android eclipse framework (not ready yet) -- Didier Roche Mon, 11 Aug 2014 17:44:12 +0200 ubuntu-developer-tools-center (0.0.1) utopic; urgency=medium * Initial release, supporting android-studio -- Didier Roche Fri, 01 Aug 2014 09:37:20 +0200 ubuntu-make-18.09+disco1/debian/compat0000644000000000000000000000000213352651520014456 0ustar 9 ubuntu-make-18.09+disco1/debian/control0000644000000000000000000000340313352651520014663 0ustar Source: ubuntu-make Section: devel Priority: optional Build-Depends: debhelper (>= 9), dh-python, gettext, python3, python3-apt, python3-argcomplete, python3-gi, python3-gnupg, python3-setuptools, python3-nose, python3-nose-cov, python3-nose-json, python3-pep8, python3-pexpect, python3-progressbar, python3-yaml, python3-requests, python3-xdg, dbus-x11, fakeroot, help2man, Maintainer: Didier Roche Standards-Version: 3.9.6 X-Python3-Version: >= 3.4 XS-Testsuite: autopkgtest Package: ubuntu-make Architecture: all Depends: ${misc:Depends}, ${python3:Depends}, python3-apt, python3-argcomplete, python3-gi, python3-gnupg, python3-progressbar, python3-yaml, python3-requests, python3-xdg, Description: setup your development environment on ubuntu easily Ubuntu Make provides a set of functionality to setup, maintain and personalize your developer environment easily. It will handle all dependencies, even those which aren't in Ubuntu itself, and install latest versions of the desired and recommended tools. . For now, you can configure a complete android studio environment. Package: ubuntu-developer-tools-center Architecture: all Section: oldlibs Priority: extra Depends: ubuntu-make, ${misc:Depends}, ${python3:Depends} Description: transitional dummy package This is a transitional dummy package only providing previous udtc binary instead of umake. It can safely be removed. ubuntu-make-18.09+disco1/debian/copyright0000644000000000000000000000166513352651520015223 0ustar Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ Upstream-Name: Ubuntu Make Source: https://github.com/ubuntu/ubuntu-make Files: * Copyright: (C) 2014 Canonical License: GPL-3 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; version 3 of the License. . 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 package; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA . The full text of the GPL is distributed in /usr/share/common-licenses/GPL-3 on Debian systems. ubuntu-make-18.09+disco1/debian/gbp.conf0000644000000000000000000000010613352651520014674 0ustar [buildpackage] export-dir=../build-area/ export=INDEX ignore-new=True ubuntu-make-18.09+disco1/debian/rules0000755000000000000000000000056513352651520014346 0ustar #!/usr/bin/make -f #DH_VERBOSE=1 %: dh $@ --with python3 --buildsystem=pybuild --fail-missing override_dh_auto_test: ./runtests pep8 small override_dh_installman: help2man -n "Deploy and setup developers environment easily on ubuntu" -o debian/umake.1 bin/umake sed -i s/+unknown//g debian/umake.1 dh_installman override_dh_clean: rm -f debian/umake.1 dh_clean ubuntu-make-18.09+disco1/debian/tests/0000755000000000000000000000000013352651520014422 5ustar ubuntu-make-18.09+disco1/debian/tests/collect-coverage0000644000000000000000000000061313352651520017563 0ustar #!/bin/bash # collect and generate global coverage report # Author: Didier Roche set -e . `dirname $0`/utils # combine the reports cd $coverage_dir python3-coverage combine python3-coverage html -d html-coverage python3-coverage xml # archive the results cp .coverage ${ADT_ARTIFACTS} cp -a *coverage* ${ADT_ARTIFACTS} # print on stdout as well python3-coverage report ubuntu-make-18.09+disco1/debian/tests/control0000644000000000000000000000102613352651520016024 0ustar # Setup an ubuntu-desktop install which can logout and login Tests: setup-testbed, pep8, small, medium, large, custom, collect-coverage, Depends: @builddeps@, ubuntu-desktop, git, docker.io, sloccount, libjs-jquery, libjs-jquery-hotkeys, libjs-jquery-isonscreen, libjs-jquery-tablesorter, libjs-jquery-throttle-debounce, Restrictions: rw-build-tree, isolation-machine, allow-stderr, ubuntu-make-18.09+disco1/debian/tests/custom0000644000000000000000000000037413352651520015663 0ustar #!/bin/bash # Author: Didier Roche set -e . `dirname $0`/utils # skip tests if not requested skip_if_no_in_list # require user session to run as we might have large tests wait_for_user_session run_tests $TESTS publish_results ubuntu-make-18.09+disco1/debian/tests/large0000644000000000000000000000033613352651520015441 0ustar #!/bin/bash # Author: Didier Roche set -e . `dirname $0`/utils # skip tests if not requested skip_if_no_in_list # require user session to run wait_for_user_session run_tests large publish_results ubuntu-make-18.09+disco1/debian/tests/medium0000644000000000000000000000025213352651520015624 0ustar #!/bin/bash # Author: Didier Roche set -e . `dirname $0`/utils # skip tests if not requested skip_if_no_in_list run_tests medium publish_results ubuntu-make-18.09+disco1/debian/tests/pep80000644000000000000000000000025013352651520015216 0ustar #!/bin/bash # Author: Didier Roche set -e . `dirname $0`/utils # skip tests if not requested skip_if_no_in_list run_tests pep8 publish_results ubuntu-make-18.09+disco1/debian/tests/setup-testbed0000644000000000000000000000626413352651520017145 0ustar #!/bin/bash # setup an ubuntu-desktop machine with autologin and dependencies # Author: Didier Roche set -e . `dirname $0`/utils if [ -n "$ADT_REBOOT_MARK" ]; then exit 0 fi export DEBIAN_FRONTEND=noninteractive # configure docker sudo -n addgroup $(whoami) docker # the config file isn't a pam file (shouldn't have export) when used from the # service file under systemd if [ -d /run/systemd/system/ ]; then grep proxy /etc/environment | sudo -n tee -a /etc/default/docker else # this is sourced for sysv init scripts sed -n '/proxy/ { s/^/export /; p}' /etc/environment | sudo -n tee -a /etc/default/docker fi # ensure we have a cgroup controller installed (systemd for wily and on, cgroup-lite for trusty) if ! `dpkg -l systemd-sysv 1>/dev/null 2>&1`; then sudo -n apt --no-install-recommends install -y cgroup-lite fi # workaround for https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=808203 sudo -n rm -f /etc/dpkg/dpkg.cfg.d/pkg-config-hook-config # enable xserver dummy driver sudo -n apt --no-install-recommends install -y xserver-xorg-video-dummy cat <> ~/.ssh/authorized_keys # install ubuntu-make if we are running system tests, otherwise install only deps from debian/control if [ "$(is_package_test)" = "true" ]; then PACKAGES="ubuntu-make" else PACKAGES=$(tests/daily_runs/get_binary_depends ubuntu-make) fi sudo -n -E apt install -y $PACKAGES # store ubuntu make version and packages config_dir="$ADT_ARTIFACTS/config" mkdir -p $config_dir # discover target: package/branch, origin if [ "$(is_package_test)" = "true" ]; then # clean the source package to ensure we don't have duplicated files after # build for sloccount debian/rules clean type="system" origin="$(apt-cache policy ubuntu-make | sed -n '/\*\*\*/ {n;p}' | cut -d' ' -f 10)" [ -z "$origin" ] && origin="Local package" version="$(umake --version)'" else type="branch" upstream_short="$(git for-each-ref --format='%(upstream:short)' $(git symbolic-ref -q HEAD))" IFS=/ read repo branch <<< $upstream_short repo_url=$(git config --get remote.${repo}.url) origin="${repo_url} $branch" version="$(bin/umake --version)'" fi cat << EOF | tee "$config_dir/version" { 'target': { 'type': '$type', 'origin': '$origin', 'version': '$version', }, 'date': { 'timestamp': '$(date +%s)', 'utc': '$(date -u)' }, 'arch': '$(arch)' } EOF dpkg -l > "$config_dir/packages_list" echo -e "\nStats:" sloccount * | head -n -17 | tail -17 | tee "$config_dir/stats" # remove umake directory for coverage reporting on real used files if [ "$type" = "system" ]; then rm -r umake/ fi # compile local python file under current user to avoid some root-owned compile # file like for local server python3 -m compileall . sudo -n /tmp/autopkgtest-reboot ready ubuntu-make-18.09+disco1/debian/tests/small0000644000000000000000000000025213352651520015454 0ustar #!/bin/bash # Author: Didier Roche set -e . `dirname $0`/utils # skip tests if not requested. skip_if_no_in_list run_tests small publish_results ubuntu-make-18.09+disco1/debian/tests/utils0000644000000000000000000000553013352651520015510 0ustar #!/bin/bash # Author: Didier Roche coverage_dir=/tmp/global-coverage # publish test results for given test run. Keep a secondary coverage copy (as the first one is cleaned) for collect step function publish_results { test_type=$(basename $0) output_dir="$ADT_ARTIFACTS/$test_type" mkdir -p $output_dir mv nosetests.* ${output_dir} mv .coverage ${output_dir} mv *coverage* ${output_dir} mv *.log ${output_dir} mkdir -p $coverage_dir cp ${output_dir}/.coverage ${coverage_dir}/.coverage.${test_type} } # this function need to be run in ubuntu make directory" function is_package_test { if [ -d ".git" ]; then echo "false" return fi echo "true" } # add --system if we run from a package dir function add_runtests_opts { if [ "$(is_package_test)" = true ]; then echo "--system" return fi } # skip current test if not "all" or in the list of $TESTS # if the test variable is empty, we still want to run some tests as per of package testing function skip_if_no_in_list { # tests to run if nothing was provided [ -z "$TESTS" ] && TESTS="small" test_type=$(basename $0) re=\\btests[\./] # we are in the custom type test flavor if [[ "$test_type" = "custom" ]]; then if [[ "$TESTS" =~ $re ]]; then return else echo "No specific mentioned in \$TESTS; skipping test" exit 0 fi fi # if we run only some tests of the current type, (tests..), disable all and this category if [[ "$TESTS" =~ $re ]]; then echo "Specific tests required, skipping general ones." exit 0 fi retype=\\b${test_type}\\b reall=\\ball\\b if [[ "$TESTS" =~ $retype ]] || [[ "$TESTS" =~ $reall ]]; then return fi echo "$test_type isn't mentioned in \$TESTS; skipping test" exit 0 } # we need to run in a ssh subshell to get a real terminal connexion so that ssh can returns when subprocess are killed function run_tests { ssh -o StrictHostKeyChecking=no -t -t 127.0.0.1 "cd $PWD; DISPLAY=:0 dbus-launch ./runtests --publish --coverage $(add_runtests_opts) $@" } # wait for user session to start, exit 1 after a timeout if not running. function wait_for_user_session { timeout=100 # we want 2 gnome-sessions: one for gdm, one for the user session while [ ! `pgrep -c gnome-session` -gt 0 ]; do if [ $timeout -le 0 ]; then echo "gnome-session for users didn't start" echo "------------- journal: -------------" sudo -n journalctl -b || true echo "------------- ~/.xsession-errors -------------" cat ~/.xsession-errors || true exit 1 fi timeout=$((timeout - 5)) sleep 5 echo "waiting for user session to start... (${timeout}s left)" done } ubuntu-make-18.09+disco1/debian/ubuntu-developer-tools-center.install0000644000000000000000000000001513352651520022565 0ustar usr/bin/udtc ubuntu-make-18.09+disco1/debian/ubuntu-developer-tools-center.postinst0000644000000000000000000000032713352651520023010 0ustar #!/bin/sh set -e case "$1" in configure) rm -f /etc/bash_completion.d/udtc ;; *) echo "postinst called with unknown argument \`$1'" >&2 exit 1 ;; esac #DEBHELPER# exit 0 ubuntu-make-18.09+disco1/debian/ubuntu-make.install0000644000000000000000000000010413352651520017100 0ustar usr/share/zsh/vendor-completions/ usr/bin/umake usr/lib/ usr/share/ ubuntu-make-18.09+disco1/debian/ubuntu-make.manpages0000644000000000000000000000001713352651520017230 0ustar debian/umake.1 ubuntu-make-18.09+disco1/debian/ubuntu-make.postinst0000644000000000000000000000036713352651520017330 0ustar #!/bin/sh set -e case "$1" in configure) register-python-argcomplete3 umake > /etc/bash_completion.d/umake ;; *) echo "postinst called with unknown argument \`$1'" >&2 exit 1 ;; esac #DEBHELPER# exit 0 ubuntu-make-18.09+disco1/debian/ubuntu-make.postrm0000644000000000000000000000042613352651520016765 0ustar #!/bin/sh set -e case "$1" in purge|remove|upgrade|failed-upgrade|abort-install|abort-upgrade|disappear) rm -f /etc/bash_completion.d/umake ;; *) echo "postrm called with unknown argument \`$1'" >&2 exit 1 ;; esac #DEBHELPER# exit 0 ubuntu-make-18.09+disco1/docker/0000755000000000000000000000000013352651520013305 5ustar ubuntu-make-18.09+disco1/docker/create_packages.sh0000755000000000000000000001325013352651520016746 0ustar #!/bin/bash repo_root_dir=$1 generate_package (){ temp_dir="/tmp/package" package_name=$1 version=$2 arch=$3 multiarch=true if [ -z "$arch" ]; then arch=$(dpkg --print-architecture) multiarch=false fi mkdir -p $temp_dir/DEBIAN control_file=$temp_dir/DEBIAN/control echo "Package: $package_name Source: testpackage Version: $version Architecture: $arch Maintainer: Didier Roche Installed-Size: 26 Section: misc Priority: extra" > $control_file [[ $multiarch == true ]] && echo "Multi-Arch: same" >> $control_file echo "Description: Dummy package for testing Package used for testing debs installation" >> $control_file dpkg-deb -b $temp_dir ${package_name}_${version,}_${arch}.deb rm -rf $temp_dir } extract_version() { version=$(apt-cache policy $1 | grep Candidate | awk '{print $2}') [ -z "$version" ] && version=1.0 echo $version } create_package() { package_name=$1 arch=$2 version=$(extract_version $package_name) generate_package $package_name $version $arch } # android studio and adt deps mkdir -p $repo_root_dir/android cd $repo_root_dir/android create_package clang create_package openjdk-7-jdk create_package openjdk-8-jdk create_package jayatana create_package libncurses5 i386 create_package libstdc++6 i386 create_package zlib1g i386 dpkg-scanpackages . /dev/null | gzip -9c > Packages.gz # android-platform-tools dep mkdir -p $repo_root_dir/android-platform-tools cd $repo_root_dir/android-platform-tools create_package android-sdk-platform-tools-common dpkg-scanpackages . /dev/null | gzip -9c > Packages.gz # rubymine deps mkdir -p $repo_root_dir/rider cd $repo_root_dir/rider create_package mono-devel dpkg-scanpackages . /dev/null | gzip -9c > Packages.gz # rubymine deps mkdir -p $repo_root_dir/rubymine cd $repo_root_dir/rubymine create_package ruby dpkg-scanpackages . /dev/null | gzip -9c > Packages.gz # stencyl deps mkdir -p $repo_root_dir/stencyl cd $repo_root_dir/stencyl create_package libxtst6 i386 create_package libxext6 i386 create_package libxi6 i386 create_package libncurses5 i386 create_package libxt6 i386 create_package libxpm4 i386 create_package libxmu6 i386 create_package libxp6 i386 create_package libgtk2.0-0 i386 create_package libatk1.0-0 i386 create_package libc6 i386 create_package libcairo2 i386 create_package libexpat1 i386 create_package libfontconfig1 i386 create_package libfreetype6 i386 create_package libglib2.0-0 i386 create_package libice6 i386 create_package libpango1.0-0 i386 create_package libpng12-0 i386 create_package libsm6 i386 create_package libxau6 i386 create_package libxcursor1 i386 create_package libxdmcp6 i386 create_package libxfixes3 i386 create_package libx11-6 i386 create_package libxinerama1 i386 create_package libxrandr2 i386 create_package libxrender1 i386 create_package zlib1g i386 create_package libnss3-1d i386 create_package libnspr4-0d i386 create_package libcurl3 i386 create_package libasound2 i386 dpkg-scanpackages . /dev/null | gzip -9c > Packages.gz # visual studio code deps mkdir -p $repo_root_dir/vscode cd $repo_root_dir/vscode create_package libgtk2.0-0 create_package libgconf-2-4 dpkg-scanpackages . /dev/null | gzip -9c > Packages.gz # atom deps mkdir -p $repo_root_dir/atom cd $repo_root_dir/atom create_package libgconf-2-4 dpkg-scanpackages . /dev/null | gzip -9c > Packages.gz # arduino deps mkdir -p $repo_root_dir/arduino cd $repo_root_dir/arduino create_package gcc-avr create_package avr-libc dpkg-scanpackages . /dev/null | gzip -9c > Packages.gz # scala deps mkdir -p $repo_root_dir/scala cd $repo_root_dir/scala create_package openjdk-7-jre create_package openjdk-8-jre dpkg-scanpackages . /dev/null | gzip -9c > Packages.gz # kotlin deps mkdir -p $repo_root_dir/kotlin cd $repo_root_dir/kotlin create_package openjdk-7-jre create_package openjdk-8-jre dpkg-scanpackages . /dev/null | gzip -9c > Packages.gz # swift deps mkdir -p $repo_root_dir/swift cd $repo_root_dir/swift create_package clang create_package libicu-dev create_package libicu55 dpkg-scanpackages . /dev/null | gzip -9c > Packages.gz # unity3d deps mkdir -p $repo_root_dir/unity3d cd $repo_root_dir/unity3d create_package gconf-service create_package lib32gcc1 create_package lib32stdc++6 create_package libasound2 create_package libcairo2 create_package libcap2 create_package libcups2 create_package libfontconfig1 create_package libfreetype6 create_package libgconf-2-4 create_package libgdk-pixbuf2.0-0 create_package libgl1-mesa-glx create_package libglu1-mesa create_package libgtk2.0-0 create_package libnspr4 create_package libnss3 create_package libpango1.0-0 create_package libpq5 create_package libxcomposite1 create_package libxcursor1 create_package libxdamage1 create_package libxext6 create_package libxfixes3 create_package libxi6 create_package libxrandr2 create_package libxrender1 create_package libxtst6 create_package monodevelop dpkg-scanpackages . /dev/null | gzip -9c > Packages.gz # crystal deps mkdir -p $repo_root_dir/crystal cd $repo_root_dir/crystal create_package libbsd-dev create_package libedit-dev create_package libevent-core-2.0-5 create_package libevent-dev create_package libevent-extra-2.0-5 create_package libevent-openssl-2.0-5 create_package libevent-pthreads-2.0-5 create_package libgc-dev create_package libgmp-dev create_package libgmpxx4ldbl create_package libssl-dev create_package libxml2-dev create_package libyaml-dev create_package libreadline-dev create_package automake create_package libtool create_package git create_package llvm create_package libpcre3-dev create_package build-essential dpkg-scanpackages . /dev/null | gzip -9c > Packages.gz # DBeaver deps mkdir -p $repo_root_dir/dbeaver cd $repo_root_dir/dbeaver create_package openjdk-8-jre-headless dpkg-scanpackages . /dev/null | gzip -9c > Packages.gz ubuntu-make-18.09+disco1/docker/umake_docker0000600000000000000000000000321313352651520015650 0ustar -----BEGIN RSA PRIVATE KEY----- MIIEowIBAAKCAQEAvYlnk9fiXGFcy1MKlyeEp26TJg9h4RwRwHbhUy0xTB3OTGZ8 JBxsyohNzfVLM+zUXnJ2M25qeW5cem5dBGmxZh/FK1cMIkSUYVco+u17so9OwdGs zniBqWOetaPH7CV+Q+tSMBRaimqPifnLdzY9iiRxzikfaCSJKD7hJnU/NbAWip/Z Ytd+3FBm7z66aaDXFiCMxGdauu0nnk7Ca7TmIWq8hopdo8IY61y1Fpt/VC2VR2Up dKdOj3JoGCzk88Zjsz3lV5qsUIUuwYph/ATjgAibj3hBqdBWJ+NUDi4hSK3BbQTl G3mHVOMdWq19KVo2j4+y1wt7UUKnQXKiZN/JFwIDAQABAoIBABmN4Q0p2jciWWSA ebkPdu8sFWLYSBYVtr8ASDjyqubcTeg3GR21R2W3IuZV4CHMGIXzYMRmaqycmJNZ NelWZriiJ+9D+TrVjDvjiH7sbfURJUk0f9wGm1S/PbK3tki8dV2q6JXa6Koo29l6 eFhGU93ANCfbm4RrCKMId0q8HB2cuH2zJBiTv/GAjmXBOhIlNDEbydkt9kMGqmVV THh1pu9jGH+AnDfd0CBrW1IfRvjl49zkaEYq+FcWy/ksPFFMPKmiunPZWk+4jJUc aJ5goYtTmNGu4W/yEfFDGLPrGAkLNAhSs2s2ssnwSQynDs+9SGQFav5S7fI71oJG y67YL0ECgYEA8w7EeGCtn5UyqZmvAF0KD901INStHEfpzU5pD+y5xBh23kPDZw1a +Zn0AKwkcc4oI0w0EcjaUshJSQc82cncdSGQGTzlnE6t6Z/CEJd9HjZG5DmlHx17 AV5Z0PRXMqgalSQEfu1Pm22KFKqa6gXA970gn7CODp0kgO9S7K4UEu8CgYEAx6ER coQUiI5frwNKbgs4JQafxqZf+2+9xyHl4HQGn6EOhrBgaLmTC2+rz/RqCp8HRwV/ hBGwhJV4Eb1gEMxCTIBQJ+4YbuO+HPxv9cJdW3twtIROHoarRDwBhEnS4JnCbLvE 1uKoh99g0+5NWKZRvN8+xwS12uF+qgakWLkeDFkCgYB9ewA/TVoVawcuu+K3A1Fw gzksa9+7G/0+Ot7Ok94LuL2VXdKBX0m6Vpq7xiNChbX/ExZGoDTmS/RZuVzW6vnf lqY4AVJg8dWjKREdU7gKYucSaBgxCh04xacE00A5LMQcfu27QXS5v0FsDe/QJYxL 2d3/0zxjmwj/b46WFgDTDQKBgQCsD/kA0jT8inKQX268sLDgwPff+bELAAH77Ay9 zGOVHPVvRACk4yaJmePl5s2rf+x+249QHwsdC9OkvqxZbiTK2WG9OOwYT/Wh+Dbs BW4AFsJK5SqMBxkBRBMumY7IBd9dZu4/JLeL/Q3xPRmvihMzjtwGH9o64VcSZ40p 58ytaQKBgBd+1TYt0U2nk2P6nqQDtGi2IfaY0dllbhYzjrwIXyfcslFriXjdHRBh 1d0X7CoRLFIlGBbQL59JyHxBK06Fdeght37xXlfzv2QjMdexqL92jbEu2OpwKcZ3 1uso5EgxFZAamQ9DP+v4k8KL1hFUsYLi/xFlBIvzzmzIq40mvpnW -----END RSA PRIVATE KEY----- ubuntu-make-18.09+disco1/docker/umake_docker.pub0000644000000000000000000000061413352651520016447 0ustar ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC9iWeT1+JcYVzLUwqXJ4SnbpMmD2HhHBHAduFTLTFMHc5MZnwkHGzKiE3N9Usz7NRecnYzbmp5blx6bl0EabFmH8UrVwwiRJRhVyj67Xuyj07B0azOeIGpY561o8fsJX5D61IwFFqKao+J+ct3Nj2KJHHOKR9oJIkoPuEmdT81sBaKn9li137cUGbvPrppoNcWIIzEZ1q67SeeTsJrtOYharyGil2jwhjrXLUWm39ULZVHZSl0p06PcmgYLOTzxmOzPeVXmqxQhS7BimH8BOOACJuPeEGp0FYn41QOLiFIrcFtBOUbeYdU4x1arX0pWjaPj7LXC3tRQqdBcqJk38kX didrocks@tidus ubuntu-make-18.09+disco1/enable_completion0000644000000000000000000000015413352651520015440 0ustar # just source that file to enable shell completion on umake eval "$(register-python-argcomplete bin/umake)" ubuntu-make-18.09+disco1/po/0000755000000000000000000000000013352651520012454 5ustar ubuntu-make-18.09+disco1/po/da.po0000644000000000000000000001633013352651520013403 0ustar # Danish translation for ubuntu-make # Copyright (c) 2015 Rosetta Contributors and Canonical Ltd 2015 # This file is distributed under the same license as the ubuntu-make package. # FIRST AUTHOR , 2015. # msgid "" msgstr "" "Project-Id-Version: ubuntu-make\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-11-17 09:26+0100\n" "PO-Revision-Date: 2015-04-28 19:25+0000\n" "Last-Translator: Aputsiaĸ Niels Janussen \n" "Language-Team: Danish \n" "Language: da\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-05-04 07:08+0000\n" "X-Generator: Launchpad (build 17474)\n" #: umake/tools.py:48 msgid "# Ubuntu make installation of {}\n" msgstr "" #: umake/__init__.py:99 msgid "* Command '{}':" msgstr "" #: umake/__init__.py:107 msgid "Deploy and setup developers environment easily on ubuntu" msgstr "" #: umake/__init__.py:108 msgid "" "Note that you can also configure different debug logging behavior using " "LOG_CFG that points to a log yaml profile." msgstr "" #: umake/__init__.py:111 msgid "Show this help" msgstr "Vis denne hjælp" #: umake/__init__.py:112 msgid "Increase output verbosity (2 levels)" msgstr "" #: umake/__init__.py:114 msgid "Remove specified framework if installed" msgstr "" #: umake/__init__.py:116 msgid "Print version and exit" msgstr "" #: umake/frameworks/ide.py:63 msgid "Generic IDEs" msgstr "" #: umake/frameworks/ide.py:76 msgid "Pure Eclipse Luna (4.4)" msgstr "" #: umake/frameworks/ide.py:128 msgid "The Eclipse Luna Integrated Development Environment" msgstr "" #: umake/frameworks/ide.py:131 msgid "Eclipse Luna" msgstr "" #: umake/frameworks/ide.py:217 msgid "PyCharm Community Edition" msgstr "" #: umake/frameworks/ide.py:233 msgid "PyCharm Educational Edition" msgstr "" #: umake/frameworks/ide.py:249 msgid "PyCharm Professional Edition" msgstr "" #: umake/frameworks/ide.py:265 msgid "IntelliJ IDEA Community Edition" msgstr "" #: umake/frameworks/ide.py:281 msgid "IntelliJ IDEA" msgstr "" #: umake/frameworks/ide.py:297 msgid "Ruby on Rails IDE" msgstr "" #: umake/frameworks/ide.py:314 msgid "Complex client-side and server-side javascript IDE" msgstr "" #: umake/frameworks/ide.py:331 msgid "PHP and web development IDE" msgstr "" #: umake/frameworks/ide.py:348 msgid "CLion integrated C/C++ IDE" msgstr "" #: umake/frameworks/ide.py:376 msgid "The Arduino Software Distribution" msgstr "" #: umake/frameworks/ide.py:475 msgid "The Arduino Software IDE" msgstr "" #: umake/frameworks/ide.py:478 msgid "Arduino" msgstr "" #: umake/frameworks/ide.py:484 msgid "You need to logout and login again for your installation to work" msgstr "" #: umake/frameworks/ide.py:504 umake/frameworks/ide.py:584 #: umake/frameworks/ide.py:587 msgid "Netbeans IDE" msgstr "" #: umake/frameworks/dart.py:43 msgid "Dartlang Development Environment" msgstr "" #: umake/frameworks/dart.py:49 msgid "Dart SDK with editor (not supported upstream anyymore)" msgstr "" #: umake/frameworks/dart.py:56 msgid "Dart SDK (default)" msgstr "" #: umake/frameworks/dart.py:97 umake/frameworks/rust.py:134 #: umake/frameworks/scala.py:66 umake/frameworks/go.py:76 #: umake/frameworks/android.py:135 msgid "" "You need to restart your current shell session for your {} installation to " "work properly" msgstr "" #: umake/frameworks/rust.py:43 msgid "Rust language" msgstr "" #: umake/frameworks/rust.py:56 msgid "The official Rust distribution" msgstr "" #: umake/frameworks/scala.py:40 msgid "The Scala Programming Language" msgstr "" #: umake/frameworks/scala.py:46 msgid "Scala compiler and interpreter (default)" msgstr "" #: umake/frameworks/go.py:39 msgid "Go language" msgstr "" #: umake/frameworks/go.py:46 msgid "Google compiler (default)" msgstr "" #: umake/frameworks/android.py:42 msgid "Android Development Environment" msgstr "" #: umake/frameworks/android.py:80 msgid "Android Studio (default)" msgstr "" #: umake/frameworks/android.py:100 msgid "Android Studio" msgstr "" #: umake/frameworks/android.py:103 msgid "Android Studio developer environment" msgstr "" #: umake/frameworks/android.py:111 #, fuzzy msgid "Android SDK" msgstr "Android NDK" #: umake/frameworks/android.py:147 msgid "Android NDK" msgstr "Android NDK" #: umake/frameworks/__init__.py:129 msgid "A default framework for category {} was requested where there is none" msgstr "" #: umake/frameworks/__init__.py:240 msgid "You can't install that framework on this machine" msgstr "" #: umake/frameworks/__init__.py:256 msgid "You can't remove {} as it isn't installed" msgstr "" #: umake/frameworks/__init__.py:285 msgid "" "If the default framework name isn't provided, destdir should contain a /" msgstr "" #: umake/frameworks/__init__.py:288 msgid "Remove framework if installed" msgstr "" #: umake/frameworks/__init__.py:291 msgid "Accept license without prompting" msgstr "" #: umake/frameworks/web.py:45 msgid "Web Developer Environment" msgstr "" #: umake/frameworks/web.py:51 umake/frameworks/web.py:120 msgid "Firefox Developer Edition" msgstr "" #: umake/frameworks/web.py:116 msgid "Choose language: {}" msgstr "" #: umake/frameworks/web.py:123 msgid "Firefox Aurora with Developer tools" msgstr "" #: umake/frameworks/web.py:129 msgid "Install in given language without prompting" msgstr "" #: umake/frameworks/web.py:141 umake/frameworks/web.py:226 msgid "Visual Studio focused on modern web and cloud" msgstr "" #: umake/frameworks/web.py:223 msgid "Visual Studio Code" msgstr "" #: umake/frameworks/games.py:42 msgid "Games Development Environment" msgstr "" #: umake/frameworks/games.py:48 msgid "Stencyl game developer IDE" msgstr "" #: umake/frameworks/games.py:85 msgid "Stencyl" msgstr "Stencyl" #: umake/frameworks/games.py:114 msgid "Unity 3D Editor Linux experimental support" msgstr "" #: umake/frameworks/games.py:154 msgid "Unity3D Editor" msgstr "" #: umake/frameworks/games.py:164 msgid "Twine tool for creating interactive and nonlinear stories" msgstr "" #: umake/frameworks/games.py:200 msgid "Twine" msgstr "" #: umake/interactions/__init__.py:73 msgid "No suitable answer provided" msgstr "" #: umake/interactions/__init__.py:75 umake/interactions/__init__.py:83 msgid "Your entry '{}' isn't an acceptable choice. choices are: {}" msgstr "" #: umake/interactions/__init__.py:80 msgid "Your entry '{}' isn't an acceptable choice. choices are: {} and {}" msgstr "" #: umake/interactions/__init__.py:100 msgid " ({})" msgstr " ({})" #: umake/interactions/__init__.py:104 msgid "" "{}\n" "[{}] " msgstr "" "{}\n" "[{}] " #: umake/interactions/__init__.py:107 msgid "{} [{}] " msgstr "{} [{}] " #: umake/interactions/__init__.py:115 msgid "I Accept" msgstr "Jeg accepterer" #: umake/interactions/__init__.py:115 msgid "a" msgstr "" #: umake/interactions/__init__.py:116 msgid "I don't accept" msgstr "" #: umake/interactions/__init__.py:116 umake/interactions/__init__.py:149 msgid "N" msgstr "" #: umake/interactions/__init__.py:125 umake/interactions/__init__.py:126 msgid "{} ({})" msgstr "{} ({})" #: umake/interactions/__init__.py:129 msgid "[{}] " msgstr "[{}] " #: umake/interactions/__init__.py:148 msgid "Yes" msgstr "Ja" #: umake/interactions/__init__.py:148 msgid "y" msgstr "" #: umake/interactions/__init__.py:149 msgid "No" msgstr "Nej" ubuntu-make-18.09+disco1/po/de.po0000644000000000000000000002157513352651520013416 0ustar # German translation for ubuntu-make # Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014 # This file is distributed under the same license as the ubuntu-make package. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: ubuntu-make\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-11-17 09:26+0100\n" "PO-Revision-Date: 2015-10-27 10:42+0000\n" "Last-Translator: Oliver Jakobi \n" "Language-Team: German \n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-11-05 13:56+0000\n" "X-Generator: Launchpad (build 17838)\n" #: umake/tools.py:48 msgid "# Ubuntu make installation of {}\n" msgstr "# Ubuntu make Installation von {}\n" #: umake/__init__.py:99 msgid "* Command '{}':" msgstr "* Befehl '{}':" #: umake/__init__.py:107 msgid "Deploy and setup developers environment easily on ubuntu" msgstr "Entwicklerumgebungen einfach auf Ubuntu aufspielen und konfigurieren" #: umake/__init__.py:108 #, fuzzy msgid "" "Note that you can also configure different debug logging behavior using " "LOG_CFG that points to a log yaml profile." msgstr "" "Beachten Sie, dass ebenfalls das Verhalten verschiedener \"debug logs\" " "konfiguriert werden kann, indem Sie LOG_CFG benutzen, was auf einen \"log " "yaml\"-Profil zeigt." #: umake/__init__.py:111 msgid "Show this help" msgstr "Diese Hilfe anzeigen" #: umake/__init__.py:112 msgid "Increase output verbosity (2 levels)" msgstr "Erhöhe die Ausführlichkeit der Ausgabe" #: umake/__init__.py:114 msgid "Remove specified framework if installed" msgstr "Entferne, falls installiert, das spezifizierte Framework" #: umake/__init__.py:116 msgid "Print version and exit" msgstr "" #: umake/frameworks/ide.py:63 msgid "Generic IDEs" msgstr "Allgemeine integrierte Entwicklungsumgebungen" #: umake/frameworks/ide.py:76 msgid "Pure Eclipse Luna (4.4)" msgstr "Pure Eclipse Luna (4.4)" #: umake/frameworks/ide.py:128 msgid "The Eclipse Luna Integrated Development Environment" msgstr "" #: umake/frameworks/ide.py:131 msgid "Eclipse Luna" msgstr "Eclipse Luna" #: umake/frameworks/ide.py:217 msgid "PyCharm Community Edition" msgstr "PyCharm Community Ausgabe" #: umake/frameworks/ide.py:233 #, fuzzy msgid "PyCharm Educational Edition" msgstr "PyCharm Community Ausgabe" #: umake/frameworks/ide.py:249 #, fuzzy msgid "PyCharm Professional Edition" msgstr "PyCharm Community Ausgabe" #: umake/frameworks/ide.py:265 msgid "IntelliJ IDEA Community Edition" msgstr "IntelliJ IDEA Community Ausgabe" #: umake/frameworks/ide.py:281 msgid "IntelliJ IDEA" msgstr "IntelliJ IDEA" #: umake/frameworks/ide.py:297 msgid "Ruby on Rails IDE" msgstr "" #: umake/frameworks/ide.py:314 msgid "Complex client-side and server-side javascript IDE" msgstr "" #: umake/frameworks/ide.py:331 msgid "PHP and web development IDE" msgstr "" #: umake/frameworks/ide.py:348 msgid "CLion integrated C/C++ IDE" msgstr "" #: umake/frameworks/ide.py:376 msgid "The Arduino Software Distribution" msgstr "" #: umake/frameworks/ide.py:475 msgid "The Arduino Software IDE" msgstr "" #: umake/frameworks/ide.py:478 msgid "Arduino" msgstr "" #: umake/frameworks/ide.py:484 msgid "You need to logout and login again for your installation to work" msgstr "" #: umake/frameworks/ide.py:504 umake/frameworks/ide.py:584 #: umake/frameworks/ide.py:587 msgid "Netbeans IDE" msgstr "" #: umake/frameworks/dart.py:43 msgid "Dartlang Development Environment" msgstr "Dartlang Entwicklungsumgebung" #: umake/frameworks/dart.py:49 #, fuzzy msgid "Dart SDK with editor (not supported upstream anyymore)" msgstr "Dart Software Development Kit mit Editor (Standard)" #: umake/frameworks/dart.py:56 #, fuzzy msgid "Dart SDK (default)" msgstr "Dart Software Development Kit mit Editor (Standard)" #: umake/frameworks/dart.py:97 umake/frameworks/rust.py:134 #: umake/frameworks/scala.py:66 umake/frameworks/go.py:76 #: umake/frameworks/android.py:135 msgid "" "You need to restart your current shell session for your {} installation to " "work properly" msgstr "" #: umake/frameworks/rust.py:43 #, fuzzy msgid "Rust language" msgstr "Go Programmiersprache" #: umake/frameworks/rust.py:56 msgid "The official Rust distribution" msgstr "" #: umake/frameworks/scala.py:40 msgid "The Scala Programming Language" msgstr "" #: umake/frameworks/scala.py:46 #, fuzzy msgid "Scala compiler and interpreter (default)" msgstr "Google Compiler" #: umake/frameworks/go.py:39 msgid "Go language" msgstr "Go Programmiersprache" #: umake/frameworks/go.py:46 msgid "Google compiler (default)" msgstr "Google Compiler" #: umake/frameworks/android.py:42 msgid "Android Development Environment" msgstr "Android Entwicklungsumgebung" #: umake/frameworks/android.py:80 msgid "Android Studio (default)" msgstr "Android Studio" #: umake/frameworks/android.py:100 msgid "Android Studio" msgstr "Android Studio" #: umake/frameworks/android.py:103 msgid "Android Studio developer environment" msgstr "Android Studio Entwicklungsumgebung" #: umake/frameworks/android.py:111 #, fuzzy msgid "Android SDK" msgstr "Android NDK" #: umake/frameworks/android.py:147 msgid "Android NDK" msgstr "Android NDK" #: umake/frameworks/__init__.py:129 msgid "A default framework for category {} was requested where there is none" msgstr "" #: umake/frameworks/__init__.py:240 msgid "You can't install that framework on this machine" msgstr "" #: umake/frameworks/__init__.py:256 msgid "You can't remove {} as it isn't installed" msgstr "{} kann nicht deinstalliert werden, da es nicht installiert ist" #: umake/frameworks/__init__.py:285 msgid "" "If the default framework name isn't provided, destdir should contain a /" msgstr "" "Wenn der Name des standard Frameworks nicht gegeben ist, so sollte das " "Zielverzeichnis ein / enthalten" #: umake/frameworks/__init__.py:288 msgid "Remove framework if installed" msgstr "Entferne, falls installiert, das Framework" #: umake/frameworks/__init__.py:291 msgid "Accept license without prompting" msgstr "" #: umake/frameworks/web.py:45 msgid "Web Developer Environment" msgstr "Web Entwicklerumgebung" #: umake/frameworks/web.py:51 umake/frameworks/web.py:120 msgid "Firefox Developer Edition" msgstr "Firefox Entwicklerausgabe" #: umake/frameworks/web.py:116 #, fuzzy msgid "Choose language: {}" msgstr "Go Programmiersprache" #: umake/frameworks/web.py:123 msgid "Firefox Aurora with Developer tools" msgstr "Firefox Aurora mit Entwicklerwerkzeugen" #: umake/frameworks/web.py:129 msgid "Install in given language without prompting" msgstr "" #: umake/frameworks/web.py:141 umake/frameworks/web.py:226 msgid "Visual Studio focused on modern web and cloud" msgstr "" #: umake/frameworks/web.py:223 msgid "Visual Studio Code" msgstr "" #: umake/frameworks/games.py:42 msgid "Games Development Environment" msgstr "Spiele Entwicklungsumgebung" #: umake/frameworks/games.py:48 msgid "Stencyl game developer IDE" msgstr "" #: umake/frameworks/games.py:85 msgid "Stencyl" msgstr "Stencyl" #: umake/frameworks/games.py:114 msgid "Unity 3D Editor Linux experimental support" msgstr "" #: umake/frameworks/games.py:154 #, fuzzy msgid "Unity3D Editor" msgstr "Dart Editor" #: umake/frameworks/games.py:164 msgid "Twine tool for creating interactive and nonlinear stories" msgstr "" #: umake/frameworks/games.py:200 msgid "Twine" msgstr "" #: umake/interactions/__init__.py:73 msgid "No suitable answer provided" msgstr "Keine passende Antwort verfügbar" #: umake/interactions/__init__.py:75 umake/interactions/__init__.py:83 msgid "Your entry '{}' isn't an acceptable choice. choices are: {}" msgstr "Ihre Eingabe '{}' ist nicht erlaubt. Mögliche Eingaben sind: {}" #: umake/interactions/__init__.py:80 msgid "Your entry '{}' isn't an acceptable choice. choices are: {} and {}" msgstr "Ihre Eingabe '{}' ist nicht erlaubt. Mögliche Eingaben sind {} oder {}" #: umake/interactions/__init__.py:100 msgid " ({})" msgstr " ({})" #: umake/interactions/__init__.py:104 msgid "" "{}\n" "[{}] " msgstr "" "{}\n" "[{}] " #: umake/interactions/__init__.py:107 msgid "{} [{}] " msgstr "{} [{}] " #: umake/interactions/__init__.py:115 msgid "I Accept" msgstr "Ich akzeptiere" #: umake/interactions/__init__.py:115 msgid "a" msgstr "a" #: umake/interactions/__init__.py:116 msgid "I don't accept" msgstr "Ich akzeptiere nicht" #: umake/interactions/__init__.py:116 umake/interactions/__init__.py:149 msgid "N" msgstr "N" #: umake/interactions/__init__.py:125 umake/interactions/__init__.py:126 msgid "{} ({})" msgstr "{} ({})" #: umake/interactions/__init__.py:129 msgid "[{}] " msgstr "[{}] " #: umake/interactions/__init__.py:148 msgid "Yes" msgstr "Ja" #: umake/interactions/__init__.py:148 msgid "y" msgstr "j" #: umake/interactions/__init__.py:149 msgid "No" msgstr "Nein" #~ msgid "Stencyl Game developer environment" #~ msgstr "Stencyl Spiele Entwicklerumgebung" #~ msgid "Dart Editor for the dart language" #~ msgstr "Dart Editor für die dart Programmiersprache" ubuntu-make-18.09+disco1/po/el.po0000644000000000000000000002407013352651520013417 0ustar # Greek translation for ubuntu-make # Copyright (c) 2015 Rosetta Contributors and Canonical Ltd 2015 # This file is distributed under the same license as the ubuntu-make package. # FIRST AUTHOR , 2015. # msgid "" msgstr "" "Project-Id-Version: ubuntu-make\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-11-17 09:26+0100\n" "PO-Revision-Date: 2015-05-03 22:41+0000\n" "Last-Translator: stratosg \n" "Language-Team: Greek \n" "Language: el\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-05-04 07:08+0000\n" "X-Generator: Launchpad (build 17474)\n" #: umake/tools.py:48 msgid "# Ubuntu make installation of {}\n" msgstr "# Το Ubuntu εγκαθιστά το {}\n" #: umake/__init__.py:99 msgid "* Command '{}':" msgstr "* Εντολή '{}':" #: umake/__init__.py:107 msgid "Deploy and setup developers environment easily on ubuntu" msgstr "" "ΑναπτÏξτε και Ïυθμίστε το Ï€ÏογÏαμματιστικό πεÏιβάλλον εÏκολα στο ubuntu" #: umake/__init__.py:108 #, fuzzy msgid "" "Note that you can also configure different debug logging behavior using " "LOG_CFG that points to a log yaml profile." msgstr "" "Σημειώστε πως μποÏείτε επίσης να Ïυθμίστε διαφοÏετικές συμπεÏιφοÏές " "καταγÏαφών απασφαλμάτωσης χÏησιμοποιώντας LOG_CFG δείχνοντας σε ένα log yaml " "Ï€Ïοφίλ" #: umake/__init__.py:111 msgid "Show this help" msgstr "Εμφάνιση αυτής της βοήθειας" #: umake/__init__.py:112 msgid "Increase output verbosity (2 levels)" msgstr "Αυξήστε τη λεκτική λεπτομέÏεια εξόδου (2 επίπεδα)" #: umake/__init__.py:114 msgid "Remove specified framework if installed" msgstr "ΑφαίÏεση συγκεκÏιμένου πλάισιου αν έχει εγκατασταθεί" #: umake/__init__.py:116 msgid "Print version and exit" msgstr "" #: umake/frameworks/ide.py:63 msgid "Generic IDEs" msgstr "Γενικά IDE" #: umake/frameworks/ide.py:76 msgid "Pure Eclipse Luna (4.4)" msgstr "" #: umake/frameworks/ide.py:128 msgid "The Eclipse Luna Integrated Development Environment" msgstr "" #: umake/frameworks/ide.py:131 msgid "Eclipse Luna" msgstr "" #: umake/frameworks/ide.py:217 msgid "PyCharm Community Edition" msgstr "PyCharm Έκδοση Κοινότητας" #: umake/frameworks/ide.py:233 #, fuzzy msgid "PyCharm Educational Edition" msgstr "PyCharm Έκδοση Κοινότητας" #: umake/frameworks/ide.py:249 #, fuzzy msgid "PyCharm Professional Edition" msgstr "PyCharm Έκδοση Κοινότητας" #: umake/frameworks/ide.py:265 msgid "IntelliJ IDEA Community Edition" msgstr "IntelliJ IDEA Έκδοση Κοινότητας" #: umake/frameworks/ide.py:281 msgid "IntelliJ IDEA" msgstr "IntelliJ IDEA" #: umake/frameworks/ide.py:297 msgid "Ruby on Rails IDE" msgstr "" #: umake/frameworks/ide.py:314 msgid "Complex client-side and server-side javascript IDE" msgstr "" #: umake/frameworks/ide.py:331 #, fuzzy msgid "PHP and web development IDE" msgstr "IDE Ï€ÏογÏαμματιστή παιχνιδιών Stencyl" #: umake/frameworks/ide.py:348 msgid "CLion integrated C/C++ IDE" msgstr "" #: umake/frameworks/ide.py:376 msgid "The Arduino Software Distribution" msgstr "" #: umake/frameworks/ide.py:475 msgid "The Arduino Software IDE" msgstr "" #: umake/frameworks/ide.py:478 msgid "Arduino" msgstr "" #: umake/frameworks/ide.py:484 #, fuzzy msgid "You need to logout and login again for your installation to work" msgstr "" "ΠÏέπει να επανεκκινήσεις μια συνεδÏία κελÏφους για να δουλέψει η εγκατάστασή " "σου" #: umake/frameworks/ide.py:504 umake/frameworks/ide.py:584 #: umake/frameworks/ide.py:587 msgid "Netbeans IDE" msgstr "" #: umake/frameworks/dart.py:43 msgid "Dartlang Development Environment" msgstr "Dartlang ΠεÏιβάλλον Ανάπτυξης" #: umake/frameworks/dart.py:49 msgid "Dart SDK with editor (not supported upstream anyymore)" msgstr "" #: umake/frameworks/dart.py:56 #, fuzzy msgid "Dart SDK (default)" msgstr "Android ΣτοÏντιο (Ï€Ïοεπιλεγμένο)" #: umake/frameworks/dart.py:97 umake/frameworks/rust.py:134 #: umake/frameworks/scala.py:66 umake/frameworks/go.py:76 #: umake/frameworks/android.py:135 #, fuzzy msgid "" "You need to restart your current shell session for your {} installation to " "work properly" msgstr "" "ΠÏέπει να επανεκκινήσεις μια συνεδÏία κελÏφους για να δουλέψει η εγκατάστασή " "σου" #: umake/frameworks/rust.py:43 msgid "Rust language" msgstr "" #: umake/frameworks/rust.py:56 msgid "The official Rust distribution" msgstr "" #: umake/frameworks/scala.py:40 msgid "The Scala Programming Language" msgstr "" #: umake/frameworks/scala.py:46 #, fuzzy msgid "Scala compiler and interpreter (default)" msgstr "Google μεταγλωττιστής (Ï€Ïοεπιλεγμένος)" #: umake/frameworks/go.py:39 msgid "Go language" msgstr "" #: umake/frameworks/go.py:46 msgid "Google compiler (default)" msgstr "Google μεταγλωττιστής (Ï€Ïοεπιλεγμένος)" #: umake/frameworks/android.py:42 msgid "Android Development Environment" msgstr "Android ΠεÏιβάλλον Ανάπτυξης" #: umake/frameworks/android.py:80 msgid "Android Studio (default)" msgstr "Android ΣτοÏντιο (Ï€Ïοεπιλεγμένο)" #: umake/frameworks/android.py:100 msgid "Android Studio" msgstr "Android ΣτοÏντιο" #: umake/frameworks/android.py:103 msgid "Android Studio developer environment" msgstr "ΠεÏιβάλλον Ï€ÏογÏαμματιστή Android ΣτοÏντιο" #: umake/frameworks/android.py:111 #, fuzzy msgid "Android SDK" msgstr "Android NDK" #: umake/frameworks/android.py:147 msgid "Android NDK" msgstr "Android NDK" #: umake/frameworks/__init__.py:129 msgid "A default framework for category {} was requested where there is none" msgstr "" #: umake/frameworks/__init__.py:240 msgid "You can't install that framework on this machine" msgstr "" #: umake/frameworks/__init__.py:256 msgid "You can't remove {} as it isn't installed" msgstr "Δεν μποÏείς να αφαιÏέσει {} ενώ δεν είναι εγκατεστημένο" #: umake/frameworks/__init__.py:285 msgid "" "If the default framework name isn't provided, destdir should contain a /" msgstr "" "Εάν το Ï€Ïοεπιλεγμένο όνομα πλαισίου δεν παÏέχεται, το destdir Ï€Ïέπει να " "πεÏιέχει ένα /" #: umake/frameworks/__init__.py:288 msgid "Remove framework if installed" msgstr "ΑφαιÏέστε το πλάισιο αν είναι εγκατεστημένο" #: umake/frameworks/__init__.py:291 msgid "Accept license without prompting" msgstr "" #: umake/frameworks/web.py:45 msgid "Web Developer Environment" msgstr "ΠεÏιβάλλον Ανάπτυξης ΙστοÏ" #: umake/frameworks/web.py:51 umake/frameworks/web.py:120 msgid "Firefox Developer Edition" msgstr "Firefox Έκδοση ΠÏογÏαμματιστή" #: umake/frameworks/web.py:116 msgid "Choose language: {}" msgstr "" #: umake/frameworks/web.py:123 msgid "Firefox Aurora with Developer tools" msgstr "Firefox Aurora με εÏγαλεία ΠÏογÏαμματιστή" #: umake/frameworks/web.py:129 msgid "Install in given language without prompting" msgstr "" #: umake/frameworks/web.py:141 umake/frameworks/web.py:226 msgid "Visual Studio focused on modern web and cloud" msgstr "" #: umake/frameworks/web.py:223 msgid "Visual Studio Code" msgstr "" #: umake/frameworks/games.py:42 msgid "Games Development Environment" msgstr "ΠεÏιβάλλον Ανάπτυξης Παιχνιδιών" #: umake/frameworks/games.py:48 msgid "Stencyl game developer IDE" msgstr "IDE Ï€ÏογÏαμματιστή παιχνιδιών Stencyl" #: umake/frameworks/games.py:85 msgid "Stencyl" msgstr "Stencyl" #: umake/frameworks/games.py:114 msgid "Unity 3D Editor Linux experimental support" msgstr "" #: umake/frameworks/games.py:154 msgid "Unity3D Editor" msgstr "" #: umake/frameworks/games.py:164 msgid "Twine tool for creating interactive and nonlinear stories" msgstr "" #: umake/frameworks/games.py:200 msgid "Twine" msgstr "" #: umake/interactions/__init__.py:73 msgid "No suitable answer provided" msgstr "Δεν παÏέχεται καμία καμία κατάλληλη απάντηση" #: umake/interactions/__init__.py:75 umake/interactions/__init__.py:83 msgid "Your entry '{}' isn't an acceptable choice. choices are: {}" msgstr "" "Η καταχώÏισή σας '{}' δεν ειναι μια αποδεκτή επιλογή. οι επιλογές είναι: {}" #: umake/interactions/__init__.py:80 msgid "Your entry '{}' isn't an acceptable choice. choices are: {} and {}" msgstr "" "Η καταχώÏισή σας '{}' δεν είναι μια αποδεκτή επιλογή. οι επιλογές είναι: {} " "και {}" #: umake/interactions/__init__.py:100 msgid " ({})" msgstr " ({})" #: umake/interactions/__init__.py:104 msgid "" "{}\n" "[{}] " msgstr "" "{}\n" "[{}] " #: umake/interactions/__init__.py:107 msgid "{} [{}] " msgstr "{} [{}] " #: umake/interactions/__init__.py:115 msgid "I Accept" msgstr "Αποδέχομαι" #: umake/interactions/__init__.py:115 msgid "a" msgstr "α" #: umake/interactions/__init__.py:116 msgid "I don't accept" msgstr "Δεν αποδέχομαι" #: umake/interactions/__init__.py:116 umake/interactions/__init__.py:149 msgid "N" msgstr "" #: umake/interactions/__init__.py:125 umake/interactions/__init__.py:126 msgid "{} ({})" msgstr "{} ({})" #: umake/interactions/__init__.py:129 msgid "[{}] " msgstr "[{}] " #: umake/interactions/__init__.py:148 msgid "Yes" msgstr "Îαι" #: umake/interactions/__init__.py:148 msgid "y" msgstr "" #: umake/interactions/__init__.py:149 msgid "No" msgstr "Όχι" #~ msgid "Stencyl Game developer environment" #~ msgstr "ΠεÏιβάλλον Ï€ÏογÏαμματιστή Παιχνιδιών Stencyl" ubuntu-make-18.09+disco1/po/en_AU.po0000644000000000000000000001647013352651520014013 0ustar # English (Australia) translation for ubuntu-make # Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014 # This file is distributed under the same license as the ubuntu-make package. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: ubuntu-make\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-11-17 09:26+0100\n" "PO-Revision-Date: 2014-12-09 13:09+0000\n" "Last-Translator: destiriser \n" "Language-Team: English (Australia) \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-11-05 13:56+0000\n" "X-Generator: Launchpad (build 17838)\n" #: umake/tools.py:48 msgid "# Ubuntu make installation of {}\n" msgstr "" #: umake/__init__.py:99 msgid "* Command '{}':" msgstr "" #: umake/__init__.py:107 msgid "Deploy and setup developers environment easily on ubuntu" msgstr "Deploy and setup developers environment easily on Ubuntu" #: umake/__init__.py:108 msgid "" "Note that you can also configure different debug logging behavior using " "LOG_CFG that points to a log yaml profile." msgstr "" #: umake/__init__.py:111 msgid "Show this help" msgstr "" #: umake/__init__.py:112 msgid "Increase output verbosity (2 levels)" msgstr "" #: umake/__init__.py:114 msgid "Remove specified framework if installed" msgstr "" #: umake/__init__.py:116 msgid "Print version and exit" msgstr "" #: umake/frameworks/ide.py:63 msgid "Generic IDEs" msgstr "" #: umake/frameworks/ide.py:76 msgid "Pure Eclipse Luna (4.4)" msgstr "" #: umake/frameworks/ide.py:128 msgid "The Eclipse Luna Integrated Development Environment" msgstr "" #: umake/frameworks/ide.py:131 msgid "Eclipse Luna" msgstr "" #: umake/frameworks/ide.py:217 msgid "PyCharm Community Edition" msgstr "" #: umake/frameworks/ide.py:233 msgid "PyCharm Educational Edition" msgstr "" #: umake/frameworks/ide.py:249 msgid "PyCharm Professional Edition" msgstr "" #: umake/frameworks/ide.py:265 msgid "IntelliJ IDEA Community Edition" msgstr "" #: umake/frameworks/ide.py:281 msgid "IntelliJ IDEA" msgstr "" #: umake/frameworks/ide.py:297 msgid "Ruby on Rails IDE" msgstr "" #: umake/frameworks/ide.py:314 msgid "Complex client-side and server-side javascript IDE" msgstr "" #: umake/frameworks/ide.py:331 msgid "PHP and web development IDE" msgstr "" #: umake/frameworks/ide.py:348 msgid "CLion integrated C/C++ IDE" msgstr "" #: umake/frameworks/ide.py:376 msgid "The Arduino Software Distribution" msgstr "" #: umake/frameworks/ide.py:475 msgid "The Arduino Software IDE" msgstr "" #: umake/frameworks/ide.py:478 msgid "Arduino" msgstr "" #: umake/frameworks/ide.py:484 msgid "You need to logout and login again for your installation to work" msgstr "" #: umake/frameworks/ide.py:504 umake/frameworks/ide.py:584 #: umake/frameworks/ide.py:587 msgid "Netbeans IDE" msgstr "" #: umake/frameworks/dart.py:43 msgid "Dartlang Development Environment" msgstr "" #: umake/frameworks/dart.py:49 msgid "Dart SDK with editor (not supported upstream anyymore)" msgstr "" #: umake/frameworks/dart.py:56 msgid "Dart SDK (default)" msgstr "" #: umake/frameworks/dart.py:97 umake/frameworks/rust.py:134 #: umake/frameworks/scala.py:66 umake/frameworks/go.py:76 #: umake/frameworks/android.py:135 msgid "" "You need to restart your current shell session for your {} installation to " "work properly" msgstr "" #: umake/frameworks/rust.py:43 msgid "Rust language" msgstr "" #: umake/frameworks/rust.py:56 msgid "The official Rust distribution" msgstr "" #: umake/frameworks/scala.py:40 msgid "The Scala Programming Language" msgstr "" #: umake/frameworks/scala.py:46 msgid "Scala compiler and interpreter (default)" msgstr "" #: umake/frameworks/go.py:39 msgid "Go language" msgstr "" #: umake/frameworks/go.py:46 msgid "Google compiler (default)" msgstr "" #: umake/frameworks/android.py:42 msgid "Android Development Environment" msgstr "" #: umake/frameworks/android.py:80 msgid "Android Studio (default)" msgstr "" #: umake/frameworks/android.py:100 msgid "Android Studio" msgstr "" #: umake/frameworks/android.py:103 msgid "Android Studio developer environment" msgstr "" #: umake/frameworks/android.py:111 msgid "Android SDK" msgstr "" #: umake/frameworks/android.py:147 msgid "Android NDK" msgstr "" #: umake/frameworks/__init__.py:129 msgid "A default framework for category {} was requested where there is none" msgstr "" #: umake/frameworks/__init__.py:240 msgid "You can't install that framework on this machine" msgstr "" #: umake/frameworks/__init__.py:256 msgid "You can't remove {} as it isn't installed" msgstr "" #: umake/frameworks/__init__.py:285 msgid "" "If the default framework name isn't provided, destdir should contain a /" msgstr "" #: umake/frameworks/__init__.py:288 msgid "Remove framework if installed" msgstr "" #: umake/frameworks/__init__.py:291 msgid "Accept license without prompting" msgstr "" #: umake/frameworks/web.py:45 msgid "Web Developer Environment" msgstr "" #: umake/frameworks/web.py:51 umake/frameworks/web.py:120 msgid "Firefox Developer Edition" msgstr "" #: umake/frameworks/web.py:116 msgid "Choose language: {}" msgstr "" #: umake/frameworks/web.py:123 msgid "Firefox Aurora with Developer tools" msgstr "" #: umake/frameworks/web.py:129 msgid "Install in given language without prompting" msgstr "" #: umake/frameworks/web.py:141 umake/frameworks/web.py:226 msgid "Visual Studio focused on modern web and cloud" msgstr "" #: umake/frameworks/web.py:223 msgid "Visual Studio Code" msgstr "" #: umake/frameworks/games.py:42 msgid "Games Development Environment" msgstr "" #: umake/frameworks/games.py:48 msgid "Stencyl game developer IDE" msgstr "" #: umake/frameworks/games.py:85 msgid "Stencyl" msgstr "" #: umake/frameworks/games.py:114 msgid "Unity 3D Editor Linux experimental support" msgstr "" #: umake/frameworks/games.py:154 msgid "Unity3D Editor" msgstr "" #: umake/frameworks/games.py:164 msgid "Twine tool for creating interactive and nonlinear stories" msgstr "" #: umake/frameworks/games.py:200 msgid "Twine" msgstr "" #: umake/interactions/__init__.py:73 msgid "No suitable answer provided" msgstr "" #: umake/interactions/__init__.py:75 umake/interactions/__init__.py:83 msgid "Your entry '{}' isn't an acceptable choice. choices are: {}" msgstr "Your entry '{}' isn't an acceptable choice. Choices are: {}" #: umake/interactions/__init__.py:80 msgid "Your entry '{}' isn't an acceptable choice. choices are: {} and {}" msgstr "Your entry '{}' isn't an acceptable choice. Choices are: {} and {}" #: umake/interactions/__init__.py:100 msgid " ({})" msgstr "" #: umake/interactions/__init__.py:104 msgid "" "{}\n" "[{}] " msgstr "" #: umake/interactions/__init__.py:107 msgid "{} [{}] " msgstr "" #: umake/interactions/__init__.py:115 msgid "I Accept" msgstr "I accept" #: umake/interactions/__init__.py:115 msgid "a" msgstr "" #: umake/interactions/__init__.py:116 msgid "I don't accept" msgstr "" #: umake/interactions/__init__.py:116 umake/interactions/__init__.py:149 msgid "N" msgstr "" #: umake/interactions/__init__.py:125 umake/interactions/__init__.py:126 msgid "{} ({})" msgstr "" #: umake/interactions/__init__.py:129 msgid "[{}] " msgstr "" #: umake/interactions/__init__.py:148 msgid "Yes" msgstr "" #: umake/interactions/__init__.py:148 msgid "y" msgstr "" #: umake/interactions/__init__.py:149 msgid "No" msgstr "" ubuntu-make-18.09+disco1/po/en_CA.po0000644000000000000000000001646213352651520013772 0ustar # English (Canada) translation for ubuntu-make # Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014 # This file is distributed under the same license as the ubuntu-make package. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: ubuntu-make\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-11-17 09:26+0100\n" "PO-Revision-Date: 2014-12-09 13:09+0000\n" "Last-Translator: destiriser \n" "Language-Team: English (Canada) \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-11-05 13:56+0000\n" "X-Generator: Launchpad (build 17838)\n" #: umake/tools.py:48 msgid "# Ubuntu make installation of {}\n" msgstr "" #: umake/__init__.py:99 msgid "* Command '{}':" msgstr "" #: umake/__init__.py:107 msgid "Deploy and setup developers environment easily on ubuntu" msgstr "Deploy and setup developers environment easily on Ubuntu" #: umake/__init__.py:108 msgid "" "Note that you can also configure different debug logging behavior using " "LOG_CFG that points to a log yaml profile." msgstr "" #: umake/__init__.py:111 msgid "Show this help" msgstr "" #: umake/__init__.py:112 msgid "Increase output verbosity (2 levels)" msgstr "" #: umake/__init__.py:114 msgid "Remove specified framework if installed" msgstr "" #: umake/__init__.py:116 msgid "Print version and exit" msgstr "" #: umake/frameworks/ide.py:63 msgid "Generic IDEs" msgstr "" #: umake/frameworks/ide.py:76 msgid "Pure Eclipse Luna (4.4)" msgstr "" #: umake/frameworks/ide.py:128 msgid "The Eclipse Luna Integrated Development Environment" msgstr "" #: umake/frameworks/ide.py:131 msgid "Eclipse Luna" msgstr "" #: umake/frameworks/ide.py:217 msgid "PyCharm Community Edition" msgstr "" #: umake/frameworks/ide.py:233 msgid "PyCharm Educational Edition" msgstr "" #: umake/frameworks/ide.py:249 msgid "PyCharm Professional Edition" msgstr "" #: umake/frameworks/ide.py:265 msgid "IntelliJ IDEA Community Edition" msgstr "" #: umake/frameworks/ide.py:281 msgid "IntelliJ IDEA" msgstr "" #: umake/frameworks/ide.py:297 msgid "Ruby on Rails IDE" msgstr "" #: umake/frameworks/ide.py:314 msgid "Complex client-side and server-side javascript IDE" msgstr "" #: umake/frameworks/ide.py:331 msgid "PHP and web development IDE" msgstr "" #: umake/frameworks/ide.py:348 msgid "CLion integrated C/C++ IDE" msgstr "" #: umake/frameworks/ide.py:376 msgid "The Arduino Software Distribution" msgstr "" #: umake/frameworks/ide.py:475 msgid "The Arduino Software IDE" msgstr "" #: umake/frameworks/ide.py:478 msgid "Arduino" msgstr "" #: umake/frameworks/ide.py:484 msgid "You need to logout and login again for your installation to work" msgstr "" #: umake/frameworks/ide.py:504 umake/frameworks/ide.py:584 #: umake/frameworks/ide.py:587 msgid "Netbeans IDE" msgstr "" #: umake/frameworks/dart.py:43 msgid "Dartlang Development Environment" msgstr "" #: umake/frameworks/dart.py:49 msgid "Dart SDK with editor (not supported upstream anyymore)" msgstr "" #: umake/frameworks/dart.py:56 msgid "Dart SDK (default)" msgstr "" #: umake/frameworks/dart.py:97 umake/frameworks/rust.py:134 #: umake/frameworks/scala.py:66 umake/frameworks/go.py:76 #: umake/frameworks/android.py:135 msgid "" "You need to restart your current shell session for your {} installation to " "work properly" msgstr "" #: umake/frameworks/rust.py:43 msgid "Rust language" msgstr "" #: umake/frameworks/rust.py:56 msgid "The official Rust distribution" msgstr "" #: umake/frameworks/scala.py:40 msgid "The Scala Programming Language" msgstr "" #: umake/frameworks/scala.py:46 msgid "Scala compiler and interpreter (default)" msgstr "" #: umake/frameworks/go.py:39 msgid "Go language" msgstr "" #: umake/frameworks/go.py:46 msgid "Google compiler (default)" msgstr "" #: umake/frameworks/android.py:42 msgid "Android Development Environment" msgstr "" #: umake/frameworks/android.py:80 msgid "Android Studio (default)" msgstr "" #: umake/frameworks/android.py:100 msgid "Android Studio" msgstr "" #: umake/frameworks/android.py:103 msgid "Android Studio developer environment" msgstr "" #: umake/frameworks/android.py:111 msgid "Android SDK" msgstr "" #: umake/frameworks/android.py:147 msgid "Android NDK" msgstr "" #: umake/frameworks/__init__.py:129 msgid "A default framework for category {} was requested where there is none" msgstr "" #: umake/frameworks/__init__.py:240 msgid "You can't install that framework on this machine" msgstr "" #: umake/frameworks/__init__.py:256 msgid "You can't remove {} as it isn't installed" msgstr "" #: umake/frameworks/__init__.py:285 msgid "" "If the default framework name isn't provided, destdir should contain a /" msgstr "" #: umake/frameworks/__init__.py:288 msgid "Remove framework if installed" msgstr "" #: umake/frameworks/__init__.py:291 msgid "Accept license without prompting" msgstr "" #: umake/frameworks/web.py:45 msgid "Web Developer Environment" msgstr "" #: umake/frameworks/web.py:51 umake/frameworks/web.py:120 msgid "Firefox Developer Edition" msgstr "" #: umake/frameworks/web.py:116 msgid "Choose language: {}" msgstr "" #: umake/frameworks/web.py:123 msgid "Firefox Aurora with Developer tools" msgstr "" #: umake/frameworks/web.py:129 msgid "Install in given language without prompting" msgstr "" #: umake/frameworks/web.py:141 umake/frameworks/web.py:226 msgid "Visual Studio focused on modern web and cloud" msgstr "" #: umake/frameworks/web.py:223 msgid "Visual Studio Code" msgstr "" #: umake/frameworks/games.py:42 msgid "Games Development Environment" msgstr "" #: umake/frameworks/games.py:48 msgid "Stencyl game developer IDE" msgstr "" #: umake/frameworks/games.py:85 msgid "Stencyl" msgstr "" #: umake/frameworks/games.py:114 msgid "Unity 3D Editor Linux experimental support" msgstr "" #: umake/frameworks/games.py:154 msgid "Unity3D Editor" msgstr "" #: umake/frameworks/games.py:164 msgid "Twine tool for creating interactive and nonlinear stories" msgstr "" #: umake/frameworks/games.py:200 msgid "Twine" msgstr "" #: umake/interactions/__init__.py:73 msgid "No suitable answer provided" msgstr "" #: umake/interactions/__init__.py:75 umake/interactions/__init__.py:83 msgid "Your entry '{}' isn't an acceptable choice. choices are: {}" msgstr "Your entry '{}' isn't an acceptable choice. Choices are: {}" #: umake/interactions/__init__.py:80 msgid "Your entry '{}' isn't an acceptable choice. choices are: {} and {}" msgstr "Your entry '{}' isn't an acceptable choice. Choices are: {} and {}" #: umake/interactions/__init__.py:100 msgid " ({})" msgstr "" #: umake/interactions/__init__.py:104 msgid "" "{}\n" "[{}] " msgstr "" #: umake/interactions/__init__.py:107 msgid "{} [{}] " msgstr "" #: umake/interactions/__init__.py:115 msgid "I Accept" msgstr "I accept" #: umake/interactions/__init__.py:115 msgid "a" msgstr "" #: umake/interactions/__init__.py:116 msgid "I don't accept" msgstr "" #: umake/interactions/__init__.py:116 umake/interactions/__init__.py:149 msgid "N" msgstr "" #: umake/interactions/__init__.py:125 umake/interactions/__init__.py:126 msgid "{} ({})" msgstr "" #: umake/interactions/__init__.py:129 msgid "[{}] " msgstr "" #: umake/interactions/__init__.py:148 msgid "Yes" msgstr "" #: umake/interactions/__init__.py:148 msgid "y" msgstr "" #: umake/interactions/__init__.py:149 msgid "No" msgstr "" ubuntu-make-18.09+disco1/po/en_GB.po0000644000000000000000000001650213352651520013772 0ustar # English (United Kingdom) translation for ubuntu-make # Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014 # This file is distributed under the same license as the ubuntu-make package. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: ubuntu-make\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-11-17 09:26+0100\n" "PO-Revision-Date: 2014-12-09 13:09+0000\n" "Last-Translator: destiriser \n" "Language-Team: English (United Kingdom) \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-11-05 13:56+0000\n" "X-Generator: Launchpad (build 17838)\n" #: umake/tools.py:48 msgid "# Ubuntu make installation of {}\n" msgstr "" #: umake/__init__.py:99 msgid "* Command '{}':" msgstr "" #: umake/__init__.py:107 msgid "Deploy and setup developers environment easily on ubuntu" msgstr "Deploy and setup developers environment easily on Ubuntu" #: umake/__init__.py:108 msgid "" "Note that you can also configure different debug logging behavior using " "LOG_CFG that points to a log yaml profile." msgstr "" #: umake/__init__.py:111 msgid "Show this help" msgstr "" #: umake/__init__.py:112 msgid "Increase output verbosity (2 levels)" msgstr "" #: umake/__init__.py:114 msgid "Remove specified framework if installed" msgstr "" #: umake/__init__.py:116 msgid "Print version and exit" msgstr "" #: umake/frameworks/ide.py:63 msgid "Generic IDEs" msgstr "" #: umake/frameworks/ide.py:76 msgid "Pure Eclipse Luna (4.4)" msgstr "" #: umake/frameworks/ide.py:128 msgid "The Eclipse Luna Integrated Development Environment" msgstr "" #: umake/frameworks/ide.py:131 msgid "Eclipse Luna" msgstr "" #: umake/frameworks/ide.py:217 msgid "PyCharm Community Edition" msgstr "" #: umake/frameworks/ide.py:233 msgid "PyCharm Educational Edition" msgstr "" #: umake/frameworks/ide.py:249 msgid "PyCharm Professional Edition" msgstr "" #: umake/frameworks/ide.py:265 msgid "IntelliJ IDEA Community Edition" msgstr "" #: umake/frameworks/ide.py:281 msgid "IntelliJ IDEA" msgstr "" #: umake/frameworks/ide.py:297 msgid "Ruby on Rails IDE" msgstr "" #: umake/frameworks/ide.py:314 msgid "Complex client-side and server-side javascript IDE" msgstr "" #: umake/frameworks/ide.py:331 msgid "PHP and web development IDE" msgstr "" #: umake/frameworks/ide.py:348 msgid "CLion integrated C/C++ IDE" msgstr "" #: umake/frameworks/ide.py:376 msgid "The Arduino Software Distribution" msgstr "" #: umake/frameworks/ide.py:475 msgid "The Arduino Software IDE" msgstr "" #: umake/frameworks/ide.py:478 msgid "Arduino" msgstr "" #: umake/frameworks/ide.py:484 msgid "You need to logout and login again for your installation to work" msgstr "" #: umake/frameworks/ide.py:504 umake/frameworks/ide.py:584 #: umake/frameworks/ide.py:587 msgid "Netbeans IDE" msgstr "" #: umake/frameworks/dart.py:43 msgid "Dartlang Development Environment" msgstr "" #: umake/frameworks/dart.py:49 msgid "Dart SDK with editor (not supported upstream anyymore)" msgstr "" #: umake/frameworks/dart.py:56 msgid "Dart SDK (default)" msgstr "" #: umake/frameworks/dart.py:97 umake/frameworks/rust.py:134 #: umake/frameworks/scala.py:66 umake/frameworks/go.py:76 #: umake/frameworks/android.py:135 msgid "" "You need to restart your current shell session for your {} installation to " "work properly" msgstr "" #: umake/frameworks/rust.py:43 msgid "Rust language" msgstr "" #: umake/frameworks/rust.py:56 msgid "The official Rust distribution" msgstr "" #: umake/frameworks/scala.py:40 msgid "The Scala Programming Language" msgstr "" #: umake/frameworks/scala.py:46 msgid "Scala compiler and interpreter (default)" msgstr "" #: umake/frameworks/go.py:39 msgid "Go language" msgstr "" #: umake/frameworks/go.py:46 msgid "Google compiler (default)" msgstr "" #: umake/frameworks/android.py:42 msgid "Android Development Environment" msgstr "" #: umake/frameworks/android.py:80 msgid "Android Studio (default)" msgstr "" #: umake/frameworks/android.py:100 msgid "Android Studio" msgstr "" #: umake/frameworks/android.py:103 msgid "Android Studio developer environment" msgstr "" #: umake/frameworks/android.py:111 msgid "Android SDK" msgstr "" #: umake/frameworks/android.py:147 msgid "Android NDK" msgstr "" #: umake/frameworks/__init__.py:129 msgid "A default framework for category {} was requested where there is none" msgstr "" #: umake/frameworks/__init__.py:240 msgid "You can't install that framework on this machine" msgstr "" #: umake/frameworks/__init__.py:256 msgid "You can't remove {} as it isn't installed" msgstr "" #: umake/frameworks/__init__.py:285 msgid "" "If the default framework name isn't provided, destdir should contain a /" msgstr "" #: umake/frameworks/__init__.py:288 msgid "Remove framework if installed" msgstr "" #: umake/frameworks/__init__.py:291 msgid "Accept license without prompting" msgstr "" #: umake/frameworks/web.py:45 msgid "Web Developer Environment" msgstr "" #: umake/frameworks/web.py:51 umake/frameworks/web.py:120 msgid "Firefox Developer Edition" msgstr "" #: umake/frameworks/web.py:116 msgid "Choose language: {}" msgstr "" #: umake/frameworks/web.py:123 msgid "Firefox Aurora with Developer tools" msgstr "" #: umake/frameworks/web.py:129 msgid "Install in given language without prompting" msgstr "" #: umake/frameworks/web.py:141 umake/frameworks/web.py:226 msgid "Visual Studio focused on modern web and cloud" msgstr "" #: umake/frameworks/web.py:223 msgid "Visual Studio Code" msgstr "" #: umake/frameworks/games.py:42 msgid "Games Development Environment" msgstr "" #: umake/frameworks/games.py:48 msgid "Stencyl game developer IDE" msgstr "" #: umake/frameworks/games.py:85 msgid "Stencyl" msgstr "" #: umake/frameworks/games.py:114 msgid "Unity 3D Editor Linux experimental support" msgstr "" #: umake/frameworks/games.py:154 msgid "Unity3D Editor" msgstr "" #: umake/frameworks/games.py:164 msgid "Twine tool for creating interactive and nonlinear stories" msgstr "" #: umake/frameworks/games.py:200 msgid "Twine" msgstr "" #: umake/interactions/__init__.py:73 msgid "No suitable answer provided" msgstr "" #: umake/interactions/__init__.py:75 umake/interactions/__init__.py:83 msgid "Your entry '{}' isn't an acceptable choice. choices are: {}" msgstr "Your entry '{}' isn't an acceptable choice. Choices are: {}" #: umake/interactions/__init__.py:80 msgid "Your entry '{}' isn't an acceptable choice. choices are: {} and {}" msgstr "Your entry '{}' isn't an acceptable choice. Choices are: {} and {}" #: umake/interactions/__init__.py:100 msgid " ({})" msgstr "" #: umake/interactions/__init__.py:104 msgid "" "{}\n" "[{}] " msgstr "" #: umake/interactions/__init__.py:107 msgid "{} [{}] " msgstr "" #: umake/interactions/__init__.py:115 msgid "I Accept" msgstr "I accept" #: umake/interactions/__init__.py:115 msgid "a" msgstr "" #: umake/interactions/__init__.py:116 msgid "I don't accept" msgstr "" #: umake/interactions/__init__.py:116 umake/interactions/__init__.py:149 msgid "N" msgstr "" #: umake/interactions/__init__.py:125 umake/interactions/__init__.py:126 msgid "{} ({})" msgstr "" #: umake/interactions/__init__.py:129 msgid "[{}] " msgstr "" #: umake/interactions/__init__.py:148 msgid "Yes" msgstr "" #: umake/interactions/__init__.py:148 msgid "y" msgstr "" #: umake/interactions/__init__.py:149 msgid "No" msgstr "" ubuntu-make-18.09+disco1/po/es.po0000644000000000000000000002322113352651520013423 0ustar # Spanish translation for ubuntu-make # Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014 # This file is distributed under the same license as the ubuntu-make package. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: ubuntu-make\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-11-17 09:26+0100\n" "PO-Revision-Date: 2016-09-24 22:34-0400\n" "Last-Translator: Wilsen Hernandez \n" "Language-Team: Spanish \n" "Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-04-02 06:32+0000\n" "X-Generator: Poedit 1.8.7.1\n" #: umake/tools.py:48 msgid "# Ubuntu make installation of {}\n" msgstr "# Instalación de {} con Ubuntu make\n" #: umake/__init__.py:99 msgid "* Command '{}':" msgstr "* Orden «{}»:" #: umake/__init__.py:107 msgid "Deploy and setup developers environment easily on ubuntu" msgstr "Instalar y configurar entornos de desarrollo fácilmente en Ubuntu" #: umake/__init__.py:108 msgid "" "Note that you can also configure different debug logging behavior using " "LOG_CFG that points to a log yaml profile." msgstr "" "También puede configurar distintos comportamientos para los registros de " "depuración usando LOG_CFG apuntando a un perfil yaml." #: umake/__init__.py:111 msgid "Show this help" msgstr "Muestra esta ayuda" #: umake/__init__.py:112 msgid "Increase output verbosity (2 levels)" msgstr "Aumentar detalles en la salida (2 niveles)" #: umake/__init__.py:114 msgid "Remove specified framework if installed" msgstr "Eliminar el marco especificado si está instalado" #: umake/__init__.py:116 msgid "Print version and exit" msgstr "Mostrar versión y salir" #: umake/frameworks/ide.py:63 msgid "Generic IDEs" msgstr "EID genéricos" #: umake/frameworks/ide.py:76 msgid "Pure Eclipse Luna (4.4)" msgstr "Pure Eclipse Luna (4.4)" #: umake/frameworks/ide.py:128 msgid "The Eclipse Luna Integrated Development Environment" msgstr "El entorno integrado de desarrollo Eclipse Luna" #: umake/frameworks/ide.py:131 msgid "Eclipse Luna" msgstr "Eclipse Luna" #: umake/frameworks/ide.py:217 msgid "PyCharm Community Edition" msgstr "PyCharm Edición Comunidad" #: umake/frameworks/ide.py:233 msgid "PyCharm Educational Edition" msgstr "PyCharm Edición Educacional" #: umake/frameworks/ide.py:249 msgid "PyCharm Professional Edition" msgstr "PyCharm Edición Profesional" #: umake/frameworks/ide.py:265 msgid "IntelliJ IDEA Community Edition" msgstr "IntelliJ IDEA Community Edition" #: umake/frameworks/ide.py:281 msgid "IntelliJ IDEA" msgstr "IntelliJ IDEA" #: umake/frameworks/ide.py:297 msgid "Ruby on Rails IDE" msgstr "EID Ruby on Rails" #: umake/frameworks/ide.py:314 msgid "Complex client-side and server-side javascript IDE" msgstr "Complejo EID para cliente y servidor" #: umake/frameworks/ide.py:331 msgid "PHP and web development IDE" msgstr "EID de desarrollo web y PHP" #: umake/frameworks/ide.py:348 msgid "CLion integrated C/C++ IDE" msgstr "EID de C/C++ integrado CLion" #: umake/frameworks/ide.py:376 msgid "The Arduino Software Distribution" msgstr "La Distribución de Software Arduino" #: umake/frameworks/ide.py:475 msgid "The Arduino Software IDE" msgstr "EID Arduino Software" #: umake/frameworks/ide.py:478 msgid "Arduino" msgstr "Arduino" #: umake/frameworks/ide.py:484 msgid "You need to logout and login again for your installation to work" msgstr "" "Es necesario reiniciar la sesión del equipo para que la instalación entre en " "funcionamiento" #: umake/frameworks/ide.py:504 umake/frameworks/ide.py:584 #: umake/frameworks/ide.py:587 msgid "Netbeans IDE" msgstr "EID Netbeans" #: umake/frameworks/dart.py:43 msgid "Dartlang Development Environment" msgstr "Entorno de desarrollo Dartlang" #: umake/frameworks/dart.py:49 msgid "Dart SDK with editor (not supported upstream anyymore)" msgstr "SDK de Dart con editor (subida ya no soportada)" #: umake/frameworks/dart.py:56 msgid "Dart SDK (default)" msgstr "SDK de Dart con editor (predeterminado)" #: umake/frameworks/dart.py:97 umake/frameworks/rust.py:134 #: umake/frameworks/scala.py:66 umake/frameworks/go.py:76 #: umake/frameworks/android.py:135 msgid "" "You need to restart your current shell session for your {} installation to " "work properly" msgstr "" "Es necesario reiniciar la sesión de la consola para que la instalación entre " "en funcionamiento" #: umake/frameworks/rust.py:43 msgid "Rust language" msgstr "Lenguaje Rust" #: umake/frameworks/rust.py:56 msgid "The official Rust distribution" msgstr "La distribución oficial de Rust" #: umake/frameworks/scala.py:40 msgid "The Scala Programming Language" msgstr "Lenguaje de Programación Scala" #: umake/frameworks/scala.py:46 msgid "Scala compiler and interpreter (default)" msgstr "Compilador e interpretador Scala (predeterminado)" #: umake/frameworks/go.py:39 msgid "Go language" msgstr "Lenguaje Go" #: umake/frameworks/go.py:46 msgid "Google compiler (default)" msgstr "Compilador de Google (predeterminado)" #: umake/frameworks/android.py:42 msgid "Android Development Environment" msgstr "Entorno de desarrollo de Android" #: umake/frameworks/android.py:80 msgid "Android Studio (default)" msgstr "Android Studio (predeterminado)" #: umake/frameworks/android.py:100 msgid "Android Studio" msgstr "Android Studio" #: umake/frameworks/android.py:103 msgid "Android Studio developer environment" msgstr "Entorno de desarrollo Android Studio" #: umake/frameworks/android.py:111 msgid "Android SDK" msgstr "Android SDK" #: umake/frameworks/android.py:147 msgid "Android NDK" msgstr "Android NDK" #: umake/frameworks/__init__.py:129 msgid "A default framework for category {} was requested where there is none" msgstr "" "Se solicito un marco predeterminado para la categoría {} y no existe alguno" #: umake/frameworks/__init__.py:240 msgid "You can't install that framework on this machine" msgstr "No puedes instalar ese marco predeterminado en esta maquina" #: umake/frameworks/__init__.py:256 msgid "You can't remove {} as it isn't installed" msgstr "No se puede desinstalar {} ya que no está instalado" #: umake/frameworks/__init__.py:285 msgid "" "If the default framework name isn't provided, destdir should contain a /" msgstr "" "Si no se especifica el nombre del marco predeterminado, destdir debe " "contener una /" #: umake/frameworks/__init__.py:288 msgid "Remove framework if installed" msgstr "Eliminar marco si está instalado" #: umake/frameworks/__init__.py:291 msgid "Accept license without prompting" msgstr "Aceptar licencia sin preguntar" #: umake/frameworks/web.py:45 msgid "Web Developer Environment" msgstr "Entorno de desarrollo web" #: umake/frameworks/web.py:51 umake/frameworks/web.py:120 msgid "Firefox Developer Edition" msgstr "Firefox Developer Edition" #: umake/frameworks/web.py:116 msgid "Choose language: {}" msgstr "Elige idioma: {}" #: umake/frameworks/web.py:123 msgid "Firefox Aurora with Developer tools" msgstr "Firefox Aurora con herramientas de desarrollo" #: umake/frameworks/web.py:129 msgid "Install in given language without prompting" msgstr "Instalar en el idioma dado sin preguntar" #: umake/frameworks/web.py:141 umake/frameworks/web.py:226 msgid "Visual Studio focused on modern web and cloud" msgstr "Visual Studio enfocado a la web moderna y la nube" #: umake/frameworks/web.py:223 msgid "Visual Studio Code" msgstr "Visual Studio Code" #: umake/frameworks/games.py:42 msgid "Games Development Environment" msgstr "Entorno de desarrollo de juegos" #: umake/frameworks/games.py:48 msgid "Stencyl game developer IDE" msgstr "EID de desarrollo de juegos Stencyl" #: umake/frameworks/games.py:85 msgid "Stencyl" msgstr "Stencyl" #: umake/frameworks/games.py:114 msgid "Unity 3D Editor Linux experimental support" msgstr "Editor Unity 3D soporte experimental Linux" #: umake/frameworks/games.py:154 msgid "Unity3D Editor" msgstr "Editor Unity 3D" #: umake/frameworks/games.py:164 msgid "Twine tool for creating interactive and nonlinear stories" msgstr "Herramienta Twine para crear historia interactivas y no-lineales" #: umake/frameworks/games.py:200 msgid "Twine" msgstr "Twine" #: umake/interactions/__init__.py:73 msgid "No suitable answer provided" msgstr "No se ha provisto una respuesta adecuada" #: umake/interactions/__init__.py:75 umake/interactions/__init__.py:83 msgid "Your entry '{}' isn't an acceptable choice. choices are: {}" msgstr "Su entrada «{}» no es una opción aceptable. Las opciones son: {}" #: umake/interactions/__init__.py:80 msgid "Your entry '{}' isn't an acceptable choice. choices are: {} and {}" msgstr "Su entrada «{}» no es una opción aceptable. Las opciones son: {} y {}" #: umake/interactions/__init__.py:100 msgid " ({})" msgstr " ({})" #: umake/interactions/__init__.py:104 msgid "" "{}\n" "[{}] " msgstr "" "{}\n" "[{}] " #: umake/interactions/__init__.py:107 msgid "{} [{}] " msgstr "{} [{}] " #: umake/interactions/__init__.py:115 msgid "I Accept" msgstr "Acepto" #: umake/interactions/__init__.py:115 msgid "a" msgstr "a" #: umake/interactions/__init__.py:116 msgid "I don't accept" msgstr "No acepto" #: umake/interactions/__init__.py:116 umake/interactions/__init__.py:149 msgid "N" msgstr "N" #: umake/interactions/__init__.py:125 umake/interactions/__init__.py:126 msgid "{} ({})" msgstr "{} ({})" #: umake/interactions/__init__.py:129 msgid "[{}] " msgstr "[{}] " #: umake/interactions/__init__.py:148 msgid "Yes" msgstr "Sí" #: umake/interactions/__init__.py:148 msgid "y" msgstr "s" #: umake/interactions/__init__.py:149 msgid "No" msgstr "No" #~ msgid "Stencyl Game developer environment" #~ msgstr "Entorno de desarrollo de juegos Stencyl" #~ msgid "Dart Editor for the dart language" #~ msgstr "Editor Dart para el lenguaje Dart" ubuntu-make-18.09+disco1/po/eu.po0000644000000000000000000001644713352651520013441 0ustar # Basque translation for ubuntu-make # Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014 # This file is distributed under the same license as the ubuntu-make package. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: ubuntu-make\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-11-17 09:26+0100\n" "PO-Revision-Date: 2014-12-09 13:12+0000\n" "Last-Translator: Didier Roche \n" "Language-Team: Basque \n" "Language: eu\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-11-05 13:56+0000\n" "X-Generator: Launchpad (build 17838)\n" #: umake/tools.py:48 msgid "# Ubuntu make installation of {}\n" msgstr "" #: umake/__init__.py:99 msgid "* Command '{}':" msgstr "" #: umake/__init__.py:107 msgid "Deploy and setup developers environment easily on ubuntu" msgstr "" #: umake/__init__.py:108 msgid "" "Note that you can also configure different debug logging behavior using " "LOG_CFG that points to a log yaml profile." msgstr "" #: umake/__init__.py:111 msgid "Show this help" msgstr "Erakutsi laguntza hau" #: umake/__init__.py:112 msgid "Increase output verbosity (2 levels)" msgstr "" #: umake/__init__.py:114 msgid "Remove specified framework if installed" msgstr "" #: umake/__init__.py:116 msgid "Print version and exit" msgstr "" #: umake/frameworks/ide.py:63 msgid "Generic IDEs" msgstr "" #: umake/frameworks/ide.py:76 msgid "Pure Eclipse Luna (4.4)" msgstr "" #: umake/frameworks/ide.py:128 msgid "The Eclipse Luna Integrated Development Environment" msgstr "" #: umake/frameworks/ide.py:131 msgid "Eclipse Luna" msgstr "" #: umake/frameworks/ide.py:217 msgid "PyCharm Community Edition" msgstr "" #: umake/frameworks/ide.py:233 msgid "PyCharm Educational Edition" msgstr "" #: umake/frameworks/ide.py:249 msgid "PyCharm Professional Edition" msgstr "" #: umake/frameworks/ide.py:265 msgid "IntelliJ IDEA Community Edition" msgstr "" #: umake/frameworks/ide.py:281 msgid "IntelliJ IDEA" msgstr "" #: umake/frameworks/ide.py:297 msgid "Ruby on Rails IDE" msgstr "" #: umake/frameworks/ide.py:314 msgid "Complex client-side and server-side javascript IDE" msgstr "" #: umake/frameworks/ide.py:331 msgid "PHP and web development IDE" msgstr "" #: umake/frameworks/ide.py:348 msgid "CLion integrated C/C++ IDE" msgstr "" #: umake/frameworks/ide.py:376 msgid "The Arduino Software Distribution" msgstr "" #: umake/frameworks/ide.py:475 msgid "The Arduino Software IDE" msgstr "" #: umake/frameworks/ide.py:478 msgid "Arduino" msgstr "" #: umake/frameworks/ide.py:484 msgid "You need to logout and login again for your installation to work" msgstr "" #: umake/frameworks/ide.py:504 umake/frameworks/ide.py:584 #: umake/frameworks/ide.py:587 msgid "Netbeans IDE" msgstr "" #: umake/frameworks/dart.py:43 msgid "Dartlang Development Environment" msgstr "" #: umake/frameworks/dart.py:49 msgid "Dart SDK with editor (not supported upstream anyymore)" msgstr "" #: umake/frameworks/dart.py:56 msgid "Dart SDK (default)" msgstr "" #: umake/frameworks/dart.py:97 umake/frameworks/rust.py:134 #: umake/frameworks/scala.py:66 umake/frameworks/go.py:76 #: umake/frameworks/android.py:135 msgid "" "You need to restart your current shell session for your {} installation to " "work properly" msgstr "" #: umake/frameworks/rust.py:43 msgid "Rust language" msgstr "" #: umake/frameworks/rust.py:56 msgid "The official Rust distribution" msgstr "" #: umake/frameworks/scala.py:40 msgid "The Scala Programming Language" msgstr "" #: umake/frameworks/scala.py:46 msgid "Scala compiler and interpreter (default)" msgstr "" #: umake/frameworks/go.py:39 msgid "Go language" msgstr "" #: umake/frameworks/go.py:46 msgid "Google compiler (default)" msgstr "" #: umake/frameworks/android.py:42 msgid "Android Development Environment" msgstr "Androiderako garapen-ingurunea" #: umake/frameworks/android.py:80 msgid "Android Studio (default)" msgstr "" #: umake/frameworks/android.py:100 msgid "Android Studio" msgstr "Android Studio" #: umake/frameworks/android.py:103 msgid "Android Studio developer environment" msgstr "Android Studio garapen-ingurunea" #: umake/frameworks/android.py:111 #, fuzzy msgid "Android SDK" msgstr "Android Studio" #: umake/frameworks/android.py:147 msgid "Android NDK" msgstr "" #: umake/frameworks/__init__.py:129 msgid "A default framework for category {} was requested where there is none" msgstr "" #: umake/frameworks/__init__.py:240 msgid "You can't install that framework on this machine" msgstr "" #: umake/frameworks/__init__.py:256 msgid "You can't remove {} as it isn't installed" msgstr "" #: umake/frameworks/__init__.py:285 msgid "" "If the default framework name isn't provided, destdir should contain a /" msgstr "" #: umake/frameworks/__init__.py:288 msgid "Remove framework if installed" msgstr "" #: umake/frameworks/__init__.py:291 msgid "Accept license without prompting" msgstr "" #: umake/frameworks/web.py:45 msgid "Web Developer Environment" msgstr "" #: umake/frameworks/web.py:51 umake/frameworks/web.py:120 msgid "Firefox Developer Edition" msgstr "" #: umake/frameworks/web.py:116 msgid "Choose language: {}" msgstr "" #: umake/frameworks/web.py:123 msgid "Firefox Aurora with Developer tools" msgstr "" #: umake/frameworks/web.py:129 msgid "Install in given language without prompting" msgstr "" #: umake/frameworks/web.py:141 umake/frameworks/web.py:226 msgid "Visual Studio focused on modern web and cloud" msgstr "" #: umake/frameworks/web.py:223 msgid "Visual Studio Code" msgstr "" #: umake/frameworks/games.py:42 msgid "Games Development Environment" msgstr "" #: umake/frameworks/games.py:48 msgid "Stencyl game developer IDE" msgstr "" #: umake/frameworks/games.py:85 msgid "Stencyl" msgstr "" #: umake/frameworks/games.py:114 msgid "Unity 3D Editor Linux experimental support" msgstr "" #: umake/frameworks/games.py:154 msgid "Unity3D Editor" msgstr "" #: umake/frameworks/games.py:164 msgid "Twine tool for creating interactive and nonlinear stories" msgstr "" #: umake/frameworks/games.py:200 msgid "Twine" msgstr "" #: umake/interactions/__init__.py:73 msgid "No suitable answer provided" msgstr "" #: umake/interactions/__init__.py:75 umake/interactions/__init__.py:83 msgid "Your entry '{}' isn't an acceptable choice. choices are: {}" msgstr "" #: umake/interactions/__init__.py:80 msgid "Your entry '{}' isn't an acceptable choice. choices are: {} and {}" msgstr "" #: umake/interactions/__init__.py:100 msgid " ({})" msgstr " ({})" #: umake/interactions/__init__.py:104 msgid "" "{}\n" "[{}] " msgstr "" "{}\n" "[{}] " #: umake/interactions/__init__.py:107 msgid "{} [{}] " msgstr "{} [{}] " #: umake/interactions/__init__.py:115 msgid "I Accept" msgstr "Onartzen dut" #: umake/interactions/__init__.py:115 msgid "a" msgstr "o" #: umake/interactions/__init__.py:116 msgid "I don't accept" msgstr "Ez dut onartzen" #: umake/interactions/__init__.py:116 umake/interactions/__init__.py:149 msgid "N" msgstr "E" #: umake/interactions/__init__.py:125 umake/interactions/__init__.py:126 msgid "{} ({})" msgstr "{} ({})" #: umake/interactions/__init__.py:129 msgid "[{}] " msgstr "[{}] " #: umake/interactions/__init__.py:148 msgid "Yes" msgstr "Bai" #: umake/interactions/__init__.py:148 msgid "y" msgstr "b" #: umake/interactions/__init__.py:149 msgid "No" msgstr "Ez" ubuntu-make-18.09+disco1/po/fa.po0000644000000000000000000001723713352651520013414 0ustar # Persian translation for ubuntu-make # Copyright (c) 2015 Rosetta Contributors and Canonical Ltd 2015 # This file is distributed under the same license as the ubuntu-make package. # FIRST AUTHOR , 2015. # msgid "" msgstr "" "Project-Id-Version: ubuntu-make\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-11-17 09:26+0100\n" "PO-Revision-Date: 2015-07-23 05:28+0000\n" "Last-Translator: Arash Badie Modiri \n" "Language-Team: Persian \n" "Language: fa\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-11-05 13:56+0000\n" "X-Generator: Launchpad (build 17838)\n" #: umake/tools.py:48 msgid "# Ubuntu make installation of {}\n" msgstr "" #: umake/__init__.py:99 msgid "* Command '{}':" msgstr "" #: umake/__init__.py:107 msgid "Deploy and setup developers environment easily on ubuntu" msgstr "" #: umake/__init__.py:108 msgid "" "Note that you can also configure different debug logging behavior using " "LOG_CFG that points to a log yaml profile." msgstr "" #: umake/__init__.py:111 msgid "Show this help" msgstr "این راهنما را نشان بده" #: umake/__init__.py:112 msgid "Increase output verbosity (2 levels)" msgstr "" #: umake/__init__.py:114 msgid "Remove specified framework if installed" msgstr "" #: umake/__init__.py:116 msgid "Print version and exit" msgstr "" #: umake/frameworks/ide.py:63 msgid "Generic IDEs" msgstr "" #: umake/frameworks/ide.py:76 msgid "Pure Eclipse Luna (4.4)" msgstr "" #: umake/frameworks/ide.py:128 msgid "The Eclipse Luna Integrated Development Environment" msgstr "" #: umake/frameworks/ide.py:131 msgid "Eclipse Luna" msgstr "" #: umake/frameworks/ide.py:217 msgid "PyCharm Community Edition" msgstr "" #: umake/frameworks/ide.py:233 msgid "PyCharm Educational Edition" msgstr "" #: umake/frameworks/ide.py:249 msgid "PyCharm Professional Edition" msgstr "" #: umake/frameworks/ide.py:265 msgid "IntelliJ IDEA Community Edition" msgstr "" #: umake/frameworks/ide.py:281 msgid "IntelliJ IDEA" msgstr "" #: umake/frameworks/ide.py:297 msgid "Ruby on Rails IDE" msgstr "" #: umake/frameworks/ide.py:314 msgid "Complex client-side and server-side javascript IDE" msgstr "" #: umake/frameworks/ide.py:331 msgid "PHP and web development IDE" msgstr "" #: umake/frameworks/ide.py:348 msgid "CLion integrated C/C++ IDE" msgstr "" #: umake/frameworks/ide.py:376 msgid "The Arduino Software Distribution" msgstr "" #: umake/frameworks/ide.py:475 msgid "The Arduino Software IDE" msgstr "" #: umake/frameworks/ide.py:478 msgid "Arduino" msgstr "" #: umake/frameworks/ide.py:484 msgid "You need to logout and login again for your installation to work" msgstr "" #: umake/frameworks/ide.py:504 umake/frameworks/ide.py:584 #: umake/frameworks/ide.py:587 msgid "Netbeans IDE" msgstr "" #: umake/frameworks/dart.py:43 msgid "Dartlang Development Environment" msgstr "" #: umake/frameworks/dart.py:49 msgid "Dart SDK with editor (not supported upstream anyymore)" msgstr "" #: umake/frameworks/dart.py:56 msgid "Dart SDK (default)" msgstr "" #: umake/frameworks/dart.py:97 umake/frameworks/rust.py:134 #: umake/frameworks/scala.py:66 umake/frameworks/go.py:76 #: umake/frameworks/android.py:135 msgid "" "You need to restart your current shell session for your {} installation to " "work properly" msgstr "" #: umake/frameworks/rust.py:43 #, fuzzy msgid "Rust language" msgstr "زبان Go" #: umake/frameworks/rust.py:56 msgid "The official Rust distribution" msgstr "" #: umake/frameworks/scala.py:40 msgid "The Scala Programming Language" msgstr "" #: umake/frameworks/scala.py:46 msgid "Scala compiler and interpreter (default)" msgstr "" #: umake/frameworks/go.py:39 msgid "Go language" msgstr "زبان Go" #: umake/frameworks/go.py:46 msgid "Google compiler (default)" msgstr "" #: umake/frameworks/android.py:42 msgid "Android Development Environment" msgstr "محیط توسعه Android" #: umake/frameworks/android.py:80 msgid "Android Studio (default)" msgstr "" #: umake/frameworks/android.py:100 msgid "Android Studio" msgstr "" #: umake/frameworks/android.py:103 msgid "Android Studio developer environment" msgstr "" #: umake/frameworks/android.py:111 msgid "Android SDK" msgstr "" #: umake/frameworks/android.py:147 msgid "Android NDK" msgstr "" #: umake/frameworks/__init__.py:129 msgid "A default framework for category {} was requested where there is none" msgstr "" #: umake/frameworks/__init__.py:240 msgid "You can't install that framework on this machine" msgstr "" #: umake/frameworks/__init__.py:256 msgid "You can't remove {} as it isn't installed" msgstr "نمی‌توانید «{}» را پاک کنید چون اصلا نصب نشده" #: umake/frameworks/__init__.py:285 msgid "" "If the default framework name isn't provided, destdir should contain a /" msgstr "" #: umake/frameworks/__init__.py:288 msgid "Remove framework if installed" msgstr "" #: umake/frameworks/__init__.py:291 msgid "Accept license without prompting" msgstr "" #: umake/frameworks/web.py:45 msgid "Web Developer Environment" msgstr "محیط توسعه وب" #: umake/frameworks/web.py:51 umake/frameworks/web.py:120 msgid "Firefox Developer Edition" msgstr "نسخه‌ی توسعه‌دهنده Firefox" #: umake/frameworks/web.py:116 #, fuzzy msgid "Choose language: {}" msgstr "زبان Go" #: umake/frameworks/web.py:123 msgid "Firefox Aurora with Developer tools" msgstr "نسخه‌ی Aurora مرورگر Firefox به همراه ابزار توسعه" #: umake/frameworks/web.py:129 msgid "Install in given language without prompting" msgstr "" #: umake/frameworks/web.py:141 umake/frameworks/web.py:226 msgid "Visual Studio focused on modern web and cloud" msgstr "" #: umake/frameworks/web.py:223 msgid "Visual Studio Code" msgstr "" #: umake/frameworks/games.py:42 msgid "Games Development Environment" msgstr "محیط توسعه‌ی بازی" #: umake/frameworks/games.py:48 msgid "Stencyl game developer IDE" msgstr "" #: umake/frameworks/games.py:85 msgid "Stencyl" msgstr "" #: umake/frameworks/games.py:114 msgid "Unity 3D Editor Linux experimental support" msgstr "" #: umake/frameworks/games.py:154 msgid "Unity3D Editor" msgstr "" #: umake/frameworks/games.py:164 msgid "Twine tool for creating interactive and nonlinear stories" msgstr "" #: umake/frameworks/games.py:200 msgid "Twine" msgstr "" #: umake/interactions/__init__.py:73 msgid "No suitable answer provided" msgstr "پاسخ مناسبی داده نشد" #: umake/interactions/__init__.py:75 umake/interactions/__init__.py:83 msgid "Your entry '{}' isn't an acceptable choice. choices are: {}" msgstr "" #: umake/interactions/__init__.py:80 msgid "Your entry '{}' isn't an acceptable choice. choices are: {} and {}" msgstr "«{}» ورودی قابل قبولی نیست. انتخاب‌ها «{}» Ùˆ «{}»اند" #: umake/interactions/__init__.py:100 msgid " ({})" msgstr "" #: umake/interactions/__init__.py:104 msgid "" "{}\n" "[{}] " msgstr "" #: umake/interactions/__init__.py:107 msgid "{} [{}] " msgstr "" #: umake/interactions/__init__.py:115 msgid "I Accept" msgstr "قبول می‌کنم" #: umake/interactions/__init__.py:115 msgid "a" msgstr "" #: umake/interactions/__init__.py:116 msgid "I don't accept" msgstr "قبول نمی‌کنم" #: umake/interactions/__init__.py:116 umake/interactions/__init__.py:149 msgid "N" msgstr "" #: umake/interactions/__init__.py:125 umake/interactions/__init__.py:126 msgid "{} ({})" msgstr "" #: umake/interactions/__init__.py:129 msgid "[{}] " msgstr "" #: umake/interactions/__init__.py:148 msgid "Yes" msgstr "بلی" #: umake/interactions/__init__.py:148 msgid "y" msgstr "" #: umake/interactions/__init__.py:149 msgid "No" msgstr "خیر" ubuntu-make-18.09+disco1/po/fr.po0000644000000000000000000002314013352651520013423 0ustar # French translation for ubuntu-make # Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014 # This file is distributed under the same license as the ubuntu-make package. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: ubuntu-make\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-11-17 09:26+0100\n" "PO-Revision-Date: 2015-11-23 15:36+0000\n" "Last-Translator: Didier Roche \n" "Language-Team: French \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-11-24 07:00+0000\n" "X-Generator: Launchpad (build 17850)\n" "Language: fr\n" #: umake/tools.py:48 msgid "# Ubuntu make installation of {}\n" msgstr "# Ajouté par Ubuntu make de {}\n" #: umake/__init__.py:99 msgid "* Command '{}':" msgstr "* Commande '{}':" #: umake/__init__.py:107 msgid "Deploy and setup developers environment easily on ubuntu" msgstr "" "Installez et déployez un environnement de développement facilement sur ubuntu" #: umake/__init__.py:108 msgid "" "Note that you can also configure different debug logging behavior using " "LOG_CFG that points to a log yaml profile." msgstr "" "Il est également possible de configurer différents comportements et niveaux " "de logs en faisant pointer la variable d'environnement LOG_CFG vers un " "fichier de profile de log yaml." #: umake/__init__.py:111 msgid "Show this help" msgstr "Afficher cette aide" #: umake/__init__.py:112 msgid "Increase output verbosity (2 levels)" msgstr "Augmenter la verbosité de la sortie (2 niveaux)" #: umake/__init__.py:114 msgid "Remove specified framework if installed" msgstr "Supprimer l'environnement spécifié si installé" #: umake/__init__.py:116 msgid "Print version and exit" msgstr "Afficher la version et quitter" #: umake/frameworks/ide.py:63 msgid "Generic IDEs" msgstr "Environnement de développement intégré" #: umake/frameworks/ide.py:76 msgid "Pure Eclipse Luna (4.4)" msgstr "Eclipse Luna (4.4)" #: umake/frameworks/ide.py:128 msgid "The Eclipse Luna Integrated Development Environment" msgstr "L'environnement de développement intégré Eclipse Luna" #: umake/frameworks/ide.py:131 msgid "Eclipse Luna" msgstr "Eclipse Luna" #: umake/frameworks/ide.py:217 msgid "PyCharm Community Edition" msgstr "PyCharm Édition Communautaire" #: umake/frameworks/ide.py:233 msgid "PyCharm Educational Edition" msgstr "PyCharm Édition Éducation" #: umake/frameworks/ide.py:249 msgid "PyCharm Professional Edition" msgstr "PyCharm Édition Professionelle" #: umake/frameworks/ide.py:265 msgid "IntelliJ IDEA Community Edition" msgstr "IntelliJ IDEA Édition Communautaire" #: umake/frameworks/ide.py:281 msgid "IntelliJ IDEA" msgstr "IntelliJ IDEA" #: umake/frameworks/ide.py:297 msgid "Ruby on Rails IDE" msgstr "IDE Ruby on Rails" #: umake/frameworks/ide.py:314 msgid "Complex client-side and server-side javascript IDE" msgstr "" "IDE pour le développement d'applications javascript clientes et serveur" #: umake/frameworks/ide.py:331 msgid "PHP and web development IDE" msgstr "IDE pour PHP et web" #: umake/frameworks/ide.py:348 msgid "CLion integrated C/C++ IDE" msgstr "IDE C/C++ CLion" #: umake/frameworks/ide.py:376 msgid "The Arduino Software Distribution" msgstr "Logiciels pour Arduino" #: umake/frameworks/ide.py:475 msgid "The Arduino Software IDE" msgstr "IDE pour Arduino" #: umake/frameworks/ide.py:478 msgid "Arduino" msgstr "Arduino" #: umake/frameworks/ide.py:484 msgid "You need to logout and login again for your installation to work" msgstr "" "Vous devez vous déconnecter et vous reconnecter pour que votre installation " "fonctionne" #: umake/frameworks/ide.py:504 umake/frameworks/ide.py:584 #: umake/frameworks/ide.py:587 msgid "Netbeans IDE" msgstr "IDE Netbeans" #: umake/frameworks/dart.py:43 msgid "Dartlang Development Environment" msgstr "Environnement de Développement Dartlang" #: umake/frameworks/dart.py:49 msgid "Dart SDK with editor (not supported upstream anyymore)" msgstr "Dart SDK avec éditeur (non supporté par upstream)" #: umake/frameworks/dart.py:56 msgid "Dart SDK (default)" msgstr "Dart SDK (défault)" #: umake/frameworks/dart.py:97 umake/frameworks/rust.py:134 #: umake/frameworks/scala.py:66 umake/frameworks/go.py:76 #: umake/frameworks/android.py:135 msgid "" "You need to restart your current shell session for your {} installation to " "work properly" msgstr "" "Vous devez redémarrer votre shell courant pour que votre installation {} " "fonctionne correctement" #: umake/frameworks/rust.py:43 msgid "Rust language" msgstr "Langage Rust" #: umake/frameworks/rust.py:56 msgid "The official Rust distribution" msgstr "Distribution officielle Rust" #: umake/frameworks/scala.py:40 msgid "The Scala Programming Language" msgstr "Langage Scala" #: umake/frameworks/scala.py:46 msgid "Scala compiler and interpreter (default)" msgstr "Compilateur et interpréteur Scala (défaut)" #: umake/frameworks/go.py:39 msgid "Go language" msgstr "Langage Go" #: umake/frameworks/go.py:46 msgid "Google compiler (default)" msgstr "Compilateur Google (défaut)" #: umake/frameworks/android.py:42 msgid "Android Development Environment" msgstr "Environnement de développement Android" #: umake/frameworks/android.py:80 msgid "Android Studio (default)" msgstr "Android Studio (défaut)" #: umake/frameworks/android.py:100 msgid "Android Studio" msgstr "Android Studio" #: umake/frameworks/android.py:103 msgid "Android Studio developer environment" msgstr "Environnement de développement Android Studio" #: umake/frameworks/android.py:111 msgid "Android SDK" msgstr "SDK Android" #: umake/frameworks/android.py:147 msgid "Android NDK" msgstr "Android NDK" #: umake/frameworks/__init__.py:129 msgid "A default framework for category {} was requested where there is none" msgstr "" "Un framework par défaut pour la catégorie {} est requis, mais il n'y en " "a aucun" #: umake/frameworks/__init__.py:240 msgid "You can't install that framework on this machine" msgstr "Vous ne pouvez pas installer ce framework sur cette machine" #: umake/frameworks/__init__.py:256 msgid "You can't remove {} as it isn't installed" msgstr "Vous ne pouvez supprimer {} puisqu'il n'est pas installé" #: umake/frameworks/__init__.py:285 msgid "" "If the default framework name isn't provided, destdir should contain a /" msgstr "" "Si l'environnement par défaut n'est pas spécifié, destdir doit contenir un /" #: umake/frameworks/__init__.py:288 msgid "Remove framework if installed" msgstr "Supprime l'environnement si installé" #: umake/frameworks/__init__.py:291 msgid "Accept license without prompting" msgstr "Accepter la license sans demander" #: umake/frameworks/web.py:45 msgid "Web Developer Environment" msgstr "Environnement de développement Web" #: umake/frameworks/web.py:51 umake/frameworks/web.py:120 msgid "Firefox Developer Edition" msgstr "Firefox Édition Développeur" #: umake/frameworks/web.py:116 msgid "Choose language: {}" msgstr "Votre langue : {}" #: umake/frameworks/web.py:123 msgid "Firefox Aurora with Developer tools" msgstr "Firefox Aurora avec outils développeur" #: umake/frameworks/web.py:129 msgid "Install in given language without prompting" msgstr "Installer dans la lange choisie sans demander" #: umake/frameworks/web.py:141 umake/frameworks/web.py:226 msgid "Visual Studio focused on modern web and cloud" msgstr "Visual Studio pour le web moderne et cloud" #: umake/frameworks/web.py:223 msgid "Visual Studio Code" msgstr "Visual Studio Code" #: umake/frameworks/games.py:42 msgid "Games Development Environment" msgstr "Environnement de développement de jeux" #: umake/frameworks/games.py:48 msgid "Stencyl game developer IDE" msgstr "Éditeur de jeux Stencyl" #: umake/frameworks/games.py:85 msgid "Stencyl" msgstr "Stencyl" #: umake/frameworks/games.py:114 msgid "Unity 3D Editor Linux experimental support" msgstr "Éditeur Unity 3D avec support expérimental pour Linux" #: umake/frameworks/games.py:154 msgid "Unity3D Editor" msgstr "Éditeur Unity 3D" #: umake/frameworks/games.py:164 msgid "Twine tool for creating interactive and nonlinear stories" msgstr "Outil Twine de création interactive et non linéaire d'histoires" #: umake/frameworks/games.py:200 msgid "Twine" msgstr "Twine" #: umake/interactions/__init__.py:73 msgid "No suitable answer provided" msgstr "La réponse n'est pas satisfaisante" #: umake/interactions/__init__.py:75 umake/interactions/__init__.py:83 msgid "Your entry '{}' isn't an acceptable choice. choices are: {}" msgstr "" "Votre entrée '{}' n'est pas un choix acceptable. Choisissez parmi: {}" #: umake/interactions/__init__.py:80 msgid "Your entry '{}' isn't an acceptable choice. choices are: {} and {}" msgstr "" "Votre entrée '{}' n'est pas un choix acceptable. Choisissez entre {} et {}" #: umake/interactions/__init__.py:100 msgid " ({})" msgstr " ({})" #: umake/interactions/__init__.py:104 msgid "" "{}\n" "[{}] " msgstr "" "{}\n" "[{}] " #: umake/interactions/__init__.py:107 msgid "{} [{}] " msgstr "{} [{}] " #: umake/interactions/__init__.py:115 msgid "I Accept" msgstr "J'accepte" #: umake/interactions/__init__.py:115 msgid "a" msgstr "a" #: umake/interactions/__init__.py:116 msgid "I don't accept" msgstr "Je ne les accepte pas" #: umake/interactions/__init__.py:116 umake/interactions/__init__.py:149 msgid "N" msgstr "N" #: umake/interactions/__init__.py:125 umake/interactions/__init__.py:126 msgid "{} ({})" msgstr "{} ({})" #: umake/interactions/__init__.py:129 msgid "[{}] " msgstr "[{}] " #: umake/interactions/__init__.py:148 msgid "Yes" msgstr "Oui" #: umake/interactions/__init__.py:148 msgid "y" msgstr "o" #: umake/interactions/__init__.py:149 msgid "No" msgstr "Non" ubuntu-make-18.09+disco1/po/hr.po0000644000000000000000000001656713352651520013444 0ustar # Croatian translation for ubuntu-make # Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014 # This file is distributed under the same license as the ubuntu-make package. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: ubuntu-make\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-11-17 09:26+0100\n" "PO-Revision-Date: 2014-12-09 13:12+0000\n" "Last-Translator: Didier Roche \n" "Language-Team: Croatian \n" "Language: hr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-11-05 13:56+0000\n" "X-Generator: Launchpad (build 17838)\n" #: umake/tools.py:48 msgid "# Ubuntu make installation of {}\n" msgstr "" #: umake/__init__.py:99 msgid "* Command '{}':" msgstr "* Naredba '{}':" #: umake/__init__.py:107 msgid "Deploy and setup developers environment easily on ubuntu" msgstr "" #: umake/__init__.py:108 msgid "" "Note that you can also configure different debug logging behavior using " "LOG_CFG that points to a log yaml profile." msgstr "" #: umake/__init__.py:111 msgid "Show this help" msgstr "Prikaži ovu pomoć" #: umake/__init__.py:112 msgid "Increase output verbosity (2 levels)" msgstr "" #: umake/__init__.py:114 msgid "Remove specified framework if installed" msgstr "" #: umake/__init__.py:116 msgid "Print version and exit" msgstr "" #: umake/frameworks/ide.py:63 msgid "Generic IDEs" msgstr "" #: umake/frameworks/ide.py:76 msgid "Pure Eclipse Luna (4.4)" msgstr "" #: umake/frameworks/ide.py:128 msgid "The Eclipse Luna Integrated Development Environment" msgstr "" #: umake/frameworks/ide.py:131 msgid "Eclipse Luna" msgstr "" #: umake/frameworks/ide.py:217 msgid "PyCharm Community Edition" msgstr "" #: umake/frameworks/ide.py:233 msgid "PyCharm Educational Edition" msgstr "" #: umake/frameworks/ide.py:249 msgid "PyCharm Professional Edition" msgstr "" #: umake/frameworks/ide.py:265 msgid "IntelliJ IDEA Community Edition" msgstr "" #: umake/frameworks/ide.py:281 msgid "IntelliJ IDEA" msgstr "" #: umake/frameworks/ide.py:297 msgid "Ruby on Rails IDE" msgstr "" #: umake/frameworks/ide.py:314 msgid "Complex client-side and server-side javascript IDE" msgstr "" #: umake/frameworks/ide.py:331 msgid "PHP and web development IDE" msgstr "" #: umake/frameworks/ide.py:348 msgid "CLion integrated C/C++ IDE" msgstr "" #: umake/frameworks/ide.py:376 msgid "The Arduino Software Distribution" msgstr "" #: umake/frameworks/ide.py:475 msgid "The Arduino Software IDE" msgstr "" #: umake/frameworks/ide.py:478 msgid "Arduino" msgstr "" #: umake/frameworks/ide.py:484 msgid "You need to logout and login again for your installation to work" msgstr "" #: umake/frameworks/ide.py:504 umake/frameworks/ide.py:584 #: umake/frameworks/ide.py:587 msgid "Netbeans IDE" msgstr "" #: umake/frameworks/dart.py:43 msgid "Dartlang Development Environment" msgstr "" #: umake/frameworks/dart.py:49 msgid "Dart SDK with editor (not supported upstream anyymore)" msgstr "" #: umake/frameworks/dart.py:56 msgid "Dart SDK (default)" msgstr "" #: umake/frameworks/dart.py:97 umake/frameworks/rust.py:134 #: umake/frameworks/scala.py:66 umake/frameworks/go.py:76 #: umake/frameworks/android.py:135 msgid "" "You need to restart your current shell session for your {} installation to " "work properly" msgstr "" #: umake/frameworks/rust.py:43 msgid "Rust language" msgstr "" #: umake/frameworks/rust.py:56 msgid "The official Rust distribution" msgstr "" #: umake/frameworks/scala.py:40 msgid "The Scala Programming Language" msgstr "" #: umake/frameworks/scala.py:46 msgid "Scala compiler and interpreter (default)" msgstr "" #: umake/frameworks/go.py:39 msgid "Go language" msgstr "" #: umake/frameworks/go.py:46 msgid "Google compiler (default)" msgstr "" #: umake/frameworks/android.py:42 msgid "Android Development Environment" msgstr "" #: umake/frameworks/android.py:80 msgid "Android Studio (default)" msgstr "" #: umake/frameworks/android.py:100 msgid "Android Studio" msgstr "Android Studio" #: umake/frameworks/android.py:103 msgid "Android Studio developer environment" msgstr "Android Studio razvojno okruženje" #: umake/frameworks/android.py:111 #, fuzzy msgid "Android SDK" msgstr "Android Studio" #: umake/frameworks/android.py:147 msgid "Android NDK" msgstr "" #: umake/frameworks/__init__.py:129 msgid "A default framework for category {} was requested where there is none" msgstr "" #: umake/frameworks/__init__.py:240 msgid "You can't install that framework on this machine" msgstr "" #: umake/frameworks/__init__.py:256 msgid "You can't remove {} as it isn't installed" msgstr "" #: umake/frameworks/__init__.py:285 msgid "" "If the default framework name isn't provided, destdir should contain a /" msgstr "" #: umake/frameworks/__init__.py:288 msgid "Remove framework if installed" msgstr "" #: umake/frameworks/__init__.py:291 msgid "Accept license without prompting" msgstr "" #: umake/frameworks/web.py:45 msgid "Web Developer Environment" msgstr "" #: umake/frameworks/web.py:51 umake/frameworks/web.py:120 msgid "Firefox Developer Edition" msgstr "" #: umake/frameworks/web.py:116 msgid "Choose language: {}" msgstr "" #: umake/frameworks/web.py:123 msgid "Firefox Aurora with Developer tools" msgstr "" #: umake/frameworks/web.py:129 msgid "Install in given language without prompting" msgstr "" #: umake/frameworks/web.py:141 umake/frameworks/web.py:226 msgid "Visual Studio focused on modern web and cloud" msgstr "" #: umake/frameworks/web.py:223 msgid "Visual Studio Code" msgstr "" #: umake/frameworks/games.py:42 msgid "Games Development Environment" msgstr "" #: umake/frameworks/games.py:48 msgid "Stencyl game developer IDE" msgstr "" #: umake/frameworks/games.py:85 msgid "Stencyl" msgstr "" #: umake/frameworks/games.py:114 msgid "Unity 3D Editor Linux experimental support" msgstr "" #: umake/frameworks/games.py:154 msgid "Unity3D Editor" msgstr "" #: umake/frameworks/games.py:164 msgid "Twine tool for creating interactive and nonlinear stories" msgstr "" #: umake/frameworks/games.py:200 msgid "Twine" msgstr "" #: umake/interactions/__init__.py:73 msgid "No suitable answer provided" msgstr "Nije ponuÄ‘en prikladan odgovor" #: umake/interactions/__init__.py:75 umake/interactions/__init__.py:83 msgid "Your entry '{}' isn't an acceptable choice. choices are: {}" msgstr "VaÅ¡ unos '{}' nije prikladan. Mogući unosi su: {}" #: umake/interactions/__init__.py:80 msgid "Your entry '{}' isn't an acceptable choice. choices are: {} and {}" msgstr "VaÅ¡ unos '{}' nije prikladan. Mogući unosi su: {} i {}" #: umake/interactions/__init__.py:100 msgid " ({})" msgstr "" #: umake/interactions/__init__.py:104 msgid "" "{}\n" "[{}] " msgstr "" #: umake/interactions/__init__.py:107 msgid "{} [{}] " msgstr "" #: umake/interactions/__init__.py:115 msgid "I Accept" msgstr "Prihvaćam" #: umake/interactions/__init__.py:115 msgid "a" msgstr "" #: umake/interactions/__init__.py:116 msgid "I don't accept" msgstr "Ne prihvaćam" #: umake/interactions/__init__.py:116 umake/interactions/__init__.py:149 msgid "N" msgstr "" #: umake/interactions/__init__.py:125 umake/interactions/__init__.py:126 msgid "{} ({})" msgstr "" #: umake/interactions/__init__.py:129 msgid "[{}] " msgstr "" #: umake/interactions/__init__.py:148 msgid "Yes" msgstr "Da" #: umake/interactions/__init__.py:148 msgid "y" msgstr "d" #: umake/interactions/__init__.py:149 msgid "No" msgstr "Ne" ubuntu-make-18.09+disco1/po/id.po0000644000000000000000000002202413352651520013410 0ustar # Indonesian translation for ubuntu-make # Copyright (c) 2015 Rosetta Contributors and Canonical Ltd 2015 # This file is distributed under the same license as the ubuntu-make package. # FIRST AUTHOR , 2015. # msgid "" msgstr "" "Project-Id-Version: ubuntu-make\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-11-17 09:26+0100\n" "PO-Revision-Date: 2015-03-01 08:40+0000\n" "Last-Translator: Eka Y Saputra \n" "Language-Team: Indonesian \n" "Language: id\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-04-02 06:32+0000\n" "X-Generator: Launchpad (build 17413)\n" #: umake/tools.py:48 msgid "# Ubuntu make installation of {}\n" msgstr "# Instalasi Ubuntu make di {}\n" #: umake/__init__.py:99 msgid "* Command '{}':" msgstr "* Command '{}':" #: umake/__init__.py:107 msgid "Deploy and setup developers environment easily on ubuntu" msgstr "Memasang dan mengatur lingkungan pengembangan dengan mudah di ubuntu" #: umake/__init__.py:108 #, fuzzy msgid "" "Note that you can also configure different debug logging behavior using " "LOG_CFG that points to a log yaml profile." msgstr "" "Anda juga bisa mengonfigurasikan perilaku pencatatan debug yang berbeda " "menggunakan LOG_CFG yang merujuk ke sebuah profil pencatatan yaml" #: umake/__init__.py:111 msgid "Show this help" msgstr "Tampilkan bantuan ini" #: umake/__init__.py:112 msgid "Increase output verbosity (2 levels)" msgstr "Tingkatkan verbositas output (2 level)" #: umake/__init__.py:114 msgid "Remove specified framework if installed" msgstr "Hapus framework yang ditentukan jika telah terinstal" #: umake/__init__.py:116 msgid "Print version and exit" msgstr "" #: umake/frameworks/ide.py:63 msgid "Generic IDEs" msgstr "IDE Generik" #: umake/frameworks/ide.py:76 msgid "Pure Eclipse Luna (4.4)" msgstr "Pure Eclipse Luna (4.4)" #: umake/frameworks/ide.py:128 msgid "The Eclipse Luna Integrated Development Environment" msgstr "The Eclipse Luna Integrated Development Environment" #: umake/frameworks/ide.py:131 msgid "Eclipse Luna" msgstr "Eclipse Luna" #: umake/frameworks/ide.py:217 msgid "PyCharm Community Edition" msgstr "PyCharm Community Edition" #: umake/frameworks/ide.py:233 #, fuzzy msgid "PyCharm Educational Edition" msgstr "PyCharm Community Edition" #: umake/frameworks/ide.py:249 #, fuzzy msgid "PyCharm Professional Edition" msgstr "PyCharm Community Edition" #: umake/frameworks/ide.py:265 msgid "IntelliJ IDEA Community Edition" msgstr "IntelliJ IDEA Community Edition" #: umake/frameworks/ide.py:281 msgid "IntelliJ IDEA" msgstr "IntelliJ IDEA" #: umake/frameworks/ide.py:297 msgid "Ruby on Rails IDE" msgstr "" #: umake/frameworks/ide.py:314 msgid "Complex client-side and server-side javascript IDE" msgstr "" #: umake/frameworks/ide.py:331 #, fuzzy msgid "PHP and web development IDE" msgstr "IDE untuk pengembangan game Stencyl" #: umake/frameworks/ide.py:348 msgid "CLion integrated C/C++ IDE" msgstr "" #: umake/frameworks/ide.py:376 msgid "The Arduino Software Distribution" msgstr "" #: umake/frameworks/ide.py:475 msgid "The Arduino Software IDE" msgstr "" #: umake/frameworks/ide.py:478 msgid "Arduino" msgstr "" #: umake/frameworks/ide.py:484 #, fuzzy msgid "You need to logout and login again for your installation to work" msgstr "" "Anda harus menjalankan sebuah sesi shell untuk membuat instalasi Anda bekerja" #: umake/frameworks/ide.py:504 umake/frameworks/ide.py:584 #: umake/frameworks/ide.py:587 msgid "Netbeans IDE" msgstr "" #: umake/frameworks/dart.py:43 msgid "Dartlang Development Environment" msgstr "Dartlang Development Environment" #: umake/frameworks/dart.py:49 #, fuzzy msgid "Dart SDK with editor (not supported upstream anyymore)" msgstr "Dart SDK with editor (default)" #: umake/frameworks/dart.py:56 #, fuzzy msgid "Dart SDK (default)" msgstr "Dart SDK with editor (default)" #: umake/frameworks/dart.py:97 umake/frameworks/rust.py:134 #: umake/frameworks/scala.py:66 umake/frameworks/go.py:76 #: umake/frameworks/android.py:135 #, fuzzy msgid "" "You need to restart your current shell session for your {} installation to " "work properly" msgstr "" "Anda harus menjalankan sebuah sesi shell untuk membuat instalasi Anda bekerja" #: umake/frameworks/rust.py:43 #, fuzzy msgid "Rust language" msgstr "Bahasa Go" #: umake/frameworks/rust.py:56 msgid "The official Rust distribution" msgstr "" #: umake/frameworks/scala.py:40 msgid "The Scala Programming Language" msgstr "" #: umake/frameworks/scala.py:46 #, fuzzy msgid "Scala compiler and interpreter (default)" msgstr "Google compiler (default)" #: umake/frameworks/go.py:39 msgid "Go language" msgstr "Bahasa Go" #: umake/frameworks/go.py:46 msgid "Google compiler (default)" msgstr "Google compiler (default)" #: umake/frameworks/android.py:42 msgid "Android Development Environment" msgstr "Lingkungan Pengembangan Android" #: umake/frameworks/android.py:80 msgid "Android Studio (default)" msgstr "Android Studio (default)" #: umake/frameworks/android.py:100 msgid "Android Studio" msgstr "Android Studio" #: umake/frameworks/android.py:103 msgid "Android Studio developer environment" msgstr "Lingkungan pengembangan Android Studio" #: umake/frameworks/android.py:111 #, fuzzy msgid "Android SDK" msgstr "Android NDK" #: umake/frameworks/android.py:147 msgid "Android NDK" msgstr "Android NDK" #: umake/frameworks/__init__.py:129 msgid "A default framework for category {} was requested where there is none" msgstr "" #: umake/frameworks/__init__.py:240 msgid "You can't install that framework on this machine" msgstr "" #: umake/frameworks/__init__.py:256 msgid "You can't remove {} as it isn't installed" msgstr "Anda tak bisa menghapus {} sebab belum pernah diinstal" #: umake/frameworks/__init__.py:285 msgid "" "If the default framework name isn't provided, destdir should contain a /" msgstr "" "Jika nama framework bawaan tidak tersedia, destdir harus memuat sebuah /" #: umake/frameworks/__init__.py:288 msgid "Remove framework if installed" msgstr "Hapus framework jika terinstal" #: umake/frameworks/__init__.py:291 msgid "Accept license without prompting" msgstr "" #: umake/frameworks/web.py:45 msgid "Web Developer Environment" msgstr "Lingkungan Pengembangan Web" #: umake/frameworks/web.py:51 umake/frameworks/web.py:120 msgid "Firefox Developer Edition" msgstr "Firefox Developer Edition" #: umake/frameworks/web.py:116 #, fuzzy msgid "Choose language: {}" msgstr "Bahasa Go" #: umake/frameworks/web.py:123 msgid "Firefox Aurora with Developer tools" msgstr "Firefox Aurora with Developer tools" #: umake/frameworks/web.py:129 msgid "Install in given language without prompting" msgstr "" #: umake/frameworks/web.py:141 umake/frameworks/web.py:226 msgid "Visual Studio focused on modern web and cloud" msgstr "" #: umake/frameworks/web.py:223 msgid "Visual Studio Code" msgstr "" #: umake/frameworks/games.py:42 msgid "Games Development Environment" msgstr "Lingkungan Pengembangan Game" #: umake/frameworks/games.py:48 msgid "Stencyl game developer IDE" msgstr "IDE untuk pengembangan game Stencyl" #: umake/frameworks/games.py:85 msgid "Stencyl" msgstr "Stencyl" #: umake/frameworks/games.py:114 msgid "Unity 3D Editor Linux experimental support" msgstr "" #: umake/frameworks/games.py:154 #, fuzzy msgid "Unity3D Editor" msgstr "Dart Editor" #: umake/frameworks/games.py:164 msgid "Twine tool for creating interactive and nonlinear stories" msgstr "" #: umake/frameworks/games.py:200 msgid "Twine" msgstr "" #: umake/interactions/__init__.py:73 msgid "No suitable answer provided" msgstr "Tak ada jawaban yang cocok" #: umake/interactions/__init__.py:75 umake/interactions/__init__.py:83 msgid "Your entry '{}' isn't an acceptable choice. choices are: {}" msgstr "" "Entri '{}' Anda bukanlah pilihan yang bisa diterima. pilihannya adalah: {}" #: umake/interactions/__init__.py:80 msgid "Your entry '{}' isn't an acceptable choice. choices are: {} and {}" msgstr "" "Entri '{}' Anda bukanlah pilihan yang bisa diterima. pilihannya adalah: {} " "dan {}" #: umake/interactions/__init__.py:100 msgid " ({})" msgstr " ({})" #: umake/interactions/__init__.py:104 msgid "" "{}\n" "[{}] " msgstr "" "{}\n" "[{}] " #: umake/interactions/__init__.py:107 msgid "{} [{}] " msgstr "{} [{}] " #: umake/interactions/__init__.py:115 msgid "I Accept" msgstr "Setuju" #: umake/interactions/__init__.py:115 msgid "a" msgstr "" #: umake/interactions/__init__.py:116 msgid "I don't accept" msgstr "Tidak setuju" #: umake/interactions/__init__.py:116 umake/interactions/__init__.py:149 msgid "N" msgstr "" #: umake/interactions/__init__.py:125 umake/interactions/__init__.py:126 msgid "{} ({})" msgstr "{} ({})" #: umake/interactions/__init__.py:129 msgid "[{}] " msgstr "[{}] " #: umake/interactions/__init__.py:148 msgid "Yes" msgstr "Ya" #: umake/interactions/__init__.py:148 msgid "y" msgstr "" #: umake/interactions/__init__.py:149 msgid "No" msgstr "Tidak" #~ msgid "Stencyl Game developer environment" #~ msgstr "Lingkungan pengembangan game Stencyl" #~ msgid "Dart Editor for the dart language" #~ msgstr "Dart Editor untuk bahasa Dart" ubuntu-make-18.09+disco1/po/it.po0000644000000000000000000002016513352651520013434 0ustar # Italian translation for ubuntu-make # Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014 # This file is distributed under the same license as the ubuntu-make package. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: ubuntu-make\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-11-17 09:26+0100\n" "PO-Revision-Date: 2015-09-29 08:08+0000\n" "Last-Translator: Francesco \n" "Language-Team: Italian \n" "Language: it\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-11-05 13:56+0000\n" "X-Generator: Launchpad (build 17838)\n" #: umake/tools.py:48 msgid "# Ubuntu make installation of {}\n" msgstr "# Ubuntu make installazione di {}\n" #: umake/__init__.py:99 msgid "* Command '{}':" msgstr "* Comando '{}'" #: umake/__init__.py:107 msgid "Deploy and setup developers environment easily on ubuntu" msgstr "Installa e configura facilmente un ambiente per sviluppatori su Ubuntu" #: umake/__init__.py:108 #, fuzzy msgid "" "Note that you can also configure different debug logging behavior using " "LOG_CFG that points to a log yaml profile." msgstr "" "Nota che è anche possibile configurare diversi schemi di debug utilizzando " "LOG_CFG puntando ad un profilo di log yaml." #: umake/__init__.py:111 msgid "Show this help" msgstr "Mostra questo aiuto" #: umake/__init__.py:112 msgid "Increase output verbosity (2 levels)" msgstr "Aumenta la verbosità dell'output (2 livelli)" #: umake/__init__.py:114 msgid "Remove specified framework if installed" msgstr "Rimuovi il framework specificato se installato" #: umake/__init__.py:116 msgid "Print version and exit" msgstr "" #: umake/frameworks/ide.py:63 msgid "Generic IDEs" msgstr "" #: umake/frameworks/ide.py:76 msgid "Pure Eclipse Luna (4.4)" msgstr "" #: umake/frameworks/ide.py:128 msgid "The Eclipse Luna Integrated Development Environment" msgstr "" #: umake/frameworks/ide.py:131 msgid "Eclipse Luna" msgstr "Eclipse Luna" #: umake/frameworks/ide.py:217 msgid "PyCharm Community Edition" msgstr "PyCharm Community Edition" #: umake/frameworks/ide.py:233 #, fuzzy msgid "PyCharm Educational Edition" msgstr "PyCharm Community Edition" #: umake/frameworks/ide.py:249 #, fuzzy msgid "PyCharm Professional Edition" msgstr "PyCharm Community Edition" #: umake/frameworks/ide.py:265 msgid "IntelliJ IDEA Community Edition" msgstr "IntelliJ IDEA Community Edition" #: umake/frameworks/ide.py:281 msgid "IntelliJ IDEA" msgstr "IntelliJ IDEA" #: umake/frameworks/ide.py:297 msgid "Ruby on Rails IDE" msgstr "" #: umake/frameworks/ide.py:314 msgid "Complex client-side and server-side javascript IDE" msgstr "" #: umake/frameworks/ide.py:331 msgid "PHP and web development IDE" msgstr "" #: umake/frameworks/ide.py:348 msgid "CLion integrated C/C++ IDE" msgstr "" #: umake/frameworks/ide.py:376 msgid "The Arduino Software Distribution" msgstr "" #: umake/frameworks/ide.py:475 msgid "The Arduino Software IDE" msgstr "" #: umake/frameworks/ide.py:478 msgid "Arduino" msgstr "" #: umake/frameworks/ide.py:484 msgid "You need to logout and login again for your installation to work" msgstr "" #: umake/frameworks/ide.py:504 umake/frameworks/ide.py:584 #: umake/frameworks/ide.py:587 msgid "Netbeans IDE" msgstr "" #: umake/frameworks/dart.py:43 msgid "Dartlang Development Environment" msgstr "" #: umake/frameworks/dart.py:49 msgid "Dart SDK with editor (not supported upstream anyymore)" msgstr "" #: umake/frameworks/dart.py:56 msgid "Dart SDK (default)" msgstr "" #: umake/frameworks/dart.py:97 umake/frameworks/rust.py:134 #: umake/frameworks/scala.py:66 umake/frameworks/go.py:76 #: umake/frameworks/android.py:135 msgid "" "You need to restart your current shell session for your {} installation to " "work properly" msgstr "" #: umake/frameworks/rust.py:43 msgid "Rust language" msgstr "" #: umake/frameworks/rust.py:56 msgid "The official Rust distribution" msgstr "" #: umake/frameworks/scala.py:40 msgid "The Scala Programming Language" msgstr "" #: umake/frameworks/scala.py:46 msgid "Scala compiler and interpreter (default)" msgstr "" #: umake/frameworks/go.py:39 msgid "Go language" msgstr "" #: umake/frameworks/go.py:46 msgid "Google compiler (default)" msgstr "" #: umake/frameworks/android.py:42 msgid "Android Development Environment" msgstr "Android Development Environment" #: umake/frameworks/android.py:80 msgid "Android Studio (default)" msgstr "" #: umake/frameworks/android.py:100 msgid "Android Studio" msgstr "Android Studio" #: umake/frameworks/android.py:103 msgid "Android Studio developer environment" msgstr "Ambiente di sviluppo Android Studio" #: umake/frameworks/android.py:111 #, fuzzy msgid "Android SDK" msgstr "Android NDK" #: umake/frameworks/android.py:147 msgid "Android NDK" msgstr "Android NDK" #: umake/frameworks/__init__.py:129 msgid "A default framework for category {} was requested where there is none" msgstr "" #: umake/frameworks/__init__.py:240 msgid "You can't install that framework on this machine" msgstr "" #: umake/frameworks/__init__.py:256 msgid "You can't remove {} as it isn't installed" msgstr "Non puoi rimuovere {} perchè non è installato" #: umake/frameworks/__init__.py:285 msgid "" "If the default framework name isn't provided, destdir should contain a /" msgstr "" "Se non viene fornito il nome predefinito del framework, destdir dovrebbe " "contenere /" #: umake/frameworks/__init__.py:288 msgid "Remove framework if installed" msgstr "RImuovi il framework se installato" #: umake/frameworks/__init__.py:291 msgid "Accept license without prompting" msgstr "" #: umake/frameworks/web.py:45 msgid "Web Developer Environment" msgstr "" #: umake/frameworks/web.py:51 umake/frameworks/web.py:120 msgid "Firefox Developer Edition" msgstr "" #: umake/frameworks/web.py:116 msgid "Choose language: {}" msgstr "" #: umake/frameworks/web.py:123 msgid "Firefox Aurora with Developer tools" msgstr "" #: umake/frameworks/web.py:129 msgid "Install in given language without prompting" msgstr "" #: umake/frameworks/web.py:141 umake/frameworks/web.py:226 msgid "Visual Studio focused on modern web and cloud" msgstr "" #: umake/frameworks/web.py:223 msgid "Visual Studio Code" msgstr "" #: umake/frameworks/games.py:42 msgid "Games Development Environment" msgstr "" #: umake/frameworks/games.py:48 msgid "Stencyl game developer IDE" msgstr "" #: umake/frameworks/games.py:85 msgid "Stencyl" msgstr "Stencyl" #: umake/frameworks/games.py:114 msgid "Unity 3D Editor Linux experimental support" msgstr "" #: umake/frameworks/games.py:154 msgid "Unity3D Editor" msgstr "" #: umake/frameworks/games.py:164 msgid "Twine tool for creating interactive and nonlinear stories" msgstr "" #: umake/frameworks/games.py:200 msgid "Twine" msgstr "" #: umake/interactions/__init__.py:73 msgid "No suitable answer provided" msgstr "Nessuna risposta adeguata fornita" #: umake/interactions/__init__.py:75 umake/interactions/__init__.py:83 msgid "Your entry '{}' isn't an acceptable choice. choices are: {}" msgstr "La tua scelta '{}' non è una scelta accettabile. Le scelte sono: {}" #: umake/interactions/__init__.py:80 msgid "Your entry '{}' isn't an acceptable choice. choices are: {} and {}" msgstr "" "La tua scelta '{}' non è una scelta accettabile. Le scelte sono: {} e {}" #: umake/interactions/__init__.py:100 msgid " ({})" msgstr " ({})" #: umake/interactions/__init__.py:104 msgid "" "{}\n" "[{}] " msgstr "" "{}\n" "[{}] " #: umake/interactions/__init__.py:107 msgid "{} [{}] " msgstr "{} [{}] " #: umake/interactions/__init__.py:115 msgid "I Accept" msgstr "Accetto" #: umake/interactions/__init__.py:115 msgid "a" msgstr "a" #: umake/interactions/__init__.py:116 msgid "I don't accept" msgstr "Non accetto" #: umake/interactions/__init__.py:116 umake/interactions/__init__.py:149 msgid "N" msgstr "N" #: umake/interactions/__init__.py:125 umake/interactions/__init__.py:126 msgid "{} ({})" msgstr "{} ({})" #: umake/interactions/__init__.py:129 msgid "[{}] " msgstr "[{}] " #: umake/interactions/__init__.py:148 msgid "Yes" msgstr "Sì" #: umake/interactions/__init__.py:148 msgid "y" msgstr "y" #: umake/interactions/__init__.py:149 msgid "No" msgstr "No" ubuntu-make-18.09+disco1/po/pl.po0000644000000000000000000002167713352651520013444 0ustar # Polish translation for ubuntu-make # Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014 # This file is distributed under the same license as the ubuntu-make package. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: ubuntu-make\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-11-17 09:26+0100\n" "PO-Revision-Date: 2015-10-22 17:29+0000\n" "Last-Translator: Bartek BudzyÅ„ski \n" "Language-Team: Polish \n" "Language: pl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-11-05 13:56+0000\n" "X-Generator: Launchpad (build 17838)\n" #: umake/tools.py:48 msgid "# Ubuntu make installation of {}\n" msgstr "# Instalacja {} przez Ubuntu make\n" #: umake/__init__.py:99 msgid "* Command '{}':" msgstr "* Komenda '{}':" #: umake/__init__.py:107 msgid "Deploy and setup developers environment easily on ubuntu" msgstr "Åatwo wdróż i skonfiguruj Å›rodowisko programistyczne na Ubuntu" #: umake/__init__.py:108 #, fuzzy msgid "" "Note that you can also configure different debug logging behavior using " "LOG_CFG that points to a log yaml profile." msgstr "" "Możesz również skonfigurować różne zachowania debug logów używajÄ…c LOG_CFG " "wskazujÄ…cych na profile logów yaml." #: umake/__init__.py:111 msgid "Show this help" msgstr "WyÅ›wietla tÄ™ pomoc" #: umake/__init__.py:112 msgid "Increase output verbosity (2 levels)" msgstr "ZwiÄ™ksz dokÅ‚adność wyniku (2 stopnie)" #: umake/__init__.py:114 msgid "Remove specified framework if installed" msgstr "UsuÅ„ wskazany framework, jeÅ›li jest zainstalowany" #: umake/__init__.py:116 msgid "Print version and exit" msgstr "" #: umake/frameworks/ide.py:63 msgid "Generic IDEs" msgstr "generalne zintegrowane Å›rodowiska programistyczne" #: umake/frameworks/ide.py:76 msgid "Pure Eclipse Luna (4.4)" msgstr "" #: umake/frameworks/ide.py:128 msgid "The Eclipse Luna Integrated Development Environment" msgstr "Zintegrowane Å›rodowisko programistyczne Eclipse Luna" #: umake/frameworks/ide.py:131 msgid "Eclipse Luna" msgstr "" #: umake/frameworks/ide.py:217 msgid "PyCharm Community Edition" msgstr "" #: umake/frameworks/ide.py:233 msgid "PyCharm Educational Edition" msgstr "" #: umake/frameworks/ide.py:249 msgid "PyCharm Professional Edition" msgstr "" #: umake/frameworks/ide.py:265 msgid "IntelliJ IDEA Community Edition" msgstr "" #: umake/frameworks/ide.py:281 msgid "IntelliJ IDEA" msgstr "" #: umake/frameworks/ide.py:297 msgid "Ruby on Rails IDE" msgstr "" #: umake/frameworks/ide.py:314 msgid "Complex client-side and server-side javascript IDE" msgstr "" #: umake/frameworks/ide.py:331 #, fuzzy msgid "PHP and web development IDE" msgstr "" "deweloperskie zintegrowane Å›rodowisko programistyczne gier komputerowych - " "Stencyl" #: umake/frameworks/ide.py:348 msgid "CLion integrated C/C++ IDE" msgstr "" #: umake/frameworks/ide.py:376 msgid "The Arduino Software Distribution" msgstr "" #: umake/frameworks/ide.py:475 msgid "The Arduino Software IDE" msgstr "" #: umake/frameworks/ide.py:478 msgid "Arduino" msgstr "" #: umake/frameworks/ide.py:484 #, fuzzy msgid "You need to logout and login again for your installation to work" msgstr "" "Musisz ponownie uruchomić sesjÄ™ powÅ‚oki do poprawnego dziaÅ‚ania instalacji" #: umake/frameworks/ide.py:504 umake/frameworks/ide.py:584 #: umake/frameworks/ide.py:587 msgid "Netbeans IDE" msgstr "" #: umake/frameworks/dart.py:43 msgid "Dartlang Development Environment" msgstr "" #: umake/frameworks/dart.py:49 #, fuzzy msgid "Dart SDK with editor (not supported upstream anyymore)" msgstr "Dart SDK z edytorem" #: umake/frameworks/dart.py:56 #, fuzzy msgid "Dart SDK (default)" msgstr "Dart SDK z edytorem" #: umake/frameworks/dart.py:97 umake/frameworks/rust.py:134 #: umake/frameworks/scala.py:66 umake/frameworks/go.py:76 #: umake/frameworks/android.py:135 #, fuzzy msgid "" "You need to restart your current shell session for your {} installation to " "work properly" msgstr "" "Musisz ponownie uruchomić sesjÄ™ powÅ‚oki do poprawnego dziaÅ‚ania instalacji" #: umake/frameworks/rust.py:43 #, fuzzy msgid "Rust language" msgstr "JÄ™zyk Go" #: umake/frameworks/rust.py:56 msgid "The official Rust distribution" msgstr "" #: umake/frameworks/scala.py:40 msgid "The Scala Programming Language" msgstr "" #: umake/frameworks/scala.py:46 #, fuzzy msgid "Scala compiler and interpreter (default)" msgstr "Kompilator Google (domyÅ›lnie)" #: umake/frameworks/go.py:39 msgid "Go language" msgstr "JÄ™zyk Go" #: umake/frameworks/go.py:46 msgid "Google compiler (default)" msgstr "Kompilator Google (domyÅ›lnie)" #: umake/frameworks/android.py:42 msgid "Android Development Environment" msgstr "Åšrodowisko Programistyczne Android" #: umake/frameworks/android.py:80 msgid "Android Studio (default)" msgstr "Android Studio (domyÅ›lnie)" #: umake/frameworks/android.py:100 msgid "Android Studio" msgstr "Android Studio" #: umake/frameworks/android.py:103 msgid "Android Studio developer environment" msgstr "Å›rodowisko programistyczne Android Studio" #: umake/frameworks/android.py:111 #, fuzzy msgid "Android SDK" msgstr "Android NDK" #: umake/frameworks/android.py:147 msgid "Android NDK" msgstr "Android NDK" #: umake/frameworks/__init__.py:129 msgid "A default framework for category {} was requested where there is none" msgstr "" #: umake/frameworks/__init__.py:240 msgid "You can't install that framework on this machine" msgstr "" #: umake/frameworks/__init__.py:256 msgid "You can't remove {} as it isn't installed" msgstr "Nie możesz usunąć {}, ponieważ nie jest zainstalowane" #: umake/frameworks/__init__.py:285 msgid "" "If the default framework name isn't provided, destdir should contain a /" msgstr "" "JeÅ›li nazwa domyÅ›lnego frameworka nie jest okreÅ›lona, destdir powinien " "zawierać a /" #: umake/frameworks/__init__.py:288 msgid "Remove framework if installed" msgstr "UsuÅ„ framework, jeÅ›li jest zainstalowany" #: umake/frameworks/__init__.py:291 msgid "Accept license without prompting" msgstr "" #: umake/frameworks/web.py:45 msgid "Web Developer Environment" msgstr "Internetowe Å›rodowisko deweloperskie" #: umake/frameworks/web.py:51 umake/frameworks/web.py:120 msgid "Firefox Developer Edition" msgstr "Deweloperska Edycja Firefox" #: umake/frameworks/web.py:116 #, fuzzy msgid "Choose language: {}" msgstr "JÄ™zyk Go" #: umake/frameworks/web.py:123 msgid "Firefox Aurora with Developer tools" msgstr "Firefox Aurora z narzÄ™dziami deweloperskimi" #: umake/frameworks/web.py:129 msgid "Install in given language without prompting" msgstr "" #: umake/frameworks/web.py:141 umake/frameworks/web.py:226 msgid "Visual Studio focused on modern web and cloud" msgstr "" #: umake/frameworks/web.py:223 msgid "Visual Studio Code" msgstr "" #: umake/frameworks/games.py:42 msgid "Games Development Environment" msgstr "Åšrodowiska Deweloperskie Gier Komputerowych" #: umake/frameworks/games.py:48 msgid "Stencyl game developer IDE" msgstr "" "deweloperskie zintegrowane Å›rodowisko programistyczne gier komputerowych - " "Stencyl" #: umake/frameworks/games.py:85 msgid "Stencyl" msgstr "Stencyl" #: umake/frameworks/games.py:114 msgid "Unity 3D Editor Linux experimental support" msgstr "" #: umake/frameworks/games.py:154 #, fuzzy msgid "Unity3D Editor" msgstr "Edytor Dart" #: umake/frameworks/games.py:164 msgid "Twine tool for creating interactive and nonlinear stories" msgstr "" #: umake/frameworks/games.py:200 msgid "Twine" msgstr "" #: umake/interactions/__init__.py:73 msgid "No suitable answer provided" msgstr "Nie podano wÅ‚aÅ›ciwej odpowiedzi" #: umake/interactions/__init__.py:75 umake/interactions/__init__.py:83 msgid "Your entry '{}' isn't an acceptable choice. choices are: {}" msgstr "Twój wybór '{}' nie jest dopuszczalny. Możliwe wybory to: {}" #: umake/interactions/__init__.py:80 msgid "Your entry '{}' isn't an acceptable choice. choices are: {} and {}" msgstr "Twój wybór '{}' nie jest dopuszczalny. Możliwe wybory to: {} i {}" #: umake/interactions/__init__.py:100 msgid " ({})" msgstr " ({})" #: umake/interactions/__init__.py:104 msgid "" "{}\n" "[{}] " msgstr "" "{}\n" "[{}] " #: umake/interactions/__init__.py:107 msgid "{} [{}] " msgstr "{} [{}] " #: umake/interactions/__init__.py:115 msgid "I Accept" msgstr "Zgadzam siÄ™" #: umake/interactions/__init__.py:115 msgid "a" msgstr "a" #: umake/interactions/__init__.py:116 msgid "I don't accept" msgstr "Nie zgadzam siÄ™" #: umake/interactions/__init__.py:116 umake/interactions/__init__.py:149 msgid "N" msgstr "N" #: umake/interactions/__init__.py:125 umake/interactions/__init__.py:126 msgid "{} ({})" msgstr "{} ({})" #: umake/interactions/__init__.py:129 msgid "[{}] " msgstr "[{}] " #: umake/interactions/__init__.py:148 msgid "Yes" msgstr "Tak" #: umake/interactions/__init__.py:148 msgid "y" msgstr "T" #: umake/interactions/__init__.py:149 msgid "No" msgstr "Nie" #~ msgid "Stencyl Game developer environment" #~ msgstr "Å›rodowisko deweloperskie gier komputerowych - Stencyl" ubuntu-make-18.09+disco1/po/pt_BR.po0000644000000000000000000002344613352651520014033 0ustar # Brazilian Portuguese translation for ubuntu-make # Copyright (c) 2015 Rosetta Contributors and Canonical Ltd 2015 # This file is distributed under the same license as the ubuntu-make package. # FIRST AUTHOR , 2015. # msgid "" msgstr "" "Project-Id-Version: ubuntu-make\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-11-17 09:26+0100\n" "PO-Revision-Date: 2015-07-13 13:02+0000\n" "Last-Translator: Renato Cruz \n" "Language-Team: Brazilian Portuguese \n" "Language: pt_BR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-11-05 13:56+0000\n" "X-Generator: Launchpad (build 17838)\n" #: umake/tools.py:48 msgid "# Ubuntu make installation of {}\n" msgstr "# Ubuntu make instalação de {}\n" #: umake/__init__.py:99 msgid "* Command '{}':" msgstr "* Comando '{}':" #: umake/__init__.py:107 msgid "Deploy and setup developers environment easily on ubuntu" msgstr "" "Instala e configura de maneira fácil um ambiente de desenvolvimento no Ubuntu" #: umake/__init__.py:108 #, fuzzy msgid "" "Note that you can also configure different debug logging behavior using " "LOG_CFG that points to a log yaml profile." msgstr "" "Note que você também pode configurar diferentes comportamentos para os logs " "de depuração usando LOG_CFG e apontando o log para o arquivo yaml." #: umake/__init__.py:111 msgid "Show this help" msgstr "Mostrar ajuda" #: umake/__init__.py:112 msgid "Increase output verbosity (2 levels)" msgstr "Aumenta a verbosidade da saída (2 níveis)" #: umake/__init__.py:114 msgid "Remove specified framework if installed" msgstr "Remove um determinado framework se estiver instalado" #: umake/__init__.py:116 msgid "Print version and exit" msgstr "Exibir versão e sair" #: umake/frameworks/ide.py:63 msgid "Generic IDEs" msgstr "IDEs genéricas" #: umake/frameworks/ide.py:76 msgid "Pure Eclipse Luna (4.4)" msgstr "Eclipse Luna (4.4) puro" #: umake/frameworks/ide.py:128 msgid "The Eclipse Luna Integrated Development Environment" msgstr "Ambiente de Desenvolvimento Integrado Eclipse Luna" #: umake/frameworks/ide.py:131 msgid "Eclipse Luna" msgstr "Eclipse Luna" #: umake/frameworks/ide.py:217 msgid "PyCharm Community Edition" msgstr "PyCharm Community Edition" #: umake/frameworks/ide.py:233 #, fuzzy msgid "PyCharm Educational Edition" msgstr "PyCharm Community Edition" #: umake/frameworks/ide.py:249 #, fuzzy msgid "PyCharm Professional Edition" msgstr "PyCharm Community Edition" #: umake/frameworks/ide.py:265 msgid "IntelliJ IDEA Community Edition" msgstr "IntelliJ IDEA Community Edition" #: umake/frameworks/ide.py:281 msgid "IntelliJ IDEA" msgstr "IntelliJ IDEA" #: umake/frameworks/ide.py:297 msgid "Ruby on Rails IDE" msgstr "Ruby on Rails IDE" #: umake/frameworks/ide.py:314 msgid "Complex client-side and server-side javascript IDE" msgstr "IDE Javascript lado cliente e lado servidor" #: umake/frameworks/ide.py:331 #, fuzzy msgid "PHP and web development IDE" msgstr "IDE PHP e desenvolvimento web" #: umake/frameworks/ide.py:348 msgid "CLion integrated C/C++ IDE" msgstr "IDE Clion integrado C/C++" #: umake/frameworks/ide.py:376 msgid "The Arduino Software Distribution" msgstr "Distribuição de software Arduino" #: umake/frameworks/ide.py:475 msgid "The Arduino Software IDE" msgstr "IDE Software Arduino" #: umake/frameworks/ide.py:478 msgid "Arduino" msgstr "Arduino" #: umake/frameworks/ide.py:484 #, fuzzy msgid "You need to logout and login again for your installation to work" msgstr "Você precisa reiniciar a sessão shell para que sua instalação funcione" #: umake/frameworks/ide.py:504 umake/frameworks/ide.py:584 #: umake/frameworks/ide.py:587 msgid "Netbeans IDE" msgstr "Netbeans IDE" #: umake/frameworks/dart.py:43 msgid "Dartlang Development Environment" msgstr "Ambiente de desenvolvimento Dartlang" #: umake/frameworks/dart.py:49 #, fuzzy msgid "Dart SDK with editor (not supported upstream anyymore)" msgstr "Dart SDK com editor (sem suporte upstream)" #: umake/frameworks/dart.py:56 #, fuzzy msgid "Dart SDK (default)" msgstr "Dart SDK com editor (padrão)" #: umake/frameworks/dart.py:97 umake/frameworks/rust.py:134 #: umake/frameworks/scala.py:66 umake/frameworks/go.py:76 #: umake/frameworks/android.py:135 #, fuzzy msgid "" "You need to restart your current shell session for your {} installation to " "work properly" msgstr "Você precisa reiniciar a sessão shell para que sua instalação funcione" #: umake/frameworks/rust.py:43 #, fuzzy msgid "Rust language" msgstr "Linguagem Go" #: umake/frameworks/rust.py:56 msgid "The official Rust distribution" msgstr "Distribuição official Rust" #: umake/frameworks/scala.py:40 msgid "The Scala Programming Language" msgstr "Linguagem de programação Scala" #: umake/frameworks/scala.py:46 #, fuzzy msgid "Scala compiler and interpreter (default)" msgstr "Compilador e interpretador Scala (padrão)" #: umake/frameworks/go.py:39 msgid "Go language" msgstr "Linguagem Go" #: umake/frameworks/go.py:46 msgid "Google compiler (default)" msgstr "Compilador Google (padrão)" #: umake/frameworks/android.py:42 msgid "Android Development Environment" msgstr "Ambiente de desenvolvimento Android" #: umake/frameworks/android.py:80 msgid "Android Studio (default)" msgstr "Android Studio (padrão)" #: umake/frameworks/android.py:100 msgid "Android Studio" msgstr "Android Studio" #: umake/frameworks/android.py:103 msgid "Android Studio developer environment" msgstr "Ambiente de desenvolvimento Android Studio" #: umake/frameworks/android.py:111 #, fuzzy msgid "Android SDK" msgstr "Android SDK" #: umake/frameworks/android.py:147 msgid "Android NDK" msgstr "Android NDK" #: umake/frameworks/__init__.py:129 msgid "A default framework for category {} was requested where there is none" msgstr "Um framework padrão é necessário para a categoria {} quando não existe nenhum" #: umake/frameworks/__init__.py:240 msgid "You can't install that framework on this machine" msgstr "Você não pode instalar esse framework neste computador" #: umake/frameworks/__init__.py:256 msgid "You can't remove {} as it isn't installed" msgstr "Você não pode remover {} porque ele não está instalado" #: umake/frameworks/__init__.py:285 msgid "" "If the default framework name isn't provided, destdir should contain a /" msgstr "" "Se o nome padrão do framework não for fornecido, o diretório de destino deve " "conter uma /" #: umake/frameworks/__init__.py:288 msgid "Remove framework if installed" msgstr "Remove o framework se estiver instalado" #: umake/frameworks/__init__.py:291 msgid "Accept license without prompting" msgstr "Aceitar licença sem avisos" #: umake/frameworks/web.py:45 msgid "Web Developer Environment" msgstr "Ambiente para desenvolvimento Web" #: umake/frameworks/web.py:51 umake/frameworks/web.py:120 msgid "Firefox Developer Edition" msgstr "Firefox Developer Edition" #: umake/frameworks/web.py:116 #, fuzzy msgid "Choose language: {}" msgstr "Escolha a linguagem: {}" #: umake/frameworks/web.py:123 msgid "Firefox Aurora with Developer tools" msgstr "Firefox Aurora com ferramentas para desenvolvedores" #: umake/frameworks/web.py:129 msgid "Install in given language without prompting" msgstr "Instalar em dada linguagem sem avisos" #: umake/frameworks/web.py:141 umake/frameworks/web.py:226 msgid "Visual Studio focused on modern web and cloud" msgstr "Visual Studio focado em web moderna e Cloud" #: umake/frameworks/web.py:223 msgid "Visual Studio Code" msgstr "Visual Studio Code" #: umake/frameworks/games.py:42 msgid "Games Development Environment" msgstr "Ambiente para desenvolvimento de jogos" #: umake/frameworks/games.py:48 msgid "Stencyl game developer IDE" msgstr "IDE Stencyl para desenvolvimento de jogos" #: umake/frameworks/games.py:85 msgid "Stencyl" msgstr "Stencyl" #: umake/frameworks/games.py:114 msgid "Unity 3D Editor Linux experimental support" msgstr "Unity 3D Editor Linux suporte experimental" #: umake/frameworks/games.py:154 #, fuzzy msgid "Unity3D Editor" msgstr "Editor Unity3D" #: umake/frameworks/games.py:164 msgid "Twine tool for creating interactive and nonlinear stories" msgstr "Ferramenta Twine para criar histórias interativas e não lineares" #: umake/frameworks/games.py:200 msgid "Twine" msgstr "Twine" #: umake/interactions/__init__.py:73 msgid "No suitable answer provided" msgstr "Não há resposta adequada" #: umake/interactions/__init__.py:75 umake/interactions/__init__.py:83 msgid "Your entry '{}' isn't an acceptable choice. choices are: {}" msgstr "A sua entrada '{}' não é uma opção aceitável, as opções são: {}" #: umake/interactions/__init__.py:80 msgid "Your entry '{}' isn't an acceptable choice. choices are: {} and {}" msgstr "A sua entrada '{}' não é uma opção aceitável, as opções são: {} e {}" #: umake/interactions/__init__.py:100 msgid " ({})" msgstr " ({})" #: umake/interactions/__init__.py:104 msgid "" "{}\n" "[{}] " msgstr "" "{}\n" "[{}] " #: umake/interactions/__init__.py:107 msgid "{} [{}] " msgstr "{}[{}] " #: umake/interactions/__init__.py:115 msgid "I Accept" msgstr "Eu aceito" #: umake/interactions/__init__.py:115 msgid "a" msgstr "a" #: umake/interactions/__init__.py:116 msgid "I don't accept" msgstr "Eu não aceito" #: umake/interactions/__init__.py:116 umake/interactions/__init__.py:149 msgid "N" msgstr "N" #: umake/interactions/__init__.py:125 umake/interactions/__init__.py:126 msgid "{} ({})" msgstr "{}({})" #: umake/interactions/__init__.py:129 msgid "[{}] " msgstr "[{}] " #: umake/interactions/__init__.py:148 msgid "Yes" msgstr "Sim" #: umake/interactions/__init__.py:148 msgid "y" msgstr "s" #: umake/interactions/__init__.py:149 msgid "No" msgstr "Não" #~ msgid "Stencyl Game developer environment" #~ msgstr "Ambiente para desenvolvimento de jogos Stencyl" #~ msgid "Dart Editor for the dart language" #~ msgstr "Editor Dart para a linguagem dart" ubuntu-make-18.09+disco1/po/ru.po0000644000000000000000000002666213352651520013456 0ustar # Russian translation for ubuntu-make # Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014 # This file is distributed under the same license as the ubuntu-make package. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: ubuntu-make\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-11-17 09:26+0100\n" "PO-Revision-Date: 2015-11-17 21:34+0300\n" "Last-Translator: Eldar Khayrullin \n" "Language-Team: Russian \n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-11-05 13:56+0000\n" "X-Generator: Poedit 1.7.7\n" #: umake/tools.py:48 msgid "# Ubuntu make installation of {}\n" msgstr "# Ubuntu make уÑтановка {}\n" #: umake/__init__.py:99 msgid "* Command '{}':" msgstr "* Команда '{}':" #: umake/__init__.py:107 msgid "Deploy and setup developers environment easily on ubuntu" msgstr "Легкое развертывание и уÑтановка Ñреды разработчика на ubuntu" #: umake/__init__.py:108 msgid "" "Note that you can also configure different debug logging behavior using " "LOG_CFG that points to a log yaml profile." msgstr "" "Обратите внимание, что вы также можете наÑтроить различное поведение Ð²ÐµÐ´ÐµÐ½Ð¸Ñ " "журнала отладки иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ LOG_CFG, который указывает на профиль журнала yaml." #: umake/__init__.py:111 msgid "Show this help" msgstr "Показать Ñту Ñправку" #: umake/__init__.py:112 msgid "Increase output verbosity (2 levels)" msgstr "Увеличить многоÑловноÑть выхода (2 уровнÑ)" #: umake/__init__.py:114 msgid "Remove specified framework if installed" msgstr "Удалить указанную Ñреду, еÑли она уÑтановлена" #: umake/__init__.py:116 msgid "Print version and exit" msgstr "Ðапечатать верÑию и выйти" #: umake/frameworks/ide.py:63 msgid "Generic IDEs" msgstr "Общие интегрированные Ñреды разработки" #: umake/frameworks/ide.py:76 msgid "Pure Eclipse Luna (4.4)" msgstr "ЧиÑтый Eclipse Luna (4.4)" #: umake/frameworks/ide.py:128 msgid "The Eclipse Luna Integrated Development Environment" msgstr "Ð˜Ð½Ñ‚ÐµÐ³Ñ€Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð½Ð°Ñ Ñреда разработки Eclipse Luna" #: umake/frameworks/ide.py:131 msgid "Eclipse Luna" msgstr "Eclipse Luna" #: umake/frameworks/ide.py:217 msgid "PyCharm Community Edition" msgstr "PyCharm ОбщеÑÑ‚Ð²ÐµÐ½Ð½Ð°Ñ Ð²ÐµÑ€ÑиÑ" #: umake/frameworks/ide.py:233 msgid "PyCharm Educational Edition" msgstr "PyCharm Ð£Ñ‡ÐµÐ±Ð½Ð°Ñ Ð²ÐµÑ€ÑиÑ" #: umake/frameworks/ide.py:249 msgid "PyCharm Professional Edition" msgstr "PyCharm ПрофеÑÑÐ¸Ð¾Ð½Ð°Ð»ÑŒÐ½Ð°Ñ Ð²ÐµÑ€ÑиÑ" #: umake/frameworks/ide.py:265 msgid "IntelliJ IDEA Community Edition" msgstr "IntelliJ IDEA ОбщеÑÑ‚Ð²ÐµÐ½Ð½Ð°Ñ Ð²ÐµÑ€ÑиÑ" #: umake/frameworks/ide.py:281 msgid "IntelliJ IDEA" msgstr "IntelliJ IDEA" #: umake/frameworks/ide.py:297 msgid "Ruby on Rails IDE" msgstr "Ruby в интегрированной Ñреде разработки Rails" #: umake/frameworks/ide.py:314 msgid "Complex client-side and server-side javascript IDE" msgstr "" "ÐŸÐ¾Ð»Ð½Ð°Ñ ÐºÐ»Ð¸ÐµÐ½Ñ‚ÑÐºÐ°Ñ Ð¸ ÑÐµÑ€Ð²ÐµÑ€Ð½Ð°Ñ Ð¸Ð½Ñ‚ÐµÐ³Ñ€Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð½Ð°Ñ Ñреда разработки javascript" #: umake/frameworks/ide.py:331 msgid "PHP and web development IDE" msgstr "Ð˜Ð½Ñ‚ÐµÐ³Ñ€Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð½Ð°Ñ Ñреда разработки PHP и веб" #: umake/frameworks/ide.py:348 msgid "CLion integrated C/C++ IDE" msgstr "Ð˜Ð½Ñ‚ÐµÐ³Ñ€Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð½Ð°Ñ Ñреда разработки CLion Ñзыка C/C++" #: umake/frameworks/ide.py:376 msgid "The Arduino Software Distribution" msgstr "РаÑпроÑтранение ПО Arduino" #: umake/frameworks/ide.py:475 msgid "The Arduino Software IDE" msgstr "Ð˜Ð½Ñ‚ÐµÐ³Ñ€Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð½Ð°Ñ Ñреда разработки ПО Arduino" #: umake/frameworks/ide.py:478 msgid "Arduino" msgstr "Arduino" #: umake/frameworks/ide.py:484 msgid "You need to logout and login again for your installation to work" msgstr "Вам нужно завершить ÑÐµÐ°Ð½Ñ Ð¸ войти Ñнова Ð´Ð»Ñ ÑƒÑтановки к работе" #: umake/frameworks/ide.py:504 umake/frameworks/ide.py:584 #: umake/frameworks/ide.py:587 msgid "Netbeans IDE" msgstr "Ð˜Ð½Ñ‚ÐµÐ³Ñ€Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð½Ð°Ñ Ñреда разработки Netbeans" #: umake/frameworks/dart.py:43 msgid "Dartlang Development Environment" msgstr "Среда разработки Dartlang" #: umake/frameworks/dart.py:49 msgid "Dart SDK with editor (not supported upstream anyymore)" msgstr "" "Комплект ÑредÑтв разработки Dart Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¾Ñ€Ð¾Ð¼ (больше не поддерживаетÑÑ)" #: umake/frameworks/dart.py:56 msgid "Dart SDK (default)" msgstr "Комплект ÑредÑтв разработки Dart" #: umake/frameworks/dart.py:97 umake/frameworks/rust.py:134 #: umake/frameworks/scala.py:66 umake/frameworks/go.py:76 #: umake/frameworks/android.py:135 msgid "" "You need to restart your current shell session for your {} installation to " "work properly" msgstr "" "Вам нужно перезапуÑтить вашу текущую ÑеÑÑию оболочки Ð´Ð»Ñ ÑƒÑтановки {} к " "работе правильно" #: umake/frameworks/rust.py:43 msgid "Rust language" msgstr "Язык Rust" #: umake/frameworks/rust.py:56 msgid "The official Rust distribution" msgstr "ÐžÑ„Ð¸Ñ†Ð¸Ð°Ð»ÑŒÐ½Ð°Ñ Ð¿Ð¾Ñтавка Rust" #: umake/frameworks/scala.py:40 msgid "The Scala Programming Language" msgstr "Язык Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Scala" #: umake/frameworks/scala.py:46 msgid "Scala compiler and interpreter (default)" msgstr "КомпилÑтор и интерпретатор Scala (по умолчанию)" #: umake/frameworks/go.py:39 msgid "Go language" msgstr "Язык Go" #: umake/frameworks/go.py:46 msgid "Google compiler (default)" msgstr "КомпилÑтор Google (по умолчанию)" #: umake/frameworks/android.py:42 msgid "Android Development Environment" msgstr "Среда разработки Android" #: umake/frameworks/android.py:80 msgid "Android Studio (default)" msgstr "Android Studio (по умолчанию)" #: umake/frameworks/android.py:100 msgid "Android Studio" msgstr "Android Studio" #: umake/frameworks/android.py:103 msgid "Android Studio developer environment" msgstr "Среда разработки Android Studio" #: umake/frameworks/android.py:111 msgid "Android SDK" msgstr "Комплект ÑредÑтв разработки Android" #: umake/frameworks/android.py:147 msgid "Android NDK" msgstr "Родной комплект разработки Android" #: umake/frameworks/__init__.py:129 msgid "A default framework for category {} was requested where there is none" msgstr "Среда по умолчанию Ð´Ð»Ñ ÐºÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ð¸Ð¸ {} была запрошена там где ее нет" #: umake/frameworks/__init__.py:240 msgid "You can't install that framework on this machine" msgstr "Ð’Ñ‹ не можете уÑтановить Ñту Ñреду на Ñтой машине" #: umake/frameworks/__init__.py:256 msgid "You can't remove {} as it isn't installed" msgstr "Ð’Ñ‹ не можете удалить {}, поÑкольку он не уÑтановлен" #: umake/frameworks/__init__.py:285 msgid "" "If the default framework name isn't provided, destdir should contain a /" msgstr "" "ЕÑли Ð¸Ð¼Ñ Ñреды по умолчанию не предуÑмотрено, Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ð° " "Ñодержать /" #: umake/frameworks/__init__.py:288 msgid "Remove framework if installed" msgstr "Удалить Ñреду, еÑли уÑтановлена" #: umake/frameworks/__init__.py:291 msgid "Accept license without prompting" msgstr "ПринÑть лицензию без запроÑа" #: umake/frameworks/web.py:45 msgid "Web Developer Environment" msgstr "Веб Ñреда разработки" #: umake/frameworks/web.py:51 umake/frameworks/web.py:120 msgid "Firefox Developer Edition" msgstr "Firefox ВерÑÐ¸Ñ Ñ€Ð°Ð·Ñ€Ð°Ð±Ð¾Ñ‚Ñ‡Ð¸ÐºÐ°" #: umake/frameworks/web.py:116 msgid "Choose language: {}" msgstr "Выбрать Ñзык: {}" #: umake/frameworks/web.py:123 msgid "Firefox Aurora with Developer tools" msgstr "Firefox Aurora Ñ Ð¸Ð½Ñтрументами разработчика" #: umake/frameworks/web.py:129 msgid "Install in given language without prompting" msgstr "УÑтановить в данном Ñзыке без запроÑа" #: umake/frameworks/web.py:141 umake/frameworks/web.py:226 msgid "Visual Studio focused on modern web and cloud" msgstr "" "Visual Studio фокуÑируетÑÑ Ð½Ð° разработке Ñовременных веб и облачных " "приложений" #: umake/frameworks/web.py:223 msgid "Visual Studio Code" msgstr "Visual Studio Code" #: umake/frameworks/games.py:42 msgid "Games Development Environment" msgstr "Окружение разработки игр" #: umake/frameworks/games.py:48 msgid "Stencyl game developer IDE" msgstr "Ð˜Ð½Ñ‚ÐµÐ³Ñ€Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð½Ð°Ñ Ñреда разработки разработчика игр Stencyl" #: umake/frameworks/games.py:85 msgid "Stencyl" msgstr "Stencyl" #: umake/frameworks/games.py:114 msgid "Unity 3D Editor Linux experimental support" msgstr "Unity 3D Editor Linux ÑкÑÐ¿ÐµÑ€Ð¸Ð¼ÐµÐ½Ñ‚Ð°Ð»ÑŒÐ½Ð°Ñ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶ÐºÐ°" #: umake/frameworks/games.py:154 msgid "Unity3D Editor" msgstr "Редактор Unity3D" #: umake/frameworks/games.py:164 msgid "Twine tool for creating interactive and nonlinear stories" msgstr "ИнÑтрумент Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¸Ð½Ñ‚ÐµÑ€Ð°ÐºÑ‚Ð¸Ð²Ð½Ñ‹Ñ… и нелинейных иÑторий Twine" #: umake/frameworks/games.py:200 msgid "Twine" msgstr "Twine" #: umake/interactions/__init__.py:73 msgid "No suitable answer provided" msgstr "Ðе указано приемлемого ответа" #: umake/interactions/__init__.py:75 umake/interactions/__init__.py:83 msgid "Your entry '{}' isn't an acceptable choice. choices are: {}" msgstr "Ваш запиÑÑŒ '{}' не ÑвлÑетÑÑ Ð¿Ñ€Ð¸ÐµÐ¼Ð»ÐµÐ¼Ñ‹Ð¼ выбором. возможные варианты: {}" #: umake/interactions/__init__.py:80 msgid "Your entry '{}' isn't an acceptable choice. choices are: {} and {}" msgstr "" "Ваш запиÑÑŒ '{}' не ÑвлÑетÑÑ Ð¿Ñ€Ð¸ÐµÐ¼Ð»ÐµÐ¼Ñ‹Ð¼ выбором. возможные варианты: {} и {}" #: umake/interactions/__init__.py:100 msgid " ({})" msgstr " ({})" #: umake/interactions/__init__.py:104 msgid "" "{}\n" "[{}] " msgstr "" "{}\n" "[{}] " #: umake/interactions/__init__.py:107 msgid "{} [{}] " msgstr "{} [{}] " #: umake/interactions/__init__.py:115 msgid "I Accept" msgstr "Я принимаю" #: umake/interactions/__init__.py:115 msgid "a" msgstr "п" #: umake/interactions/__init__.py:116 msgid "I don't accept" msgstr "Я не принимаю" #: umake/interactions/__init__.py:116 umake/interactions/__init__.py:149 msgid "N" msgstr "Ð" #: umake/interactions/__init__.py:125 umake/interactions/__init__.py:126 msgid "{} ({})" msgstr "{} ({})" #: umake/interactions/__init__.py:129 msgid "[{}] " msgstr "[{}] " #: umake/interactions/__init__.py:148 msgid "Yes" msgstr "Да" #: umake/interactions/__init__.py:148 msgid "y" msgstr "д" #: umake/interactions/__init__.py:149 msgid "No" msgstr "Ðет" ubuntu-make-18.09+disco1/po/sv.po0000644000000000000000000001722213352651520013450 0ustar # Swedish translation for ubuntu-make # Copyright (c) 2015 Rosetta Contributors and Canonical Ltd 2015 # This file is distributed under the same license as the ubuntu-make package. # FIRST AUTHOR , 2015. # msgid "" msgstr "" "Project-Id-Version: ubuntu-make\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-11-17 09:26+0100\n" "PO-Revision-Date: 2015-05-02 09:00+0000\n" "Last-Translator: Lars Nyström \n" "Language-Team: Swedish \n" "Language: sv\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-05-04 07:08+0000\n" "X-Generator: Launchpad (build 17474)\n" #: umake/tools.py:48 msgid "# Ubuntu make installation of {}\n" msgstr "" #: umake/__init__.py:99 msgid "* Command '{}':" msgstr "" #: umake/__init__.py:107 msgid "Deploy and setup developers environment easily on ubuntu" msgstr "Installera och konfigurera utvecklares arbetsmiljö enkelt pÃ¥ Ubuntu" #: umake/__init__.py:108 msgid "" "Note that you can also configure different debug logging behavior using " "LOG_CFG that points to a log yaml profile." msgstr "" #: umake/__init__.py:111 msgid "Show this help" msgstr "Visa denna hjälptext" #: umake/__init__.py:112 msgid "Increase output verbosity (2 levels)" msgstr "" #: umake/__init__.py:114 msgid "Remove specified framework if installed" msgstr "Avinstallera givet ramverk om det är installerat" #: umake/__init__.py:116 msgid "Print version and exit" msgstr "" #: umake/frameworks/ide.py:63 msgid "Generic IDEs" msgstr "Allmänna utvecklingsmiljöer" #: umake/frameworks/ide.py:76 msgid "Pure Eclipse Luna (4.4)" msgstr "" #: umake/frameworks/ide.py:128 msgid "The Eclipse Luna Integrated Development Environment" msgstr "" #: umake/frameworks/ide.py:131 msgid "Eclipse Luna" msgstr "" #: umake/frameworks/ide.py:217 msgid "PyCharm Community Edition" msgstr "" #: umake/frameworks/ide.py:233 msgid "PyCharm Educational Edition" msgstr "" #: umake/frameworks/ide.py:249 msgid "PyCharm Professional Edition" msgstr "" #: umake/frameworks/ide.py:265 msgid "IntelliJ IDEA Community Edition" msgstr "" #: umake/frameworks/ide.py:281 msgid "IntelliJ IDEA" msgstr "" #: umake/frameworks/ide.py:297 msgid "Ruby on Rails IDE" msgstr "" #: umake/frameworks/ide.py:314 msgid "Complex client-side and server-side javascript IDE" msgstr "" #: umake/frameworks/ide.py:331 #, fuzzy msgid "PHP and web development IDE" msgstr "Stencyl spelutvecklingsmiljö" #: umake/frameworks/ide.py:348 msgid "CLion integrated C/C++ IDE" msgstr "" #: umake/frameworks/ide.py:376 msgid "The Arduino Software Distribution" msgstr "" #: umake/frameworks/ide.py:475 msgid "The Arduino Software IDE" msgstr "" #: umake/frameworks/ide.py:478 msgid "Arduino" msgstr "" #: umake/frameworks/ide.py:484 msgid "You need to logout and login again for your installation to work" msgstr "" #: umake/frameworks/ide.py:504 umake/frameworks/ide.py:584 #: umake/frameworks/ide.py:587 msgid "Netbeans IDE" msgstr "" #: umake/frameworks/dart.py:43 msgid "Dartlang Development Environment" msgstr "" #: umake/frameworks/dart.py:49 msgid "Dart SDK with editor (not supported upstream anyymore)" msgstr "" #: umake/frameworks/dart.py:56 msgid "Dart SDK (default)" msgstr "" #: umake/frameworks/dart.py:97 umake/frameworks/rust.py:134 #: umake/frameworks/scala.py:66 umake/frameworks/go.py:76 #: umake/frameworks/android.py:135 msgid "" "You need to restart your current shell session for your {} installation to " "work properly" msgstr "" #: umake/frameworks/rust.py:43 msgid "Rust language" msgstr "" #: umake/frameworks/rust.py:56 msgid "The official Rust distribution" msgstr "" #: umake/frameworks/scala.py:40 msgid "The Scala Programming Language" msgstr "" #: umake/frameworks/scala.py:46 msgid "Scala compiler and interpreter (default)" msgstr "" #: umake/frameworks/go.py:39 msgid "Go language" msgstr "" #: umake/frameworks/go.py:46 msgid "Google compiler (default)" msgstr "" #: umake/frameworks/android.py:42 msgid "Android Development Environment" msgstr "" #: umake/frameworks/android.py:80 msgid "Android Studio (default)" msgstr "" #: umake/frameworks/android.py:100 msgid "Android Studio" msgstr "" #: umake/frameworks/android.py:103 msgid "Android Studio developer environment" msgstr "" #: umake/frameworks/android.py:111 msgid "Android SDK" msgstr "" #: umake/frameworks/android.py:147 msgid "Android NDK" msgstr "" #: umake/frameworks/__init__.py:129 msgid "A default framework for category {} was requested where there is none" msgstr "" #: umake/frameworks/__init__.py:240 msgid "You can't install that framework on this machine" msgstr "" #: umake/frameworks/__init__.py:256 msgid "You can't remove {} as it isn't installed" msgstr "Du kan inte avinstallera {} eftersom det inte är installerat" #: umake/frameworks/__init__.py:285 msgid "" "If the default framework name isn't provided, destdir should contain a /" msgstr "" #: umake/frameworks/__init__.py:288 msgid "Remove framework if installed" msgstr "Avinstallera ramverket om det är installerat" #: umake/frameworks/__init__.py:291 msgid "Accept license without prompting" msgstr "" #: umake/frameworks/web.py:45 msgid "Web Developer Environment" msgstr "" #: umake/frameworks/web.py:51 umake/frameworks/web.py:120 msgid "Firefox Developer Edition" msgstr "" #: umake/frameworks/web.py:116 msgid "Choose language: {}" msgstr "" #: umake/frameworks/web.py:123 msgid "Firefox Aurora with Developer tools" msgstr "" #: umake/frameworks/web.py:129 msgid "Install in given language without prompting" msgstr "" #: umake/frameworks/web.py:141 umake/frameworks/web.py:226 msgid "Visual Studio focused on modern web and cloud" msgstr "" #: umake/frameworks/web.py:223 msgid "Visual Studio Code" msgstr "" #: umake/frameworks/games.py:42 msgid "Games Development Environment" msgstr "Spelutvecklingsmiljö" #: umake/frameworks/games.py:48 msgid "Stencyl game developer IDE" msgstr "Stencyl spelutvecklingsmiljö" #: umake/frameworks/games.py:85 msgid "Stencyl" msgstr "Stencyl" #: umake/frameworks/games.py:114 msgid "Unity 3D Editor Linux experimental support" msgstr "" #: umake/frameworks/games.py:154 msgid "Unity3D Editor" msgstr "" #: umake/frameworks/games.py:164 msgid "Twine tool for creating interactive and nonlinear stories" msgstr "" #: umake/frameworks/games.py:200 msgid "Twine" msgstr "" #: umake/interactions/__init__.py:73 msgid "No suitable answer provided" msgstr "Inget lämpligt svar angivet" #: umake/interactions/__init__.py:75 umake/interactions/__init__.py:83 msgid "Your entry '{}' isn't an acceptable choice. choices are: {}" msgstr "" #: umake/interactions/__init__.py:80 msgid "Your entry '{}' isn't an acceptable choice. choices are: {} and {}" msgstr "" #: umake/interactions/__init__.py:100 msgid " ({})" msgstr " ({})" #: umake/interactions/__init__.py:104 msgid "" "{}\n" "[{}] " msgstr "" "{}\n" "[{}] " #: umake/interactions/__init__.py:107 msgid "{} [{}] " msgstr "{} [{}] " #: umake/interactions/__init__.py:115 msgid "I Accept" msgstr "Jag godkänner" #: umake/interactions/__init__.py:115 msgid "a" msgstr "a" #: umake/interactions/__init__.py:116 msgid "I don't accept" msgstr "Jag godkänner inte" #: umake/interactions/__init__.py:116 umake/interactions/__init__.py:149 msgid "N" msgstr "N" #: umake/interactions/__init__.py:125 umake/interactions/__init__.py:126 msgid "{} ({})" msgstr "{} ({})" #: umake/interactions/__init__.py:129 msgid "[{}] " msgstr "[{}] " #: umake/interactions/__init__.py:148 msgid "Yes" msgstr "Ja" #: umake/interactions/__init__.py:148 msgid "y" msgstr "j" #: umake/interactions/__init__.py:149 msgid "No" msgstr "Nej" #~ msgid "Stencyl Game developer environment" #~ msgstr "Stencyl spelutvecklingsmiljö" ubuntu-make-18.09+disco1/po/te.po0000644000000000000000000002166713352651520013440 0ustar # Telugu translation for ubuntu-make # Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014 # This file is distributed under the same license as the ubuntu-make package. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: ubuntu-make\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-11-17 09:26+0100\n" "PO-Revision-Date: 2014-12-09 13:12+0000\n" "Last-Translator: Didier Roche \n" "Language-Team: Telugu \n" "Language: te\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-11-05 13:56+0000\n" "X-Generator: Launchpad (build 17838)\n" #: umake/tools.py:48 msgid "# Ubuntu make installation of {}\n" msgstr "# {} యొకà±à°• Ubuntu make ఇనà±à°¸à±à°Ÿà°¾à°²à±‡à°·à°¨à±\n" #: umake/__init__.py:99 msgid "* Command '{}':" msgstr "* ఆదేశం '{}':" #: umake/__init__.py:107 msgid "Deploy and setup developers environment easily on ubuntu" msgstr "à°¸à±à°²à°­à°‚à°—à°¾ డెవలపరà±à°² à°Žà°¨à±à°µà°¿à°°à°¾à°¨à±â€Œà°®à±†à°‚à°Ÿà±â€Œà°¨à°¿ సెటపౠచెయà±à°¯à°¿" #: umake/__init__.py:108 #, fuzzy msgid "" "Note that you can also configure different debug logging behavior using " "LOG_CFG that points to a log yaml profile." msgstr "" "LOG_CFG ని à°à°¦à±ˆà°¨à°¾ à°’à°• yaml à°ªà±à°°à±Šà°«à±ˆà°²à±â€Œà°¨à°¿ సూచించేటటà±à°Ÿà± చేయడం à°¦à±à°µà°¾à°°à°¾ డీబగà±à°—ింగౠలాగà±â€Œà°² పని విధానానà±à°¨à°¿ మారà±à°šà°µà°šà±à°šà±" #: umake/__init__.py:111 msgid "Show this help" msgstr "à°ˆ సహాయానà±à°¨à°¿ చూపించà±" #: umake/__init__.py:112 msgid "Increase output verbosity (2 levels)" msgstr "à°Žà°•à±à°•à±à°µ సమాచారానà±à°¨à°¿ చూపించౠ(రెండౠరెటà±à°²à±)" #: umake/__init__.py:114 msgid "Remove specified framework if installed" msgstr "à°«à±à°°à±‡à°®à±â€Œà°µà°°à±à°•ౠఇనà±à°¸à±à°Ÿà°¾à°²à± అయి à°µà±à°‚టే తొలగించండి" #: umake/__init__.py:116 msgid "Print version and exit" msgstr "" #: umake/frameworks/ide.py:63 msgid "Generic IDEs" msgstr "" #: umake/frameworks/ide.py:76 msgid "Pure Eclipse Luna (4.4)" msgstr "" #: umake/frameworks/ide.py:128 msgid "The Eclipse Luna Integrated Development Environment" msgstr "" #: umake/frameworks/ide.py:131 msgid "Eclipse Luna" msgstr "" #: umake/frameworks/ide.py:217 msgid "PyCharm Community Edition" msgstr "" #: umake/frameworks/ide.py:233 msgid "PyCharm Educational Edition" msgstr "" #: umake/frameworks/ide.py:249 msgid "PyCharm Professional Edition" msgstr "" #: umake/frameworks/ide.py:265 msgid "IntelliJ IDEA Community Edition" msgstr "" #: umake/frameworks/ide.py:281 msgid "IntelliJ IDEA" msgstr "" #: umake/frameworks/ide.py:297 msgid "Ruby on Rails IDE" msgstr "" #: umake/frameworks/ide.py:314 msgid "Complex client-side and server-side javascript IDE" msgstr "" #: umake/frameworks/ide.py:331 msgid "PHP and web development IDE" msgstr "" #: umake/frameworks/ide.py:348 msgid "CLion integrated C/C++ IDE" msgstr "" #: umake/frameworks/ide.py:376 msgid "The Arduino Software Distribution" msgstr "" #: umake/frameworks/ide.py:475 msgid "The Arduino Software IDE" msgstr "" #: umake/frameworks/ide.py:478 msgid "Arduino" msgstr "" #: umake/frameworks/ide.py:484 msgid "You need to logout and login again for your installation to work" msgstr "" #: umake/frameworks/ide.py:504 umake/frameworks/ide.py:584 #: umake/frameworks/ide.py:587 msgid "Netbeans IDE" msgstr "" #: umake/frameworks/dart.py:43 msgid "Dartlang Development Environment" msgstr "" #: umake/frameworks/dart.py:49 msgid "Dart SDK with editor (not supported upstream anyymore)" msgstr "" #: umake/frameworks/dart.py:56 msgid "Dart SDK (default)" msgstr "" #: umake/frameworks/dart.py:97 umake/frameworks/rust.py:134 #: umake/frameworks/scala.py:66 umake/frameworks/go.py:76 #: umake/frameworks/android.py:135 msgid "" "You need to restart your current shell session for your {} installation to " "work properly" msgstr "" #: umake/frameworks/rust.py:43 msgid "Rust language" msgstr "" #: umake/frameworks/rust.py:56 msgid "The official Rust distribution" msgstr "" #: umake/frameworks/scala.py:40 msgid "The Scala Programming Language" msgstr "" #: umake/frameworks/scala.py:46 msgid "Scala compiler and interpreter (default)" msgstr "" #: umake/frameworks/go.py:39 msgid "Go language" msgstr "" #: umake/frameworks/go.py:46 msgid "Google compiler (default)" msgstr "" #: umake/frameworks/android.py:42 msgid "Android Development Environment" msgstr "ఆండà±à°°à°¾à°¯à°¿à°¡à± డెవలెపà±â€Œà°®à±†à°‚à°Ÿà± à°Žà°¨à±à°µà°¿à°°à°¾à°¨à±â€Œà°®à±†à°‚à°Ÿà±" #: umake/frameworks/android.py:80 msgid "Android Studio (default)" msgstr "" #: umake/frameworks/android.py:100 msgid "Android Studio" msgstr "ఆండà±à°°à°¾à°¯à°¿à°¡à± à°¸à±à°Ÿà±à°¯à±‚యో" #: umake/frameworks/android.py:103 msgid "Android Studio developer environment" msgstr "ఆండà±à°°à°¾à°¯à°¿à°¡à± à°¸à±à°¤à±‚డియో డెవలపరౠఎనà±à°µà°¿à°°à°¾à°¨à±â€Œà°®à±†à°‚à°Ÿà±" #: umake/frameworks/android.py:111 #, fuzzy msgid "Android SDK" msgstr "ఆండà±à°°à°¾à°¯à°¿à°¡à± à°¸à±à°Ÿà±à°¯à±‚యో" #: umake/frameworks/android.py:147 msgid "Android NDK" msgstr "" #: umake/frameworks/__init__.py:129 msgid "A default framework for category {} was requested where there is none" msgstr "" #: umake/frameworks/__init__.py:240 msgid "You can't install that framework on this machine" msgstr "" #: umake/frameworks/__init__.py:256 msgid "You can't remove {} as it isn't installed" msgstr "{} ఇనà±à°¸à±à°Ÿà°¾à°²à± అయి లేదౠకాబటà±à°Ÿà°¿ దానిని తొలగించలేమà±" #: umake/frameworks/__init__.py:285 msgid "" "If the default framework name isn't provided, destdir should contain a /" msgstr "" #: umake/frameworks/__init__.py:288 msgid "Remove framework if installed" msgstr "à°«à±à°°à±‡à°®à±â€Œà°µà°°à±à°•ౠఇనà±à°¸à±à°Ÿà°¾à°²à± అయి à°µà±à°‚టే దానిని తొలగించà±" #: umake/frameworks/__init__.py:291 msgid "Accept license without prompting" msgstr "" #: umake/frameworks/web.py:45 msgid "Web Developer Environment" msgstr "" #: umake/frameworks/web.py:51 umake/frameworks/web.py:120 msgid "Firefox Developer Edition" msgstr "" #: umake/frameworks/web.py:116 msgid "Choose language: {}" msgstr "" #: umake/frameworks/web.py:123 msgid "Firefox Aurora with Developer tools" msgstr "" #: umake/frameworks/web.py:129 msgid "Install in given language without prompting" msgstr "" #: umake/frameworks/web.py:141 umake/frameworks/web.py:226 msgid "Visual Studio focused on modern web and cloud" msgstr "" #: umake/frameworks/web.py:223 msgid "Visual Studio Code" msgstr "" #: umake/frameworks/games.py:42 msgid "Games Development Environment" msgstr "" #: umake/frameworks/games.py:48 msgid "Stencyl game developer IDE" msgstr "" #: umake/frameworks/games.py:85 msgid "Stencyl" msgstr "" #: umake/frameworks/games.py:114 msgid "Unity 3D Editor Linux experimental support" msgstr "" #: umake/frameworks/games.py:154 msgid "Unity3D Editor" msgstr "" #: umake/frameworks/games.py:164 msgid "Twine tool for creating interactive and nonlinear stories" msgstr "" #: umake/frameworks/games.py:200 msgid "Twine" msgstr "" #: umake/interactions/__init__.py:73 msgid "No suitable answer provided" msgstr "తగిన సమాధానం ఇవà±à°µà°²à±‡à°¦à±" #: umake/interactions/__init__.py:75 umake/interactions/__init__.py:83 msgid "Your entry '{}' isn't an acceptable choice. choices are: {}" msgstr "మీ ఎంపిక '{}' తగినది కాదà±. సరియైన ఎంపికలà±: {}" #: umake/interactions/__init__.py:80 msgid "Your entry '{}' isn't an acceptable choice. choices are: {} and {}" msgstr "మీ ఎంపిక '{}' తగినది కాదà±. సరియైన ఎంపికలà±: {} మరియౠ{}" #: umake/interactions/__init__.py:100 msgid " ({})" msgstr " ({})" #: umake/interactions/__init__.py:104 msgid "" "{}\n" "[{}] " msgstr "" "{}\n" "[{}] " #: umake/interactions/__init__.py:107 msgid "{} [{}] " msgstr "{} [{}] " #: umake/interactions/__init__.py:115 msgid "I Accept" msgstr "నాకౠఅంగీకారమే" #: umake/interactions/__init__.py:115 msgid "a" msgstr "a" #: umake/interactions/__init__.py:116 msgid "I don't accept" msgstr "నేనౠఅంగీకరించనà±" #: umake/interactions/__init__.py:116 umake/interactions/__init__.py:149 msgid "N" msgstr "N" #: umake/interactions/__init__.py:125 umake/interactions/__init__.py:126 msgid "{} ({})" msgstr "{} ({})" #: umake/interactions/__init__.py:129 msgid "[{}] " msgstr "[{}] " #: umake/interactions/__init__.py:148 msgid "Yes" msgstr "à°…à°µà±à°¨à±" #: umake/interactions/__init__.py:148 msgid "y" msgstr "à°…à°µà±à°¨à±" #: umake/interactions/__init__.py:149 msgid "No" msgstr "కాదà±" ubuntu-make-18.09+disco1/po/tr.po0000644000000000000000000002273213352651520013447 0ustar # Turkish translation for ubuntu-make # Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014 # This file is distributed under the same license as the ubuntu-make package. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: ubuntu-make\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-11-17 09:26+0100\n" "PO-Revision-Date: 2015-04-24 08:17+0000\n" "Last-Translator: Julian & Mehmet \n" "Language-Team: Turkish \n" "Language: tr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-05-04 07:08+0000\n" "X-Generator: Launchpad (build 17474)\n" #: umake/tools.py:48 msgid "# Ubuntu make installation of {}\n" msgstr "{}\n'in Ubuntu make kurulumu" #: umake/__init__.py:99 msgid "* Command '{}':" msgstr "* Komut '{}':" #: umake/__init__.py:107 msgid "Deploy and setup developers environment easily on ubuntu" msgstr "Ubuntuda dağıtım ve kurulum geliÅŸtiricileri ortamını kolayca yapabilirsiniz" #: umake/__init__.py:108 msgid "" "Note that you can also configure different debug logging behavior using " "LOG_CFG that points to a log yaml profile." msgstr "" "Ayrıca farklı hata ayıklama logu davranış yapılandırabileceÄŸiniz kullanarak " "LOG_CFG bir log yaml profilini iÅŸaret eder." #: umake/__init__.py:111 msgid "Show this help" msgstr "Bu yardımı göster" #: umake/__init__.py:112 msgid "Increase output verbosity (2 levels)" msgstr "Çıkış ayrıntısını arttırma (2 seviye)" #: umake/__init__.py:114 msgid "Remove specified framework if installed" msgstr "EÄŸer yüklü ise belirtilen çerçeveyi kaldır" #: umake/__init__.py:116 msgid "Print version and exit" msgstr "Sürümü yaz ve çık" #: umake/frameworks/ide.py:63 msgid "Generic IDEs" msgstr "Genel IDEler" #: umake/frameworks/ide.py:76 msgid "Pure Eclipse Luna (4.4)" msgstr "Pure Eclipse Luna (4.4)" #: umake/frameworks/ide.py:128 msgid "The Eclipse Luna Integrated Development Environment" msgstr "Eclipse Luna " #: umake/frameworks/ide.py:131 msgid "Eclipse Luna" msgstr "Eclipse Luna TümleÅŸik GeliÅŸtirme Ortamı (IDE)" #: umake/frameworks/ide.py:217 msgid "PyCharm Community Edition" msgstr "PyCharm Topluluk Sürümü " #: umake/frameworks/ide.py:233 msgid "PyCharm Educational Edition" msgstr "PyCharm EÄŸitim Sürümü" #: umake/frameworks/ide.py:249 msgid "PyCharm Professional Edition" msgstr "PyCharm Profesyonel Sürümü" #: umake/frameworks/ide.py:265 msgid "IntelliJ IDEA Community Edition" msgstr "IntelliJ IDEA Topluluk Sürümü" #: umake/frameworks/ide.py:281 msgid "IntelliJ IDEA" msgstr "IntelliJ IDEA" #: umake/frameworks/ide.py:297 msgid "Ruby on Rails IDE" msgstr "Ruby on Rails IDE" #: umake/frameworks/ide.py:314 msgid "Complex client-side and server-side javascript IDE" msgstr "Kompleks istemci-tarası ve server-tarafı javascript IDE" #: umake/frameworks/ide.py:331 msgid "PHP and web development IDE" msgstr "PHP ve web geliÅŸtirme IDEsi" #: umake/frameworks/ide.py:348 msgid "CLion integrated C/C++ IDE" msgstr "CLion entegrelenmiÅŸ C/C++ IDE" #: umake/frameworks/ide.py:376 msgid "The Arduino Software Distribution" msgstr "Arduino Yazılım Dağıtımı" #: umake/frameworks/ide.py:475 msgid "The Arduino Software IDE" msgstr "Arduino Yazılım IDEsi" #: umake/frameworks/ide.py:478 msgid "Arduino" msgstr "Arduino" #: umake/frameworks/ide.py:484 msgid "You need to logout and login again for your installation to work" msgstr "Kurulumunuzun çalışabilmesi için tekrar çıkış ve giriÅŸ yapmaya ihtiyacınız vardır" #: umake/frameworks/ide.py:504 umake/frameworks/ide.py:584 #: umake/frameworks/ide.py:587 msgid "Netbeans IDE" msgstr "Netbeans IDE" #: umake/frameworks/dart.py:43 msgid "Dartlang Development Environment" msgstr "Dartlang GeliÅŸtirme Ortamı" #: umake/frameworks/dart.py:49 msgid "Dart SDK with editor (not supported upstream anymore)" msgstr "Düzenleyici ile Dart SDK (bundan sonra güncellemeleri desteklenmeyecek)" #: umake/frameworks/dart.py:56 msgid "Dart SDK (default)" msgstr "Dart SDK (varsayılan)" #: umake/frameworks/dart.py:97 umake/frameworks/rust.py:134 #: umake/frameworks/scala.py:66 umake/frameworks/go.py:76 #: umake/frameworks/android.py:135 msgid "" "You need to restart your current shell session for your {} installation to " "work properly" msgstr "" "{} Kurulumunun düzgün çalışabilmesi için geçerli kabuk oturumunuzun " "tekrar baÅŸlatılmasına ihtiyaç vardır" #: umake/frameworks/rust.py:43 msgid "Rust language" msgstr "Rust dili" #: umake/frameworks/rust.py:56 msgid "The official Rust distribution" msgstr "Resmi Rust Dağıtımı" #: umake/frameworks/scala.py:40 msgid "The Scala Programming Language" msgstr "Scala Programlama Dili" #: umake/frameworks/scala.py:46 msgid "Scala compiler and interpreter (default)" msgstr "Scala derleyici ve yorumlayıcı (varsayılan)" #: umake/frameworks/go.py:39 msgid "Go language" msgstr "Go dili" #: umake/frameworks/go.py:46 msgid "Google compiler (default)" msgstr "Google derleyicisi (varsayılan)" #: umake/frameworks/android.py:42 msgid "Android Development Environment" msgstr "Android GeliÅŸtirme Ortamı" #: umake/frameworks/android.py:80 msgid "Android Studio (default)" msgstr "Android Studio (varsayılan)" #: umake/frameworks/android.py:100 msgid "Android Studio" msgstr "Android Studio" #: umake/frameworks/android.py:103 msgid "Android Studio developer environment" msgstr "Android Studio geliÅŸtirici ortamı" #: umake/frameworks/android.py:111 msgid "Android SDK" msgstr "Android SDK" #: umake/frameworks/android.py:147 msgid "Android NDK" msgstr "Android NDK" #: umake/frameworks/__init__.py:129 msgid "A default framework for category {} was requested where there is none" msgstr "Hiçbiri yoksa {} kategorisi için varsayılan çerçeve talep edilmiÅŸtir" #: umake/frameworks/__init__.py:240 msgid "You can't install that framework on this machine" msgstr "Bu makinaya bu çerçeveyi kuramayabilirsiniz" #: umake/frameworks/__init__.py:256 msgid "You can't remove {} as it isn't installed" msgstr "{} kurulmamış iken kaldıramazsınız" #: umake/frameworks/__init__.py:285 msgid "" "If the default framework name isn't provided, destdir should contain a /" msgstr "" "Varsayılan çerçevenin adı saÄŸlamıyorsa, hedefdizin bir / içermelidir" #: umake/frameworks/__init__.py:288 msgid "Remove framework if installed" msgstr "KurulmuÅŸsa çerçeveyi kaldır" #: umake/frameworks/__init__.py:291 msgid "Accept license without prompting" msgstr "Lisansı telkinsiz kabul et" #: umake/frameworks/web.py:45 msgid "Web Developer Environment" msgstr "Web GeliÅŸtirme Ortamı" #: umake/frameworks/web.py:51 umake/frameworks/web.py:120 msgid "Firefox Developer Edition" msgstr "Firefox GeliÅŸtirici Sürümü" #: umake/frameworks/web.py:116 msgid "Choose language: {}" msgstr "Bir dil seçiniz: {}" #: umake/frameworks/web.py:123 msgid "Firefox Aurora with Developer tools" msgstr "Firefox Aurora ile GeliÅŸtirici araçları" #: umake/frameworks/web.py:129 msgid "Install in given language without prompting" msgstr "Verilen dili telkinsiz kur" #: umake/frameworks/web.py:141 umake/frameworks/web.py:226 msgid "Visual Studio focused on modern web and cloud" msgstr "Visual Studio moden web ve bulut'a odaklanmıştır" #: umake/frameworks/web.py:223 msgid "Visual Studio Code" msgstr "Visual Studio Kodu" #: umake/frameworks/games.py:42 msgid "Games Development Environment" msgstr "Oyun GeliÅŸtirme Ortamları" #: umake/frameworks/games.py:48 msgid "Stencyl game developer IDE" msgstr "Stencyl oyun geliÅŸtirici IDEsi" #: umake/frameworks/games.py:85 msgid "Stencyl" msgstr "Stencyl" #: umake/frameworks/games.py:114 msgid "Unity 3D Editor Linux experimental support" msgstr "Unity 3D Editörü Linux deneysel desteÄŸi" #: umake/frameworks/games.py:154 msgid "Unity3D Editor" msgstr "Unity3D Editörü" #: umake/frameworks/games.py:164 msgid "Twine tool for creating interactive and nonlinear stories" msgstr "EtkileÅŸimli ve nonlineer hikayeleri oluÅŸturma için Twine aracı" #: umake/frameworks/games.py:200 msgid "Twine" msgstr "Twine" #: umake/interactions/__init__.py:73 msgid "No suitable answer provided" msgstr "Uygun cevap saÄŸlanmamıştır" #: umake/interactions/__init__.py:75 umake/interactions/__init__.py:83 msgid "Your entry '{}' isn't an acceptable choice. Choices are: {}" msgstr "Sizin giriÅŸiniz '{}' kabul edilebilir bir seçim deÄŸildir. Seçimler: {}" #: umake/interactions/__init__.py:80 msgid "Your entry '{}' isn't an acceptable choice. Choices are: {} and {}" msgstr "Sizin giriÅŸiniz '{}' kabul edilebilir bir seçim deÄŸildir. Seçimler: {} ve {}" #: umake/interactions/__init__.py:100 msgid " ({})" msgstr " ({})" #: umake/interactions/__init__.py:104 msgid "" "{}\n" "[{}] " msgstr "" "{}\n" "[{}] " #: umake/interactions/__init__.py:107 msgid "{} [{}] " msgstr "{} [{}] " #: umake/interactions/__init__.py:115 msgid "I Accept" msgstr "Kabul ediyorum" #: umake/interactions/__init__.py:115 msgid "a" msgstr "a" #: umake/interactions/__init__.py:116 msgid "I don't accept" msgstr "Kabul etmiyorum" #: umake/interactions/__init__.py:116 umake/interactions/__init__.py:149 msgid "N" msgstr "N" #: umake/interactions/__init__.py:125 umake/interactions/__init__.py:126 msgid "{} ({})" msgstr "{} ({})" #: umake/interactions/__init__.py:129 msgid "[{}] " msgstr "[{}] " #: umake/interactions/__init__.py:148 msgid "Yes" msgstr "Evet" #: umake/interactions/__init__.py:148 msgid "y" msgstr "y" #: umake/interactions/__init__.py:149 msgid "No" msgstr "Hayır" ubuntu-make-18.09+disco1/po/ubuntu-make.pot0000644000000000000000000001575513352651520015452 0ustar # SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: ubuntu-make\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-11-17 09:26+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" #: umake/tools.py:48 msgid "# Ubuntu make installation of {}\n" msgstr "" #: umake/__init__.py:99 msgid "* Command '{}':" msgstr "" #: umake/__init__.py:107 msgid "Deploy and setup developers environment easily on ubuntu" msgstr "" #: umake/__init__.py:108 msgid "" "Note that you can also configure different debug logging behavior using " "LOG_CFG that points to a log yaml profile." msgstr "" #: umake/__init__.py:111 msgid "Show this help" msgstr "" #: umake/__init__.py:112 msgid "Increase output verbosity (2 levels)" msgstr "" #: umake/__init__.py:114 msgid "Remove specified framework if installed" msgstr "" #: umake/__init__.py:116 msgid "Print version and exit" msgstr "" #: umake/frameworks/ide.py:63 msgid "Generic IDEs" msgstr "" #: umake/frameworks/ide.py:76 msgid "Pure Eclipse Luna (4.4)" msgstr "" #: umake/frameworks/ide.py:128 msgid "The Eclipse Luna Integrated Development Environment" msgstr "" #: umake/frameworks/ide.py:131 msgid "Eclipse Luna" msgstr "" #: umake/frameworks/ide.py:217 msgid "PyCharm Community Edition" msgstr "" #: umake/frameworks/ide.py:233 msgid "PyCharm Educational Edition" msgstr "" #: umake/frameworks/ide.py:249 msgid "PyCharm Professional Edition" msgstr "" #: umake/frameworks/ide.py:265 msgid "IntelliJ IDEA Community Edition" msgstr "" #: umake/frameworks/ide.py:281 msgid "IntelliJ IDEA" msgstr "" #: umake/frameworks/ide.py:297 msgid "Ruby on Rails IDE" msgstr "" #: umake/frameworks/ide.py:314 msgid "Complex client-side and server-side javascript IDE" msgstr "" #: umake/frameworks/ide.py:331 msgid "PHP and web development IDE" msgstr "" #: umake/frameworks/ide.py:348 msgid "CLion integrated C/C++ IDE" msgstr "" #: umake/frameworks/ide.py:376 msgid "The Arduino Software Distribution" msgstr "" #: umake/frameworks/ide.py:475 msgid "The Arduino Software IDE" msgstr "" #: umake/frameworks/ide.py:478 msgid "Arduino" msgstr "" #: umake/frameworks/ide.py:484 msgid "You need to logout and login again for your installation to work" msgstr "" #: umake/frameworks/ide.py:504 umake/frameworks/ide.py:584 #: umake/frameworks/ide.py:587 msgid "Netbeans IDE" msgstr "" #: umake/frameworks/dart.py:43 msgid "Dartlang Development Environment" msgstr "" #: umake/frameworks/dart.py:49 msgid "Dart SDK with editor (not supported upstream anymore)" msgstr "" #: umake/frameworks/dart.py:56 msgid "Dart SDK (default)" msgstr "" #: umake/frameworks/dart.py:97 umake/frameworks/rust.py:134 #: umake/frameworks/scala.py:66 umake/frameworks/go.py:76 #: umake/frameworks/android.py:135 msgid "" "You need to restart your current shell session for your {} installation to " "work properly" msgstr "" #: umake/frameworks/rust.py:43 msgid "Rust language" msgstr "" #: umake/frameworks/rust.py:56 msgid "The official Rust distribution" msgstr "" #: umake/frameworks/scala.py:40 msgid "The Scala Programming Language" msgstr "" #: umake/frameworks/scala.py:46 msgid "Scala compiler and interpreter (default)" msgstr "" #: umake/frameworks/go.py:39 msgid "Go language" msgstr "" #: umake/frameworks/go.py:46 msgid "Google compiler (default)" msgstr "" #: umake/frameworks/android.py:42 msgid "Android Development Environment" msgstr "" #: umake/frameworks/android.py:80 msgid "Android Studio (default)" msgstr "" #: umake/frameworks/android.py:100 msgid "Android Studio" msgstr "" #: umake/frameworks/android.py:103 msgid "Android Studio developer environment" msgstr "" #: umake/frameworks/android.py:111 msgid "Android SDK" msgstr "" #: umake/frameworks/android.py:147 msgid "Android NDK" msgstr "" #: umake/frameworks/__init__.py:129 msgid "A default framework for category {} was requested where there is none" msgstr "" #: umake/frameworks/__init__.py:240 msgid "You can't install that framework on this machine" msgstr "" #: umake/frameworks/__init__.py:256 msgid "You can't remove {} as it isn't installed" msgstr "" #: umake/frameworks/__init__.py:285 msgid "" "If the default framework name isn't provided, destdir should contain a /" msgstr "" #: umake/frameworks/__init__.py:288 msgid "Remove framework if installed" msgstr "" #: umake/frameworks/__init__.py:291 msgid "Accept license without prompting" msgstr "" #: umake/frameworks/web.py:45 msgid "Web Developer Environment" msgstr "" #: umake/frameworks/web.py:51 umake/frameworks/web.py:120 msgid "Firefox Developer Edition" msgstr "" #: umake/frameworks/web.py:116 msgid "Choose language: {}" msgstr "" #: umake/frameworks/web.py:123 msgid "Firefox Aurora with Developer tools" msgstr "" #: umake/frameworks/web.py:129 msgid "Install in given language without prompting" msgstr "" #: umake/frameworks/web.py:141 umake/frameworks/web.py:226 msgid "Visual Studio focused on modern web and cloud" msgstr "" #: umake/frameworks/web.py:223 msgid "Visual Studio Code" msgstr "" #: umake/frameworks/games.py:42 msgid "Games Development Environment" msgstr "" #: umake/frameworks/games.py:48 msgid "Stencyl game developer IDE" msgstr "" #: umake/frameworks/games.py:85 msgid "Stencyl" msgstr "" #: umake/frameworks/games.py:114 msgid "Unity 3D Editor Linux experimental support" msgstr "" #: umake/frameworks/games.py:154 msgid "Unity3D Editor" msgstr "" #: umake/frameworks/games.py:164 msgid "Twine tool for creating interactive and nonlinear stories" msgstr "" #: umake/frameworks/games.py:200 msgid "Twine" msgstr "" #: umake/interactions/__init__.py:73 msgid "No suitable answer provided" msgstr "" #: umake/interactions/__init__.py:75 umake/interactions/__init__.py:83 msgid "Your entry '{}' isn't an acceptable choice. choices are: {}" msgstr "" #: umake/interactions/__init__.py:80 msgid "Your entry '{}' isn't an acceptable choice. choices are: {} and {}" msgstr "" #: umake/interactions/__init__.py:100 msgid " ({})" msgstr "" #: umake/interactions/__init__.py:104 msgid "" "{}\n" "[{}] " msgstr "" #: umake/interactions/__init__.py:107 msgid "{} [{}] " msgstr "" #: umake/interactions/__init__.py:115 msgid "I Accept" msgstr "" #: umake/interactions/__init__.py:115 msgid "a" msgstr "" #: umake/interactions/__init__.py:116 msgid "I don't accept" msgstr "" #: umake/interactions/__init__.py:116 umake/interactions/__init__.py:149 msgid "N" msgstr "" #: umake/interactions/__init__.py:125 umake/interactions/__init__.py:126 msgid "{} ({})" msgstr "" #: umake/interactions/__init__.py:129 msgid "[{}] " msgstr "" #: umake/interactions/__init__.py:148 msgid "Yes" msgstr "" #: umake/interactions/__init__.py:148 msgid "y" msgstr "" #: umake/interactions/__init__.py:149 msgid "No" msgstr "" ubuntu-make-18.09+disco1/po/zh_CN.po0000644000000000000000000001747613352651520014034 0ustar # Chinese (Simplified) translation for ubuntu-make # Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014 # This file is distributed under the same license as the ubuntu-make package. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: ubuntu-make\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-11-17 09:26+0100\n" "PO-Revision-Date: 2014-12-09 13:12+0000\n" "Last-Translator: Didier Roche \n" "Language-Team: Chinese (Simplified) \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-11-05 13:56+0000\n" "X-Generator: Launchpad (build 17838)\n" #: umake/tools.py:48 msgid "# Ubuntu make installation of {}\n" msgstr "" #: umake/__init__.py:99 msgid "* Command '{}':" msgstr "* 命令 '{}':" #: umake/__init__.py:107 msgid "Deploy and setup developers environment easily on ubuntu" msgstr "在 Ubuntu 上轻æ¾éƒ¨ç½²å’Œè®¾ç½®å¼€å‘环境" #: umake/__init__.py:108 #, fuzzy msgid "" "Note that you can also configure different debug logging behavior using " "LOG_CFG that points to a log yaml profile." msgstr "" "请注æ„,您还å¯ä»¥é€šè¿‡ LOG_CFG 指å‘çš„ yaml é…置文件æ¥è®¾ç½®ä¸åŒçš„调试日志行为。" #: umake/__init__.py:111 msgid "Show this help" msgstr "显示本帮助" #: umake/__init__.py:112 msgid "Increase output verbosity (2 levels)" msgstr "æå‡è¾“出的级别 (2级)" #: umake/__init__.py:114 msgid "Remove specified framework if installed" msgstr "如已安装指定框架,请å¸è½½" #: umake/__init__.py:116 msgid "Print version and exit" msgstr "" #: umake/frameworks/ide.py:63 msgid "Generic IDEs" msgstr "" #: umake/frameworks/ide.py:76 msgid "Pure Eclipse Luna (4.4)" msgstr "" #: umake/frameworks/ide.py:128 msgid "The Eclipse Luna Integrated Development Environment" msgstr "" #: umake/frameworks/ide.py:131 msgid "Eclipse Luna" msgstr "" #: umake/frameworks/ide.py:217 msgid "PyCharm Community Edition" msgstr "" #: umake/frameworks/ide.py:233 msgid "PyCharm Educational Edition" msgstr "" #: umake/frameworks/ide.py:249 msgid "PyCharm Professional Edition" msgstr "" #: umake/frameworks/ide.py:265 msgid "IntelliJ IDEA Community Edition" msgstr "" #: umake/frameworks/ide.py:281 msgid "IntelliJ IDEA" msgstr "" #: umake/frameworks/ide.py:297 msgid "Ruby on Rails IDE" msgstr "" #: umake/frameworks/ide.py:314 msgid "Complex client-side and server-side javascript IDE" msgstr "" #: umake/frameworks/ide.py:331 msgid "PHP and web development IDE" msgstr "" #: umake/frameworks/ide.py:348 msgid "CLion integrated C/C++ IDE" msgstr "" #: umake/frameworks/ide.py:376 msgid "The Arduino Software Distribution" msgstr "" #: umake/frameworks/ide.py:475 msgid "The Arduino Software IDE" msgstr "" #: umake/frameworks/ide.py:478 msgid "Arduino" msgstr "" #: umake/frameworks/ide.py:484 msgid "You need to logout and login again for your installation to work" msgstr "" #: umake/frameworks/ide.py:504 umake/frameworks/ide.py:584 #: umake/frameworks/ide.py:587 msgid "Netbeans IDE" msgstr "" #: umake/frameworks/dart.py:43 msgid "Dartlang Development Environment" msgstr "" #: umake/frameworks/dart.py:49 msgid "Dart SDK with editor (not supported upstream anyymore)" msgstr "" #: umake/frameworks/dart.py:56 msgid "Dart SDK (default)" msgstr "" #: umake/frameworks/dart.py:97 umake/frameworks/rust.py:134 #: umake/frameworks/scala.py:66 umake/frameworks/go.py:76 #: umake/frameworks/android.py:135 msgid "" "You need to restart your current shell session for your {} installation to " "work properly" msgstr "" #: umake/frameworks/rust.py:43 msgid "Rust language" msgstr "" #: umake/frameworks/rust.py:56 msgid "The official Rust distribution" msgstr "" #: umake/frameworks/scala.py:40 msgid "The Scala Programming Language" msgstr "" #: umake/frameworks/scala.py:46 msgid "Scala compiler and interpreter (default)" msgstr "" #: umake/frameworks/go.py:39 msgid "Go language" msgstr "" #: umake/frameworks/go.py:46 msgid "Google compiler (default)" msgstr "" #: umake/frameworks/android.py:42 msgid "Android Development Environment" msgstr "Android å¼€å‘环境" #: umake/frameworks/android.py:80 msgid "Android Studio (default)" msgstr "" #: umake/frameworks/android.py:100 msgid "Android Studio" msgstr "Android Studio" #: umake/frameworks/android.py:103 msgid "Android Studio developer environment" msgstr "Android Studio å¼€å‘者环境" #: umake/frameworks/android.py:111 #, fuzzy msgid "Android SDK" msgstr "Android Studio" #: umake/frameworks/android.py:147 msgid "Android NDK" msgstr "" #: umake/frameworks/__init__.py:129 msgid "A default framework for category {} was requested where there is none" msgstr "" #: umake/frameworks/__init__.py:240 msgid "You can't install that framework on this machine" msgstr "" #: umake/frameworks/__init__.py:256 msgid "You can't remove {} as it isn't installed" msgstr "未安装,无法移除{}" #: umake/frameworks/__init__.py:285 msgid "" "If the default framework name isn't provided, destdir should contain a /" msgstr "如未æä¾›é»˜è®¤æ¡†æž¶åç§°ï¼Œè¾“å‡ºç›®å½•åº”åŒ…å«æ–œæ  /" #: umake/frameworks/__init__.py:288 msgid "Remove framework if installed" msgstr "如已安装框架,请å¸è½½" #: umake/frameworks/__init__.py:291 msgid "Accept license without prompting" msgstr "" #: umake/frameworks/web.py:45 msgid "Web Developer Environment" msgstr "" #: umake/frameworks/web.py:51 umake/frameworks/web.py:120 msgid "Firefox Developer Edition" msgstr "" #: umake/frameworks/web.py:116 msgid "Choose language: {}" msgstr "" #: umake/frameworks/web.py:123 msgid "Firefox Aurora with Developer tools" msgstr "" #: umake/frameworks/web.py:129 msgid "Install in given language without prompting" msgstr "" #: umake/frameworks/web.py:141 umake/frameworks/web.py:226 msgid "Visual Studio focused on modern web and cloud" msgstr "" #: umake/frameworks/web.py:223 msgid "Visual Studio Code" msgstr "" #: umake/frameworks/games.py:42 msgid "Games Development Environment" msgstr "" #: umake/frameworks/games.py:48 msgid "Stencyl game developer IDE" msgstr "" #: umake/frameworks/games.py:85 msgid "Stencyl" msgstr "" #: umake/frameworks/games.py:114 msgid "Unity 3D Editor Linux experimental support" msgstr "" #: umake/frameworks/games.py:154 msgid "Unity3D Editor" msgstr "" #: umake/frameworks/games.py:164 msgid "Twine tool for creating interactive and nonlinear stories" msgstr "" #: umake/frameworks/games.py:200 msgid "Twine" msgstr "" #: umake/interactions/__init__.py:73 msgid "No suitable answer provided" msgstr "未æä¾›åˆé€‚的答案" #: umake/interactions/__init__.py:75 umake/interactions/__init__.py:83 msgid "Your entry '{}' isn't an acceptable choice. choices are: {}" msgstr "您的输入 '{}' 䏿˜¯ä¸€ä¸ªå¯ä»¥æŽ¥å—的选择。选项有:{}" #: umake/interactions/__init__.py:80 msgid "Your entry '{}' isn't an acceptable choice. choices are: {} and {}" msgstr "您的输入 '{}' 䏿˜¯ä¸€ä¸ªå¯ä»¥æŽ¥å—的选择。选项有:{} å’Œ {}" #: umake/interactions/__init__.py:100 msgid " ({})" msgstr " ({})" #: umake/interactions/__init__.py:104 msgid "" "{}\n" "[{}] " msgstr "" "{}\n" "[{}] " #: umake/interactions/__init__.py:107 msgid "{} [{}] " msgstr "{} [{}] " #: umake/interactions/__init__.py:115 msgid "I Accept" msgstr "我接å—" #: umake/interactions/__init__.py:115 msgid "a" msgstr "a" #: umake/interactions/__init__.py:116 msgid "I don't accept" msgstr "æˆ‘ä¸æŽ¥å—" #: umake/interactions/__init__.py:116 umake/interactions/__init__.py:149 msgid "N" msgstr "N" #: umake/interactions/__init__.py:125 umake/interactions/__init__.py:126 msgid "{} ({})" msgstr "{} ({})" #: umake/interactions/__init__.py:129 msgid "[{}] " msgstr "[{}] " #: umake/interactions/__init__.py:148 msgid "Yes" msgstr "是" #: umake/interactions/__init__.py:148 msgid "y" msgstr "y" #: umake/interactions/__init__.py:149 msgid "No" msgstr "å¦" ubuntu-make-18.09+disco1/po/zh_HK.po0000644000000000000000000001656313352651520014032 0ustar # Chinese (Hong Kong) translation for ubuntu-make # Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014 # This file is distributed under the same license as the ubuntu-make package. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: ubuntu-make\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-11-17 09:26+0100\n" "PO-Revision-Date: 2014-12-09 13:12+0000\n" "Last-Translator: Anthony Wong \n" "Language-Team: Chinese (Hong Kong) \n" "Language: zh_HK\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-11-05 13:56+0000\n" "X-Generator: Launchpad (build 17838)\n" #: umake/tools.py:48 msgid "# Ubuntu make installation of {}\n" msgstr "" #: umake/__init__.py:99 msgid "* Command '{}':" msgstr "* 命令 '{}':" #: umake/__init__.py:107 msgid "Deploy and setup developers environment easily on ubuntu" msgstr "在 Ubuntu 上輕鬆部署和é…置開發環境" #: umake/__init__.py:108 msgid "" "Note that you can also configure different debug logging behavior using " "LOG_CFG that points to a log yaml profile." msgstr "" #: umake/__init__.py:111 msgid "Show this help" msgstr "顯示此求助說明" #: umake/__init__.py:112 msgid "Increase output verbosity (2 levels)" msgstr "æå‡è¼¸å‡ºè©³ç´°ç´šåˆ¥ (2ç´š)" #: umake/__init__.py:114 msgid "Remove specified framework if installed" msgstr "" #: umake/__init__.py:116 msgid "Print version and exit" msgstr "" #: umake/frameworks/ide.py:63 msgid "Generic IDEs" msgstr "" #: umake/frameworks/ide.py:76 msgid "Pure Eclipse Luna (4.4)" msgstr "" #: umake/frameworks/ide.py:128 msgid "The Eclipse Luna Integrated Development Environment" msgstr "" #: umake/frameworks/ide.py:131 msgid "Eclipse Luna" msgstr "" #: umake/frameworks/ide.py:217 msgid "PyCharm Community Edition" msgstr "" #: umake/frameworks/ide.py:233 msgid "PyCharm Educational Edition" msgstr "" #: umake/frameworks/ide.py:249 msgid "PyCharm Professional Edition" msgstr "" #: umake/frameworks/ide.py:265 msgid "IntelliJ IDEA Community Edition" msgstr "" #: umake/frameworks/ide.py:281 msgid "IntelliJ IDEA" msgstr "" #: umake/frameworks/ide.py:297 msgid "Ruby on Rails IDE" msgstr "" #: umake/frameworks/ide.py:314 msgid "Complex client-side and server-side javascript IDE" msgstr "" #: umake/frameworks/ide.py:331 msgid "PHP and web development IDE" msgstr "" #: umake/frameworks/ide.py:348 msgid "CLion integrated C/C++ IDE" msgstr "" #: umake/frameworks/ide.py:376 msgid "The Arduino Software Distribution" msgstr "" #: umake/frameworks/ide.py:475 msgid "The Arduino Software IDE" msgstr "" #: umake/frameworks/ide.py:478 msgid "Arduino" msgstr "" #: umake/frameworks/ide.py:484 msgid "You need to logout and login again for your installation to work" msgstr "" #: umake/frameworks/ide.py:504 umake/frameworks/ide.py:584 #: umake/frameworks/ide.py:587 msgid "Netbeans IDE" msgstr "" #: umake/frameworks/dart.py:43 msgid "Dartlang Development Environment" msgstr "" #: umake/frameworks/dart.py:49 msgid "Dart SDK with editor (not supported upstream anyymore)" msgstr "" #: umake/frameworks/dart.py:56 msgid "Dart SDK (default)" msgstr "" #: umake/frameworks/dart.py:97 umake/frameworks/rust.py:134 #: umake/frameworks/scala.py:66 umake/frameworks/go.py:76 #: umake/frameworks/android.py:135 msgid "" "You need to restart your current shell session for your {} installation to " "work properly" msgstr "" #: umake/frameworks/rust.py:43 msgid "Rust language" msgstr "" #: umake/frameworks/rust.py:56 msgid "The official Rust distribution" msgstr "" #: umake/frameworks/scala.py:40 msgid "The Scala Programming Language" msgstr "" #: umake/frameworks/scala.py:46 msgid "Scala compiler and interpreter (default)" msgstr "" #: umake/frameworks/go.py:39 msgid "Go language" msgstr "" #: umake/frameworks/go.py:46 msgid "Google compiler (default)" msgstr "" #: umake/frameworks/android.py:42 msgid "Android Development Environment" msgstr "Android 開發環境" #: umake/frameworks/android.py:80 msgid "Android Studio (default)" msgstr "" #: umake/frameworks/android.py:100 msgid "Android Studio" msgstr "Android Studio" #: umake/frameworks/android.py:103 msgid "Android Studio developer environment" msgstr "Android Studio 開發環境" #: umake/frameworks/android.py:111 #, fuzzy msgid "Android SDK" msgstr "Android Studio" #: umake/frameworks/android.py:147 msgid "Android NDK" msgstr "" #: umake/frameworks/__init__.py:129 msgid "A default framework for category {} was requested where there is none" msgstr "" #: umake/frameworks/__init__.py:240 msgid "You can't install that framework on this machine" msgstr "" #: umake/frameworks/__init__.py:256 msgid "You can't remove {} as it isn't installed" msgstr "" #: umake/frameworks/__init__.py:285 msgid "" "If the default framework name isn't provided, destdir should contain a /" msgstr "" #: umake/frameworks/__init__.py:288 msgid "Remove framework if installed" msgstr "" #: umake/frameworks/__init__.py:291 msgid "Accept license without prompting" msgstr "" #: umake/frameworks/web.py:45 msgid "Web Developer Environment" msgstr "" #: umake/frameworks/web.py:51 umake/frameworks/web.py:120 msgid "Firefox Developer Edition" msgstr "" #: umake/frameworks/web.py:116 msgid "Choose language: {}" msgstr "" #: umake/frameworks/web.py:123 msgid "Firefox Aurora with Developer tools" msgstr "" #: umake/frameworks/web.py:129 msgid "Install in given language without prompting" msgstr "" #: umake/frameworks/web.py:141 umake/frameworks/web.py:226 msgid "Visual Studio focused on modern web and cloud" msgstr "" #: umake/frameworks/web.py:223 msgid "Visual Studio Code" msgstr "" #: umake/frameworks/games.py:42 msgid "Games Development Environment" msgstr "" #: umake/frameworks/games.py:48 msgid "Stencyl game developer IDE" msgstr "" #: umake/frameworks/games.py:85 msgid "Stencyl" msgstr "" #: umake/frameworks/games.py:114 msgid "Unity 3D Editor Linux experimental support" msgstr "" #: umake/frameworks/games.py:154 msgid "Unity3D Editor" msgstr "" #: umake/frameworks/games.py:164 msgid "Twine tool for creating interactive and nonlinear stories" msgstr "" #: umake/frameworks/games.py:200 msgid "Twine" msgstr "" #: umake/interactions/__init__.py:73 msgid "No suitable answer provided" msgstr "未æä¾›åˆé©ç­”案" #: umake/interactions/__init__.py:75 umake/interactions/__init__.py:83 msgid "Your entry '{}' isn't an acceptable choice. choices are: {}" msgstr "" #: umake/interactions/__init__.py:80 msgid "Your entry '{}' isn't an acceptable choice. choices are: {} and {}" msgstr "" #: umake/interactions/__init__.py:100 msgid " ({})" msgstr "" #: umake/interactions/__init__.py:104 msgid "" "{}\n" "[{}] " msgstr "" #: umake/interactions/__init__.py:107 msgid "{} [{}] " msgstr "" #: umake/interactions/__init__.py:115 msgid "I Accept" msgstr "接å—" #: umake/interactions/__init__.py:115 msgid "a" msgstr "" #: umake/interactions/__init__.py:116 msgid "I don't accept" msgstr "䏿ޥå—" #: umake/interactions/__init__.py:116 umake/interactions/__init__.py:149 msgid "N" msgstr "" #: umake/interactions/__init__.py:125 umake/interactions/__init__.py:126 msgid "{} ({})" msgstr "" #: umake/interactions/__init__.py:129 msgid "[{}] " msgstr "" #: umake/interactions/__init__.py:148 msgid "Yes" msgstr "" #: umake/interactions/__init__.py:148 msgid "y" msgstr "" #: umake/interactions/__init__.py:149 msgid "No" msgstr "" ubuntu-make-18.09+disco1/po/zh_TW.po0000644000000000000000000002204113352651520014046 0ustar # Chinese (Traditional) translation for ubuntu-make # Copyright (c) 2015 Rosetta Contributors and Canonical Ltd 2015 # This file is distributed under the same license as the ubuntu-make package. # FIRST AUTHOR , 2015. # msgid "" msgstr "" "Project-Id-Version: ubuntu-make\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-11-17 09:26+0100\n" "PO-Revision-Date: 2015-05-03 05:28+0000\n" "Last-Translator: ï¼¶å­—é¾(Vdragon) \n" "Language-Team: Chinese (Traditional) \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2015-05-04 07:08+0000\n" "X-Generator: Launchpad (build 17474)\n" #: umake/tools.py:48 msgid "# Ubuntu make installation of {}\n" msgstr "# {} çš„ Ubuntu make 安è£\n" #: umake/__init__.py:99 msgid "* Command '{}':" msgstr "* 命令「{}ã€ï¼š" #: umake/__init__.py:107 msgid "Deploy and setup developers environment easily on ubuntu" msgstr "在 Ubuntu 上輕易地佈署與安è£é–‹ç™¼ç’°å¢ƒ" #: umake/__init__.py:108 #, fuzzy msgid "" "Note that you can also configure different debug logging behavior using " "LOG_CFG that points to a log yaml profile." msgstr "" "æ³¨æ„æ‚¨ä¹Ÿå¯ä»¥ä½¿ç”¨ LOG_CFG 環境變數指å‘一個 YAML æ ¼å¼é™¤éŒ¯ç´€éŒ„設定檔來設定ä¸åŒçš„" "除錯紀錄行為。" #: umake/__init__.py:111 msgid "Show this help" msgstr "顯示此幫助訊æ¯" #: umake/__init__.py:112 msgid "Increase output verbosity (2 levels)" msgstr "增加輸出訊æ¯çš„å†—é•·ç¨‹åº¦ï¼ˆæœ€å¤šå¯æé«˜ 2 級)" #: umake/__init__.py:114 msgid "Remove specified framework if installed" msgstr "如果已被安è£çš„話移除指定的軟體框架" #: umake/__init__.py:116 msgid "Print version and exit" msgstr "" #: umake/frameworks/ide.py:63 msgid "Generic IDEs" msgstr "一般整åˆå¼é–‹ç™¼ç’°å¢ƒ" #: umake/frameworks/ide.py:76 msgid "Pure Eclipse Luna (4.4)" msgstr "純粹的 Eclipse Luna (4.4) æ•´åˆå¼é–‹ç™¼ç’°å¢ƒ" #: umake/frameworks/ide.py:128 msgid "The Eclipse Luna Integrated Development Environment" msgstr "Eclipse Luna æ•´åˆå¼é–‹ç™¼ç’°å¢ƒ" #: umake/frameworks/ide.py:131 msgid "Eclipse Luna" msgstr "Eclipse Luna æ•´åˆå¼é–‹ç™¼ç’°å¢ƒ" #: umake/frameworks/ide.py:217 msgid "PyCharm Community Edition" msgstr "PyCharm 社群版本" #: umake/frameworks/ide.py:233 #, fuzzy msgid "PyCharm Educational Edition" msgstr "PyCharm 社群版本" #: umake/frameworks/ide.py:249 #, fuzzy msgid "PyCharm Professional Edition" msgstr "PyCharm 社群版本" #: umake/frameworks/ide.py:265 msgid "IntelliJ IDEA Community Edition" msgstr "IntelliJ IDEA 社群版本" #: umake/frameworks/ide.py:281 msgid "IntelliJ IDEA" msgstr "IntelliJ IDEA" #: umake/frameworks/ide.py:297 msgid "Ruby on Rails IDE" msgstr "" #: umake/frameworks/ide.py:314 msgid "Complex client-side and server-side javascript IDE" msgstr "" #: umake/frameworks/ide.py:331 #, fuzzy msgid "PHP and web development IDE" msgstr "Stencyl éŠæˆ²é–‹ç™¼è€…æ•´åˆå¼é–‹ç™¼ç’°å¢ƒ" #: umake/frameworks/ide.py:348 msgid "CLion integrated C/C++ IDE" msgstr "" #: umake/frameworks/ide.py:376 msgid "The Arduino Software Distribution" msgstr "" #: umake/frameworks/ide.py:475 msgid "The Arduino Software IDE" msgstr "" #: umake/frameworks/ide.py:478 msgid "Arduino" msgstr "" #: umake/frameworks/ide.py:484 #, fuzzy msgid "You need to logout and login again for your installation to work" msgstr "æ‚¨å¿…é ˆé‡æ–°å•Ÿå‹•殼程å¼(shell)å·¥ä½œéšŽæ®µæ‚¨çš„å®‰è£æ‰æœƒç”Ÿæ•ˆ" #: umake/frameworks/ide.py:504 umake/frameworks/ide.py:584 #: umake/frameworks/ide.py:587 msgid "Netbeans IDE" msgstr "" #: umake/frameworks/dart.py:43 msgid "Dartlang Development Environment" msgstr "Dartlang 開發環境" #: umake/frameworks/dart.py:49 #, fuzzy msgid "Dart SDK with editor (not supported upstream anyymore)" msgstr "Dart 軟體開發工具(SDK)與編輯器(é è¨­ï¼‰" #: umake/frameworks/dart.py:56 #, fuzzy msgid "Dart SDK (default)" msgstr "Dart 軟體開發工具(SDK)與編輯器(é è¨­ï¼‰" #: umake/frameworks/dart.py:97 umake/frameworks/rust.py:134 #: umake/frameworks/scala.py:66 umake/frameworks/go.py:76 #: umake/frameworks/android.py:135 #, fuzzy msgid "" "You need to restart your current shell session for your {} installation to " "work properly" msgstr "æ‚¨å¿…é ˆé‡æ–°å•Ÿå‹•殼程å¼(shell)å·¥ä½œéšŽæ®µæ‚¨çš„å®‰è£æ‰æœƒç”Ÿæ•ˆ" #: umake/frameworks/rust.py:43 #, fuzzy msgid "Rust language" msgstr "Go 程å¼èªžè¨€" #: umake/frameworks/rust.py:56 msgid "The official Rust distribution" msgstr "" #: umake/frameworks/scala.py:40 msgid "The Scala Programming Language" msgstr "" #: umake/frameworks/scala.py:46 #, fuzzy msgid "Scala compiler and interpreter (default)" msgstr "Google 編譯器(é è¨­ï¼‰" #: umake/frameworks/go.py:39 msgid "Go language" msgstr "Go 程å¼èªžè¨€" #: umake/frameworks/go.py:46 msgid "Google compiler (default)" msgstr "Google 編譯器(é è¨­ï¼‰" #: umake/frameworks/android.py:42 msgid "Android Development Environment" msgstr "Android 開發環境" #: umake/frameworks/android.py:80 msgid "Android Studio (default)" msgstr "Android Studio(é è¨­ï¼‰" #: umake/frameworks/android.py:100 msgid "Android Studio" msgstr "Android Studio" #: umake/frameworks/android.py:103 msgid "Android Studio developer environment" msgstr "Android Studio 軟體開發環境" #: umake/frameworks/android.py:111 #, fuzzy msgid "Android SDK" msgstr "Android NDK" #: umake/frameworks/android.py:147 msgid "Android NDK" msgstr "Android NDK" #: umake/frameworks/__init__.py:129 msgid "A default framework for category {} was requested where there is none" msgstr "" #: umake/frameworks/__init__.py:240 msgid "You can't install that framework on this machine" msgstr "" #: umake/frameworks/__init__.py:256 msgid "You can't remove {} as it isn't installed" msgstr "您ä¸èƒ½ç§»é™¤ {} 因為它沒有被安è£" #: umake/frameworks/__init__.py:285 msgid "" "If the default framework name isn't provided, destdir should contain a /" msgstr "" #: umake/frameworks/__init__.py:288 msgid "Remove framework if installed" msgstr "如果軟體框架已經被安è£çš„話移除它" #: umake/frameworks/__init__.py:291 msgid "Accept license without prompting" msgstr "" #: umake/frameworks/web.py:45 msgid "Web Developer Environment" msgstr "Web 開發環境" #: umake/frameworks/web.py:51 umake/frameworks/web.py:120 msgid "Firefox Developer Edition" msgstr "Firefox 開發版" #: umake/frameworks/web.py:116 #, fuzzy msgid "Choose language: {}" msgstr "Go 程å¼èªžè¨€" #: umake/frameworks/web.py:123 msgid "Firefox Aurora with Developer tools" msgstr "內建開發工具的 Firefox Aurora" #: umake/frameworks/web.py:129 msgid "Install in given language without prompting" msgstr "" #: umake/frameworks/web.py:141 umake/frameworks/web.py:226 msgid "Visual Studio focused on modern web and cloud" msgstr "" #: umake/frameworks/web.py:223 msgid "Visual Studio Code" msgstr "" #: umake/frameworks/games.py:42 msgid "Games Development Environment" msgstr "éŠæˆ²é–‹ç™¼ç’°å¢ƒ" #: umake/frameworks/games.py:48 msgid "Stencyl game developer IDE" msgstr "Stencyl éŠæˆ²é–‹ç™¼è€…æ•´åˆå¼é–‹ç™¼ç’°å¢ƒ" #: umake/frameworks/games.py:85 msgid "Stencyl" msgstr "Stencyl" #: umake/frameworks/games.py:114 msgid "Unity 3D Editor Linux experimental support" msgstr "" #: umake/frameworks/games.py:154 #, fuzzy msgid "Unity3D Editor" msgstr "Dart 編輯器" #: umake/frameworks/games.py:164 msgid "Twine tool for creating interactive and nonlinear stories" msgstr "" #: umake/frameworks/games.py:200 msgid "Twine" msgstr "" #: umake/interactions/__init__.py:73 msgid "No suitable answer provided" msgstr "沒有得到é©ç•¶çš„答案" #: umake/interactions/__init__.py:75 umake/interactions/__init__.py:83 msgid "Your entry '{}' isn't an acceptable choice. choices are: {}" msgstr "您的「{}ã€è¼¸å…¥ä¸¦ä¸æ˜¯å€‹å¯æŽ¥å—çš„é¸é …。å¯ç”¨é¸é …有:{}" #: umake/interactions/__init__.py:80 msgid "Your entry '{}' isn't an acceptable choice. choices are: {} and {}" msgstr "您的「{}ã€è¼¸å…¥ä¸¦ä¸æ˜¯å€‹å¯æŽ¥å—çš„é¸é …。å¯ç”¨é¸é …有:{} 與 {}" #: umake/interactions/__init__.py:100 msgid " ({})" msgstr " ({})" #: umake/interactions/__init__.py:104 msgid "" "{}\n" "[{}] " msgstr "" "{}\n" "[{}] " #: umake/interactions/__init__.py:107 msgid "{} [{}] " msgstr "{} [{}] " #: umake/interactions/__init__.py:115 msgid "I Accept" msgstr "我接å—" #: umake/interactions/__init__.py:115 msgid "a" msgstr "a" #: umake/interactions/__init__.py:116 msgid "I don't accept" msgstr "æˆ‘ä¸æŽ¥å—" #: umake/interactions/__init__.py:116 umake/interactions/__init__.py:149 msgid "N" msgstr "N" #: umake/interactions/__init__.py:125 umake/interactions/__init__.py:126 msgid "{} ({})" msgstr "{} ({})" #: umake/interactions/__init__.py:129 msgid "[{}] " msgstr "[{}] " #: umake/interactions/__init__.py:148 msgid "Yes" msgstr "是" #: umake/interactions/__init__.py:148 msgid "y" msgstr "y" #: umake/interactions/__init__.py:149 msgid "No" msgstr "å¦" #~ msgid "Stencyl Game developer environment" #~ msgstr "Stencyl éŠæˆ²é–‹ç™¼ç’°å¢ƒ" #~ msgid "Dart Editor for the dart language" #~ msgstr "用於 Dart 語言的 Dart 編輯器" ubuntu-make-18.09+disco1/requirements.txt0000644000000000000000000000030613352651520015321 0ustar # runtime requirements -e git://git.launchpad.net/python-apt@1.1.0_beta1#egg=apt argcomplete progressbar33 pyyaml requests pyxdg python-gnupg # test tools nose nose-cov nose-json pep8 pexpect>=4.0 ubuntu-make-18.09+disco1/runtests0000755000000000000000000003576713352651520013675 0ustar #!/usr/bin/env python3 # -*- coding: utf-8 -*- # Copyright (C) 2014 Canonical # # Authors: # Didier Roche # # 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; version 3. # # 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 import argparse import configparser import logging import logging.config import nose import os import yaml import shutil import subprocess import sys import tempfile root_dir = os.path.abspath(os.path.dirname(__file__)) config_dir = os.path.join(root_dir, 'confs') DEBUG_CONFIG_FILE = os.path.join(config_dir, "debug.nose") COVERAGE_CONFIG_FILE = os.path.join(config_dir, "prod.nose") TESTS_DIR = os.path.join(root_dir, 'tests') DEBUG_LOG_CONFIG = os.path.join(config_dir, "debug.logcfg") TESTING_LOG_CONFIG = os.path.join(config_dir, "testing.logcfg") # subprocess need to output on stdout the logs to be monitored # the profile is the testing one + console output in warning mode TESTING_SUBPROCESS_LOG_CONFIG = os.path.join(config_dir, "testing.subprocess.logcfg") def transform_nose_config_to_cmd(filename): """Manually transform a nose config file to a cmd parameters This is needed in case the same parameter is repeated multiple times This return the cmd line array parameters.""" cmd_line = [] config = configparser.ConfigParser() config.read(filename) for key in config["nosetests"]: value = config["nosetests"][key] if value == '1': cmd_line.append('--' + key) # multiple values (what the config parameter for nose doesn't support) elif ',' in value: for val in value.split(','): cmd_line.append('--{}={}'.format(key, val)) else: cmd_line.append('--{}={}'.format(key, value)) return cmd_line def set_logging_profile(log_config_file): """Set logging profile for current process and subprocesses""" with open(log_config_file, 'rt') as f: logging_config = yaml.load(f.read()) logging.config.dictConfig(logging_config) os.environ["LOG_CFG"] = log_config_file if log_config_file == TESTING_LOG_CONFIG: os.environ["LOG_CFG"] = TESTING_SUBPROCESS_LOG_CONFIG def local_run(args): """Run directly the tests on the host""" # setup the environment in plain english so that we standardize the test bed (if some people have some .mo # Ubuntu Make files installed while having a locale set to it) to avoid getting translated strings not # matching our expectations. os.environ["LANGUAGE"] = "C" nose_args = [] # nosetests captured logs format nose_args.extend(["--logging-format", "%(asctime)s [%(name)s] %(levelname)s: %(message)s"]) ## handle config first specified_config = False if args.config: nose_args.extend(["--config", args.config]) specified_config = True elif args.debug: nose_args.extend(["--config", DEBUG_CONFIG_FILE]) set_logging_profile(DEBUG_LOG_CONFIG) specified_config = True elif args.coverage: nose_args.extend(transform_nose_config_to_cmd(COVERAGE_CONFIG_FILE)) set_logging_profile(TESTING_LOG_CONFIG) specified_config = True elif args.no_config: specified_config = True ## output xunit and json if requested if args.publish: nose_args.append("--with-xunit") # FIXME: disable nose-json for now, incompatible with coverage reporting when an exception is raised. # we are going to switch to nose2 anyway. #nose_args.append("--with-json") ## check if we want to run those tests with the system code if args.system: nose_args.append("-P") # let remove it from there as well sys.path.remove(root_dir) else: import tests tests.tools.set_local_umake() if not "all" in args.tests and len(args.tests) > 0: for test_type in args.tests: for named_test_type in ("small", "medium", "large", "pep8"): if test_type == named_test_type: if test_type == "pep8": nose_args.append(os.path.join(TESTS_DIR, "__init__.py")) else: nose_args.append(os.path.join(TESTS_DIR, named_test_type)) break # Not a named test_type, but a list of tests to run else: nose_args.append(test_type) # If no config is given, choose debug by default for partial run if not specified_config: nose_args.extend(["--config", DEBUG_CONFIG_FILE]) set_logging_profile(DEBUG_LOG_CONFIG) specified_config = True else: # If no config is given, run with coverage if not specified_config: nose_args.extend(transform_nose_config_to_cmd(COVERAGE_CONFIG_FILE)) set_logging_profile(TESTING_LOG_CONFIG) specified_config = True ## need a fake $0 argument nose_args.insert(0, "") nose.main(argv=nose_args) def vm_run(args): """Run the tests on a qemu vm""" artefacts_dir = tempfile.mkdtemp(prefix="umake-test-artefacts-") cmds = ['autopkgtest'] # default target to test is current tree target = ['.'] # test package from archive or ppa (the most recent) if args.test_package: target = ["ubuntu-make"] # git checkout testing if args.test_git: target = [args.test_git] # local source package testing if args.test_source: target = [args.test_source] cmds.extend(target) cmds.extend([# artefacts saving "--output-dir", artefacts_dir, # env variables setting up tests '--env', "TESTS={}".format(' '.join(args.tests))]) # add emulator options cmds.extend(['--', 'qemu', '-o', '/var/tmp', args.image]) try: return_code = subprocess.call(cmds) print("Artefacts are available at {}".format(artefacts_dir)) except FileNotFoundError: print("autopkgtest isn't installed.") shutil.rmtree(artefacts_dir) return_code = 1 sys.exit(return_code) def remote_run(args): """Start a run on the official ubuntu instances""" # Note that we wrap arguments containing spaces with double quoting as they are passed through ssh # ssh connection to snakefruit cmds = ["ssh", "snakefruit.canonical.com", "sudo", "-i", "-u", "ubuntu-archive", # run-autopkgtest command "run-autopkgtest", "-s", args.series, # ensure we always add the ppa to be in correct swift container archive "--ppa", "ubuntu-desktop/ubuntu-make-builddeps", "--ppa", "ubuntu-desktop/ubuntu-make", # env variables setting up tests (with double quoting '--env', "'TESTS={}'".format(' '.join(args.tests))] # add architectures if any: for arch in args.architecture: cmds.extend(["-a", arch]) target = [] if args.test_package: target = ["ubuntu-make"] # git checkout testing, put results under ubuntu-make-git tag if args.test_git: target = ["--test-git", "'{}'".format(args.test_git), "ubuntu-make-git"] cmds.extend(target) sys.exit(subprocess.call(cmds)) def add_tests_arg(parser): """add the generic tests arguments to the parser""" parser.add_argument("tests", nargs='*', help="Action to perform: all (or omitted) to run all tests. " "small/medium/large/pep8 or nose syntax: " "tests.small.test_frameworks_loader:TestFrameworkLoaderSaveConfig.foo") class _GlobalHelp(argparse._HelpAction): def __call__(self, parser, namespace, values, option_string=None): parser.print_help() # retrieve local subparser from parser subparsers_actions = [ action for action in parser._actions if isinstance(action, argparse._SubParsersAction)] print(""" ------------------------------------------- Default mode is 'local' and can be omitted. -------------------------------------------""") subparsers_actions[0].choices['local'].print_help() parser.exit() if __name__ == '__main__': # ensure we have the right chmod on the ssh key to connect to docker containers (git by default reverts to x44) os.chmod(os.path.join(root_dir, "docker", "umake_docker"), 0o600) parser = argparse.ArgumentParser(description="Run umake tests. Specified list of test run in debug mode. " "Running a partial suite of tests is using a normal mode. " "Running all tests is using coverage by default.", add_help=False) parser.add_argument('--help', action=_GlobalHelp, help='Show this help') command_group = parser.add_subparsers(help='What mode to run tests with') local_mode = command_group.add_parser('local', help='run tests locally (default). Enable easy debugging but large ' 'tests requires sudo and impact your sessions.') vm_mode = command_group.add_parser('vm', help='run tests with vm_mode running on a qemu image.') remote_mode = command_group.add_parser('remote', help='run on official autopkgtests ubuntu instances (only for ' 'ubuntu archive admins or release team members)') ## local options local_mode.set_defaults(run=local_run) add_tests_arg(local_mode) local_mode.add_argument('-s', "--system", action="store_true", help="Use system umake instead of local one") local_mode.add_argument("--publish", action="store_true", help="Publish xunit results format") config_group = local_mode.add_argument_group('Run configuration options', description="The default configuration is to use the debug profile " "when running some manually specific list of tests. No profile is " "selected when running some suites of tests and coverage " "profile when selecting all tests.")\ .add_mutually_exclusive_group() config_group.add_argument("-c", "--config", help="Force using a particular nose profile, disable autoselection") config_group.add_argument("--coverage", action="store_true", help="Force using coverage profile even when some " "tests or tessuite") config_group.add_argument("--debug", action="store_true", help="Force using debug profile even when running " "all tests") config_group.add_argument("--no-config", action="store_true", help="Disable any automated or manual config " "selection") ## vm options vm_mode.set_defaults(run=vm_run) vm_mode.add_argument('image', metavar="image_path", help="Image against which running the tests. This is what " "determines as well the release and arch against which " "we are testing on. You can build one cloud image via: " "'buildvm-ubuntu-cloud -r trusty' for instance.") add_tests_arg(vm_mode) target_group = vm_mode.add_argument_group('Ubuntu Make test target', description="This defines which Ubuntu Make you want to test. Default " "is the local tree (what's your pwd). You can change it " "for a git tree/branch or package from archive.")\ .add_mutually_exclusive_group() target_group.add_argument("--test-git", metavar='GITURL [branchname]', help="A single URL or URL branchname. The test will be git cloned from " "that URL and ran from the checkout. This will not build binary " "packages from the branch and run tests against those, the test " "dependencies will be taken from the archive, or Ubuntu Make PPA.") target_group.add_argument("--test-package", action="store_true", help="Test the ubuntu-make package (system run) " "from the archive or Ubuntu Make PPA.") target_group.add_argument("--test-source", metavar='DSC or some/pkg.dsc', help='Build DSC and use its tests and/or generated binary packages') ## remote options remote_mode.set_defaults(run=remote_run) remote_mode.add_argument("series", help='Distro series name.') add_tests_arg(remote_mode) remote_mode.add_argument('-a', '--architecture', action='append', default=[], help='Only run test(s) on given architecture name(s). ' 'Can be specified multiple times (default: all).') target_group = remote_mode.add_argument_group('Ubuntu Make test target', description="This defines which Ubuntu Make you want to test. You " "can change between a git tree/branch of package from " "archive.")\ .add_mutually_exclusive_group(required=True) target_group.add_argument("--test-package", action="store_true", help="Test the ubuntu-make package (system run) " "from the archive or Ubuntu Make PPA.") target_group.add_argument("--test-git", metavar='GITURL [branchname]', help="A single URL or URL branchname. The test will be git cloned from " "that URL and ran from the checkout. This will not build binary " "packages from the branch and run tests against those, the test " "dependencies will be taken from the archive, or Ubuntu Make PPA.") # set local as default and parse cmd = sys.argv[1:] if "--help" not in cmd: if cmd[0] not in ["local", "vm", "remote"]: cmd.insert(0, "local") args = parser.parse_args(cmd) args.run(args) ubuntu-make-18.09+disco1/setup.py0000755000000000000000000001242413352651520013556 0ustar #!/usr/bin/env python3 # -*- coding: utf-8 -*- # Copyright (C) 2014 Canonical # # Authors: # Didier Roche # # 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; version 3. # # 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 from distutils import cmd from distutils.command.install_data import install_data as _install_data from distutils.command.build import build as _build import gettext from glob import glob import os from setuptools import setup, find_packages import subprocess import umake # that initializes the gettext domain from umake.settings import get_version I18N_DOMAIN = gettext.textdomain() PO_DIR = os.path.join(os.path.dirname(os.curdir), 'po') def get_requirements(tag_to_detect=""): """Gather a list of requirements line per line from tag_to_detect to next tag. if tag_to_detect is empty, it will gather every requirement""" requirements = [] tag_detected = False with open("requirements.txt") as f: for line in f.read().splitlines(): if line.startswith("#") or line == "": tag_detected = False if line.startswith(tag_to_detect): tag_detected = True continue if tag_detected: requirements.append(line) print(requirements) return requirements # # add translation support # class build(_build): sub_commands = _build.sub_commands + [('build_trans', None)] def run(self): _build.run(self) class build_trans(cmd.Command): description = 'Compile .po files into .mo files' user_options = [] def initialize_options(self): pass def finalize_options(self): pass def run(self): for filename in os.listdir(PO_DIR): if not filename.endswith('.po'): continue lang = filename[:-3] src = os.path.join(PO_DIR, filename) dest_path = os.path.join('build', 'locale', lang, 'LC_MESSAGES') dest = os.path.join(dest_path, I18N_DOMAIN + '.mo') if not os.path.exists(dest_path): os.makedirs(dest_path) if not os.path.exists(dest): print('Compiling {}'.format(src)) subprocess.call(["msgfmt", src, "--output-file", dest]) else: src_mtime = os.stat(src)[8] dest_mtime = os.stat(dest)[8] if src_mtime > dest_mtime: print('Compiling {}'.format(src)) subprocess.call(["msgfmt", src, "--output-file", dest]) class install_data(_install_data): def run(self): for filename in os.listdir(PO_DIR): if not filename.endswith('.po'): continue lang = filename[:-3] lang_dir = os.path.join('share', 'locale', lang, 'LC_MESSAGES') lang_file = os.path.join('build', 'locale', lang, 'LC_MESSAGES', I18N_DOMAIN + '.mo') self.data_files.append((lang_dir, [lang_file])) _install_data.run(self) class update_pot(cmd.Command): description = 'Update template for translators' user_options = [] def initialize_options(self): pass def finalize_options(self): pass def run(self): cmd = ['xgettext', '--language=Python', '--keyword=_', '--package-name', I18N_DOMAIN, '--output', 'po/{}.pot'.format(I18N_DOMAIN)] for path, names, filenames in os.walk(os.path.join(os.curdir, 'umake')): for f in filenames: if f.endswith('.py'): cmd.append(os.path.join(path, f)) subprocess.call(cmd) class update_po(cmd.Command): description = 'Update po from pot file' user_options = [] def initialize_options(self): pass def finalize_options(self): pass def run(self): source_pot = os.path.join(os.curdir, 'po', '{}.pot'.format(I18N_DOMAIN)) for po_file in glob(os.path.join(os.curdir, 'po', '*.po')): subprocess.check_call(["msgmerge", "-U", po_file, source_pot]) setup( name="Ubuntu Make", version=get_version(), packages=find_packages(exclude=["tests*"]), package_data={}, entry_points={ 'console_scripts': [ 'umake = umake:main', 'udtc = umake:main' ], }, data_files=[ ('lib/python3/dist-packages/umake', ['umake/version']), ("share/ubuntu-make/log-confs", glob('log-confs/*.yaml')), ('share/zsh/vendor-completions', ['confs/completions/_umake']), ], # In addition to run all nose tests, that will as well show python warnings test_suite="nose.collector", cmdclass={ 'build': build, 'build_trans': build_trans, 'install_data': install_data, 'update_pot': update_pot, 'update_po': update_po, } ) ubuntu-make-18.09+disco1/snap/0000755000000000000000000000000013352651520012777 5ustar ubuntu-make-18.09+disco1/snap/snapcraft.yaml0000644000000000000000000000306713352651520015652 0ustar name: ubuntu-make version: 'master' summary: Setup your development environment on ubuntu easily description: | Ubuntu Make provides a set of functionality to setup, maintain and personalize your developer environment easily. It will handle all dependencies, even those which aren't in Ubuntu itself, and install latest versions of the desired and recommended tools. . This is the latest master from ubuntu make, freshly built from https://github.com/ubuntu/ubuntu-make. It may contain even unreleased features! grade: stable confinement: classic apps: umake: command: bin/umake-wrapper completer: umake-completion parts: umake: source: . plugin: python organize: lib/python3/dist-packages/umake: lib/python3.5/site-packages/umake build-packages: - gettext - python3-apt - python3-argcomplete - python3-gi - python3-gnupg - python3-setuptools - python3-nose - python3-nose-cov - python3-nose-json - python3-pep8 - python3-pexpect - python3-progressbar - python3-yaml - python3-requests - python3-xdg - dbus-x11 - fakeroot - help2man stage-packages: - python3-apt - python3-argcomplete - python3-gi - python3-gnupg - python3-progressbar - python3-yaml - python3-requests - python3-xdg umake-completion: plugin: dump source: snap stage: - umake-completion umake-wrapper: source: snap/ plugin: dump organize: umake-wrapper: bin/umake-wrapper ubuntu-make-18.09+disco1/snap/umake-completion0000644000000000000000000000161413352651520016175 0ustar _umake() { local cur prev opts _init_completion -s || return COMPREPLY=() cur="${COMP_WORDS[COMP_CWORD]}" prev="${COMP_WORDS[COMP_CWORD-1]}" opts=$(ls $SNAP/lib/python3.5/site-packages/umake/frameworks/ | sed '/\(__init__\|baseinstaller\)/d' | sed 's/.py//g' | tr '\n' ' ') case "$prev" in go|web|maven|kotlin|ide|swift|nodejs|android|electronics|scala|games|rust|dart|crystal) frameworks=$(cat $SNAP/lib/python3.5/site-packages/umake/frameworks/$prev.py | grep -oP '(?<=super\(\).__init__\(name=")[\w\s]+(?=\")' | tr '[:upper:]' '[:lower:]' | tr ' ' '-' | tr '\n' ' ' | sed "s/$prev //g") COMPREPLY=( $(compgen -W "$frameworks" -- $cur)) return 0 ;; ubuntu-make.umake) COMPREPLY=( $(compgen -W "$opts" -- $cur) ) return 0 ;; esac } complete -F _umake ubuntu-make.umake ubuntu-make-18.09+disco1/snap/umake-wrapper0000755000000000000000000000137213352651520015510 0ustar #/bin/sh # Export LD_LIBRARY_PATH based on triplet if [ "$SNAP_ARCH" = "amd64" ]; then ARCH="x86_64-linux-gnu" elif [ "$SNAP_ARCH" = "armhf" ]; then ARCH="arm-linux-gnueabihf" elif [ "$SNAP_ARCH" = "arm64" ]; then ARCH="aarch64-linux-gnu" else ARCH="$SNAP_ARCH-linux-gnu" fi export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$SNAP/lib:$SNAP/usr/lib:$SNAP/lib/$ARCH:$SNAP/usr/lib/$ARCH" # Set those environments here. If exported in snapcraft.yaml, they don't have any effect (while being exported) anymore. export PYTHONUSERBASE=$SNAP export PYTHONHOME=$SNAP/usr # We need to set our local python3 binary in PATH so that system one isn't used (especially when executing subprocess if sudo needed) export PATH=$SNAP/usr/bin/:$PATH exec "$SNAP/bin/umake" "$@" ubuntu-make-18.09+disco1/tests/0000755000000000000000000000000013415340675013206 5ustar ubuntu-make-18.09+disco1/tests/__init__.py0000644000000000000000000000277413352651520015323 0ustar # -*- coding: utf-8 -*- # Copyright (C) 2014 Canonical # # Authors: # Didier Roche # # 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; version 3. # # 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 """Ensure we keep a sane formatting syntax""" import os import pep8 from .tools import get_root_dir import umake from unittest import TestCase class CodeCheck(TestCase): def test_pep8(self): """Proceed a pep8 checking Note that we have a .pep8 config file for maximum line length tweak and excluding the virtualenv dir.""" pep8style = pep8.StyleGuide(config_file=os.path.join(get_root_dir(), '.pep8')) # we want to use either local or system umake, but always local tests files umake_dir = os.path.dirname(umake.__file__) results = pep8style.check_files([umake_dir, os.path.join(get_root_dir(), "tests"), os.path.join(get_root_dir(), "bin")]) self.assertEqual(results.get_statistics(), []) ubuntu-make-18.09+disco1/tests/daily_runs/0000755000000000000000000000000013352651520015351 5ustar ubuntu-make-18.09+disco1/tests/daily_runs/get_binary_depends0000755000000000000000000000457213352651520021134 0ustar #!/usr/bin/env python3 # -*- coding: utf-8 -*- # Copyright (C) 2014 Canonical # # Authors: # Didier Roche # # 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; version 3. # # 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 import argparse import sys if __name__ == '__main__': parser = argparse.ArgumentParser(description="Parse debian/control for provided binary package and echo all " "dependencies.") parser.add_argument("binary", help="binary package name to grab dependencies") args = parser.parse_args() try: in_binary_section = False in_depends_section = False depends = [] with open("debian/control") as f: for line in f.readlines(): line = line.rstrip() if line == "Package: {}".format(args.binary): in_binary_section = True if not in_binary_section: continue if line.startswith("Depends: "): line = line.replace("Depends: ", "") in_depends_section = True elif line.startswith("Recommends: "): line = line.replace("Recommends: ", "") in_depends_section = True else: # we are getting out of the depends or binary sections if not line: in_binary_section = False elif line[0] != " ": in_depends_section = False if not in_depends_section: continue line_deps = line.split(",") depends.extend([dep.strip() for dep in line_deps if (dep.strip() != "" and dep.strip()[0] != "$")]) except OSError: print("Can't find debian/control") sys.exit(1) print(" ".join(depends)) ubuntu-make-18.09+disco1/tests/daily_runs/install_build_tests_depends0000755000000000000000000000051513352651520023051 0ustar #!/bin/bash # install test depends from autopkgtests requirements and build-deps # devscripts and equivs are needed for mk-build-deps apt -y --no-install-recommends install $(grep Depends debian/tests/control | tr -d , | tr -d @ | sed 's/Depends: builddeps//') devscripts equivs mk-build-deps -i -t "apt -y --no-install-recommends" ubuntu-make-18.09+disco1/tests/data/0000755000000000000000000000000013415340675014117 5ustar ubuntu-make-18.09+disco1/tests/data/__init__.py0000644000000000000000000000000013352651520016210 0ustar ubuntu-make-18.09+disco1/tests/data/abstractframeworks/0000755000000000000000000000000013415340675020023 5ustar ubuntu-make-18.09+disco1/tests/data/abstractframeworks/__init__.py0000644000000000000000000000000013352651520022114 0ustar ubuntu-make-18.09+disco1/tests/data/abstractframeworks/category.py0000644000000000000000000000234213352651520022205 0ustar # -*- coding: utf-8 -*- # Copyright (C) 2014 Canonical # # Authors: # Didier Roche # # 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; version 3. # # 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 """Abstract framework with category module""" import umake.frameworks class ACategory(umake.frameworks.BaseCategory): def __init__(self): super().__init__(name="Category A", description="Category A description") class FrameworkA(umake.frameworks.BaseFramework): def __init__(self, **kwargs): super().__init__(name="Framework A", description="Description for framework A", install_path_dir="custom/frameworka", **kwargs) # No setup() or other virtual interfaces ubuntu-make-18.09+disco1/tests/data/api.dartlang.org.crt0000644000000000000000000000242613352651520017761 0ustar -----BEGIN CERTIFICATE----- MIIDkzCCAnugAwIBAgIJALSb3qXZ19zRMA0GCSqGSIb3DQEBCwUAMGAxCzAJBgNV BAYTAkZSMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX aWRnaXRzIFB0eSBMdGQxGTAXBgNVBAMMEGFwaS5kYXJ0bGFuZy5vcmcwHhcNMTUw OTMwMTQyMTE4WhcNMjUwODA4MTQyMTE4WjBgMQswCQYDVQQGEwJGUjETMBEGA1UE CAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0cyBQdHkgTHRk MRkwFwYDVQQDDBBhcGkuZGFydGxhbmcub3JnMIIBIjANBgkqhkiG9w0BAQEFAAOC AQ8AMIIBCgKCAQEAv6jtbTZmb+xQa1jbFuXPdNNW6k3S0WDVEFlu4RBGM1RYJ1u+ XtC9vEKJMCzQqUDnEObTB/hYTll79x9+ZOnUzwiHFTM8MhQMo4h0ShXnncOBae4X 1zVi6d+SRrGPjXCOJi3ghdnsnoFMz/QW6v0CfsDgiq0/siQ2sXYoaxNIRbtlWmyH Cr2LfYXm//+L9fQSOvCXsfgHv10XSysHS9u2+fq4he463hmpxIKPtZ1f94sq2yg5 va2xYfceaF7jen0uxBcQMwJqO+lIN9WCsrpmWLTERzVzuN/H0DK8xjCfgSlhrz5w AhIZ0ZG0SXMr+XnMMC9UN0lstj+F0tE5MKSMbwIDAQABo1AwTjAdBgNVHQ4EFgQU INl38sv3/6yjLDjbyjR5slQNa0IwHwYDVR0jBBgwFoAUINl38sv3/6yjLDjbyjR5 slQNa0IwDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAYvDi9QURcC6i 4zHdnYSklEQSrIrbiqfVUKokol5fa8ohdwI53mYRviwrAMJT5NOVWW0ZGLI+o2H7 4HtGV+BX4++2UmvoK2DgPSg70hGJRsHJhDwhkjo27Gtkdn4xE6Fr9JfVIWQ2NCoW lJ2a6ZN6gzEtTMz2CT8M1AoXteI0tCwDS9azrcIjmNPMeKB3TxHU3D1Hdaos6Ahy LUUhNt5ETwA5ua4nZnkmeBCFk9S4lexnrH2J+qBi9YJLsPvbGiGcH+nJCXCKAHou D12o6JFY+Oxm2ccH3obX+yr2VMbN9vNU6s0/EzXTBYUkh6a116XAvJIp4sURAB42 8NvYomFOig== -----END CERTIFICATE----- ubuntu-make-18.09+disco1/tests/data/api.dartlang.org.pem0000644000000000000000000000567613352651520017764 0ustar -----BEGIN PRIVATE KEY----- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC/qO1tNmZv7FBr WNsW5c9001bqTdLRYNUQWW7hEEYzVFgnW75e0L28QokwLNCpQOcQ5tMH+FhOWXv3 H35k6dTPCIcVMzwyFAyjiHRKFeedw4Fp7hfXNWLp35JGsY+NcI4mLeCF2eyegUzP 9Bbq/QJ+wOCKrT+yJDaxdihrE0hFu2VabIcKvYt9heb//4v19BI68Jex+Ae/XRdL KwdL27b5+riF7jreGanEgo+1nV/3iyrbKDm9rbFh9x5oXuN6fS7EFxAzAmo76Ug3 1YKyumZYtMRHNXO438fQMrzGMJ+BKWGvPnACEhnRkbRJcyv5ecwwL1Q3SWy2P4XS 0TkwpIxvAgMBAAECggEAfNMNhzKF9uEG41Mkpb4YpjK6ibET26/gNFy63TQXNHj7 TO7whpoW6JTA+rJFV+ZgV16uFKPHB4g6N5G4ZQrxwcEBEWqkCs2KCbvmWRX5GoPp Nk+OEWjAuicVApvELc8flXgNob9z3yvBFjMX9gXAaUM/OrJpKKFzSZL18f7F9Dtd x0zpf2BDefqy9eaNJOL6OVyUh4Ay38SbL1LnXsoIKwnt8Mfq/gRR5JCJvUlD/Pof ZQlLOEp2Q1FcgWWKfAlQEohnMxeeXBH1D03dx2l9vhr68YOr5y0S4IHyAR4JZMTq DGhZE3CTX9/tQ86CNEhfsCirRU2rkrg3JFrweNd8QQKBgQDxZsgBt8o0l4QyiXAJ j75MHt4Tsuxj/HTpnODX/diCTSrA/DNZcg1MuME0Y8WEpux3VVWaG4Cshuh1MEEp J53qPmxSjbgl/l8x/VBzZ+xCUxGDv6WfVehz4yUDIQ6/HA6fTlnh0MxcaJSF1gpd tqu8z4nXlb6dsyAEctg3m1zPDwKBgQDLQBRKCn5kHze7jH9C5iDb9Q71qg27C22l SA1pcTwQctBhg1+PlXLVs9IEOmRjIzFRo6a086snQoUZRpgkRQrrFdY/79MdDBky gA01Baf1Wa3fq24vnlsD7l5A1sNZg4RcqVe5+JJ81IOW0w/oXT1FCSlqbyTUlnU7 O/xobVRsoQKBgQClUuG5I3itCfN0dOGw+qu2EBHBZfE1DMm40ELASc4EdvrHzjEQ meZ327QdwBKepX8evudwMlOuVHpQ/6owmDwzF2syInKyOoJRhw2Y69xHFALTuuWf uMMI0tAfU3147qso+QzfdRLwWoMVIaBZy+fT2EKrzZcNA4by5QAlHRaziwKBgG1x 8fr0r56GWOJ7A0Qo22TWDtomWgJwYvhvVhmDSg6pZKA9t8V/ejis/dgdAVWI69PE Rc6Gr5ESds1ngCF3tCtmtNn08D9h9meFIJd+ljS9t60LiOfHY8c4IjTT8JlRAoNL BNw1h9wEK1+aA6TiIE3+YvjXJIP9CN9+q6onxSBBAoGAQCQB+kDXWA5qnegDTgPq 7v0o1ToWnGXySFNFS+EDCsPmRD+tx4ArVegocaH8kyo2eDM1y1EBWmMT+wbbAmbT /26MTkQhJrFh6Tgh7RBRIYwkk6CgjCQHqhSSGcgMpevcFSchDZ3Mu0JEStHEFqr/ iJCaY82855sNTKV91XvaNHU= -----END PRIVATE KEY----- -----BEGIN CERTIFICATE----- MIIDkzCCAnugAwIBAgIJALSb3qXZ19zRMA0GCSqGSIb3DQEBCwUAMGAxCzAJBgNV BAYTAkZSMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX aWRnaXRzIFB0eSBMdGQxGTAXBgNVBAMMEGFwaS5kYXJ0bGFuZy5vcmcwHhcNMTUw OTMwMTQyMTE4WhcNMjUwODA4MTQyMTE4WjBgMQswCQYDVQQGEwJGUjETMBEGA1UE CAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0cyBQdHkgTHRk MRkwFwYDVQQDDBBhcGkuZGFydGxhbmcub3JnMIIBIjANBgkqhkiG9w0BAQEFAAOC AQ8AMIIBCgKCAQEAv6jtbTZmb+xQa1jbFuXPdNNW6k3S0WDVEFlu4RBGM1RYJ1u+ XtC9vEKJMCzQqUDnEObTB/hYTll79x9+ZOnUzwiHFTM8MhQMo4h0ShXnncOBae4X 1zVi6d+SRrGPjXCOJi3ghdnsnoFMz/QW6v0CfsDgiq0/siQ2sXYoaxNIRbtlWmyH Cr2LfYXm//+L9fQSOvCXsfgHv10XSysHS9u2+fq4he463hmpxIKPtZ1f94sq2yg5 va2xYfceaF7jen0uxBcQMwJqO+lIN9WCsrpmWLTERzVzuN/H0DK8xjCfgSlhrz5w AhIZ0ZG0SXMr+XnMMC9UN0lstj+F0tE5MKSMbwIDAQABo1AwTjAdBgNVHQ4EFgQU INl38sv3/6yjLDjbyjR5slQNa0IwHwYDVR0jBBgwFoAUINl38sv3/6yjLDjbyjR5 slQNa0IwDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAYvDi9QURcC6i 4zHdnYSklEQSrIrbiqfVUKokol5fa8ohdwI53mYRviwrAMJT5NOVWW0ZGLI+o2H7 4HtGV+BX4++2UmvoK2DgPSg70hGJRsHJhDwhkjo27Gtkdn4xE6Fr9JfVIWQ2NCoW lJ2a6ZN6gzEtTMz2CT8M1AoXteI0tCwDS9azrcIjmNPMeKB3TxHU3D1Hdaos6Ahy LUUhNt5ETwA5ua4nZnkmeBCFk9S4lexnrH2J+qBi9YJLsPvbGiGcH+nJCXCKAHou D12o6JFY+Oxm2ccH3obX+yr2VMbN9vNU6s0/EzXTBYUkh6a116XAvJIp4sURAB42 8NvYomFOig== -----END CERTIFICATE----- ubuntu-make-18.09+disco1/tests/data/api.github.com.crt0000644000000000000000000000212313352651520017430 0ustar -----BEGIN CERTIFICATE----- MIIDBTCCAe2gAwIBAgIJAJLCdMijBMgAMA0GCSqGSIb3DQEBCwUAMBkxFzAVBgNV BAMMDmFwaS5naXRodWIuY29tMB4XDTE2MDIyNTE1MzQ1MloXDTI2MDEwMzE1MzQ1 MlowGTEXMBUGA1UEAwwOYXBpLmdpdGh1Yi5jb20wggEiMA0GCSqGSIb3DQEBAQUA A4IBDwAwggEKAoIBAQDddFGLJWAcen/LvQTd5tVEnNLsix3y53zce4vK98PAaVMe 75WepjFAr92Oo9Hdpbij+NZGXq2zJP8N1qg75iyn30jkf9uevy5J0+L1gfJnBrxU aaWvEpdQIeiiRJZ0jx9BynLltg0Sd6PsLPMJjgjujSBRG/aI2jwj/7R4cJOE0oOq gwUtFzM7i+/QZgTwK5+/o7BuosbHl+E7kf/Ll/fjo3oqgU1+FHDmfSum4l8ELc0W CnZM9AP62DzebiiEYkVYUV6OJWvIfjnNz7ILWObU1kf7aWmISadjeORGNCkrC10O FksMqXxIJftyRmfC8QN3+lHpKMT0cVmSNDlC51rRAgMBAAGjUDBOMB0GA1UdDgQW BBTwMJe9dMeSnAI4fMQe3F+MVFgHIDAfBgNVHSMEGDAWgBTwMJe9dMeSnAI4fMQe 3F+MVFgHIDAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQDNZ9ZT4Ev7 5bZcf0tmJdO62iBnoMlYTJiZw+5AuXzlw9/oxOANlaZ65gnawOINpqiPkXfjQo7o BnEluB/oYsXIKGnGhkKHvrXCqCP0QiCP/TdAAKMZcE1bfRkwmAUUATiLlfYkgU4s DCHv1Nk/lsur1ua/BIIrRbPbuuogWiA9rvCOUAlcXeQN36z5pTt1a1yJE1zkpD8X f5G8/gUvgR71Uc6Z9f+8uvTPm30G0+5Jk5x2NLAYR19cG0iNI6aaHtqcly4n4ukb zVTOkCB1tcdeBMJabbFdV+Db5OC4fdjbhRn19OvO/Lh0rdPtQaV6+gFaTSWNHIRl kxFnA2y/C7en -----END CERTIFICATE----- ubuntu-make-18.09+disco1/tests/data/api.github.com.pem0000644000000000000000000000536713352651520017436 0ustar -----BEGIN PRIVATE KEY----- MIIEuwIBADANBgkqhkiG9w0BAQEFAASCBKUwggShAgEAAoIBAQDddFGLJWAcen/L vQTd5tVEnNLsix3y53zce4vK98PAaVMe75WepjFAr92Oo9Hdpbij+NZGXq2zJP8N 1qg75iyn30jkf9uevy5J0+L1gfJnBrxUaaWvEpdQIeiiRJZ0jx9BynLltg0Sd6Ps LPMJjgjujSBRG/aI2jwj/7R4cJOE0oOqgwUtFzM7i+/QZgTwK5+/o7BuosbHl+E7 kf/Ll/fjo3oqgU1+FHDmfSum4l8ELc0WCnZM9AP62DzebiiEYkVYUV6OJWvIfjnN z7ILWObU1kf7aWmISadjeORGNCkrC10OFksMqXxIJftyRmfC8QN3+lHpKMT0cVmS NDlC51rRAgMBAAECggEAJPQcB1QdTaNDYAQSo9S5EdH5gG9WeAoY09Hp6dyeVaU9 sZPZK7gfz+OI3RyJEKtuvC3x05xI7/Pke7KuMBCgswKXb0nGpB7S4o7w+HbOtFJz asKWWziG92AxKaK4WIrpdFkMAzj1xXcha2+0vottAiGamu5HnV6NWpR40QA4HZmT 1bzfkxpKWfDuaLjXyehHmqtm5KOxDp/ePzOaZexo8JRKnnjEhYJpgjGtaCSQBCtF cYmqJVPGIKQXTl3NDh7qzO8xW0wK7F+qEGFxPljfRv35RtXOx5yIqS1p5ExSzDed HwygXOl1bgJc0PINqRL5SA9m4jO9TXJary2Yg3llYQKBgQDx3M9VPFSn5FvmCSYd F2mfDTK6+9wdBQmmsjNMVBAsRsVwCDJYUu/u51/wwKtgi6Kg9RVfpkDm85g8Z8dp 0udOQ5Fv6o+ovypx/ffdpKAZX5r7Gp1vwb5CG/Ln26WIKrpeRYYL0q8ygrenQ3oD B16Xnp+kdMvvSzk7m/0w4aMAWwKBgQDqZh/OR2xFk5l2u0giNgRy3RGZ3yVKApSr S7beUPr+bwz4R08TLBqa+6sw7mieAkxmEf8daqJdiJpEkp9ceKTkc3Zf4UIX3FJR pIBV/3xemLC2kunOw3h5jus6XO2Yv6a79Xe6akBF2dkx1a8GRlNBdGYgNuBPjANN rhvitp45QwKBgQDl3WQ3sAUNI92rfRp6H5xEi7ihOWlzMyx+/3H9ow9T5VcUKNYg V4KtXb0zBQpb0ZoYu5U6uLmKRg1zq3Y8vzMSkOkSoq0yRa1DdYozXpjCRLj42cyz QEFgd0uezIRAK8vAePbzGaNksBN3pou5gTGHjDxRgqenn6ifXJt/75KJbQJ/TOk1 hnnpDOthb5QEFzWiQA5JuDOACMjP/2TYnBn2QYYuu0iqqZ/PGwt5IJUZvr8CUnuV OhHDNO2dsOJrZ+wuLse0D8HZ7fpdCGzxr0YliOSRF1cdYLrCzSAYDw5u56/7BbGF l6VFcaYJnlB/HY/1wYRv/iIDeBZ4/wQiIkHJqQKBgFdxOK44wwfyuJE3LHz9igNd /+gdsUDKwm8Zt/8g0AE+h/Gr9QZqgYFQnxdFyf7VN/cbfOrwWzFGZXdT8SRMnDF5 0RoUEVe9+pieK2j5uNvdi75dFJEjGA7z4H8ojt/rB4IN3/B1T2UnKD+giWpjd12z 9EiT7Vsi+GVHE3KL6X3e -----END PRIVATE KEY----- -----BEGIN CERTIFICATE----- MIIDBTCCAe2gAwIBAgIJAJLCdMijBMgAMA0GCSqGSIb3DQEBCwUAMBkxFzAVBgNV BAMMDmFwaS5naXRodWIuY29tMB4XDTE2MDIyNTE1MzQ1MloXDTI2MDEwMzE1MzQ1 MlowGTEXMBUGA1UEAwwOYXBpLmdpdGh1Yi5jb20wggEiMA0GCSqGSIb3DQEBAQUA A4IBDwAwggEKAoIBAQDddFGLJWAcen/LvQTd5tVEnNLsix3y53zce4vK98PAaVMe 75WepjFAr92Oo9Hdpbij+NZGXq2zJP8N1qg75iyn30jkf9uevy5J0+L1gfJnBrxU aaWvEpdQIeiiRJZ0jx9BynLltg0Sd6PsLPMJjgjujSBRG/aI2jwj/7R4cJOE0oOq gwUtFzM7i+/QZgTwK5+/o7BuosbHl+E7kf/Ll/fjo3oqgU1+FHDmfSum4l8ELc0W CnZM9AP62DzebiiEYkVYUV6OJWvIfjnNz7ILWObU1kf7aWmISadjeORGNCkrC10O FksMqXxIJftyRmfC8QN3+lHpKMT0cVmSNDlC51rRAgMBAAGjUDBOMB0GA1UdDgQW BBTwMJe9dMeSnAI4fMQe3F+MVFgHIDAfBgNVHSMEGDAWgBTwMJe9dMeSnAI4fMQe 3F+MVFgHIDAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQDNZ9ZT4Ev7 5bZcf0tmJdO62iBnoMlYTJiZw+5AuXzlw9/oxOANlaZ65gnawOINpqiPkXfjQo7o BnEluB/oYsXIKGnGhkKHvrXCqCP0QiCP/TdAAKMZcE1bfRkwmAUUATiLlfYkgU4s DCHv1Nk/lsur1ua/BIIrRbPbuuogWiA9rvCOUAlcXeQN36z5pTt1a1yJE1zkpD8X f5G8/gUvgR71Uc6Z9f+8uvTPm30G0+5Jk5x2NLAYR19cG0iNI6aaHtqcly4n4ukb zVTOkCB1tcdeBMJabbFdV+Db5OC4fdjbhRn19OvO/Lh0rdPtQaV6+gFaTSWNHIRl kxFnA2y/C7en -----END CERTIFICATE----- ubuntu-make-18.09+disco1/tests/data/apt/0000755000000000000000000000000013352651520014675 5ustar ubuntu-make-18.09+disco1/tests/data/apt/Packages0000644000000000000000000000463313352651520016344 0ustar Package: testpackage Version: 0.0.1 Architecture: all Maintainer: Didier Roche Installed-Size: 26 Filename: ./testpackage_0.0.1_all.deb Size: 1698 MD5sum: 09c049be56996d2856d63a1fff8bc5fe SHA1: c51ac45e9a9d5f6dcc78de7db33d766d24f80b4f SHA256: a51e9128ccc800f6ab36bf25d7ced128cbbadfffb34d243198795913fd72e7c4 Section: misc Priority: extra Description: Dummy package for testing Package used for testing debs installation Package: testpackage0 Source: testpackage Version: 0.0.1 Architecture: all Maintainer: Didier Roche Installed-Size: 26 Filename: ./testpackage0_0.0.1_all.deb Size: 1714 MD5sum: 6805bc475b48d82af3766f82c36e14aa SHA1: 8e6f1924aff2086afc2bbc9c9aa6ac8c9464fb04 SHA256: 152d328d7bd757bc11f2e5f0dd496768c745038946151cb5c5191e17f08e66ff Section: misc Priority: extra Description: Dummy package for testinga - other Package used for other testing debs installation Package: testpackage1 Source: testpackage Version: 0.0.1 Architecture: all Maintainer: Didier Roche Installed-Size: 26 Depends: testpackage Filename: ./testpackage1_0.0.1_all.deb Size: 1722 MD5sum: a7e3f78b1371a282c39ea3b4748ec983 SHA1: cb64e24b8cd567160cd2e912f8cd878e13b6d6cc SHA256: 26ba2636e06ef1a8d637f5b37dfdf2d14be7971a20ccbae09481e63bb158cf7e Section: misc Priority: extra Description: Dummy package for testing - dep Package used for testing debs installation with dep Package: testpackage2 Source: testpackage Version: 0.0.1 Architecture: all Maintainer: Didier Roche Installed-Size: 26 Conflicts: testpackage (<< 0.2) Filename: ./testpackage2_0.0.1_all.deb Size: 1732 MD5sum: f141d37818d53249b0468982a3f9d3e6 SHA1: d8474882876dd15c69e8a904612440782379f17d SHA256: 51d581dd1f6502c179fae4c5e00440906b13ab01d6e7a5462da6b324f62a5241 Section: misc Priority: extra Description: Dummy package for testing - breaks Package used for testing debs installation with break Package: testpackagefoo Source: testpackage Version: 0.0.1 Architecture: foo Maintainer: Didier Roche Installed-Size: 26 Filename: ./testpackagefoo_0.0.1_foo.deb Size: 1726 MD5sum: 394ae0f62d30e74d81efda4d90a9fea5 SHA1: e2cc8783b86694b576ec8d268919c81f1bef06e1 SHA256: a78ff29d30d85b2acd83ee0cae2d0961eb5e685cc77f921f61cb928140c7b559 Section: misc Priority: extra Multi-Arch: foreign Description: Dummy package for testing - only available on foo Package used for testing debs installation ubuntu-make-18.09+disco1/tests/data/apt/Release0000644000000000000000000000145613352651520016206 0ustar Date: Fri, 18 Nov 2016 09:37:28 UTC MD5Sum: e57e979a05a98a765bc79d198d028728 2459 Packages 89912e52654745f45d83cbe17fdca2f4 36 Release SHA1: 026f6908ec1b0da0bf74ce734d2569206953c45d 2459 Packages 678f76f2a915115cebd94106ee9ed16997e70394 36 Release SHA256: 1a565bd9d62220c369bbf941a99813da613c1fcb093c67ba3a6a6b7b13bb0874 2459 Packages 375f7cda62470aea285cc1282da9c3b6267f50768a0d40c01c60f297b16db44e 36 Release SHA512: 402520dfe426361f9acd100b957f04ce14bd5ddd0b28995a6e1d3c1e39f26772211c8edb2da70c4cc825244909ef5cc6b5a7a73a59eff01bf63db1d6ee3db353 2459 Packages c00ba55fb8ff2fa8b69aa89c50a3e433c33c614fbefab4154cf4c068218b29da8ff1ab26e4db5164554808103743ff8e19c713b8dd06340236916500f949c7ab 36 Release ubuntu-make-18.09+disco1/tests/data/apt/create_package_list.sh0000755000000000000000000000142413352651520021206 0ustar #/bin/sh # Copyright (C) 2014 Canonical # # Authors: # Didier Roche # # 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; version 3. # # 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 dpkg-scanpackages . /dev/null > Packages apt-ftparchive release . > Release ubuntu-make-18.09+disco1/tests/data/apt/states/0000755000000000000000000000000013352651520016200 5ustar ubuntu-make-18.09+disco1/tests/data/apt/states/testpackage_installed_dpkg_status0000644000000000000000000000040713352651520025066 0ustar Package: testpackage Status: install ok installed Priority: extra Section: misc Installed-Size: 26 Maintainer: Didier Roche Architecture: all Version: 0.0.0 Description: Dummy package for testing Package used for testing debs installation ubuntu-make-18.09+disco1/tests/data/apt/testpackage/0000755000000000000000000000000013352651520017170 5ustar ubuntu-make-18.09+disco1/tests/data/apt/testpackage/debian/0000755000000000000000000000000013352651520020412 5ustar ubuntu-make-18.09+disco1/tests/data/apt/testpackage/debian/changelog0000644000000000000000000000042113352651520022261 0ustar testpackage (0.0.1) trusty; urgency=low * Initial release * Note: to add foo architecture, add it to: /usr/share/dpkg/cputable (copying your current arch line). And then: $ debuild -afoo -- Didier Roche Wed, 11 Jun 2014 14:00:13 +0200 ubuntu-make-18.09+disco1/tests/data/apt/testpackage/debian/compat0000644000000000000000000000000213352651520021610 0ustar 9 ubuntu-make-18.09+disco1/tests/data/apt/testpackage/debian/control0000644000000000000000000000262413352651520022021 0ustar Source: testpackage Section: misc Priority: extra Maintainer: Didier Roche Build-Depends: debhelper (>= 9.0.0) Standards-Version: 3.9.5 Package: testpackage Architecture: all Depends: ${shlibs:Depends}, ${misc:Depends}, Description: Dummy package for testing Package used for testing debs installation Package: testpackage0 Architecture: all Depends: ${shlibs:Depends}, ${misc:Depends}, Description: Dummy package for testinga - other Package used for other testing debs installation Package: testpackage1 Architecture: all Depends: ${shlibs:Depends}, ${misc:Depends}, testpackage, Description: Dummy package for testing - dep Package used for testing debs installation with dep Package: testpackage2 Architecture: all Depends: ${shlibs:Depends}, ${misc:Depends}, Conflicts: testpackage (<< 0.2), Description: Dummy package for testing - breaks Package used for testing debs installation with break Package: testpackagefoo Architecture: foo Multi-Arch: foreign Depends: ${shlibs:Depends}, ${misc:Depends}, Description: Dummy package for testing - only available on foo Package used for testing debs installation Package: testpackagearmhf Architecture: armhf Multi-Arch: foreign Depends: ${shlibs:Depends}, ${misc:Depends}, Description: Dummy package for testing - only available on armhf Package used for testing debs installation ubuntu-make-18.09+disco1/tests/data/apt/testpackage/debian/copyright0000644000000000000000000000170413352651520022347 0ustar Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ Upstream-Name: testpackage Source: www.example.com Files: * Copyright: 2014 Didier Roche License: GPL-2+ This package 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 package 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 . On Debian systems, the complete text of the GNU General Public License version 2 can be found in "/usr/share/common-licenses/GPL-2". ubuntu-make-18.09+disco1/tests/data/apt/testpackage/debian/rules0000755000000000000000000000006213352651520021470 0ustar #!/usr/bin/make -f # -*- makefile -*- %: dh $@ ubuntu-make-18.09+disco1/tests/data/apt/testpackage/debian/source/0000755000000000000000000000000013352651520021712 5ustar ubuntu-make-18.09+disco1/tests/data/apt/testpackage/debian/source/format0000644000000000000000000000001513352651520023121 0ustar 3.0 (native) ubuntu-make-18.09+disco1/tests/data/apt/testpackage0_0.0.1_all.deb0000644000000000000000000000326213352651520021273 0ustar ! debian-binary 1404741350 0 0 100644 4 ` 2.0 control.tar.gz 1404741350 0 0 100644 426 ` ‹íÔQkÛ0`?ëWèÔ–eK±Ã-äeƒ²ÀÞeéb‹ÚVdXúë§8´ƒuOI)ÜF–|œe§¼È®Ž%!Ö1ù{\ïK^ )xUÕ2­o6œgTd7°„¨<¥™w.¾÷¿çŸT^LF„e W®¿¬ëÖŸóòmýËó,£ ëu•Ô¢­ZmÙì84¥äü ˜‚&Í(]‚/ <Æé"BˆG¥ŸT¬Ðƒš{]Ÿ÷ϤղbJ˜V×U¬k”‘Œ™RmdÓ4ïgrÇ“·ýI†nÛÿÚÍÑ»ñû¿.Å«þçþ¯xý —ÜÒ×íHönñúí"ù >X7o)ËY^’¯AÇŧ@5Žä»²sLø-ÝYcÁÓN@¿k¼ÓOá~é–9.¹vÓWòmN~ÁÜíísJÁ%Ù§të+&4yôÖyO[ ¿¢WdA{{¼Dì–i:Ñ—½Ñƒóë^íÜ+zG]Àúòméܳ†¬ë©.P{Ù…:gų!„B!„B!„B!„ÐgõÁóº1(data.tar.xz 1404741350 0 0 100644 1096 ` ý7zXZi"Þ6!t/å£à'ÿ ] ¼}•ÀJ>yÂÌ&£Ta»o4­†=ù&»ÁT‹†´!£}ª©ð^"C2*A}aÏ s`2ü°¸|’ä©#Lú øþ]<ì)íWŸƒh4n(Ʀ­ @"_™RðZV‚”†{2WÈõ œ ñ×I±$œö¾î÷ vç Œ i˜|Äüe¥´„ø~?ÜÅ2‚—™’Œ‰¾¨¬ÏÇG5Ń_oÔÙ™˜Ì­Ií²î/ó‘®fv˜-š„7ûô;”¸ã õ’­ÈW­ ðéÔö"*Á/ «¯Ój¥h½·ÕïøM¸ w_½¥5}ë2˜ËÆøµZˆâl§ûÈ´GÇ­ìÂá.êÓÛb«ï¿'Ž7iõŽH~n~KìÓ §“AåF®¢}ú—´÷òA  »5/o¥Æ1Ûwÿ 6L¹qów<{ëÛg.t8ª©´„Rã^™…žçñj ÃvÅ*³ÉN›!Ž×¼NðL ¼6¶Q^„«:”^ë½H‰Î_L5¡Ñ3™Ò‡ßjF‚É`íºÈó‘ž.öjpGó܆l“%!eÒÍK² ÈÚëTÏà)c,¼uóçrÌ–«ÃíDw™ë(Ð[%e ‚ÏTKÏ¿G7E”ˆjÈ@f1ÒÛÈ€¦®lúÒ}^’×L=³–jEXÿƒ¤¼aÖêó÷=®Ü©ù>½ªBî#½ä‰!$Í8=Ô$“@¦—<—YŤÔAÙ›¦e¸ Evù\OªÔ,•aZêˆrþ,hæùXÅä¯Ã`Z™"æ0L í!}éDz´Æ#mXÓ«&‰Ìëyeé@ =©¼@œBQ¿l¤ «`’†ZX*£ç)A'+ƒq—Òœßyajõ†l´}‚ØNÛ,o)ó’C ± D6SÑ©¯ÅÐBDžaÜÆœp¼ªžïçPz¦Hî~ ù]+‘y²~~ нÆ;‰Š“ŒýŒñŸ œ9ºí4Ȯ•×<ù„·œI‚ýƒ;Œ,)m´êˆ¥y^èæÓAõCJs½_ïKUôâi¬D›éɹ)@õ]ô“ÛŒÞám¦Î|`ŸÃ—a¡àSD„ynp¿ÜÊ~›a“~¬Y(  ˜|zÊí J\¥°Ö=P^¾‘Q{«›K†‰Äúv.PiÉzÆátô× kHå™(;» þkÙêF9{€Ã¶R²{nι&• ±$çpâûE(ᄀC›=%g³c–ñ˜XNô„ÌL‡ WFœ±aŸuÅ”Ÿ³Á#b«ue¥@{ ܳZûá))wÈHÚòñ”ó[ù•÷&wo Ê¹fª¸Ëô\²äžªêº:²´6„Õõ˜qÚ„úU,x^¤€PoTMð>0 ‹YZubuntu-make-18.09+disco1/tests/data/apt/testpackage1_0.0.1_all.deb0000644000000000000000000000327213352651520021275 0ustar ! debian-binary 1404741350 0 0 100644 4 ` 2.0 control.tar.gz 1404741350 0 0 100644 433 ` ‹íÔÍjÜ0`ŸõzøG¶´öRJ {顲»,ÍÚ"¶e$™vóôÑzsÈšžvÓÂ|`lýl£4K®.6œ¯÷èý}}.XÉgeY‰Ø¿Ù0–PžÜÀâƒt”&ÎÚðѼ¿ÿ§ÒlÔÜ/£¿rþEUý1ÿŒ—ù/N­„æ˜ÿ«+…âMÙ€hŠD[á.cžK¨c‹ÒÅ»Ì÷ÒA¦­Êø0Kõ$;(2ÕË©ƒÁvi÷L%Ê\rݨª,!ok©EžëBnD]×G²óÑ™®$A·­e§àìð‰õ_UìMýóSý—¬Âú¿…ûsnéÛr${»8uÙIÁyc§-ÍÓ<-Èw§z@…ÅʼnrÈOi¦/p[º3Ú€£Võ@¿h£UOþÛÒ.SXReǯäÇÿü0€¾Û›ç‚ ²ƒ&í/÷ÝÇ=Ö}Gã¹wÆ:Ž[ ¿ƒ“q‰WÎÌç»eôu!=X·2SG暴™Ðׯ'è‹q ­§æüFòŒþ2¡_áB!„B!„B!„Bèß÷—¶‹“( data.tar.xz 1404741350 0 0 100644 1096 ` ý7zXZi"Þ6!t/å£à'ÿ ] ¼}•ÀJ>yÂÌ&£Ta»o4­†=ù&»ÁT‹†´!£}ª©ð^"C2*A}aÏ s`2ü°¸|’ä©#Lú øþ]<ì)íWŸƒh4n(Ʀ­ @"_™RðZV‚”†{2WÈõ œ ñ×I±$Ÿ­+¾î÷ vç yîþ½+ ‰ŠJ²#×aר²zQ…>T?­¨óÿVƒƒÝøPÓ&¡ÏëžÐæ—ñ‡º£ô1ç¿%<3X¸nø…·×ïÅi5­8BˆxvªAålèÙa–뤤ÎREp§a¢L+RY0Öaˆ¯žë–Es9vØ:ËPu!“cÐóæûïëêmù…{‘cN£:‘TM-P|šÐ©à ¬Ë,?HªGmÆÖ Ù#pXna€ M*ãìTË=ÍÕ‰ºH/R‹·_ôÑL$¹Àj ¬ÚÕ‰–ÄÃd_PLH¨<‰ z#[µ D±mõ½V‚lhçô<Ä[œWwnÅáqRIe5!Ä4ǯ'œûïk]l=ÃÀŽ5³0› \r†èÜoP ¢=>Ê1ýDUÚuHnF¥xvÄÌßÎó$±Šo»Hû+‡XzJ;PÐIy“=·>~§ÁO®—¸dÑ$Âq+¾V³ìÝj|è¤an)¬ðÐà!ÛA½È\‰7N.J°0¼KJÇT[lÄáø[¡H¾w7§f{["’Ì…ù”é’#Yª¯  ê†5*ÕE´**ls³[»ÂV‚²•‰É¦cIµ"‡aJ¤€PoTMð>0 ‹YZubuntu-make-18.09+disco1/tests/data/apt/testpackage2_0.0.1_all.deb0000644000000000000000000000330413352651520021272 0ustar ! debian-binary 1404741350 0 0 100644 4 ` 2.0 control.tar.gz 1404741350 0 0 100644 443 ` ‹íÔAo›0`Îþ>n‡‚1` ЦMËe‡IÕ"ínì°8²¶ô×ÏM6i©Ô•Þ'!cóx6XÏi–\‹êª:µÑÓötŸó¢/ŠRÄñºæ<¡Ur‹ÒQš8kÃKqÿzþF¥Ù¤+¿LþÊû/ÊòÙýç<¿Üÿü±—P†ûu…PU[´ Ú¼Ñ5°krÁù®bšØ£tñ.óƒti«²>¤ÚËx¦9÷0Ú>íH«DÁd [U°®‘Z0¦sY‹¦i^ÎdGgú!ݶþ•ƒ³ã¬ÿRð§õ_ðëÿîϸ¢—#ÙÚÅ©ËAòœ7v^Q–²4'ŸœLå8’¯ÒÌ!^àVtc´G¿Y5]k£U{ÿqé–9,©²ÓòeŽ~AßmÍCLÁùlçÝhTð3Ówëuœ”¿'Û8Ýi “ñŠÜ;c Ç…ŸÁI²¯œ9œ#6Ë4éŸ ;ëNÍÜÓ;Ú9{Oèïoçè‹ §æ¼>ù˜þ0a8¿‡B!„B!„B!„B¡Wè~—ÕÅ( data.tar.xz 1404741350 0 0 100644 1096 ` ý7zXZi"Þ6!t/å£à'ÿ ] ¼}•ÀJ>yÂÌ&£Ta»o4­†=ù&»ÁT‹†´!£}ª©ð^"C2*A}aÏ s`2ü°¸|’ä©#Lú øþ]<ì)íWŸƒh4n(Ʀ­ @"_™RðZV‚”†{2WÈõ œ ñ×I±$¢c×¾î÷ xö¯Íê”t½ÂVÑZÃí&Þk­™:X}Ó3,\8Wàãp,:;:_X5’aÙØ!q”p\Ûµ©*<Úþfá¥/aÍ^ew[ ¦ŠfËÔ71ýA·ç$ãÝ[ ¡qµÔ<üÆ¢àU\d‰ÈqÓš æñh ¹¥ü”¥Ófýв&\·7ØqÅPuæ{C%q¸°?ZPÌ¢›‘çé¶uW„"OI˜$'¢8ùA5f2R4zî¹uŠ[Y)*cç›KêÔÛOÊ˥IÉˆŽ¹…0ï3í·z8*X¹™ºI«Œþš ¬Àš¾†D¶º:¨®@«`4çÀhµY¾I'¿x°‹óîêÿkýüô9¾¾‡Ä\ƒùÒ€Hû,å"eKƒ~““më­gý.°ËëIõå#!ú<§*ÒW®”Š8È]à±Öµa»_¿ÜÏÏ‹ýªøq0½â¹qÅ϶).@#À2 °é)Á™ˆ0óš~ÇehÖ"Ï2Uî ‹ 6€= ¤Ð Xg® v²µ¦×ŒË $ª€SFÌ=oëU/$ª¡9ýžéï§x¦Dß§#1˜Òä‘75ž}NÍIØcñòŒ®>2~²x0&°˜‚O¤ùë'ø4’?}ŒÛ-±ÞE£1àío“dAÍ|G äáIGêkÔ3FÁÈ¡q£A³i÷­Óz~Ö5Ð9j( ØâÈbYÜÜ%¼~³Ñ€|§ÌÒ99*kfed¿ „Øåuá\,¬Oý C#¨½jñ6¥Ž•u^chL÷·"ú¹¬‰±#pÂ0{×M•y']Ï㔵j˜.B+KäzÇ”»£1áÆ«ï%RÞIœf’´K -Eý¾êuYѵN ‘/"¦ysÒ~ä!ôÌëùcK’¬ÊkUyqLÚ²‹8‰<\áµkùiÚÖ+{ÓÛÒ"ÁÉúð嘯^ûÄw­V¯ÑŒÈ‚žÚåRâRŒÝΛt ¨s#€Æ³¨U¨‘¤2:–Lµ^)˜Êc”Ërz¶õÿ±1[¾3g_Ƀ—u&½Óì†]d2G±4qøÕ,9à-ÛçØE-[§¾¬%}‡™šÿ¤Bð¾®yAMö:’E…ú#–82­˜ xø°(ÔùÖFG—ÑØéÉKû™Ù¬iu0£€P×dHí>0 ‹YZubuntu-make-18.09+disco1/tests/data/apt/testpackage_0.0.1_all.deb0000644000000000000000000000324213352651520021211 0ustar ! debian-binary 1404741350 0 0 100644 4 ` 2.0 control.tar.gz 1404741350 0 0 100644 410 ` ‹íÔA‹Ü ðœý~&F£I†RZ˜K…¥ ½}“È&qPýôugö0-t{š)-ïÁ$ÊSòø§¬Š›cY+åyÌ~Ï÷5RI.D£òû¶å¼ ²¸ƒ-&(-‚÷é­ušÿG•ÕbeÜ–xãþ«¦ùmÿyÝþÜÿºæMî?ÃþßœPFö¢Õר¡ƒCW+Î’ièò¥[ Uœt€ÊzS%ˆé¨Í“¡2“^G˜ýXŽÏ¤7J0-lo!€ ¶Š1[ëVu]÷f!<7N‰èÞù7~MÁÏ1ÿBÖWù—/ù\`þïááÁ½Ê#ù!:¿î(+YY“OÁL.I[È õ<“/Ú­)_vtffi@¿z3}o Þ<ÅÛ°­i+_>ÏkþÈó öÝ£{Î%¸"¹Üy‹ÅEC‚óÁ¥ÓŽÂ÷4ÙC4Á/+öÛ²œèëÙèÁ‡óYÝ:úzúük{=C- ‘ºË¶ú¥ þYB!„B!„B!„BýÏ~j“}(data.tar.xz 1404741350 0 0 100644 1096 ` ý7zXZi"Þ6!t/å£à'ÿ ] ¼}•ÀJ>yÂÌ&£Ta»o4­†=ù&»ÁT‹†´!£}ª©ð^"C2*A}aÏ s`2ü°¸|’ä©#Lú øþ]<ì)íWŸƒh4n(Ʀ­ @"_™RðZV‚”†{2WÈõ œ ñ×I²›|#°@_fÑ;Ìú¬:ågÙ\ëÇCß1¤zÍSžÃ¸v¡à1ºLý2Hш[î gÉÝI–%b æd¤‚>ç)¨¨¸Î̺ù ±ÊEO±†‘Òq VaÓ·€8†ÁkT6¢°„p–º1¼UdÚ¯-è¼£ÓŸí½°,fÃâŒaàTæ×²Z¢Žƒè'{Iáu ¥K´¸o´G’µ¯pÏ5Á·­ŒÞs‡Ø';¥K3 n-í©­N_¾ñ­}>ê¥ÄªÀÄ"÷K)·S”ª•—ãò*ÍÖ– Ñuwåþ+ñ§5¿Íwÿ*7_üä‘w-J®ÿ] 6Õm²å¡Wgƒ=öýñA°Ñá_ôS¼)­2£S5„É5Éää¸ð7p}Øþèc‚±áç ¡„ªvb¤o¤’RÂh«eåÍ<‰Á̼$¯Ø­£GðIÞ§+ˬ\&¤D\íj–•&}Cä‘Ü0ĉÍÚÆPcÇÃßHQ?Å–7‘^¥/_ÌŒ÷´9ž{ÊÕ'RrÐ.>¦¨¾Æf«¬ Á\³d— úL°YÉç8Êú ùÝb«ûè§v7½Y¸ ÓjXÔ37xp¹(òPÖÝÕfdâ2àï(Ï…ýàßÊN>±Pêòw›}ê·œ«yÊ‹‚œuãÁØ©ÙìÿÒì¹@H‹)ß-%$*P a¢²,Éëø¿.^Þ0n£—7÷¼žîh]‚ªÂÈÄo°Ç…D\L´Œð‰2äïÀÈë\[o±Aÿ…Û už“Ÿî‹ÖRUb´†þ¢,bÌäÑR¾yßçZn³žF ?¤swª4&½U`AîÆó¿\Õ‘÷Š{~G—ÕS0ŒÉM]Ê“åÜ:°0pó'; ê CõGTö%µÌQ~Dd¦W# ¿HµT]<~‘‡Û0E[D{•ºêòɽ¢¦rÕDöôEQŒ óíïx02à¶„†fÛß½±,—®×Æ·™3í{Uºpž]ÄϯjDy}UìÅm3ÎÑ­oÂq öJìi'!×tnƒZÆ{µÖ©ùúßç˧#ŽOn¨4Œî Ëþ<·á=é’k n¡zƒ¹ŸÁœYˆþ”éË #i •{.þ-t¾RN‘вh.ªÃ¤@Œd&lfQ_=·ruÜ×sÖ'íûä“K0€ºT&˜ZæTÇO]§wKZm”©EÒ¢€Pr·&>0 ‹YZubuntu-make-18.09+disco1/tests/data/apt/testpackagefoo_0.0.1_foo.deb0000644000000000000000000000327613352651520021737 0ustar ! debian-binary 1404741350 0 0 100644 4 ` 2.0 control.tar.gz 1404741350 0 0 100644 442 ` ‹íÔÍŠÛ0`ŸýzøO–b‡Rv!—–z—¥‰-Ö¶‚~J³O_ÙÙKÚ=%ÛÂ|`lÉÒheyrsE´el}GïßëwYQÆYEiÍcÿv[U aÉç…%$±Æø¿ûèÿ*Ë'Å\˜ÜÏŸ×õÏ¿ªØõù—eU— )ðüoŽrÉZÚoËx×À±)yUY! ‰-B‚³¹„…\™{pþ$ä‹èáhL.1÷0š>ë_ÓVrZ ZYS E×Å‹B•bË›¦ù(–9­îŸ&è~õ/Íì­?±þkV¿¯J ¬ÿ{x¾Ôߎ\cz0ÁÊëîôX§Í¼#EVdeúhå =Hl¸Lzzöñ»#{­4XòÝÈÈ¥•5òÅ=„.Ì>dÒL_ÓosÜûqµ9è×¢âé!†[—˜´“é³ÕÆjÞøå­HŸÂèõfYwYÏ‚îçtNZ}ºÌÚ‡i:“·|—!kþzîɆ˜y<ñSèQt#Äæš2yÛ€x5ºš¡ sD_RKx¼–B!„B!„B!„Bý³~2(data.tar.xz 1404741350 0 0 100644 1092 ` ý7zXZi"Þ6!t/å£à'ÿ] ¼}•ÀJ>yÂÌ&£Ta»o4­†=ù&»ÁT‹†´!£}ª©ð^"C2*A}aÏ s`2ü°¸|’ä©#Lú øþ]<ì)íWŸƒh4n(Ʀ­ @"_™RðZV‚”†{2WÈõ œ ñ×I±%¬8HÁ„hű8PpÀë%õÊdû6cª…ŠÚ£—˜s^ׂ BÑÍ Âúù‹ˆ k4Ɉ)ÖHL™Ió–uLÿˆsrT|ª]†tgÅ2}îˆß¡³É%{òí_ÁèØFûØSÎVÓæ0 Q’%úÂcBNZKÿq…Æl`]²ÅµžL™ÖYàð#×%¶~á8¶¤ƒŸPX–‚. …NSt÷µmàQA’¤ñSºh]n‰É\@žð©ËT(Ë‹ú/繉ÃKÆT_Â8æ@x>h7Åúú—ËšXnþê$>÷)&8rgßC•âRy]¬vÖó«·? ‹™g>± JgNl!¢'Ïê‰6c£<ñ+Ö-¨×Dµë„°Ôá4¦ðÃ+iM°çl÷ƒ¶ñ´T¬g†#^D&Ïà þ¢4Äx½CrçàÈáÛJLtGa¸QÿtïyÖn*#Ps²0˜P¹[iÊ:Å 7“*Jæ  aV¿˜[Iñ Ä <Ñøð¬$©` íìÚr¢x®mgªRŠÜöÍ‘ªP­½ƒr<Š ¼ÖW‡>,¤A[Ò~öx(âÁï-Æ!%×’ŒDWg"ùDQûbnÁdO#Gü± ihÜê¾ dÀg @ŸvEÚ€ÁŸÅYoÑ 7ï¦ ™rMRØÔïüsîŽí„¿n"Ît¯É´Uëº$¶UnM1Iø7¡oˆšHCßìÎÃüçr0cý†.i¥Ô­8, !‡±¡¬ä0=ù¨Hø Àe}ðɞˠ€PyÜk>0 ‹YZubuntu-make-18.09+disco1/tests/data/beta.unity3d.com.crt0000644000000000000000000000242213352651520017711 0ustar -----BEGIN CERTIFICATE----- MIIDkDCCAnigAwIBAgIJANkIeF3Ae5iRMA0GCSqGSIb3DQEBCwUAMF0xCzAJBgNV BAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX aWRnaXRzIFB0eSBMdGQxFjAUBgNVBAMMDSoudW5pdHkzZC5jb20wHhcNMTgwNTE0 MTMwNTM0WhcNMjgwMzIyMTMwNTM0WjBdMQswCQYDVQQGEwJBVTETMBEGA1UECAwK U29tZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMRYw FAYDVQQDDA0qLnVuaXR5M2QuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB CgKCAQEA4R/DFsLIctOr3IK0xfaqaAVbtjmiaNu84u+6a+4WAnyYDLceRN7Ubt7Y /gXIj0fd/AnkuDHn/TW4PGdfBl6HXyC2fT03dU/x7HqW/d8OqGDLIj4Jo47PGXxV 7oE+tn/vkAVuNGvTsh6DHAD8q+L9j4lSqwY35oc3HDYWbLPVOo2VWXoZ0atMCb3a UZyxxOk4XFfMCRrbkBne9foIiPl2zDIiPgbXKmuOKjNkxIdIUTdLyIwnGdcQv3kd Lblehpqjx2EDafzlg9neZQOGuHu6arXlnOyZo8paQpLBaYcMM/1L9i8jLNWkLF3D BFWKiV/H7wMetpnq+GCrQ9hCVVFE5wIDAQABo1MwUTAdBgNVHQ4EFgQUuu8z+0PU c9oe65Rwvn2JbQxanGgwHwYDVR0jBBgwFoAUuu8z+0PUc9oe65Rwvn2JbQxanGgw DwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAQw4KZjRL365QRqLf MlgYynzJ793tNtnqkGpqc+TEzeDRzL6sJ6YsSlN2RL7XZjWMov0Tnra6+3vm/N79 57UMlhn0u0Io5b2S4Uup1zLC4tzLcvNkgaokvuzM3b4CIgdkzsvcb4fWNGeRLbXX ZSx3pCKG8CsZwugDO1FPuAKE5qgQKursn6qP5Jd2QbP5i0GRe64lnkATy/us9axt UcmQuE6dEEsc7Mj67q8y1bhHj2Rd3fj3OUpLJAa4OsRIMXglsSewXSCvF4ooBtmB Ir2rxR4x0nCyVZSW/wcXqBbcqGFTalSMIPXrpb3g4at+wUOf+4DkMDstoo3hGbdR XMNppw== -----END CERTIFICATE----- ubuntu-make-18.09+disco1/tests/data/beta.unity3d.com.pem0000644000000000000000000000567213352651520017714 0ustar -----BEGIN PRIVATE KEY----- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDhH8MWwshy06vc grTF9qpoBVu2OaJo27zi77pr7hYCfJgMtx5E3tRu3tj+BciPR938CeS4Mef9Nbg8 Z18GXodfILZ9PTd1T/Hsepb93w6oYMsiPgmjjs8ZfFXugT62f++QBW40a9OyHoMc APyr4v2PiVKrBjfmhzccNhZss9U6jZVZehnRq0wJvdpRnLHE6ThcV8wJGtuQGd71 +giI+XbMMiI+Btcqa44qM2TEh0hRN0vIjCcZ1xC/eR0tuV6GmqPHYQNp/OWD2d5l A4a4e7pqteWc7JmjylpCksFphwwz/Uv2LyMs1aQsXcMEVYqJX8fvAx62mer4YKtD 2EJVUUTnAgMBAAECggEAP2lO7m5XP+DXm/lFKi3cuggoWR/K23ZpshKMlDIwCOtH eO1rnUKW29PxkzvVzmYT5RZ0Ul3cVrp29qy3W3fs8aKpRIWlxWmLX2z4cvINkugQ z8hhtqxXMXqQSeol3AoVVJ/y9tkYfCeUDqNIiLIbcf7gRkQuIsUbhNrHXj8ZZLBN YokAAdi1DB7vnFZHOvyS0+E4tDZg6g6GtwUe8LGd9jMLC2lUpVQIM/FgXoqyOziz /C2DE7hmapzMFbhaTwVl3He7LUu/zwlSPtfat3fR/6UpLFy6XQpL0GIC0D7UVZqv c06SZESffu7bkUOxXr1IzxOlNyc2joUukpD4/OKnIQKBgQD8kVXr1xzVLsiP/EK8 U63+tXqHOA8HODUWZat37SRSw/6lyz8ASwMFiZ4EmRSrqIiXuojCKM7QYlzu4zRz Yk+03/dq0hBNtyxDO4cr4/LtTCXQFyh9h/T3WOVusnJozCK/kC3zZDsskhe9S1bO s2hZw/l2SJMqdkR3O40fccp0UwKBgQDkLvO3yRDythHq0mm39muulDmtBvoeVgPy lukGdcWEOMewK0Xei9vyvoQeqMUyrqH0uNgU4R6FcGzMddYSly2FbVqDRzp1lzAq 8PyjZWPkeu8mh/Viz2KMiNq1szr1/xUAI7A7AUDUMLwH1C+tqCp4XqzZtHgOXatN 1H1YD1qanQKBgQDxDXEY3z0IhlcrfRLglWkKIYDpD2rgdBfO4YhOtImnaKJg8GOX zv/6SAcF0mi1EOwVDBY8YSBKKKcT5MuJmHoEYoHMdOLUmY9oN6diD3QqYTPxsDiX 3qvBaxnGlg+1z6cWd/AzTSVg+6omo4IdU4OzsOQlrUywCSJ9PdwJ99vHOwKBgGUh ghb0YDSSCULf2scTygnn2+AZ9YS4bqt3wvOAAvhlCevEYgUOS388fOXxuuSJjXIe 8nXeiF5vw2ii2SwIIL7ABpukV/6B8XE2uWHZr/o1mgSjwVf3vh+3D+fz9a/NTAtx xcuA9LCWoN9/ZVo77AbJPyaF26fST/gAs0TyGR/pAoGAY0Je8CkpoetFGQ0tdTNo Svx+hsBDHoOo2WkGM2b4kCukaLlOaMMObPRiWnPxcRyn0eOFXs/b6sWF96f2OFoy 02ZLC5XAsMre1H0tPPTTOQahytik6tlnSfQ6VcSJ4r+w0hNEjfD12lKLaq30Rbbp Qh0TUaKGjgLzSiyfnprDVcY= -----END PRIVATE KEY----- -----BEGIN CERTIFICATE----- MIIDkDCCAnigAwIBAgIJANkIeF3Ae5iRMA0GCSqGSIb3DQEBCwUAMF0xCzAJBgNV BAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX aWRnaXRzIFB0eSBMdGQxFjAUBgNVBAMMDSoudW5pdHkzZC5jb20wHhcNMTgwNTE0 MTMwNTM0WhcNMjgwMzIyMTMwNTM0WjBdMQswCQYDVQQGEwJBVTETMBEGA1UECAwK U29tZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMRYw FAYDVQQDDA0qLnVuaXR5M2QuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB CgKCAQEA4R/DFsLIctOr3IK0xfaqaAVbtjmiaNu84u+6a+4WAnyYDLceRN7Ubt7Y /gXIj0fd/AnkuDHn/TW4PGdfBl6HXyC2fT03dU/x7HqW/d8OqGDLIj4Jo47PGXxV 7oE+tn/vkAVuNGvTsh6DHAD8q+L9j4lSqwY35oc3HDYWbLPVOo2VWXoZ0atMCb3a UZyxxOk4XFfMCRrbkBne9foIiPl2zDIiPgbXKmuOKjNkxIdIUTdLyIwnGdcQv3kd Lblehpqjx2EDafzlg9neZQOGuHu6arXlnOyZo8paQpLBaYcMM/1L9i8jLNWkLF3D BFWKiV/H7wMetpnq+GCrQ9hCVVFE5wIDAQABo1MwUTAdBgNVHQ4EFgQUuu8z+0PU c9oe65Rwvn2JbQxanGgwHwYDVR0jBBgwFoAUuu8z+0PUc9oe65Rwvn2JbQxanGgw DwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAQw4KZjRL365QRqLf MlgYynzJ793tNtnqkGpqc+TEzeDRzL6sJ6YsSlN2RL7XZjWMov0Tnra6+3vm/N79 57UMlhn0u0Io5b2S4Uup1zLC4tzLcvNkgaokvuzM3b4CIgdkzsvcb4fWNGeRLbXX ZSx3pCKG8CsZwugDO1FPuAKE5qgQKursn6qP5Jd2QbP5i0GRe64lnkATy/us9axt UcmQuE6dEEsc7Mj67q8y1bhHj2Rd3fj3OUpLJAa4OsRIMXglsSewXSCvF4ooBtmB Ir2rxR4x0nCyVZSW/wcXqBbcqGFTalSMIPXrpb3g4at+wUOf+4DkMDstoo3hGbdR XMNppw== -----END CERTIFICATE----- ubuntu-make-18.09+disco1/tests/data/bitbucket.org.crt0000644000000000000000000000241613352651520017370 0ustar -----BEGIN CERTIFICATE----- MIIDjTCCAnWgAwIBAgIJALQ2sTNknZ7/MA0GCSqGSIb3DQEBCwUAMF0xCzAJBgNV BAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX aWRnaXRzIFB0eSBMdGQxFjAUBgNVBAMMDWJpdGJ1Y2tldC5vcmcwHhcNMTcwMzI0 MTY0NjUxWhcNMjcwMTMxMTY0NjUxWjBdMQswCQYDVQQGEwJBVTETMBEGA1UECAwK U29tZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMRYw FAYDVQQDDA1iaXRidWNrZXQub3JnMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB CgKCAQEA1chz8BzePbDxJvsTq6E4BAM4pabC7TQclAAspMXAO5/Gd41cVTv9tW0J 4Tp30Q1XcCTuL152Ax4EpTRzAMT7ImaSWWy7lsACs7N4dfrLmJ5ejfoIO+1SuDFv G9855XJmVT19pOB8c9gdf5zEe0kac+08t6Hvu1uHzNuXSlMgnBk/hA07tC8OK4c5 rqUyjHvRZISdPM1FzXLvLNNGpn6U/y/JoADbLaA+ErjoMrUHiU7k+gFq3sKTHkYr AI/hXyQ+KKIDKU16olM8BXI1Xw8nFPg7Rjze2sRTXnawJfjTR+cQEKHHzwqu5PM7 cXeiV+3IiQij65XACbsNmdZSmhMW0wIDAQABo1AwTjAdBgNVHQ4EFgQUowUQMAv8 AVVgFer0RNhoqO71I8swHwYDVR0jBBgwFoAUowUQMAv8AVVgFer0RNhoqO71I8sw DAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAJzAOJRD9wRDKURSQUOQY B4KqWs9f8ve2QcTaICdbXzIhkcnTXZ0lYdZGqmlmyaBLxSZRsJgsdRkMFIW6z2GT SamRZ19HxsI3jujaVW9rZ35Q//yImmUOllLHhb2vvJZnVwjtKdwB6YFHauDeIiMP TD8UR6O0lby6VlhLJyDcW06QFybG2VrNPm/crCRMmC8iu4N18SiTLVIngvK212NK 8inf/MIdLjKqDJ8Va7RtxrILaJWnfpfnXjeEJ7GUJKOzyTaBY7KbLr5Hw1M0zo8h qKWFD5wxC9uc6mC+A/AJ6G8tleeRPkdLmdHZxe53URaLLsnLMCjh1u9zUu0/n2at JQ== -----END CERTIFICATE----- ubuntu-make-18.09+disco1/tests/data/bitbucket.org.pem0000644000000000000000000000566613352651520017373 0ustar -----BEGIN PRIVATE KEY----- MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDVyHPwHN49sPEm +xOroTgEAzilpsLtNByUACykxcA7n8Z3jVxVO/21bQnhOnfRDVdwJO4vXnYDHgSl NHMAxPsiZpJZbLuWwAKzs3h1+suYnl6N+gg77VK4MW8b3znlcmZVPX2k4Hxz2B1/ nMR7SRpz7Ty3oe+7W4fM25dKUyCcGT+EDTu0Lw4rhzmupTKMe9FkhJ08zUXNcu8s 00amfpT/L8mgANstoD4SuOgytQeJTuT6AWrewpMeRisAj+FfJD4oogMpTXqiUzwF cjVfDycU+DtGPN7axFNedrAl+NNH5xAQocfPCq7k8ztxd6JX7ciJCKPrlcAJuw2Z 1lKaExbTAgMBAAECggEAdKSwjXxSzjoy+d/Ydba7R4UybT+175KVXTNTKHw1TNL6 iNR6Yo8e+NSLpXYvVcL/yFJ+Gx5hKYZBZppdfTf9BmIMy/oFyFTvpHjx6v1yBM20 LacUww3UKmfehcigYE6xAyVP3pwVi2eJgM1abyIN6t6wWElk8kcYq2/M9mKw0jn8 xuvHBAqF2jhO3cHMuQRYPRXg0CGQY8nSJ4R6SA8MmPoSzLSONGLvsgXwKrgX2m24 arJseNFUGXDtPu6C6/FABKBsLr31h7nXmrg/6CQgus05qyejme393BmAnEULYWu5 jN28DEu0zauwPrpr/tuYpl5awg6UsviCPRBFpUY9wQKBgQD2o5q28HlMQWrXd4yH jkvoG/b/Bt8OW7hNZihcgJ8PxwkQ/pSSFroIDWkHYKvkPgsDqSFIQCUmRFllSptE knH2arX/4gFy/M6bf8Y2Eg7NxMzjwqTYpzrXySvS6kt9RywZUq1P8XX3dZIF2Ana sTgkUXIOPpD4X99/XI+aGfJBEQKBgQDd5ZzCMSno4lIKoO8Ka3GcGLqJKZXW15bS ZFo7Qh0ryTT4PfFehHhql2CdediqbZNFIIQaHq5JKgPc816DUuNOlkVasuKO27B5 mbur6D30fXkozfC4xST/SKoesuUqiv70j7YeeaAbLplz9AuxcssuE16euOEMyDCZ RISK9OkZowKBgQDJK5LTKnvVjfomezVdj9wsGzswspsXbAp83xmGscaLqO2lNfFa 4zyjusRzJw+tYEm9l6M0+lUSzGcaLmtM2CIqOsnuR5qk/r1KqkKy8bGvdpkkISwy JtzhCw46v64JJhc7JGuGrE1rJTOQnrES9r/zJ5dfNPssC48RpB7hM86b8QKBgHhq u6gSoAi2kQkdjrtb1Vp9fPUkcSEW+80PEnxoA4aYeTth+hNt1h8aKR8sWW0ba7ku zSGTlsczmscT9y1TFPG30MlInHQkOl+zEspWjRCZ6t8+6yyKJ+q1l0RzlrOAnJ1B Q/bD0CQQJMxtGs9gWWyWrFl8QPz7wovaSAdUow77AoGBAOpOuEhuqs2ePoqPVqFv QEdZGCGr6l4SbEuoO81EGEAkZxR2K73NFGKHaVBRuuDLKjH+z6dOPYuM5YfQ1wMa RxwEh60FXwpKP6a8NqnFb+nunDaEmrpnmPB1f0eAN1z40/eY3Q4Q6/iU5vr8Ld3P vLTRXkvhehWhpbWQBAI14guM -----END PRIVATE KEY----- -----BEGIN CERTIFICATE----- MIIDjTCCAnWgAwIBAgIJALQ2sTNknZ7/MA0GCSqGSIb3DQEBCwUAMF0xCzAJBgNV BAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX aWRnaXRzIFB0eSBMdGQxFjAUBgNVBAMMDWJpdGJ1Y2tldC5vcmcwHhcNMTcwMzI0 MTY0NjUxWhcNMjcwMTMxMTY0NjUxWjBdMQswCQYDVQQGEwJBVTETMBEGA1UECAwK U29tZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMRYw FAYDVQQDDA1iaXRidWNrZXQub3JnMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB CgKCAQEA1chz8BzePbDxJvsTq6E4BAM4pabC7TQclAAspMXAO5/Gd41cVTv9tW0J 4Tp30Q1XcCTuL152Ax4EpTRzAMT7ImaSWWy7lsACs7N4dfrLmJ5ejfoIO+1SuDFv G9855XJmVT19pOB8c9gdf5zEe0kac+08t6Hvu1uHzNuXSlMgnBk/hA07tC8OK4c5 rqUyjHvRZISdPM1FzXLvLNNGpn6U/y/JoADbLaA+ErjoMrUHiU7k+gFq3sKTHkYr AI/hXyQ+KKIDKU16olM8BXI1Xw8nFPg7Rjze2sRTXnawJfjTR+cQEKHHzwqu5PM7 cXeiV+3IiQij65XACbsNmdZSmhMW0wIDAQABo1AwTjAdBgNVHQ4EFgQUowUQMAv8 AVVgFer0RNhoqO71I8swHwYDVR0jBBgwFoAUowUQMAv8AVVgFer0RNhoqO71I8sw DAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAJzAOJRD9wRDKURSQUOQY B4KqWs9f8ve2QcTaICdbXzIhkcnTXZ0lYdZGqmlmyaBLxSZRsJgsdRkMFIW6z2GT SamRZ19HxsI3jujaVW9rZ35Q//yImmUOllLHhb2vvJZnVwjtKdwB6YFHauDeIiMP TD8UR6O0lby6VlhLJyDcW06QFybG2VrNPm/crCRMmC8iu4N18SiTLVIngvK212NK 8inf/MIdLjKqDJ8Va7RtxrILaJWnfpfnXjeEJ7GUJKOzyTaBY7KbLr5Hw1M0zo8h qKWFD5wxC9uc6mC+A/AJ6G8tleeRPkdLmdHZxe53URaLLsnLMCjh1u9zUu0/n2at JQ== -----END CERTIFICATE----- ubuntu-make-18.09+disco1/tests/data/code.visualstudio.com.crt0000644000000000000000000000255713352651520021055 0ustar -----BEGIN CERTIFICATE----- MIID1zCCAr+gAwIBAgIJALcOyQpcVt+2MA0GCSqGSIb3DQEBCwUAMIGBMQswCQYD VQQGEwJGUjETMBEGA1UECAwKU29tZS1TdGF0ZTE9MDsGA1UECgw0TW9jayBjZXJ0 aWZpY2F0ZSBmb3IgVmlzdWFsIFN0dWRpbyBDb2RlIG1lZGl1bSB0ZXN0czEeMBwG A1UEAwwVY29kZS52aXN1YWxzdHVkaW8uY29tMB4XDTE1MDQzMDA3NDUxMloXDTI1 MDMwODA3NDUxMlowgYExCzAJBgNVBAYTAkZSMRMwEQYDVQQIDApTb21lLVN0YXRl MT0wOwYDVQQKDDRNb2NrIGNlcnRpZmljYXRlIGZvciBWaXN1YWwgU3R1ZGlvIENv ZGUgbWVkaXVtIHRlc3RzMR4wHAYDVQQDDBVjb2RlLnZpc3VhbHN0dWRpby5jb20w ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDSiDmIjpkJEwAHKq8DsV2w X13D5ld745XZ3pT/o3Jonge7EuJHYzTwATNYkERRhJ6QTR+1VP6Gq+gV1g0tdB0p CtXGzj6McYDoQi8y/h1PaldxL5xb9vpCHUfKO0GjyPCpZe7p/lMGJnC0yJJ6EM5A hLfj6gnQFhaei0pVgeLuA7CmI5aOmNY8mzqdj5mbktrlJhJG0jLUuh0yXW8IxgYO QAECeke5pis9sXhF0qYmEsyABrRHi9NKj/LPMuKzLiRWkO4/znmmzc3DNRwGD69i EokasXoohe9jaUcMdwY+/oHGJXonSxQ5P05MocGbmTYicD+R2Ft/LyageZlzrBj5 AgMBAAGjUDBOMB0GA1UdDgQWBBQmVWhkaDF6PHbXnDGNICP8aACkNzAfBgNVHSME GDAWgBQmVWhkaDF6PHbXnDGNICP8aACkNzAMBgNVHRMEBTADAQH/MA0GCSqGSIb3 DQEBCwUAA4IBAQAHmQQXMs09tDQjvPdO9i82JZ/BduBFI0FuZV/GQs2zcfF3EmLC USwXttKT7pUtL0HuO40wfwHuTl9P+bNsacpeAMG80ND437b7+o34BfAd4EqzP6mO JSZ0wCqsNvRI7H7BpsXjdO5H3DZgv6Sqcr6ibwWpRyspl70NnTzM/sjvARMrzX21 2feKEhS/MsuE0phNh9WKipGymqALFgwuVw5a+E5TSs8X/9is+YW7fpQ1y2Hrf/3T NQF4FQ41730cHEiaO/5WK6wypi55p62hyEdjlgvfdOLdxw20mu76BtX6m4S5+a5C bGBvmiSFeRyk0EXCTDYc/LYOe3WW/qWdQsnb -----END CERTIFICATE----- ubuntu-make-18.09+disco1/tests/data/code.visualstudio.com.pem0000644000000000000000000000602713352651520021042 0ustar -----BEGIN PRIVATE KEY----- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDSiDmIjpkJEwAH Kq8DsV2wX13D5ld745XZ3pT/o3Jonge7EuJHYzTwATNYkERRhJ6QTR+1VP6Gq+gV 1g0tdB0pCtXGzj6McYDoQi8y/h1PaldxL5xb9vpCHUfKO0GjyPCpZe7p/lMGJnC0 yJJ6EM5AhLfj6gnQFhaei0pVgeLuA7CmI5aOmNY8mzqdj5mbktrlJhJG0jLUuh0y XW8IxgYOQAECeke5pis9sXhF0qYmEsyABrRHi9NKj/LPMuKzLiRWkO4/znmmzc3D NRwGD69iEokasXoohe9jaUcMdwY+/oHGJXonSxQ5P05MocGbmTYicD+R2Ft/Lyag eZlzrBj5AgMBAAECggEBAML2+mi2vYwEt2rroUXHNB8IQdoP7wZA3V303YDbyTCO 4FPjCf/YJIb6ZaVnfI0NRpYVhf60Jj1q5zOJlYx5UiPW79/60TvYROtRl0oev9/y d+XOlHsp/dnKKdhjBcd6ZzxItHanWhWA9bDFabh25boj7fO3oby9J9dM4NrMvO1y eMW2XHYjm8l+s8mqYyv0PD2milBCH7ofii/wSf2iH9sKf0Mix7BUsVSEueVIc0dV WvQ9x+GJuFl8Czdk14r20LQRQP/JcAFTymPwp0r0ZeKjlPQk71p+DK+eho8QpDXv 680LmBXTTX7wf2SqVetydsIPaUkoAG122y+XdsOwoR0CgYEA9NQea2eKPwKz7W3w d4Fe//yUDdEI0tc/muUHylg/UUvCjvZ86sU9E/qGzqBU2j1ioRf/hIP0pp1zIcZ9 HjXlS4r6unIwuqmH3hQSFxnXCZsMHLqPTNaB383rzBPlNMXrrv/QLr6ZzLkEd66h PzkmeeKgJMSDcB4fH+2mXf06hP8CgYEA3CN7ywqTf7BWQdM9kuAvbOA7bbxqqpGy Y5AXm7JpRBgJG/2uiDCN+9O4ZaruZ4paJzCiDrFf0RnE1BcdU3qsC4fqhqAL3UWh kjqzU9YdltY5oOEUuB+KX1uavHvcaOZeLBJiNsoHCBxGGWfdLRdtiJi4l3Pfj7OF VBX+bZ+figcCgYBTX8EUNmhf2N3JJz1SlR3y8uLAacUld+PTLdefUroNR010PgCA Orb4DMLHrtX2lBz4WyHK0N0JuGiywdNt7FCvjx6fS6/IgV8hg5g9gbE3NjPDvMx8 EDieLJP2JXhSpmwCZl9Q69uYWhFpaHDFBQNTUpfSrZFNJxTWXKnhLBE3pQKBgEaQ 2U3sxftYe03+eO5sDsfH2UUD8O1cZuKjfe3a8wNw8PqYByqA5gKji6iLcoCeSOfn Hwu2sBBHQmD6R9xKpnvLxdIB28vCVliZmIJ3UGTZpv97JzkeYyzOIHvq+Gxn7CgU fIczm61t4sqiELQznlj7G7Dw4+kcktCxfC2HzYxhAoGAcVdRQyuuJEXt8H7Mrzim ZZB2JRF+pfvOMZM77iYWmqmYHQKS01a5aogIBlyzuWpG4M9AHmtZkxrnnUjd1aW/ 5etGiuPPwX7G1wEm94WPFU9RSbjh5KyQVa4Pi6u649JgFYCWLDbI3yEw6JQ0aH0w nG2V4ze93qjRrzUA0zwzkH8= -----END PRIVATE KEY----- -----BEGIN CERTIFICATE----- MIID1zCCAr+gAwIBAgIJALcOyQpcVt+2MA0GCSqGSIb3DQEBCwUAMIGBMQswCQYD VQQGEwJGUjETMBEGA1UECAwKU29tZS1TdGF0ZTE9MDsGA1UECgw0TW9jayBjZXJ0 aWZpY2F0ZSBmb3IgVmlzdWFsIFN0dWRpbyBDb2RlIG1lZGl1bSB0ZXN0czEeMBwG A1UEAwwVY29kZS52aXN1YWxzdHVkaW8uY29tMB4XDTE1MDQzMDA3NDUxMloXDTI1 MDMwODA3NDUxMlowgYExCzAJBgNVBAYTAkZSMRMwEQYDVQQIDApTb21lLVN0YXRl MT0wOwYDVQQKDDRNb2NrIGNlcnRpZmljYXRlIGZvciBWaXN1YWwgU3R1ZGlvIENv ZGUgbWVkaXVtIHRlc3RzMR4wHAYDVQQDDBVjb2RlLnZpc3VhbHN0dWRpby5jb20w ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDSiDmIjpkJEwAHKq8DsV2w X13D5ld745XZ3pT/o3Jonge7EuJHYzTwATNYkERRhJ6QTR+1VP6Gq+gV1g0tdB0p CtXGzj6McYDoQi8y/h1PaldxL5xb9vpCHUfKO0GjyPCpZe7p/lMGJnC0yJJ6EM5A hLfj6gnQFhaei0pVgeLuA7CmI5aOmNY8mzqdj5mbktrlJhJG0jLUuh0yXW8IxgYO QAECeke5pis9sXhF0qYmEsyABrRHi9NKj/LPMuKzLiRWkO4/znmmzc3DNRwGD69i EokasXoohe9jaUcMdwY+/oHGJXonSxQ5P05MocGbmTYicD+R2Ft/LyageZlzrBj5 AgMBAAGjUDBOMB0GA1UdDgQWBBQmVWhkaDF6PHbXnDGNICP8aACkNzAfBgNVHSME GDAWgBQmVWhkaDF6PHbXnDGNICP8aACkNzAMBgNVHRMEBTADAQH/MA0GCSqGSIb3 DQEBCwUAA4IBAQAHmQQXMs09tDQjvPdO9i82JZ/BduBFI0FuZV/GQs2zcfF3EmLC USwXttKT7pUtL0HuO40wfwHuTl9P+bNsacpeAMG80ND437b7+o34BfAd4EqzP6mO JSZ0wCqsNvRI7H7BpsXjdO5H3DZgv6Sqcr6ibwWpRyspl70NnTzM/sjvARMrzX21 2feKEhS/MsuE0phNh9WKipGymqALFgwuVw5a+E5TSs8X/9is+YW7fpQ1y2Hrf/3T NQF4FQ41730cHEiaO/5WK6wypi55p62hyEdjlgvfdOLdxw20mu76BtX6m4S5+a5C bGBvmiSFeRyk0EXCTDYc/LYOe3WW/qWdQsnb -----END CERTIFICATE----- ubuntu-make-18.09+disco1/tests/data/compress-files/0000755000000000000000000000000013352651520017044 5ustar ubuntu-make-18.09+disco1/tests/data/compress-files/invalid.tgz0000644000000000000000000000026113352651520021217 0ustar This is not a tarfile ‹¯è¼SíÚíjƒ0BL×uÕ†ª½— ;ÞÛþ­¼•ßGBéÌzåŒÊŒÊèL‹Ä^d7û¦]Æ$y‘Çz}ߌÍûnüj>Ç¿)˰)Ê>í.­êãPZ†jÛî~³F`çÌxü•9ÄßY«÷Bjí´‰œúgO¹ñøoêz±ZÆîyY\{/˜ß0ÿ÷«¼ˆ?ªÿ ubuntu-make-18.09+disco1/tests/data/compress-files/script_with_archive.sh0000644000000000000000000000070713352651520023444 0ustar This is a script with a self-contained archive It contains multiple lines before the real archive itself == ARCHIVE TAG == ‹¯è¼SíÚíjƒ0€áüîUx²$æãzÚš¶2§#Ú võÓŽ²MêÖ kÙú> ‚ $r8'ùqšŸBL×uÕ†ª½— ;ÞÛþ­¼•ßGBéÌzåŒÊŒÊèL‹Ä^d7û¦]Æ$y‘Çz}ߌÍûnüj>Ç¿)˰)Ê>í.­êãPZ†jÛî~³F`çÌxü•9ÄßY«÷Bjí´‰œúgO¹ñøoêz±ZÆîyY\{/˜ß0ÿ÷«¼ˆ?ªÿýwÕIýŸÃéø×í.Äþ˜dsëÿ{ü½Qžú?êÿmäÿªØn'Ìü7_ç¿VÆê¿é*@7¯»ÿ)§÷¿Y,€pí>KíÿŸp3û?Mf­QN÷ý_™”ôÍþOàÿxŒgí<P ubuntu-make-18.09+disco1/tests/data/compress-files/simple.bin0000755000000000000000000000036513352651520021036 0ustar #!/bin/bash dest=android-ndk-foo while getopts "o:" opt; do case $opt in o) dest=$OPTARG/$dest ;; esac done mkdir -p $dest for bin in ndk-which ndk-build; do echo "#!/bin/sh" > $dest/$bin chmod +x $dest/$bin done ubuntu-make-18.09+disco1/tests/data/compress-files/valid.tgz0000644000000000000000000000051313352651520020670 0ustar ‹¯è¼SíÚíjƒ0€áüîUx²$æãzÚš¶2§#Ú võÓŽ²MêÖ kÙú> ‚ $r8'ùqšŸBL×uÕ†ª½— ;ÞÛþ­¼•ßGBéÌzåŒÊŒÊèL‹Ä^d7û¦]Æ$y‘Çz}ߌÍûnüj>Ç¿)˰)Ê>í.­êãPZ†jÛî~³F`çÌxü•9ÄßY«÷Bjí´‰œúgO¹ñøoêz±ZÆîyY\{/˜ß0ÿ÷«¼ˆ?ªÿýwÕIýŸÃéø×í.Äþ˜dsëÿ{ü½Qžú?êÿmäÿªØn'Ìü7_ç¿VÆê¿é*@7¯»ÿ)§÷¿Y,€pí>KíÿŸp3û?Mf­QN÷ý_™”ôÍþOàÿxŒgí<Pubuntu-make-18.09+disco1/tests/data/compress-files/valid.zip0000644000000000000000000000256413352651520020676 0ustar PK Œ+Eserver-content/UT —ÀTªÁTux èèPK zGéDserver-content/subdir/UT hè¼SvÀTux èèPK zGéD >” server-content/subdir/otherfileUT hè¼SqÀTux èèfoo bar baz PKêaÄD)8'(#server-content/biggerfileUT ·ñŽSvÀTux èèíÁ  ¬ï_Â(ø7PKêaÄD)8'(#server-content/executablefileUT ·ñŽSŸÀTux èèíÁ  ¬ï_Â(ø7PK oSÄD >” server-content/simplefileUT rØŽSvÀTux èèfoo bar baz PK ²™çD >” 0server-content/simplefile-with-no-content-lengthUT ?ÕºSvÀTux èèfoo bar baz PK Œ+EýAserver-content/UT—ÀTux èèPK zGéDýAIserver-content/subdir/UThè¼Sux èèPK zGéD >” ´™server-content/subdir/otherfileUThè¼Sux èèPKêaÄD)8'(#´þserver-content/biggerfileUT·ñŽSux èèPKêaÄD)8'(#ýkserver-content/executablefileUT·ñŽSux èèPK oSÄD >” ´Üserver-content/simplefileUTrØŽSux èèPK ²™çD >” 0´;server-content/simplefile-with-no-content-lengthUT?ÕºSux èèPK­±ubuntu-make-18.09+disco1/tests/data/compress-files/valid2.tgz0000644000000000000000000005000013352651520020746 0ustar server-content2/0000775000175000017500000000000012614620657014317 5ustar didrocksdidrocksserver-content2/subdir2/0000775000175000017500000000000012357164150015664 5ustar didrocksdidrocksserver-content2/subdir2/otherfile0000664000175000017500000000001412357164150017563 0ustar didrocksdidrocksfoo bar baz server-content2/simplefile-with-no-content-length20000664000175000017500000000001412356552477022771 0ustar didrocksdidrocksfoo bar baz server-content2/biggerfile20000664000175000017500000002145012343570667016431 0ustar didrocksdidrocksaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaserver-content2/simplefile20000664000175000017500000000001412343554162016444 0ustar didrocksdidrocksfoo bar baz ubuntu-make-18.09+disco1/tests/data/configs/0000755000000000000000000000000013352651520015541 5ustar ubuntu-make-18.09+disco1/tests/data/configs/invalid/0000755000000000000000000000000013352651520017167 5ustar ubuntu-make-18.09+disco1/tests/data/configs/invalid/umake0000644000000000000000000000000213352651520020204 0ustar : ubuntu-make-18.09+disco1/tests/data/configs/old/0000755000000000000000000000000013352651520016317 5ustar ubuntu-make-18.09+disco1/tests/data/configs/old/udtc0000644000000000000000000000025113352651520017177 0ustar frameworks: category-a: framework-a: path: /home/didrocks/quickly/ubuntu-make/adt-eclipse framework-b: path: /home/didrocks/foo/bar/android-studio ubuntu-make-18.09+disco1/tests/data/configs/valid/0000755000000000000000000000000013352651520016640 5ustar ubuntu-make-18.09+disco1/tests/data/configs/valid/umake0000644000000000000000000000025113352651520017663 0ustar frameworks: category-a: framework-a: path: /home/didrocks/quickly/ubuntu-make/adt-eclipse framework-b: path: /home/didrocks/foo/bar/android-studio ubuntu-make-18.09+disco1/tests/data/data.services.jetbrains.com.crt0000644000000000000000000000246213352651520022117 0ustar -----BEGIN CERTIFICATE----- MIIDqTCCApGgAwIBAgIJAPoNW2O3W47oMA0GCSqGSIb3DQEBCwUAMGsxCzAJBgNV BAYTAkZSMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX aWRnaXRzIFB0eSBMdGQxJDAiBgNVBAMMG2RhdGEuc2VydmljZXMuamV0YnJhaW5z LmNvbTAeFw0xNTEyMTEwODUyNTFaFw0yNTEwMTkwODUyNTFaMGsxCzAJBgNVBAYT AkZSMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBXaWRn aXRzIFB0eSBMdGQxJDAiBgNVBAMMG2RhdGEuc2VydmljZXMuamV0YnJhaW5zLmNv bTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMpKcWEr0NKZ20zZOMbk o2ZbQZZ2soAmwvHb9Nna5CHO3kzOP2A+6zQZvhdwEc8W3LtOgZgK66XKhvLTQ1lW p9fEBbmJtJEUAutoNDh5mip75SVLklL0AEq3M1KVZKPx20KGrwcnZnfLFJSH3RC5 r0Zb/Ptu9sRMjDbvg4iMIch+VrNa1P34EUdMHWUQAbl/mgNm19vJ24ZvOUj4zX9M 6nDTJGmigmXBtbhkqAayueQ+dULUx8bM+btKCRU1ChadqZdjaB59rEq0EMDruLW5 SA8DSkM2KwrRbNtxvqfPKsXDKZYYWPTmK4GzlFgb2WZbifMws2c0TAqN01KX/RDy BU0CAwEAAaNQME4wHQYDVR0OBBYEFMlFjpvuzTPurQ5jYRlAQbQdmkEBMB8GA1Ud IwQYMBaAFMlFjpvuzTPurQ5jYRlAQbQdmkEBMAwGA1UdEwQFMAMBAf8wDQYJKoZI hvcNAQELBQADggEBACqrK0PtcYKLppXmaAqv5xFghcvyH4OKSb3g+OS35CEwofNP +8dlFoCLcVCgLRcOzY3E49ky02dVmpjOg6GnK6A69gwzsw0WRRx8LzZB/hoT2fvi SDe+Z5cQ71xB9MyfUu44UQ4q8babtHwgPqcBgqT9ofp0qW0ofE2tnVzRMcc79gQE NpYnEBRn1R9k4kfRgJKk+9WuY0woNG9W+z2+ERcDit2hQeXsyLvgx58RF3tGEar9 m3sy2pBSjBaO/W5wq3P+bIIEyjqG1gWhAePG2j18hvu7/njP70oFhis2zOJRnkos oGBEZhjNDMRiW5qj1kjUgfxRqH/4U7taSYVzenA= -----END CERTIFICATE----- ubuntu-make-18.09+disco1/tests/data/data.services.jetbrains.com.pem0000644000000000000000000000573213352651520022113 0ustar -----BEGIN PRIVATE KEY----- MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQDKSnFhK9DSmdtM 2TjG5KNmW0GWdrKAJsLx2/TZ2uQhzt5Mzj9gPus0Gb4XcBHPFty7ToGYCuulyoby 00NZVqfXxAW5ibSRFALraDQ4eZoqe+UlS5JS9ABKtzNSlWSj8dtChq8HJ2Z3yxSU h90Qua9GW/z7bvbETIw274OIjCHIflazWtT9+BFHTB1lEAG5f5oDZtfbyduGbzlI +M1/TOpw0yRpooJlwbW4ZKgGsrnkPnVC1MfGzPm7SgkVNQoWnamXY2gefaxKtBDA 67i1uUgPA0pDNisK0Wzbcb6nzyrFwymWGFj05iuBs5RYG9lmW4nzMLNnNEwKjdNS l/0Q8gVNAgMBAAECggEAS8/EWAdktlik4FMUPS3YsvaGSQ5o7TAZpSyqwa6QCr+N fjlZdQd/fEIdhIkik3rc9HGCjemh0LtrAbv9JJEeS/WRs6wQ+MIIKhMeZv/jsAJI qUZ+Kwp4xYeM+2kzk2GDq5XwKH0yoLiCGPwl9CuyrWqyD8TRRFXvwnLW16i0zH8p 25NlzyQFFiXTldifAWoAeCgUZWyePQj7lhTUth1UWldbEaziKx0HEz2znqa8SWkq SWEHW8rE+ohawr+JtRP93emIJlGd7kbstdyukVz2UBgdvOiDceyL7grg59nRcppg OtOCeWXVgoal1tzDkb4PFqUoOOOAjmXa/yOfTT7BPQKBgQDuam5c5ZeG9NPj87MX 9K9S6asZufuA5Qy3T9VvaTFNWOchJ9Cjpyyh85EYGVw/fMg2p73NCt0QE8hPQWYq WF45nTpcWpMcgdvW8j3M3psAir/8U+mu+XSAigeF5rbxX7dL70cm7GVWJWJ9OTmo mrSP7kchz7LAMWAgev0BRlynOwKBgQDZNe4nVP0iLxWYE7BkipHS/IBgtzL969Lh 3/OnLwIP2rs6imAACSAzq8LoXOGgT6lSD1hNpAkri6nR+flf1fPxqViwYLOui0RS uyR9OGFliM2JUIMA+kwCEJNEo6xdFSpdh5etlA3Q+AD+9xUHloeq6VdFwN4TyVog u3TvVlMNFwKBgFHmS80rrXbVyagnwiD7k/KmhHlM80Ge7VRXX1lrSF1qqdMw6zIc rm9fzTr7Ez5X7isgSkoSbkgkk43uSFtJiey+vxqUnq6PSWa4RlSHL7Xq8/KJHOBX nxa808LCs5uNJtk19DpBwLnsE74yl0T9CAPddZ/+ykfNblkaBqmWcyObAoGAOJ8y YdZp1ktn2ajoRo1IzjM8U/nttPuQkYkLvv0mEHP4cp43wEqgtleEC4aK2ntprBaL 8lFcgpl5v17mfvELEmgO0ouiy1FKkjZuoKXd3dX3nl/6hnq47aDcgvwXpnwp+w+p nnoFz/+WYuCN/thirU7+jRRlz8qhT/8N0IY0SCkCgYBNkU6BUAaWXID6RcgRjxFy /8vm+oUYJCJiaSFC8Jlr8oA6nFmtkCEhuNt3jUBCLe69qlCdjqji9gOe7oFtDVEd p0X70uqhfVNV3s9F/mOxoT2Xaga79vu+RRbxCG2VOHzAveQZAKZ/hbo/LJDJd/Mr ygAqsTq4unvzpkiliYFZyw== -----END PRIVATE KEY----- -----BEGIN CERTIFICATE----- MIIDqTCCApGgAwIBAgIJAPoNW2O3W47oMA0GCSqGSIb3DQEBCwUAMGsxCzAJBgNV BAYTAkZSMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX aWRnaXRzIFB0eSBMdGQxJDAiBgNVBAMMG2RhdGEuc2VydmljZXMuamV0YnJhaW5z LmNvbTAeFw0xNTEyMTEwODUyNTFaFw0yNTEwMTkwODUyNTFaMGsxCzAJBgNVBAYT AkZSMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBXaWRn aXRzIFB0eSBMdGQxJDAiBgNVBAMMG2RhdGEuc2VydmljZXMuamV0YnJhaW5zLmNv bTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMpKcWEr0NKZ20zZOMbk o2ZbQZZ2soAmwvHb9Nna5CHO3kzOP2A+6zQZvhdwEc8W3LtOgZgK66XKhvLTQ1lW p9fEBbmJtJEUAutoNDh5mip75SVLklL0AEq3M1KVZKPx20KGrwcnZnfLFJSH3RC5 r0Zb/Ptu9sRMjDbvg4iMIch+VrNa1P34EUdMHWUQAbl/mgNm19vJ24ZvOUj4zX9M 6nDTJGmigmXBtbhkqAayueQ+dULUx8bM+btKCRU1ChadqZdjaB59rEq0EMDruLW5 SA8DSkM2KwrRbNtxvqfPKsXDKZYYWPTmK4GzlFgb2WZbifMws2c0TAqN01KX/RDy BU0CAwEAAaNQME4wHQYDVR0OBBYEFMlFjpvuzTPurQ5jYRlAQbQdmkEBMB8GA1Ud IwQYMBaAFMlFjpvuzTPurQ5jYRlAQbQdmkEBMAwGA1UdEwQFMAMBAf8wDQYJKoZI hvcNAQELBQADggEBACqrK0PtcYKLppXmaAqv5xFghcvyH4OKSb3g+OS35CEwofNP +8dlFoCLcVCgLRcOzY3E49ky02dVmpjOg6GnK6A69gwzsw0WRRx8LzZB/hoT2fvi SDe+Z5cQ71xB9MyfUu44UQ4q8babtHwgPqcBgqT9ofp0qW0ofE2tnVzRMcc79gQE NpYnEBRn1R9k4kfRgJKk+9WuY0woNG9W+z2+ERcDit2hQeXsyLvgx58RF3tGEar9 m3sy2pBSjBaO/W5wq3P+bIIEyjqG1gWhAePG2j18hvu7/njP70oFhis2zOJRnkos oGBEZhjNDMRiW5qj1kjUgfxRqH/4U7taSYVzenA= -----END CERTIFICATE----- ubuntu-make-18.09+disco1/tests/data/developer.android.com.crt0000644000000000000000000000246613352651520021014 0ustar -----BEGIN CERTIFICATE----- MIIDqzCCApOgAwIBAgIJANM5Fcvms7E/MA0GCSqGSIb3DQEBCwUAMGwxCzAJBgNV BAYTAkZSMRMwEQYDVQQIDApTb21lLVN0YXRlMSgwJgYDVQQKDB9BbmRyb2lkIGRl dmVsb3BlciBrZXkgZm9yIHRlc3RzMR4wHAYDVQQDDBVkZXZlbG9wZXIuYW5kcm9p ZC5jb20wHhcNMTQwODI4MDgyMzQyWhcNMjQwNzA2MDgyMzQyWjBsMQswCQYDVQQG EwJGUjETMBEGA1UECAwKU29tZS1TdGF0ZTEoMCYGA1UECgwfQW5kcm9pZCBkZXZl bG9wZXIga2V5IGZvciB0ZXN0czEeMBwGA1UEAwwVZGV2ZWxvcGVyLmFuZHJvaWQu Y29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA059PR5G1Ny1TFCaM 2EIoAh7L9xbY4Yj68cdyT3IXPgO7Liy/oVyXRyJyAIdpqwMURynLpXkedus7069x qpodHJAt0W2lAwq0/dpeBghKAYqQcAOZnQ/diDPVFYCDy3puFpRP1wDIauh8aVrd 1pZaI6NM7fTwIGkHMaenR72agMwYS75Mcwup6NlPK6eOdCpMZzhOQ+3aRzSh6fAo AVpb8JK8i+MzLs/mUnXJFsWLPspEB0MJ7gx5xciiP1TL3VMnb5sVgs7lO7OvFREi QuwcrLYKTBpDLGhhGBZDDupxM7XNJPIKiIuWdi8Dl6094UXT0lRx7qqf7GgjDyE4 iLQUWQIDAQABo1AwTjAdBgNVHQ4EFgQUs7PCZ/tV4Cfh1/UD9uiuJLnOIS8wHwYD VR0jBBgwFoAUs7PCZ/tV4Cfh1/UD9uiuJLnOIS8wDAYDVR0TBAUwAwEB/zANBgkq hkiG9w0BAQsFAAOCAQEAGgmIDe7aBeSsqr92Sh/hh1aEKxXbPSVpcKc7u8PS0/Y6 SA/2NbduLod/rY3YYMQFmbuzACFFPngdyrT4vnQp7NuMv0BEGJeAWs8jLf31x7zT pCaE7aRr+v3m5PVE1T9r7xrpeUkuKUZdKpLb/zwQGHzTQh8hOwpHWkOeaPhbeyM3 9D3v1huHumwTevKlz8DstGT+cUtSzG8xFG/eCCJYts3NgCYAunwuMbt3hO4BoANf 4sdR/MUPXxL4gSL/W8cVqwoukx2TmjvBYLyChSGNK4PZ6nfCNLrtSkXE0oKxyaLp FB8jsk738QvcVJALvN5gHW6gVY6O5o66tcCc/CPN/A== -----END CERTIFICATE----- ubuntu-make-18.09+disco1/tests/data/developer.android.com.pem0000644000000000000000000000574213352651520021005 0ustar -----BEGIN PRIVATE KEY----- MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDTn09HkbU3LVMU JozYQigCHsv3FtjhiPrxx3JPchc+A7suLL+hXJdHInIAh2mrAxRHKculeR526zvT r3Gqmh0ckC3RbaUDCrT92l4GCEoBipBwA5mdD92IM9UVgIPLem4WlE/XAMhq6Hxp Wt3Wllojo0zt9PAgaQcxp6dHvZqAzBhLvkxzC6no2U8rp450KkxnOE5D7dpHNKHp 8CgBWlvwkryL4zMuz+ZSdckWxYs+ykQHQwnuDHnFyKI/VMvdUydvmxWCzuU7s68V ESJC7BystgpMGkMsaGEYFkMO6nEztc0k8gqIi5Z2LwOXrT3hRdPSVHHuqp/saCMP ITiItBRZAgMBAAECggEBAKxd4jElGTksDbMoAyhSGkw/0VocneJ1tBAip5TWFOBK Ibfmct93jzA9eiW8JfFIvMeJ33mUQaAS0dQF3staY8PUG72tVO45Vlo99r9rGPxQ ZH0YMZKgTYyWy0SMPM0Ll4eEndM9rACIBG27uV0Dcb/9Trey/bMoWNe0+qeQY7vr BMLZz90zcFgLuRL5errPIvYCpiz22HQxXFo1+KlkXtCtwAyKpJ2Lu5ey9u04Ugng gCzsDPix1u5yYbcSEMfbKCeyMQEEiXahaLbk2I/U8CuHrZxkBTArl8xunRcAqqNk kO/MhNTTQO1c/dKB6KQJ/TqCz6AjhzT6D47HT2G3wJECgYEA+3J8K+I+4o6kuVDi jgHlApSuUyaDjCIdrwE26ujOOisjTDqB/p/vyJcZXOzYlxe1d0dNcxvkLwqk3jH8 f/jCCMy3d+xvmf8pME7be3N7TpBAluA4/5GaByVly0igkNUREVQrEugimgpn3BX6 kOhvX0tbzO/pvyhX62NyKPhUSTsCgYEA13Q6JzUvKXobVbs4V50POLmEL8s6vkZ/ g5JeaVrINncC+S3b0aEd9RXa7FhaQ2NS1BcWoftjSDd1tzsUKIxTCvDM0pNB1fRN a0NzBXUA94tvNfosVvDDJgTYIadCyjtjeIThpes5Zzrto8ckeX5+Ze0o+dj3cC1a m37+DAKYX3sCgYEAw+JBR7KeSMLVIqUXiYeCT8tiLtbPHikptL8eeExa9EfM3MKr qKASHdNQZ+r/JF3M+ZorhOQSlG8XVx3b1hoFlvNcbmlb271C6iZUp8ykH+US3Dbb UIWuV6jTr1Tp+UpzXGuUjssWwagflv3sUF0y/irn3jR8hXW5YF/9fFtQ1icCgYEA zRyKLD9Wib8EfOaCae5MymzaqgFpCDHnPSPAG75gMnG0c/IzfetLsMJAq5YlQFgz R1Q/qK/BQcQCnhBxTXThrd22sJWeLIiql34b50sPQ5sLobBsO8xzjCM6ezdXv10w glDG3QUFngAcsjlowP0qafCQfOMQFUwoITaRtm9WDjcCgYBAzawqKntYEavAYnMW 12O4f2Ms3g0xcyLqj3OcCUlhe9tqT20EDe/FGmTZYDhDqTQYjqHOCxhI5cNq49/n GO6MU4Gd3gfL27NjqIfiMEWwqWcLeeUEBQGmNN5XMLZ5+Ro2koyLrO7SJpmB5VRn 0v6kiANcQGQ6wXdH9XfSXq5jQg== -----END PRIVATE KEY----- -----BEGIN CERTIFICATE----- MIIDqzCCApOgAwIBAgIJANM5Fcvms7E/MA0GCSqGSIb3DQEBCwUAMGwxCzAJBgNV BAYTAkZSMRMwEQYDVQQIDApTb21lLVN0YXRlMSgwJgYDVQQKDB9BbmRyb2lkIGRl dmVsb3BlciBrZXkgZm9yIHRlc3RzMR4wHAYDVQQDDBVkZXZlbG9wZXIuYW5kcm9p ZC5jb20wHhcNMTQwODI4MDgyMzQyWhcNMjQwNzA2MDgyMzQyWjBsMQswCQYDVQQG EwJGUjETMBEGA1UECAwKU29tZS1TdGF0ZTEoMCYGA1UECgwfQW5kcm9pZCBkZXZl bG9wZXIga2V5IGZvciB0ZXN0czEeMBwGA1UEAwwVZGV2ZWxvcGVyLmFuZHJvaWQu Y29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA059PR5G1Ny1TFCaM 2EIoAh7L9xbY4Yj68cdyT3IXPgO7Liy/oVyXRyJyAIdpqwMURynLpXkedus7069x qpodHJAt0W2lAwq0/dpeBghKAYqQcAOZnQ/diDPVFYCDy3puFpRP1wDIauh8aVrd 1pZaI6NM7fTwIGkHMaenR72agMwYS75Mcwup6NlPK6eOdCpMZzhOQ+3aRzSh6fAo AVpb8JK8i+MzLs/mUnXJFsWLPspEB0MJ7gx5xciiP1TL3VMnb5sVgs7lO7OvFREi QuwcrLYKTBpDLGhhGBZDDupxM7XNJPIKiIuWdi8Dl6094UXT0lRx7qqf7GgjDyE4 iLQUWQIDAQABo1AwTjAdBgNVHQ4EFgQUs7PCZ/tV4Cfh1/UD9uiuJLnOIS8wHwYD VR0jBBgwFoAUs7PCZ/tV4Cfh1/UD9uiuJLnOIS8wDAYDVR0TBAUwAwEB/zANBgkq hkiG9w0BAQsFAAOCAQEAGgmIDe7aBeSsqr92Sh/hh1aEKxXbPSVpcKc7u8PS0/Y6 SA/2NbduLod/rY3YYMQFmbuzACFFPngdyrT4vnQp7NuMv0BEGJeAWs8jLf31x7zT pCaE7aRr+v3m5PVE1T9r7xrpeUkuKUZdKpLb/zwQGHzTQh8hOwpHWkOeaPhbeyM3 9D3v1huHumwTevKlz8DstGT+cUtSzG8xFG/eCCJYts3NgCYAunwuMbt3hO4BoANf 4sdR/MUPXxL4gSL/W8cVqwoukx2TmjvBYLyChSGNK4PZ6nfCNLrtSkXE0oKxyaLp FB8jsk738QvcVJALvN5gHW6gVY6O5o66tcCc/CPN/A== -----END CERTIFICATE----- ubuntu-make-18.09+disco1/tests/data/dl.google.com.crt0000644000000000000000000000241613352651520017255 0ustar -----BEGIN CERTIFICATE----- MIIDjTCCAnWgAwIBAgIJAP7z64vPplztMA0GCSqGSIb3DQEBCwUAMF0xCzAJBgNV BAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX aWRnaXRzIFB0eSBMdGQxFjAUBgNVBAMMDWRsLmdvb2dsZS5jb20wHhcNMTYwNDA4 MDc0MDM1WhcNMjYwMjE1MDc0MDM1WjBdMQswCQYDVQQGEwJBVTETMBEGA1UECAwK U29tZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMRYw FAYDVQQDDA1kbC5nb29nbGUuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB CgKCAQEAwezbqi/9UqKSP3lkDPsUvCCFEHI2M0hMrCC1LVAO6jZbQb0p+cTn15lK lO6dz3qBZu319JpJuQ/xskPFs4V5DL4CacKBgLcig5hS/GEc4JnJUIy2dy0fo4p/ MZzSglecygpkpzTmy23htBMwxu1uf3W5f0nurZbcZaht57YD4gHFWOvOFkk+vf7C cvEv6rlGCDy0ZoszB9nSq2EhbyYugwKU2Ja24mxwuNnwZUHe4WnL65rbVKYrzF7u Th7CkRc+j03GY4LH6DusvsdWR7jX/zgyt8oQmGf93UgjWGUQv9Lwy1I0LWxdT81z WCTN54f4XFHrFUiF6qyw9aVExMbt+QIDAQABo1AwTjAdBgNVHQ4EFgQU7hARFZea Oe+GFX8Eu0tuhCldh4IwHwYDVR0jBBgwFoAU7hARFZeaOe+GFX8Eu0tuhCldh4Iw DAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAparllEC0P+IqPB/U/mu2 hhhtzEM/k+xOrSx/DigBb51RA1Z6QES3FAKwCr3ZbgzFO8XgCIc3p5Fdm3tkhGyi 1072T6O2Tzypn/WlNOwg/y6HR16AsoQm1gPPA61v2fbdRV8V6D/T7cAEJ8O7KsEi UoSHv9kcB0bXwwlggH7QVZYBsZPGYOqClPcllHevoRHJlQaEoK6vqsZeJg37fKBg KjlCsu/bB7tnJ1ZGCYDLKjkr67Gv8RJTaHqQ+s7b0+leUkK4EXentVK/YBDG+TFi QvPL9OgUlKnZgHZ4APUUFQHwQhZ23iqf1GnThZ2KinDXOV+CPerb6s9mZEydXkoP Hg== -----END CERTIFICATE----- ubuntu-make-18.09+disco1/tests/data/dl.google.com.pem0000644000000000000000000000566613352651520017260 0ustar -----BEGIN PRIVATE KEY----- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDB7NuqL/1SopI/ eWQM+xS8IIUQcjYzSEysILUtUA7qNltBvSn5xOfXmUqU7p3PeoFm7fX0mkm5D/Gy Q8WzhXkMvgJpwoGAtyKDmFL8YRzgmclQjLZ3LR+jin8xnNKCV5zKCmSnNObLbeG0 EzDG7W5/dbl/Se6tltxlqG3ntgPiAcVY684WST69/sJy8S/quUYIPLRmizMH2dKr YSFvJi6DApTYlrbibHC42fBlQd7hacvrmttUpivMXu5OHsKRFz6PTcZjgsfoO6y+ x1ZHuNf/ODK3yhCYZ/3dSCNYZRC/0vDLUjQtbF1PzXNYJM3nh/hcUesVSIXqrLD1 pUTExu35AgMBAAECggEAGkXr0Nflmz95Tu40Vunhekdxn7PJkhMWiC96PGRfUO4C WRq2yCccPgJ/r0PQz55KT9anfvc0S8VUOpGiBFtt9gL8MrXuc7DcFTYa8CR8FBXh x274/ZZ4deC6sM8NWilijaDw2BJ7vk3pyUrcTec3FD+v3QX4Nz58J621DjKDvifA vEv6HBNVzKG3F1Zz89BV86wqC043HEihSwS9j4djW1ZCs/30Runnqj2zzcEnjw48 kyJwD+wTQFuid655q3Pn+mLj89/zW1if4jSTHbCpAhyvUtITO8EkmGJKhCEroq38 7bRjePij9FQ59EzTuR0elUxnEKiBy6eS4DsLZBPpcQKBgQDvZsdLExH0Pn6AvvV/ bjf+EJ1xc6uSrDf944dzEDHJ7Xw2mUwd7kWlzOHQLQ4Z1RS2KLV9FEgw2h7sO1Ry kkISEjJnkMqY8z1xsqtqkCek2lx3HxYpQrPFtMLSbgQEWEA3HHTWp79R/1JltGLz XMHoulzjvPY4Pv3JwYKvcBw/pQKBgQDPXufO+8sWfGawyqEl+ChP5VbX8HkWaTDS Vw7q0vKUbKbrHQx8RQUvxatuZiIHad6YiGyVvihRml+GzqIGITZ4ON18q8yIPcts AlJgE1/9+/RXw+kY5uuYf/jDOPv/sadSngSDoLeZUC/oogibX2oulhQoJ3alxtx4 qsgIXf/kxQKBgQCox5EhwKQbyiNtqTNzT8Vx/UzCu4XutjQTbuIDoRs4/ZFg/NrJ Dz9TEQrytZEHbU5YzoKFWFM8/cpnSbzTuYGTM/kNQutSwcpD6m8nhdItSzV9VhFN rZUIgdQIfz+dwIolUI6e90zPBm6U/YP1hyO+bAUpGgOMy/wozaDRBv0jcQKBgHev Xfk/qDJdMGO/P40LkjCyvBG70BdYNP5hktGDWNDDeP9f77HVoC23V79LIT7IItpE eu9eJiUbBSFoJ2mER8zRfTwUZ+MGT18SY/rhk9iiT59MCj/+H2IQEkKSpBcqsNjl LNPPscfB2TTaOD98rWsf4ZhfVoJNqTfX0cXKgwPFAoGAKoGzdx1Gq9SC+HRKBksq chR0SVMI7Mg7QMmZphNDU1e2kWx7iPibQrlakHAesuPsxF41LsQOWcX4zS+gXYhA 8VAtghs4X+5Gbdh7OoIEf3Yuhl+jtRnS2C7rQkjG1qCtiKoTmh52j+2eCWTQaKXt jFc9X/nwfT1j13J1t4vh+4k= -----END PRIVATE KEY----- -----BEGIN CERTIFICATE----- MIIDjTCCAnWgAwIBAgIJAP7z64vPplztMA0GCSqGSIb3DQEBCwUAMF0xCzAJBgNV BAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX aWRnaXRzIFB0eSBMdGQxFjAUBgNVBAMMDWRsLmdvb2dsZS5jb20wHhcNMTYwNDA4 MDc0MDM1WhcNMjYwMjE1MDc0MDM1WjBdMQswCQYDVQQGEwJBVTETMBEGA1UECAwK U29tZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMRYw FAYDVQQDDA1kbC5nb29nbGUuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB CgKCAQEAwezbqi/9UqKSP3lkDPsUvCCFEHI2M0hMrCC1LVAO6jZbQb0p+cTn15lK lO6dz3qBZu319JpJuQ/xskPFs4V5DL4CacKBgLcig5hS/GEc4JnJUIy2dy0fo4p/ MZzSglecygpkpzTmy23htBMwxu1uf3W5f0nurZbcZaht57YD4gHFWOvOFkk+vf7C cvEv6rlGCDy0ZoszB9nSq2EhbyYugwKU2Ja24mxwuNnwZUHe4WnL65rbVKYrzF7u Th7CkRc+j03GY4LH6DusvsdWR7jX/zgyt8oQmGf93UgjWGUQv9Lwy1I0LWxdT81z WCTN54f4XFHrFUiF6qyw9aVExMbt+QIDAQABo1AwTjAdBgNVHQ4EFgQU7hARFZea Oe+GFX8Eu0tuhCldh4IwHwYDVR0jBBgwFoAU7hARFZeaOe+GFX8Eu0tuhCldh4Iw DAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAparllEC0P+IqPB/U/mu2 hhhtzEM/k+xOrSx/DigBb51RA1Z6QES3FAKwCr3ZbgzFO8XgCIc3p5Fdm3tkhGyi 1072T6O2Tzypn/WlNOwg/y6HR16AsoQm1gPPA61v2fbdRV8V6D/T7cAEJ8O7KsEi UoSHv9kcB0bXwwlggH7QVZYBsZPGYOqClPcllHevoRHJlQaEoK6vqsZeJg37fKBg KjlCsu/bB7tnJ1ZGCYDLKjkr67Gv8RJTaHqQ+s7b0+leUkK4EXentVK/YBDG+TFi QvPL9OgUlKnZgHZ4APUUFQHwQhZ23iqf1GnThZ2KinDXOV+CPerb6s9mZEydXkoP Hg== -----END CERTIFICATE----- ubuntu-make-18.09+disco1/tests/data/download.blender.org.crt0000644000000000000000000000244213352651520020634 0ustar -----BEGIN CERTIFICATE----- MIIDnjCCAoagAwIBAgIJAPg8OYphNcruMA0GCSqGSIb3DQEBCwUAMGQxCzAJBgNV BAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX aWRnaXRzIFB0eSBMdGQxHTAbBgNVBAMMFGRvd25sb2FkLmJsZW5kZXIub3JnMB4X DTE4MDcwMzEzMTkyMloXDTI4MDUxMTEzMTkyMlowZDELMAkGA1UEBhMCQVUxEzAR BgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0IFdpZGdpdHMgUHR5 IEx0ZDEdMBsGA1UEAwwUZG93bmxvYWQuYmxlbmRlci5vcmcwggEiMA0GCSqGSIb3 DQEBAQUAA4IBDwAwggEKAoIBAQC9/WS3DTuzCb8c+jRJAMWDEL0pLzz4GOxCM6ib V6gWiWw+RhTVZ2wUrbr4jUiyN8G/VYN0xu07VyJtyCtu6lcbt3kIabMH4YECG2Qj /dhdEkF0KlX8e1QX4b3LNwgYjyz5vNXRRIyocU/92iGqboa3VbBXIu+CnTHebVQP WuLGdHXzObQHjm4TItdKiAcQIg9PyknkJiqqAEcYeoIpvpfF6Ay/MhThAlRQrmiN sv6MInYaV7SW9tzjxI+2Vb3hWizFKw8DL75fTDFYKMJrU7yJv2g5xYQeTzjUTH3G p2XZShBbauKJmlBxLWsztqU+oPhRnhksC2eNYhX9VDBbRyPBAgMBAAGjUzBRMB0G A1UdDgQWBBQ4B94jbWB0ysxjoNhBiK3NcwSNbTAfBgNVHSMEGDAWgBQ4B94jbWB0 ysxjoNhBiK3NcwSNbTAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IB AQBWuCf9UbPa96/4VKfGSha88Ylbsrg3bv+yXgzSqq/sSMoQOCSHPLQlig99aL0m jyISQ99D0b/Jprv0bWoZ6XXXI5IAzJ2B18pD8nbjcInJJRY9IPjmkOjIHfjyAVpA FH0Sjf/b949/YqUaGVivB5WUNKXSSQuWEPZRYdjAz/W1QRhNvsr22AVL8JFfF5bq 3JZqVGgJZMHyyGZphb/L4sJk+p+fpUJyOHjkB8bM93y3ZMIbtm/JjTDpmHSlZTFs JATcgPZ8u/mM3c1WICrR0V3tblN0CNP1fHvmLqv3/Kbb83TkB+wugdf0KjGSfKOH VfZIDo6Axz5cPPL8fqRohEHk -----END CERTIFICATE----- ubuntu-make-18.09+disco1/tests/data/download.blender.org.key0000644000000000000000000000325013352651520020632 0ustar -----BEGIN PRIVATE KEY----- MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQC9/WS3DTuzCb8c +jRJAMWDEL0pLzz4GOxCM6ibV6gWiWw+RhTVZ2wUrbr4jUiyN8G/VYN0xu07VyJt yCtu6lcbt3kIabMH4YECG2Qj/dhdEkF0KlX8e1QX4b3LNwgYjyz5vNXRRIyocU/9 2iGqboa3VbBXIu+CnTHebVQPWuLGdHXzObQHjm4TItdKiAcQIg9PyknkJiqqAEcY eoIpvpfF6Ay/MhThAlRQrmiNsv6MInYaV7SW9tzjxI+2Vb3hWizFKw8DL75fTDFY KMJrU7yJv2g5xYQeTzjUTH3Gp2XZShBbauKJmlBxLWsztqU+oPhRnhksC2eNYhX9 VDBbRyPBAgMBAAECggEACvbChyXGWjCnzL5LoiLfQw8GO4g0VoTprXBZvI00cAiC LJ3SufX78L2N2qYcmdxJ3AbNTUHlktUWcYtppj7zw++0ll2zLTNARKTcBI+zmrtg 95kx2R4s3ivyzfVhDDnG+KqDFE6GZ3oSia2636D9OTtCr+SeOcVkiVd50GEIUTdx 2qt9jfapkmO0a71SGEd93ggXiEP6H3CGE9aVWIcQjdXjtVCM9ImFIqwoM63LGUhY MV7rJWRCcVO8ReWDetkFS+V4HEzWde0DO/OnlEOiTEPYXvRGaGd27A4SpWAMA/fL 6FxICPelHEKsv4EXwMKQXdm4Ufo3RgL87TWkQ0Jo+QKBgQDeLmRQUKjMckv/fYmj Y82dHVTTuow/hbrMvsoapd/yqfJVL0xwoRI9ensdd81HheUL3V7kVoXdYZiiKXsY zJAjZVnZirUePEI6uv6MIDPLQeJXDCvSlUwclAR3HJNs6mTN2eXL8AXPLQp9oMXq 79fZYko9OqkNmODxbuCbU331kwKBgQDa6J4j2lnz3fGXzfV3Mdc2Hxo/ChdjQvVd 5X1sCvMDis3yXry9OJhi5/uX/czjWwY3WvNdBiI4H+ACBGhK5RorssCOkKXCeKIv aE6pGX6Io+k1RRzIXj3GUYra+X+A/LeCqh7Z3bJrEg+i1UlQuQk2u74ekcVdDarG lzZtTbsV2wKBgEgGJ/S1QRMNlj9bdcvmpZfiE0aTubU558VJsACVdxSWLP2aWKBG RsBxPQnfdUdTS13eRE2nErwiUDV5VvNCFRO0Xj0cLvx/MkURq0THh6LDV9k6E9av GT5GaXAnbk8naMgmc8z5oRh5FGaHQMGZQJKyvzg8FONYhMsfU2Zm2XVLAoGAYbET +c4U/KbcjTGFzPa6I1YIAYAAZfTYyVmD+nZ8cuU7+WDb+9nI78K1XeQOzputj4CQ QMBe/wsCjgPngxzw6/Vux3C3+KybPGrhR8ev10zG41X/fU/JY7q6K/TSOP8O6kn/ UJ0GZY/+2F00xch92yY3ty64lEloIA4VZPwedKcCgYARitLosEZOWre3cA/e2vfw ZlfeLQHGbOLF8uSHSAoPsmwEZcN999im5t+ndJ2/j6qWe1b18utG4eZuhikkcIG2 V+uehgx9xy8MNK67zPXA/eNNnScWRE6vDaJANXrJCINwa71EatpUJxEyip1CKnpK By7aXCUj48NFFIfy74MUjw== -----END PRIVATE KEY----- ubuntu-make-18.09+disco1/tests/data/download.blender.org.pem0000644000000000000000000000571213352651520020630 0ustar -----BEGIN PRIVATE KEY----- MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQC9/WS3DTuzCb8c +jRJAMWDEL0pLzz4GOxCM6ibV6gWiWw+RhTVZ2wUrbr4jUiyN8G/VYN0xu07VyJt yCtu6lcbt3kIabMH4YECG2Qj/dhdEkF0KlX8e1QX4b3LNwgYjyz5vNXRRIyocU/9 2iGqboa3VbBXIu+CnTHebVQPWuLGdHXzObQHjm4TItdKiAcQIg9PyknkJiqqAEcY eoIpvpfF6Ay/MhThAlRQrmiNsv6MInYaV7SW9tzjxI+2Vb3hWizFKw8DL75fTDFY KMJrU7yJv2g5xYQeTzjUTH3Gp2XZShBbauKJmlBxLWsztqU+oPhRnhksC2eNYhX9 VDBbRyPBAgMBAAECggEACvbChyXGWjCnzL5LoiLfQw8GO4g0VoTprXBZvI00cAiC LJ3SufX78L2N2qYcmdxJ3AbNTUHlktUWcYtppj7zw++0ll2zLTNARKTcBI+zmrtg 95kx2R4s3ivyzfVhDDnG+KqDFE6GZ3oSia2636D9OTtCr+SeOcVkiVd50GEIUTdx 2qt9jfapkmO0a71SGEd93ggXiEP6H3CGE9aVWIcQjdXjtVCM9ImFIqwoM63LGUhY MV7rJWRCcVO8ReWDetkFS+V4HEzWde0DO/OnlEOiTEPYXvRGaGd27A4SpWAMA/fL 6FxICPelHEKsv4EXwMKQXdm4Ufo3RgL87TWkQ0Jo+QKBgQDeLmRQUKjMckv/fYmj Y82dHVTTuow/hbrMvsoapd/yqfJVL0xwoRI9ensdd81HheUL3V7kVoXdYZiiKXsY zJAjZVnZirUePEI6uv6MIDPLQeJXDCvSlUwclAR3HJNs6mTN2eXL8AXPLQp9oMXq 79fZYko9OqkNmODxbuCbU331kwKBgQDa6J4j2lnz3fGXzfV3Mdc2Hxo/ChdjQvVd 5X1sCvMDis3yXry9OJhi5/uX/czjWwY3WvNdBiI4H+ACBGhK5RorssCOkKXCeKIv aE6pGX6Io+k1RRzIXj3GUYra+X+A/LeCqh7Z3bJrEg+i1UlQuQk2u74ekcVdDarG lzZtTbsV2wKBgEgGJ/S1QRMNlj9bdcvmpZfiE0aTubU558VJsACVdxSWLP2aWKBG RsBxPQnfdUdTS13eRE2nErwiUDV5VvNCFRO0Xj0cLvx/MkURq0THh6LDV9k6E9av GT5GaXAnbk8naMgmc8z5oRh5FGaHQMGZQJKyvzg8FONYhMsfU2Zm2XVLAoGAYbET +c4U/KbcjTGFzPa6I1YIAYAAZfTYyVmD+nZ8cuU7+WDb+9nI78K1XeQOzputj4CQ QMBe/wsCjgPngxzw6/Vux3C3+KybPGrhR8ev10zG41X/fU/JY7q6K/TSOP8O6kn/ UJ0GZY/+2F00xch92yY3ty64lEloIA4VZPwedKcCgYARitLosEZOWre3cA/e2vfw ZlfeLQHGbOLF8uSHSAoPsmwEZcN999im5t+ndJ2/j6qWe1b18utG4eZuhikkcIG2 V+uehgx9xy8MNK67zPXA/eNNnScWRE6vDaJANXrJCINwa71EatpUJxEyip1CKnpK By7aXCUj48NFFIfy74MUjw== -----END PRIVATE KEY----- -----BEGIN CERTIFICATE----- MIIDnjCCAoagAwIBAgIJAPg8OYphNcruMA0GCSqGSIb3DQEBCwUAMGQxCzAJBgNV BAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX aWRnaXRzIFB0eSBMdGQxHTAbBgNVBAMMFGRvd25sb2FkLmJsZW5kZXIub3JnMB4X DTE4MDcwMzEzMTkyMloXDTI4MDUxMTEzMTkyMlowZDELMAkGA1UEBhMCQVUxEzAR BgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0IFdpZGdpdHMgUHR5 IEx0ZDEdMBsGA1UEAwwUZG93bmxvYWQuYmxlbmRlci5vcmcwggEiMA0GCSqGSIb3 DQEBAQUAA4IBDwAwggEKAoIBAQC9/WS3DTuzCb8c+jRJAMWDEL0pLzz4GOxCM6ib V6gWiWw+RhTVZ2wUrbr4jUiyN8G/VYN0xu07VyJtyCtu6lcbt3kIabMH4YECG2Qj /dhdEkF0KlX8e1QX4b3LNwgYjyz5vNXRRIyocU/92iGqboa3VbBXIu+CnTHebVQP WuLGdHXzObQHjm4TItdKiAcQIg9PyknkJiqqAEcYeoIpvpfF6Ay/MhThAlRQrmiN sv6MInYaV7SW9tzjxI+2Vb3hWizFKw8DL75fTDFYKMJrU7yJv2g5xYQeTzjUTH3G p2XZShBbauKJmlBxLWsztqU+oPhRnhksC2eNYhX9VDBbRyPBAgMBAAGjUzBRMB0G A1UdDgQWBBQ4B94jbWB0ysxjoNhBiK3NcwSNbTAfBgNVHSMEGDAWgBQ4B94jbWB0 ysxjoNhBiK3NcwSNbTAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IB AQBWuCf9UbPa96/4VKfGSha88Ylbsrg3bv+yXgzSqq/sSMoQOCSHPLQlig99aL0m jyISQ99D0b/Jprv0bWoZ6XXXI5IAzJ2B18pD8nbjcInJJRY9IPjmkOjIHfjyAVpA FH0Sjf/b949/YqUaGVivB5WUNKXSSQuWEPZRYdjAz/W1QRhNvsr22AVL8JFfF5bq 3JZqVGgJZMHyyGZphb/L4sJk+p+fpUJyOHjkB8bM93y3ZMIbtm/JjTDpmHSlZTFs JATcgPZ8u/mM3c1WICrR0V3tblN0CNP1fHvmLqv3/Kbb83TkB+wugdf0KjGSfKOH VfZIDo6Axz5cPPL8fqRohEHk -----END CERTIFICATE----- ubuntu-make-18.09+disco1/tests/data/download.jetbrains.com.crt0000644000000000000000000000244613352651520021175 0ustar -----BEGIN CERTIFICATE----- MIIDnzCCAoegAwIBAgIJAM1IhO7SaWG4MA0GCSqGSIb3DQEBCwUAMGYxCzAJBgNV BAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX aWRnaXRzIFB0eSBMdGQxHzAdBgNVBAMMFmRvd25sb2FkLmpldGJyYWlucy5jb20w HhcNMTcwMzI4MTQxNTEwWhcNMjcwMjA0MTQxNTEwWjBmMQswCQYDVQQGEwJBVTET MBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0cyBQ dHkgTHRkMR8wHQYDVQQDDBZkb3dubG9hZC5qZXRicmFpbnMuY29tMIIBIjANBgkq hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArNcB4mqalTbasR6U1D6sWCFkf1h7SADH QaZQ84ryL5JNLFc0fvuIWGHTgb+002jPFZ6/xKh5yWxevLNMkfmUv8cw6IS54inX AX4O9YLasksV4NsTRleNoESPOKPecZny5oFzKisaKoCcVa7mxe/nnBQsN7wcW3c5 hc09IQEHD1TWPP3b4C19sylTP2NgDV7kCHiQRYcnBNzMmTb3g0WOLuxI5UG1gBOt DxKbzsjw/yK8osr+5Ixw1eZlhq7Ux8C/ALfUp7GQ7EiQ2LAAU690tTt1wdTcMQEq 1KQEs5zdliT+fw26f2E8omP3nrp9UOPox4JGQvzljmNTjhERAQaKnwIDAQABo1Aw TjAdBgNVHQ4EFgQUkGqE9jl5FbjBFEzAUhnnOtaO6mswHwYDVR0jBBgwFoAUkGqE 9jl5FbjBFEzAUhnnOtaO6mswDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQsFAAOC AQEAkfp/NQyYZB1KjG2cBJQiQHD2I6HBnizlHrXphgEof9FCYyP3i0JEm16XbgdX ZXfHLTJiVGlws/FPURCr1lR2ZA64Fl3wDtje4zq16du+/CPOKDKDaV5e8de+AfYD 26Kxh5QX2fmz3CZhgsYT4GoVv7BHn2BNxnpwjLvYKjjT/bebUgKNiQhUOAUBHicD YKKklrhYBYsR9/MEXnn/Xkh2OrgJXNJGkjlMOCx2AgD1f1WGP0NHQA6LSUpw6sT+ O3nVAlTtvPjQVJS2xJxcjC6y3V2Bo9P4AJMjtmh3pIvcCpc/ocyfuCyTWAFYvyzq GPKJVssJTgr2lCVFHw2Pyi0LyA== -----END CERTIFICATE----- ubuntu-make-18.09+disco1/tests/data/download.jetbrains.com.pem0000644000000000000000000000571613352651520021171 0ustar -----BEGIN PRIVATE KEY----- MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCs1wHiapqVNtqx HpTUPqxYIWR/WHtIAMdBplDzivIvkk0sVzR++4hYYdOBv7TTaM8Vnr/EqHnJbF68 s0yR+ZS/xzDohLniKdcBfg71gtqySxXg2xNGV42gRI84o95xmfLmgXMqKxoqgJxV rubF7+ecFCw3vBxbdzmFzT0hAQcPVNY8/dvgLX2zKVM/Y2ANXuQIeJBFhycE3MyZ NveDRY4u7EjlQbWAE60PEpvOyPD/Iryiyv7kjHDV5mWGrtTHwL8At9SnsZDsSJDY sABTr3S1O3XB1NwxASrUpASznN2WJP5/Dbp/YTyiY/eeun1Q4+jHgkZC/OWOY1OO EREBBoqfAgMBAAECggEBAI0WQZKKRL9S9LeqaADNXC/gqkGNf6zp/b0oP2JeZI3S li6AzPhu6QCEcnuyerAsGQbj/FRS1n9GeBr/HZz3J6ZYuiLD3VyxnLG6LgnZFB6A Tk6rZhOAerp93I92rKj86xugRdsBLi3NqFAFIpom2GA+0013v4omS41eWOztAs9O sNfYYEe8xO1FFLK/8YCs+0+8me5bSPWyl9+w+V9fMbAUzydwXXpPybmGXG3SoemZ qp/jGCqEi+IKD2LfJgzQVZY9c4oGIm+sQt3T3HfkyBUPlH6sO6XGDpAFcU9HHCD2 6BPh9QlVVtCmPltQcpgJSFgGWcNMBDQ8cspqI5KgrjECgYEA1IpMf+6kmFKsFvCu j2zbr+rz/7yrxSc3Pg/4kSgFFbdssOKAJ40inRc03kSOx9xoQVwhNmP0urznK20f Lexy1uDtW4Rl4D+eS3bj87BNSlmew0myBLweUDXNjdUddEoq3xytUFUeBrnCO8PJ qK+XGDgYBNDQBMgeWmJjkTSYyckCgYEA0C6KXiiW7ZuC4KtinctfTKalb77uE7ZN 0fDRXboUaDgl5Y92A48pagCfdbE914QmX/4HPEGTgMvG0MygBJdyW/44xCU5yAIz BLVDisQUj+cq+LKF5WffGwBwYx8Y8jpsoVSdJ7SKwBWx3q9UDLxPGHBfyorL+4mc yKJCF8bH5ScCgYADd4IJ8C2VInwWH7TpOABZXT6/pCc1Hw+inoYScBGtKgHG3Nr0 SjQPVeqR2ZJupiS5NDSCe5zpUt1+ctg4WowA/0g/3uf+gWsmlfjf57dLCC0zyEb0 FtFzw3zn3FsPo4oRe5lEHy9PMsZ9TRNEAiE3zuptYa6S9WSxWrt/CdmYKQKBgQC0 wjRSXVvvI8AX47fU2uj8XRX4WQfPBdO8HiUsBI4Dj/0XveDyZjPHXpMWVbckkhHf 92nA4A97HXSbh5DJa9ZYGfygEtKA36f8xobGzkosSMP+/MNV1ULa5x6ucinu6Nu5 mQZ7mz9+WVf/yqxoAnmK9se1zZ4f4fTIIFrS2j5msQKBgFtuz9DMlviWoqTKm7zR 9cERjJkOGL17EwnPQ1FjPJ9rz/MBnj9ckw2t+pppaA5flRkyxqhRJ2prl7lCkOrg ZUA1iu4ydA2RQEkJf1ImngRKQoUMvqD69kG97ak8bTfnJX9TS1gjZl1XmuHbxOlb OenkgixbVK14PmYOjhSbD+rx -----END PRIVATE KEY----- -----BEGIN CERTIFICATE----- MIIDnzCCAoegAwIBAgIJAM1IhO7SaWG4MA0GCSqGSIb3DQEBCwUAMGYxCzAJBgNV BAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX aWRnaXRzIFB0eSBMdGQxHzAdBgNVBAMMFmRvd25sb2FkLmpldGJyYWlucy5jb20w HhcNMTcwMzI4MTQxNTEwWhcNMjcwMjA0MTQxNTEwWjBmMQswCQYDVQQGEwJBVTET MBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0cyBQ dHkgTHRkMR8wHQYDVQQDDBZkb3dubG9hZC5qZXRicmFpbnMuY29tMIIBIjANBgkq hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArNcB4mqalTbasR6U1D6sWCFkf1h7SADH QaZQ84ryL5JNLFc0fvuIWGHTgb+002jPFZ6/xKh5yWxevLNMkfmUv8cw6IS54inX AX4O9YLasksV4NsTRleNoESPOKPecZny5oFzKisaKoCcVa7mxe/nnBQsN7wcW3c5 hc09IQEHD1TWPP3b4C19sylTP2NgDV7kCHiQRYcnBNzMmTb3g0WOLuxI5UG1gBOt DxKbzsjw/yK8osr+5Ixw1eZlhq7Ux8C/ALfUp7GQ7EiQ2LAAU690tTt1wdTcMQEq 1KQEs5zdliT+fw26f2E8omP3nrp9UOPox4JGQvzljmNTjhERAQaKnwIDAQABo1Aw TjAdBgNVHQ4EFgQUkGqE9jl5FbjBFEzAUhnnOtaO6mswHwYDVR0jBBgwFoAUkGqE 9jl5FbjBFEzAUhnnOtaO6mswDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQsFAAOC AQEAkfp/NQyYZB1KjG2cBJQiQHD2I6HBnizlHrXphgEof9FCYyP3i0JEm16XbgdX ZXfHLTJiVGlws/FPURCr1lR2ZA64Fl3wDtje4zq16du+/CPOKDKDaV5e8de+AfYD 26Kxh5QX2fmz3CZhgsYT4GoVv7BHn2BNxnpwjLvYKjjT/bebUgKNiQhUOAUBHicD YKKklrhYBYsR9/MEXnn/Xkh2OrgJXNJGkjlMOCx2AgD1f1WGP0NHQA6LSUpw6sT+ O3nVAlTtvPjQVJS2xJxcjC6y3V2Bo9P4AJMjtmh3pIvcCpc/ocyfuCyTWAFYvyzq GPKJVssJTgr2lCVFHw2Pyi0LyA== -----END CERTIFICATE----- ubuntu-make-18.09+disco1/tests/data/download.sublimetext.com.crt0000644000000000000000000000245213352651520021556 0ustar -----BEGIN CERTIFICATE----- MIIDozCCAougAwIBAgIJAPGSVoj9uaznMA0GCSqGSIb3DQEBCwUAMGgxCzAJBgNV BAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX aWRnaXRzIFB0eSBMdGQxITAfBgNVBAMMGGRvd25sb2FkLnN1YmxpbWV0ZXh0LmNv bTAeFw0xNjA0MTQyMDA0MDFaFw0yNjAyMjEyMDA0MDFaMGgxCzAJBgNVBAYTAkFV MRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBXaWRnaXRz IFB0eSBMdGQxITAfBgNVBAMMGGRvd25sb2FkLnN1YmxpbWV0ZXh0LmNvbTCCASIw DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOgwspfPu89rCZ8Qld2YWSpfgJN0 1BFhlx5xgF5KxGeRgRkKjmm9XZg0ZulzOBuOWc4177J0cGLUWTnW+kjfCDHnZHBR 7tfXQh4g2zjM4nJ71R/RpcjVet2tliT0crEMXFUywn3fGXYC1R+LUtXBXSU+3fz/ 6One/BKLqx2V/DPD2uEpkbxKihfqeqFxCu80OrxRqrKeWyuUP+YfKDquUTapSRiU ERgmjLslcQQmUvOTRY5WR50+R1wbIn99R4gFN+YhfhoXVlIYJA2LDFsmweMzjmIB SWFlUjOthuolX1eadCA3Xhgx/P4tHKmFBFroLJhu6hAYBsxDP3uz0lVg+WUCAwEA AaNQME4wHQYDVR0OBBYEFBSdBRmI82IyaWtNMXDM5Yp8mOpAMB8GA1UdIwQYMBaA FBSdBRmI82IyaWtNMXDM5Yp8mOpAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEL BQADggEBAA/Kbr/oyAxAIr2oSZjUXDpPGipu/AJz6OgbSaH6xHhe5qDCN2irXo6g Syw9gZ/mALGG10EmSHEuZtsVkH1IiqCYaACXPboHu80rEUm0xMYDbKS2Y0T13qfv 3VskKBi6dqcSHhX3a9LWQ+xD2ZME2bBJZseLME0H6Llx2rk704Q6E1ioCe31mzWW FGxY12kL5chwPM9m+Fso1XrMEHq0iJX1T6vA5rw4Uf5V+1Cro4JITM19+uNsh/5Z nvyiFnbSwbQUk8P5Sk6qJAMU0Q25tSglWb+Sprdnj9wVLPOMYPTxJ1jM33lNYn5/ 6w1PYki5syLw7LiJV9V6/bhUMxpZG4Y= -----END CERTIFICATE----- ubuntu-make-18.09+disco1/tests/data/download.sublimetext.com.pem0000644000000000000000000000572213352651520021552 0ustar -----BEGIN PRIVATE KEY----- MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDoMLKXz7vPawmf EJXdmFkqX4CTdNQRYZcecYBeSsRnkYEZCo5pvV2YNGbpczgbjlnONe+ydHBi1Fk5 1vpI3wgx52RwUe7X10IeINs4zOJye9Uf0aXI1XrdrZYk9HKxDFxVMsJ93xl2AtUf i1LVwV0lPt38/+jp3vwSi6sdlfwzw9rhKZG8SooX6nqhcQrvNDq8UaqynlsrlD/m Hyg6rlE2qUkYlBEYJoy7JXEEJlLzk0WOVkedPkdcGyJ/fUeIBTfmIX4aF1ZSGCQN iwxbJsHjM45iAUlhZVIzrYbqJV9XmnQgN14YMfz+LRyphQRa6CyYbuoQGAbMQz97 s9JVYPllAgMBAAECggEBAKF7NMoGLH0d2SwqMcBSsziYAOkMqGyKLbp7f6aUYzIQ bPOIdvEtRQmU8DnN6yinAOg8dL7s4jiprIBgdeL2UlG6twyyvuSYDaC8gxpmy9qJ KvkdKiqZ5gCEOFbtN1LQ4OpUChXWcnOzlpuAnxSQjYJYzbSmGkuEzFTtlA1YgXVR nyisb2gnufOkCBw1VpTqBNX0gErKvfVvkrY9Oc91FnrA7UrHirsjlm6ayl4r0hNd eekigIIAH8vFuKw3lXdlQ1YrCOBnE4/Y6hxtBbHhjpd1nie00CxgpRROImf6N4Sh lTuZ/AsLP+M8mLuLnaSPJGlkpxMgT+sjKBlPP/dqAKUCgYEA9SAvLH3/i9EmWrDa 9x7nzu5mJgpRuKzb68bvlvc14ogTn5KfK1hH5vLwXRu4i1qmm7G7NvxqG4YC90QK jjh8ACpwtC8cqySjDg95j47qfTrK98a30lgzl0iBBKhUie+90EFHjs3J0Zas85o4 +hkkXKGYF7dU8SUqjYvL0FowVtcCgYEA8n2b6Bcn07YsAW3P2eTF+jmmiJCgBrBc w/6nmZhD4MMWr923n3QiJorCn1XM3LE9yGg4rMurOLoe6AS5VQr5tXs1rYGt0+6k 3eLYAw1tF0DDi8mDDvnHFESlO+5FR75/aRvUuQa1R9DpIS3IN4agOcGCS2RL4f0O 9ctm4rtydiMCgYEAzDb29iM2bf5d7Lpggfa+erhEY7a/JJLmWUSQQH5N5x8k8hFO B+dxZ6fHtlos4fQwz48/gGzD3ZBFEkkeXiQSsnSpFoQVZ0OLkGA2DvKqyo/bnpdw d45B1OxziDTQ0WXpBgIMop0xYSodholapImjsIRz2HZFDu2+yNPJhhhNI1sCgYBd ueUv8PtI3mnl537mNoG7NNtEf7oKu9IvQ1eei3b5Ag7bzPPzYtzsTsfo9C3pw2wg 8P+u8k3s8CuP/Htx/nsEBWp69NuuRdhdlxdtHpxi13p9plbMzAiBsgK3xmHq2BvB EavIFGqvJnVliJ+RrqxxhnUJFOwrnjdRE9xhmJgmRwKBgDpfz2UcWUjqOW8AyBjq 8w7iFxoYzKDSC2m9uG2LOIT47MFK+WUCG3g0anjWwuSG0iL3mgsnAHCkX+1gzaUv 2JVzJCTxiHjVyG8L79A5n6BR+EdZ262keFAf6JXVmkkMeswmNWdMV8FKSW9JelEq GYjFMLThkscVlL++2vEbC5Ke -----END PRIVATE KEY----- -----BEGIN CERTIFICATE----- MIIDozCCAougAwIBAgIJAPGSVoj9uaznMA0GCSqGSIb3DQEBCwUAMGgxCzAJBgNV BAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX aWRnaXRzIFB0eSBMdGQxITAfBgNVBAMMGGRvd25sb2FkLnN1YmxpbWV0ZXh0LmNv bTAeFw0xNjA0MTQyMDA0MDFaFw0yNjAyMjEyMDA0MDFaMGgxCzAJBgNVBAYTAkFV MRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBXaWRnaXRz IFB0eSBMdGQxITAfBgNVBAMMGGRvd25sb2FkLnN1YmxpbWV0ZXh0LmNvbTCCASIw DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOgwspfPu89rCZ8Qld2YWSpfgJN0 1BFhlx5xgF5KxGeRgRkKjmm9XZg0ZulzOBuOWc4177J0cGLUWTnW+kjfCDHnZHBR 7tfXQh4g2zjM4nJ71R/RpcjVet2tliT0crEMXFUywn3fGXYC1R+LUtXBXSU+3fz/ 6One/BKLqx2V/DPD2uEpkbxKihfqeqFxCu80OrxRqrKeWyuUP+YfKDquUTapSRiU ERgmjLslcQQmUvOTRY5WR50+R1wbIn99R4gFN+YhfhoXVlIYJA2LDFsmweMzjmIB SWFlUjOthuolX1eadCA3Xhgx/P4tHKmFBFroLJhu6hAYBsxDP3uz0lVg+WUCAwEA AaNQME4wHQYDVR0OBBYEFBSdBRmI82IyaWtNMXDM5Yp8mOpAMB8GA1UdIwQYMBaA FBSdBRmI82IyaWtNMXDM5Yp8mOpAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEL BQADggEBAA/Kbr/oyAxAIr2oSZjUXDpPGipu/AJz6OgbSaH6xHhe5qDCN2irXo6g Syw9gZ/mALGG10EmSHEuZtsVkH1IiqCYaACXPboHu80rEUm0xMYDbKS2Y0T13qfv 3VskKBi6dqcSHhX3a9LWQ+xD2ZME2bBJZseLME0H6Llx2rk704Q6E1ioCe31mzWW FGxY12kL5chwPM9m+Fso1XrMEHq0iJX1T6vA5rw4Uf5V+1Cro4JITM19+uNsh/5Z nvyiFnbSwbQUk8P5Sk6qJAMU0Q25tSglWb+Sprdnj9wVLPOMYPTxJ1jM33lNYn5/ 6w1PYki5syLw7LiJV9V6/bhUMxpZG4Y= -----END CERTIFICATE----- ubuntu-make-18.09+disco1/tests/data/downloads.arduino.cc.crt0000644000000000000000000000244213352651520020643 0ustar -----BEGIN CERTIFICATE----- MIIDnjCCAoagAwIBAgIJAOfmK6glHE9RMA0GCSqGSIb3DQEBCwUAMGQxCzAJBgNV BAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX aWRnaXRzIFB0eSBMdGQxHTAbBgNVBAMMFGRvd25sb2Fkcy5hcmR1aW5vLmNjMB4X DTE4MDUxODA3MTk0MVoXDTI4MDMyNjA3MTk0MVowZDELMAkGA1UEBhMCQVUxEzAR BgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0IFdpZGdpdHMgUHR5 IEx0ZDEdMBsGA1UEAwwUZG93bmxvYWRzLmFyZHVpbm8uY2MwggEiMA0GCSqGSIb3 DQEBAQUAA4IBDwAwggEKAoIBAQC91VEw8QadtlUwm0qDa2H8PeWD8Fvkn1Q7QNSw 3fDvuT4JG+fPX0JiN5tVTIXP3H3WHtmZL3n5gbbyAhfZOgkzDLMzNFKyJSVDMfD9 nkwkCnHs8+UOHcVhuXbyTMwlFko6qxDdvEx4Z6Emc97vTiIOKik/MFn2g6w8FZbq NIi6wQcVwS36NyxdWvYb9pnSMNdLr2QUNGsDVZcCZV4pIlj4VxuxWvDyXUg4UCpq iqPDSBQm9O8982FfU0+PfMzU0j1EUxQLPhiwSJL9O/IqjlS65jLQHO2rnrwuf5Eb ZjduRipZJ2LEAp+Fv2TuUJNMnke6gwTsGOHEgP0fJLAMqT8FAgMBAAGjUzBRMB0G A1UdDgQWBBT2Xel6tbA/wvrvHkuNf1IPhg9WtDAfBgNVHSMEGDAWgBT2Xel6tbA/ wvrvHkuNf1IPhg9WtDAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IB AQAdDECE9Nu2LG8CF/wMqrlvo3yM0g1y5YjWcFsaycaz6mpu0rztXb6oUPACDN8Z lV6iqkI7ZSVb7eh6aExx2cpZgLdiGRaWCsIulLMC6TkHMtNjZ3ZRlaVwp5fnmO8h BYCz1o4zn4Hidh/u4dohx/okIdaDu7Iq4o7ZNMCPgmDAYYqzX0bZk6uxMeTqE7Fp u+BzgGAo+6YIW/yqZpuKjux0mUFzbDN++eYRcckND0ok9s5AzdbwufARy1c/N/cZ xlXcqICxbbrBgYE9N4X8WU+93VHicOlShHoORCf+wrVAYnJU2RJGLneBpZT0lvcq V5b59ujuEsFsGsL13DHoniQc -----END CERTIFICATE----- ubuntu-make-18.09+disco1/tests/data/downloads.arduino.cc.pem0000644000000000000000000000571213352651520020637 0ustar -----BEGIN PRIVATE KEY----- MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC91VEw8QadtlUw m0qDa2H8PeWD8Fvkn1Q7QNSw3fDvuT4JG+fPX0JiN5tVTIXP3H3WHtmZL3n5gbby AhfZOgkzDLMzNFKyJSVDMfD9nkwkCnHs8+UOHcVhuXbyTMwlFko6qxDdvEx4Z6Em c97vTiIOKik/MFn2g6w8FZbqNIi6wQcVwS36NyxdWvYb9pnSMNdLr2QUNGsDVZcC ZV4pIlj4VxuxWvDyXUg4UCpqiqPDSBQm9O8982FfU0+PfMzU0j1EUxQLPhiwSJL9 O/IqjlS65jLQHO2rnrwuf5EbZjduRipZJ2LEAp+Fv2TuUJNMnke6gwTsGOHEgP0f JLAMqT8FAgMBAAECggEAFPrdZUZOD+IV2jBfdNTKWIFSu1k2HrdJLN9GYmG0/hl/ 9KvD29RQVuCEZ1H0u/tHYQG51Mc9eMjQOkDm99gFKkIuD+updAzM6Hc9hhoXmigZ XTG7T+sUZG+F6NN6AGNNQtyjGY50+R2i3sgRjGsbMmuQcW5bkvYMc/uC2VGDBvib KmP6V9azbT3ukXYJKqs3XimgwCkzrvLl7aeQiP4bbSOAZxChG3OuZw6/SLUPlt9o EyJIRcac6EnOmx5VMlWosagPyUiK9PHWi+R62/qCIYxp3zSjXFS47AZXGuuqEjxE JbHdcVw91zPCjKCcuFXA+EHB4ej0dxsWvweyi8IuZQKBgQD89Nl4N9OH5K9YC9Ci PqhjNQpfyb0BVRR9lrbisJwsC4JF6P7hbceOiMQ7C9GYGjWXl51HIxcOEPnUMpRR yEFoLmRM/bP8k0LNAGF44I8OevUCI0j9PB3v3j4lh2e/ZnD4o2sSxwfoxACg9fW2 uhC75POo0nNhDUgsjBfEJ9emVwKBgQDAHgmCO8vCBXhW3YyMxpedbZeWxA2Y0ysw qGLNl3aS4p6P7AVjz8Ugnjj4MKgj8cajob6HsSY97Rd2T7EDmLYwwhGlmtXGGmED 9MIzbqLqWiYD6DlSjYsA80pSi4T9fq8vcwE6s+748PrA/M14sNyZ3ZfETrRMgoD1 Qf1rk8iUAwKBgQCbVumtr+rRCxi64xaObBgQRGRIiqTtCoh4z3MkJvzg93ha4kiT u0zPNSH8eLePxpierVbCdsQTuU0SiLUYu/eeuM6TkUFUnEJrjg5Noul3JP8M/wo1 qRNhWIOlnE+T9J7vsbtxXpR21tbkAeeQ/RaFrIYNaJ++O9/Uq3t01FrUJQKBgFic gh5DnlO7WioWvgEgiEXgio7LlsnqfH1Q7WGOfu55AFG5tzK2XmIRGI3BQ4xwtAI9 VDgaCV1+wdecIjVado4+tQ0BQaDCAgVlGz3Fxfb55ZbfwbDGAFtL2/f+yjRx/jOQ g/yjiZHg9IeXEt6cFOQTRTESbC7t8rUs3sqDu3wpAoGBAPScPkNJGV1zc4GDofTT OLJKaXQIBLGRoYgf8tj0w+xrd/rkJzVerhau7zF5mb9MJMXylrbYa42mZ+cdmm8+ ijCCfGIHxaS0r+SUij4yIWDCkdrD/HXc2fGwDfdUR0cgrZJEqeeOLeUmxqEg8Orm SK57umlt7FsSPlOTZX3YWwOS -----END PRIVATE KEY----- -----BEGIN CERTIFICATE----- MIIDnjCCAoagAwIBAgIJAOfmK6glHE9RMA0GCSqGSIb3DQEBCwUAMGQxCzAJBgNV BAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX aWRnaXRzIFB0eSBMdGQxHTAbBgNVBAMMFGRvd25sb2Fkcy5hcmR1aW5vLmNjMB4X DTE4MDUxODA3MTk0MVoXDTI4MDMyNjA3MTk0MVowZDELMAkGA1UEBhMCQVUxEzAR BgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0IFdpZGdpdHMgUHR5 IEx0ZDEdMBsGA1UEAwwUZG93bmxvYWRzLmFyZHVpbm8uY2MwggEiMA0GCSqGSIb3 DQEBAQUAA4IBDwAwggEKAoIBAQC91VEw8QadtlUwm0qDa2H8PeWD8Fvkn1Q7QNSw 3fDvuT4JG+fPX0JiN5tVTIXP3H3WHtmZL3n5gbbyAhfZOgkzDLMzNFKyJSVDMfD9 nkwkCnHs8+UOHcVhuXbyTMwlFko6qxDdvEx4Z6Emc97vTiIOKik/MFn2g6w8FZbq NIi6wQcVwS36NyxdWvYb9pnSMNdLr2QUNGsDVZcCZV4pIlj4VxuxWvDyXUg4UCpq iqPDSBQm9O8982FfU0+PfMzU0j1EUxQLPhiwSJL9O/IqjlS65jLQHO2rnrwuf5Eb ZjduRipZJ2LEAp+Fv2TuUJNMnke6gwTsGOHEgP0fJLAMqT8FAgMBAAGjUzBRMB0G A1UdDgQWBBT2Xel6tbA/wvrvHkuNf1IPhg9WtDAfBgNVHSMEGDAWgBT2Xel6tbA/ wvrvHkuNf1IPhg9WtDAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IB AQAdDECE9Nu2LG8CF/wMqrlvo3yM0g1y5YjWcFsaycaz6mpu0rztXb6oUPACDN8Z lV6iqkI7ZSVb7eh6aExx2cpZgLdiGRaWCsIulLMC6TkHMtNjZ3ZRlaVwp5fnmO8h BYCz1o4zn4Hidh/u4dohx/okIdaDu7Iq4o7ZNMCPgmDAYYqzX0bZk6uxMeTqE7Fp u+BzgGAo+6YIW/yqZpuKjux0mUFzbDN++eYRcckND0ok9s5AzdbwufARy1c/N/cZ xlXcqICxbbrBgYE9N4X8WU+93VHicOlShHoORCf+wrVAYnJU2RJGLneBpZT0lvcq V5b59ujuEsFsGsL13DHoniQc -----END CERTIFICATE----- ubuntu-make-18.09+disco1/tests/data/downloads.tuxfamily.org.crt0000644000000000000000000000245213352651520021427 0ustar -----BEGIN CERTIFICATE----- MIIDpDCCAoygAwIBAgIJAM9bNrKfPIEbMA0GCSqGSIb3DQEBCwUAMGcxCzAJBgNV BAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX aWRnaXRzIFB0eSBMdGQxIDAeBgNVBAMMF2Rvd25sb2Fkcy50dXhmYW1pbHkub3Jn MB4XDTE4MDUwNTE3MDIwN1oXDTI4MDMxMzE3MDIwN1owZzELMAkGA1UEBhMCQVUx EzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0IFdpZGdpdHMg UHR5IEx0ZDEgMB4GA1UEAwwXZG93bmxvYWRzLnR1eGZhbWlseS5vcmcwggEiMA0G CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDmVfvyvA1mcPpEtfx79lDZ03TTul22 8WrQgO4fsTxk+23e3MywWqxQwRZHuX+tqK5EffZJTzbxNuPfuSw/Y5RQOSNeLOmH qf7O6NC5Tbt2/Mdqh4oXaDrlr9GZibEWweyj0n6USzwp8qtl5GRR60YMe+xOqZt5 GhscviQQi8bt5hAGDjdaEp4aNgnKLNv+n9E9I3gsvxhup8/MDr+EZipng7X8mR0h GAnhKr8bLAYzgWw4o+wdvvKalchcoo9ZN0OjYsiCOenNkMX9Laew0K7JQ0g6UxjQ qylSrJYnG7d8Et2KG7WC13NEAc0uYEpcDWDaQHoGYgG+VOxUeuT63enLAgMBAAGj UzBRMB0GA1UdDgQWBBQMXoWMQ0p7/TgGs7iCds4pU0MvdDAfBgNVHSMEGDAWgBQM XoWMQ0p7/TgGs7iCds4pU0MvdDAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEB CwUAA4IBAQDEcHltBpdzsJpCF8fm+NzUA9wkYWO3WfQJ1BtWKQD26mXrytE9fWMi 9we7+835+A+nEfHQSc3lxAJ7UnWdknVloBwD4rZXhumPXscdThCOVPECDZrfL/Cg Gpuy9jmygkpGpMosXl7IEB1pkuMLE4RRW9xBDLC9FMVYEpyCjytQhHI65dnOMtkm CrOHkSi5znfj9dJmo6mq+XdXE6vj31ujqX5Pus3431fs3qmraGVkhNB8JUSz983j irO7/5MRiJcUiv7WrozkGYv6K1TOfBD6PJs0f68mKZ2a6BlQxHGv4qM96ehMJ3nF wg26u0p6qtG0HGFErCDW5LeppgVDpcAj -----END CERTIFICATE----- ubuntu-make-18.09+disco1/tests/data/downloads.tuxfamily.org.pem0000644000000000000000000000572213352651520021423 0ustar -----BEGIN PRIVATE KEY----- MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDmVfvyvA1mcPpE tfx79lDZ03TTul228WrQgO4fsTxk+23e3MywWqxQwRZHuX+tqK5EffZJTzbxNuPf uSw/Y5RQOSNeLOmHqf7O6NC5Tbt2/Mdqh4oXaDrlr9GZibEWweyj0n6USzwp8qtl 5GRR60YMe+xOqZt5GhscviQQi8bt5hAGDjdaEp4aNgnKLNv+n9E9I3gsvxhup8/M Dr+EZipng7X8mR0hGAnhKr8bLAYzgWw4o+wdvvKalchcoo9ZN0OjYsiCOenNkMX9 Laew0K7JQ0g6UxjQqylSrJYnG7d8Et2KG7WC13NEAc0uYEpcDWDaQHoGYgG+VOxU euT63enLAgMBAAECggEBANZvlFi+FCeb5JMVbhKmFU1FnI0FAvwvM0cb0RS2N0i3 /uitXO6N68BeknSB0MkGsf7X2fMUCU110Z3V0cjN1yT8nN2vKFaBv9Q3USJCqNU0 rh6SQtBZ3AM7tQGg+7n5HmrBq9A5XrCa2FDK2U6en589u5jcM/8Be949cmvpBXEx qr7Qnx7duZXvW2RQW/tVhzjvseKBhoBD9BOp2+G+RIXzmsWKDLTaB+fn+ekr+a8g T8pnhbr6rWH5kvIg7PevUVtLaKtNcLw/3SyQgXqBBfFoDByBIig5G8UUJRY0fX46 /xzd8MEGaeSfiXpLlCIW8DJ5431EsJ9C1msac3UIIWECgYEA+kHpV7k7uRqa+B5G 7LUNZC+6r85dVI7cA2nYEWTr+YexF8/9DkUJvQ1hQEBE4sNIZhaMAuZ9hLpjx/CG nBKjl8ny7UuNlOa4RTKkta6qSKmDry8FQ+e7CVc0ulVXLYvTRX6Dd2ZPH+AB/vYH bPjkEXZLq1ltyHm+wYWFpL4P6rECgYEA658MFKcxS8F1F1qgRSkU4EjdUX7wljyw lkWMR/kX34h4Ib8UCneLwaB1xMC0YdJN7p72zz7qWxrnTKp5+4n166x4o2kH8XQb uhMyB1K6j2JMaWxj5zTX9P22nFsmNvm91AEVfEbnzVisQxMYqaMtQuoeE99duVqo rjjT4iPOwzsCgYB1Oei/EeK6+456CVy5xrmmI4F0lts7H8xJwQvYYgjzky9Oczwb shU0vI7AlRpvioBgadFeDm/fe5v/7VhwxX5iPNQReeGxTT4mE+n5vP7BGL65kfIK dAM2BeaKHi2/BQ+LLw8QIBmSWdE1iDPERPY4g8xAUJzPWtATQKNwnyM/kQKBgQCM NB7HJ1mg/2PCWs3leXWPpCv1s3hLnZ9iO84mgaVgAN+jDQVK2SnTNLz/L7/mOXLg G703QvPG9HJP310ofUZVT1KVwgjU90cMaSGq0+JpMY/QZ4vm5z3d7R69WUubCO6Y +XAkfDiwqyQN4Y4aWxuypobxQkeN5NFcojoKZU5CQwKBgFh10nLya7DwKAZQp2tm 1R9HcT07Tw/XhfoJhQ6UHRVU8BsPL79FC9BAT0T10CFtlfMFq+yi8U7C/mmaRGJW WhbNo03K2bAGlq/WPJpkS1/U3eu6XkswdOVYCBL2Q7OApil60DGkrgJanOw0YUqe PxK43f0TGzWnwS0qumsBFwim -----END PRIVATE KEY----- -----BEGIN CERTIFICATE----- MIIDpDCCAoygAwIBAgIJAM9bNrKfPIEbMA0GCSqGSIb3DQEBCwUAMGcxCzAJBgNV BAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX aWRnaXRzIFB0eSBMdGQxIDAeBgNVBAMMF2Rvd25sb2Fkcy50dXhmYW1pbHkub3Jn MB4XDTE4MDUwNTE3MDIwN1oXDTI4MDMxMzE3MDIwN1owZzELMAkGA1UEBhMCQVUx EzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0IFdpZGdpdHMg UHR5IEx0ZDEgMB4GA1UEAwwXZG93bmxvYWRzLnR1eGZhbWlseS5vcmcwggEiMA0G CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDmVfvyvA1mcPpEtfx79lDZ03TTul22 8WrQgO4fsTxk+23e3MywWqxQwRZHuX+tqK5EffZJTzbxNuPfuSw/Y5RQOSNeLOmH qf7O6NC5Tbt2/Mdqh4oXaDrlr9GZibEWweyj0n6USzwp8qtl5GRR60YMe+xOqZt5 GhscviQQi8bt5hAGDjdaEp4aNgnKLNv+n9E9I3gsvxhup8/MDr+EZipng7X8mR0h GAnhKr8bLAYzgWw4o+wdvvKalchcoo9ZN0OjYsiCOenNkMX9Laew0K7JQ0g6UxjQ qylSrJYnG7d8Et2KG7WC13NEAc0uYEpcDWDaQHoGYgG+VOxUeuT63enLAgMBAAGj UzBRMB0GA1UdDgQWBBQMXoWMQ0p7/TgGs7iCds4pU0MvdDAfBgNVHSMEGDAWgBQM XoWMQ0p7/TgGs7iCds4pU0MvdDAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEB CwUAA4IBAQDEcHltBpdzsJpCF8fm+NzUA9wkYWO3WfQJ1BtWKQD26mXrytE9fWMi 9we7+835+A+nEfHQSc3lxAJ7UnWdknVloBwD4rZXhumPXscdThCOVPECDZrfL/Cg Gpuy9jmygkpGpMosXl7IEB1pkuMLE4RRW9xBDLC9FMVYEpyCjytQhHI65dnOMtkm CrOHkSi5znfj9dJmo6mq+XdXE6vj31ujqX5Pus3431fs3qmraGVkhNB8JUSz983j irO7/5MRiJcUiv7WrozkGYv6K1TOfBD6PJs0f68mKZ2a6BlQxHGv4qM96ehMJ3nF wg26u0p6qtG0HGFErCDW5LeppgVDpcAj -----END CERTIFICATE----- ubuntu-make-18.09+disco1/tests/data/duplicatedframeworks/0000755000000000000000000000000013415340675020336 5ustar ubuntu-make-18.09+disco1/tests/data/duplicatedframeworks/__init__.py0000644000000000000000000000000013352651520022427 0ustar ubuntu-make-18.09+disco1/tests/data/duplicatedframeworks/category.py0000644000000000000000000000324013352651520022516 0ustar # -*- coding: utf-8 -*- # Copyright (C) 2014 Canonical # # Authors: # Didier Roche # # 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; version 3. # # 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 """Framework with category module""" import umake.frameworks class ACategory(umake.frameworks.BaseCategory): def __init__(self): super().__init__(name="Category A", description="Category A description") class FrameworkA(umake.frameworks.BaseFramework): def __init__(self, **kwargs): super().__init__(name="Framework A", description="Description for framework A", install_path_dir="custom/frameworka", **kwargs) def setup(self, install_path=None, auto_accept_license=False): super().setup() def remove(self): super().remove() class FrameworkB(umake.frameworks.BaseFramework): def __init__(self, **kwargs): super().__init__(name="Framework A", description="Description for duplicated framework A", **kwargs) def setup(self, install_path=None, auto_accept_license=False): super().setup() def remove(self): super().remove() ubuntu-make-18.09+disco1/tests/data/duplicatedframeworks/samecategory.py0000644000000000000000000000322313352651520023365 0ustar # -*- coding: utf-8 -*- # Copyright (C) 2014 Canonical # # Authors: # Didier Roche # # 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; version 3. # # 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 """Framework with another category module without any framework""" import umake.frameworks class ACategory(umake.frameworks.BaseCategory): def __init__(self): super().__init__(name="Category A", description="Other category A description") class FrameworkC(umake.frameworks.BaseFramework): def __init__(self, **kwargs): super().__init__(name="Framework C", description="Description for framework C", **kwargs) def setup(self, install_path=None, auto_accept_license=False): super().setup() def remove(self): super().remove() class FrameworkD(umake.frameworks.BaseFramework): def __init__(self, **kwargs): super().__init__(name="Framework D", description="Description for framework D", **kwargs) def setup(self, install_path=None, auto_accept_license=False): super().setup() def remove(self): super().remove() ubuntu-make-18.09+disco1/tests/data/eagle-updates.circuits.io.crt0000644000000000000000000000245613352651520021604 0ustar -----BEGIN CERTIFICATE----- MIIDpTCCAo2gAwIBAgIJAJu+KDn8qFgVMA0GCSqGSIb3DQEBCwUAMGkxCzAJBgNV BAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX aWRnaXRzIFB0eSBMdGQxIjAgBgNVBAMMGWVhZ2xlLXVwZGF0ZXMuY2lyY3VpdHMu aW8wHhcNMTgwMzE2MTQ1NTQ0WhcNMjgwMTIzMTQ1NTQ0WjBpMQswCQYDVQQGEwJB VTETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0 cyBQdHkgTHRkMSIwIAYDVQQDDBllYWdsZS11cGRhdGVzLmNpcmN1aXRzLmlvMIIB IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwKMatEwQlyWTAhXTbJsUVbz3 aiWytKBx/13FJs6QGKK8FNmM708dAuoy/oYJintpck3QAQbHwKWszkd4dH04Lmqa 99m6sSv1b3TR5wk0ubp4rWNSzROz6g4Ob3Pa50jmufE3jb7JxqslGxwEPgwBGfxD RJEQD2OoHPLy3ASvUlVgkxRzktkFil6mFL1an2pq/cLxvMMqMysE3hOsCrBNzQSG CzpGukh7MAEpeKD11MEtZs42NZHu72iePrT6IIop+A/Qu78nWnfUzeKDyLPhgDe6 rajMfrpeohW3ihFPxsGpRLWzIUEx2qKBnvs6ZbY7dEAWhRlVVx8A1yG174KrvQID AQABo1AwTjAdBgNVHQ4EFgQU4Jk4DqgMeAMPbMUeNTB+aL8tp5wwHwYDVR0jBBgw FoAU4Jk4DqgMeAMPbMUeNTB+aL8tp5wwDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0B AQsFAAOCAQEAfWe4vZuAhMPopPvM7BZSYY5XFGT9eBTvlMaw28jrIzVJ/njCrGT+ HkNyfTCx3zPtRa3Sfg/iVOjcqQ96e1bPxsUVlweXa6ZGP3R1PdHvEpgzfXZckHrK 7QGfDDyoa8+g62GdYiIaOWMUBSY3BFmWyGHIOw1wPSdRdpmtN6DcxNm55D19BwgZ 9R4UOBGQJKfEKr9nig4KtMfZ+n4Bm45EQq5RlFlHA3wkNTSXcFINQYHuDAmwyYNA mBWRDfTJN5dydPNql7yypNl2BHbC5HFRV0WHxz61sxiBWgNCuyWnk85Vx+rGvdxQ kGGfgienczq/DFSIWnSf0VB/ywutzpjObg== -----END CERTIFICATE----- ubuntu-make-18.09+disco1/tests/data/eagle-updates.circuits.io.pem0000644000000000000000000000572613352651520021600 0ustar -----BEGIN PRIVATE KEY----- MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQDAoxq0TBCXJZMC FdNsmxRVvPdqJbK0oHH/XcUmzpAYorwU2YzvTx0C6jL+hgmKe2lyTdABBsfApazO R3h0fTguapr32bqxK/VvdNHnCTS5unitY1LNE7PqDg5vc9rnSOa58TeNvsnGqyUb HAQ+DAEZ/ENEkRAPY6gc8vLcBK9SVWCTFHOS2QWKXqYUvVqfamr9wvG8wyozKwTe E6wKsE3NBIYLOka6SHswASl4oPXUwS1mzjY1ke7vaJ4+tPogiin4D9C7vydad9TN 4oPIs+GAN7qtqMx+ul6iFbeKEU/GwalEtbMhQTHaooGe+zpltjt0QBaFGVVXHwDX IbXvgqu9AgMBAAECggEAakXRBqRsBqaA+oaF9AV962rrZ5DSjNly6nmVuTn9vsmQ T0RRfvg7Pg9sAIR7oP1Ch/+rf9V4v6vmsIo3RrSKGPlQ8ukYGIPyzAE7h2TJxKi9 yJHh7ScwezA0AIJ+wleyieQsTLNzZ3mlZ9ZF9OD0fpxvk9Ufcg39gbL6Di07d4SS WVMW7CMRy1NHyWKixNcZV1415HC4zYtujUsXtPlLQxTAdlWdr9som4P9GbA8yCXe zXWLFRDYI2HO6IuBtqqGQHKTtdJj+0OPwkia04Y+MM6+CqgHopfDgo0HuvSc3X0e dWfHK1RDpAmNvJNnRyMlvzSDBoH/OlF05ZvYAkCx4QKBgQDy0A6wKpR/MvOsxWqN rz47XiPhx/MsDR0MsqSIQBTxRFgTmTZCxIjJIQ6Xu+zI35RUxe/MI9RxiYiEPD92 9FeVHe11Psnhec+2oX2QMQXT6bwNNqwGJhwHZRkgFTUJrHBfq6WsJXjzHhxBgwEz UgPiI0QF+UbKB2Tmsq1OmOXA1QKBgQDLGW5tZ4gGXQvjKf3L6kofIvLoxHucegPU S0kJ+ZnaA5mqVtb2F7510ZjGiFVHGo5nRbesImFTtKQBm3YZJzmtRCrzvz8GsUiS XhkGdFGadq1riMX/PA1tj6ufaHsoQdsZGyc7xqHIh8PqzQ4WjSXKzycHOlpEeYFA ENYMVmNzSQKBgFe9uzEJkfOM8+Tgyao9Qx2s3QZ/fG3Up0SpYS8jCO5OJg2e9a6W 2l7jpSRLcjr8H9uqUwbPg7srWbt/EefoT6XA1MfjUow5ukdif78VF+gFtECKGwt1 xfceH0Aqqam/ODQ6EHnuaJBhtxAtSMfEwUZ8O950v5HNrjZ3Jo0aTxupAoGAWPjt HVRrjI4adQuiOUCL9BP1Ye8hT61MHCZW+t2zfoRxPuQIC4rfTvHhAagb46hIlgk+ q1PsWyUZa/LUy7QZWkQwpNM1IxNq/WPnhqJSVV6EHkWup1+Bamuz/YNh4ILpHph8 mX0sxpJjS2tFLq/qzGvvZwUzIigwbQZzHriBnLECgYAPalLTtG6ZLn1ytQFA84lg 2IHKjFZTVGsT7Q2BBgKkMyMbGtC4Y6S38T+N/TbjKKE3yFvJTa0X75ajTELQ2S4f fJU/GxsyyXU54HeDe7QM8ycGmfLTC9eT4lcaOl+EhJBX3XpxZlwVdXIs/aE9hUUl JJXzIK6boIGqz0gugxuYOw== -----END PRIVATE KEY----- -----BEGIN CERTIFICATE----- MIIDpTCCAo2gAwIBAgIJAJu+KDn8qFgVMA0GCSqGSIb3DQEBCwUAMGkxCzAJBgNV BAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX aWRnaXRzIFB0eSBMdGQxIjAgBgNVBAMMGWVhZ2xlLXVwZGF0ZXMuY2lyY3VpdHMu aW8wHhcNMTgwMzE2MTQ1NTQ0WhcNMjgwMTIzMTQ1NTQ0WjBpMQswCQYDVQQGEwJB VTETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0 cyBQdHkgTHRkMSIwIAYDVQQDDBllYWdsZS11cGRhdGVzLmNpcmN1aXRzLmlvMIIB IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwKMatEwQlyWTAhXTbJsUVbz3 aiWytKBx/13FJs6QGKK8FNmM708dAuoy/oYJintpck3QAQbHwKWszkd4dH04Lmqa 99m6sSv1b3TR5wk0ubp4rWNSzROz6g4Ob3Pa50jmufE3jb7JxqslGxwEPgwBGfxD RJEQD2OoHPLy3ASvUlVgkxRzktkFil6mFL1an2pq/cLxvMMqMysE3hOsCrBNzQSG CzpGukh7MAEpeKD11MEtZs42NZHu72iePrT6IIop+A/Qu78nWnfUzeKDyLPhgDe6 rajMfrpeohW3ihFPxsGpRLWzIUEx2qKBnvs6ZbY7dEAWhRlVVx8A1yG174KrvQID AQABo1AwTjAdBgNVHQ4EFgQU4Jk4DqgMeAMPbMUeNTB+aL8tp5wwHwYDVR0jBBgw FoAU4Jk4DqgMeAMPbMUeNTB+aL8tp5wwDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0B AQsFAAOCAQEAfWe4vZuAhMPopPvM7BZSYY5XFGT9eBTvlMaw28jrIzVJ/njCrGT+ HkNyfTCx3zPtRa3Sfg/iVOjcqQ96e1bPxsUVlweXa6ZGP3R1PdHvEpgzfXZckHrK 7QGfDDyoa8+g62GdYiIaOWMUBSY3BFmWyGHIOw1wPSdRdpmtN6DcxNm55D19BwgZ 9R4UOBGQJKfEKr9nig4KtMfZ+n4Bm45EQq5RlFlHA3wkNTSXcFINQYHuDAmwyYNA mBWRDfTJN5dydPNql7yypNl2BHbC5HFRV0WHxz61sxiBWgNCuyWnk85Vx+rGvdxQ kGGfgienczq/DFSIWnSf0VB/ywutzpjObg== -----END CERTIFICATE----- ubuntu-make-18.09+disco1/tests/data/forum.unity3d.com.crt0000644000000000000000000000242613352651520020132 0ustar -----BEGIN CERTIFICATE----- MIIDlTCCAn2gAwIBAgIJAOcA0CcbaV7cMA0GCSqGSIb3DQEBCwUAMGExCzAJBgNV BAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX aWRnaXRzIFB0eSBMdGQxGjAYBgNVBAMMEWZvcnVtLnVuaXR5M2QuY29tMB4XDTE3 MDMwMTEyNTMyMFoXDTI3MDEwODEyNTMyMFowYTELMAkGA1UEBhMCQVUxEzARBgNV BAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0IFdpZGdpdHMgUHR5IEx0 ZDEaMBgGA1UEAwwRZm9ydW0udW5pdHkzZC5jb20wggEiMA0GCSqGSIb3DQEBAQUA A4IBDwAwggEKAoIBAQDjCJp+wgayJ10i1lR2cNkvE4R8+mP/bO8VIHIHRG5F5chX UyqZasGqyd1oPxaCG+Bs2IF4LQOhBxO/QA40OQcbl6kazLtiH24H11Gq2TrrDyGy F6B4nisZHbdOdC1adEkFvmqWD3DTTK1pUNB8T6Y1oeVWk6xpvajG2nA9XpA6zzQc 37SAck57Hot9Svbmu/XIi6mLiofeIJUh5WXBzuqFSR4+Ltg8Nxfyxk4dcI5FC6AN kEbqbUdoyvREfCNGUvLttNaNNmVMXrPphm7wvouz6iyf+d6hcsbr/aS+sT8kBGv+ Le0qCaztmdS6Y5acjR3W9OsuPHotSakNMX7Bdx+NAgMBAAGjUDBOMB0GA1UdDgQW BBTffk6FbacJ83YPUomFNMZVrn1x6TAfBgNVHSMEGDAWgBTffk6FbacJ83YPUomF NMZVrn1x6TAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQC1WrIlyR50 yW+1MmE4ogA8NP731z8pNEXNtg+yoz6jZ8dDASt3Vog/3d5MOVdhLn3Zg9L7ptXV jy1UxggpkBUMfwRsWv+Q58neow1er7JX0zUmnALbo25ZrmghtwZzIorsx6C/tc2o JqcAEZW8Cf0MPFqYxV4kpbcoBFNvEcUgu4ght0pAbNXqTMBOaEzE7utN6IjYJNly wKcXBEGaiT3Yg+e+Yxn6xZkkWQ+vJYfq7k/oU568DXt0/3qfl1yIrz+3gm5G8d6L TC0i9KDO7jay+UpCahK6VAY5TUDdIsHny7QT6S6O6cufkHs8Y7A2d8GaYakHp50Z NHSTiHAZfG9J -----END CERTIFICATE----- ubuntu-make-18.09+disco1/tests/data/forum.unity3d.com.pem0000644000000000000000000000570213352651520020123 0ustar -----BEGIN PRIVATE KEY----- MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDjCJp+wgayJ10i 1lR2cNkvE4R8+mP/bO8VIHIHRG5F5chXUyqZasGqyd1oPxaCG+Bs2IF4LQOhBxO/ QA40OQcbl6kazLtiH24H11Gq2TrrDyGyF6B4nisZHbdOdC1adEkFvmqWD3DTTK1p UNB8T6Y1oeVWk6xpvajG2nA9XpA6zzQc37SAck57Hot9Svbmu/XIi6mLiofeIJUh 5WXBzuqFSR4+Ltg8Nxfyxk4dcI5FC6ANkEbqbUdoyvREfCNGUvLttNaNNmVMXrPp hm7wvouz6iyf+d6hcsbr/aS+sT8kBGv+Le0qCaztmdS6Y5acjR3W9OsuPHotSakN MX7Bdx+NAgMBAAECggEBAIMsEF9WaRn7plMfdHNuJf2OEElJPgdw//273kYWooPe DE9v7LfxN24e7b5yXOXVh2g7+yndEDC0bxNbxhkkLdgiWwDx8v3xXNhI7pWApwry lixYfE3UTOBZC/TXKPEPKLWZ2+lRiIV80uB7YcnBFy37mQ7ZiY8alm41/Q1oGnru 76PAXSy0qFj/aGAAUlnPQXITKo6Y3aolAb4nP5yofZzcMw7SpcjSjn36oMj1LnGQ 1K1Zt3Lal0HH+TVbjdJiLcpOWTXUfxwADkVDe4fVllD/znDbwlZ7BLSmpVUmpnzI nWYj3JmezEmTrGKdcHXuHyAM1tyMbkWOOLPhq/8Er/0CgYEA/Zhplwn0f+SNrMoE Gs5+OcnqzOYzFEoTFf31syXD14h77/4ipwB/RGSgOWp4skTjxnFpqN5GWkpoBk01 m4JhIkl268++UC+miP7hEf/vWdJ0G+ttInIkjYNlaRKYDLIxiDOp+dnEwXYzrDZn gcbNzUkTUuHRskckomgVVGbW958CgYEA5S+2xsZN9cNN3gV9rKcguoFI3XH7tip9 qPt1h9BdZ/ZfiJhtdqaOwkAnlxJS2CYMZjibp+9L4xp08oOEhPr4orK/7nwDLI/v 12yvnuQGFdNwNtGJ+a/M0fMI0KftVcRmdvMbGtIdmWhEvVVsgB7csm4XhuL8fEIy enN4IKQHyVMCgYEA3SpDTFp+RdvKQ1ub4NUd+MBEapaJDbTcmF14Htlcx2hczp1R E1y3oaowomJdCPxTugnHIGNZ7/zcZEKJ8invFLwFXvs6+yvTjb7cA5q14BxO7tqP v27UuiZSFyUEPm5aDHMiVqi5lA/GWPbJpsD/U33bwHj5LQYmyQ0FLSrTZ/kCgYBr yULmvUDRAqdOcbqnRnqn/EGuk/rTs6whmxGtbBth14cakMV6dd7SEKYN8LoxmcNf F+Rs2KgSCNFTdPMQL5BbxEFsAbrkbFVaNW1rBsat4SD3Rxji6wEjBG/y4edG3PVr n+3xcTwmd9lMSi6bGuikqg46i+o+7ksbN88ZWsumrQKBgQD6PQugD5gKR8ssJtOD VN/ILV0PWGoD3G8NZWQVMBBwe7i0YAp79Dwr2K8nSPmgiqSNRfdNQCSAHCt1h+c3 CEZ9rEBSeGbCKnhD6usUpK4Q3vdr6SG4lGjmjO5i4D+kHTNhQ6WvgCyjvefTxiLG fNIxpHmlSpxq9YkdxwWXW3GuDw== -----END PRIVATE KEY----- -----BEGIN CERTIFICATE----- MIIDlTCCAn2gAwIBAgIJAOcA0CcbaV7cMA0GCSqGSIb3DQEBCwUAMGExCzAJBgNV BAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX aWRnaXRzIFB0eSBMdGQxGjAYBgNVBAMMEWZvcnVtLnVuaXR5M2QuY29tMB4XDTE3 MDMwMTEyNTMyMFoXDTI3MDEwODEyNTMyMFowYTELMAkGA1UEBhMCQVUxEzARBgNV BAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0IFdpZGdpdHMgUHR5IEx0 ZDEaMBgGA1UEAwwRZm9ydW0udW5pdHkzZC5jb20wggEiMA0GCSqGSIb3DQEBAQUA A4IBDwAwggEKAoIBAQDjCJp+wgayJ10i1lR2cNkvE4R8+mP/bO8VIHIHRG5F5chX UyqZasGqyd1oPxaCG+Bs2IF4LQOhBxO/QA40OQcbl6kazLtiH24H11Gq2TrrDyGy F6B4nisZHbdOdC1adEkFvmqWD3DTTK1pUNB8T6Y1oeVWk6xpvajG2nA9XpA6zzQc 37SAck57Hot9Svbmu/XIi6mLiofeIJUh5WXBzuqFSR4+Ltg8Nxfyxk4dcI5FC6AN kEbqbUdoyvREfCNGUvLttNaNNmVMXrPphm7wvouz6iyf+d6hcsbr/aS+sT8kBGv+ Le0qCaztmdS6Y5acjR3W9OsuPHotSakNMX7Bdx+NAgMBAAGjUDBOMB0GA1UdDgQW BBTffk6FbacJ83YPUomFNMZVrn1x6TAfBgNVHSMEGDAWgBTffk6FbacJ83YPUomF NMZVrn1x6TAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQC1WrIlyR50 yW+1MmE4ogA8NP731z8pNEXNtg+yoz6jZ8dDASt3Vog/3d5MOVdhLn3Zg9L7ptXV jy1UxggpkBUMfwRsWv+Q58neow1er7JX0zUmnALbo25ZrmghtwZzIorsx6C/tc2o JqcAEZW8Cf0MPFqYxV4kpbcoBFNvEcUgu4ght0pAbNXqTMBOaEzE7utN6IjYJNly wKcXBEGaiT3Yg+e+Yxn6xZkkWQ+vJYfq7k/oU568DXt0/3qfl1yIrz+3gm5G8d6L TC0i9KDO7jay+UpCahK6VAY5TUDdIsHny7QT6S6O6cufkHs8Y7A2d8GaYakHp50Z NHSTiHAZfG9J -----END CERTIFICATE----- ubuntu-make-18.09+disco1/tests/data/github.com.crt0000644000000000000000000000240513352651520016663 0ustar -----BEGIN CERTIFICATE----- MIIDhzCCAm+gAwIBAgIJAPN26r3EAAhsMA0GCSqGSIb3DQEBCwUAMFoxCzAJBgNV BAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX aWRnaXRzIFB0eSBMdGQxEzARBgNVBAMMCmdpdGh1Yi5jb20wHhcNMTYwMTMxMTQx OTQxWhcNMjUxMjA5MTQxOTQxWjBaMQswCQYDVQQGEwJBVTETMBEGA1UECAwKU29t ZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMRMwEQYD VQQDDApnaXRodWIuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA r9oq9Rj3SYzmBCjZz7JwJnTwQbt9SXEwn3oL+RpqXQa3TXDbHPDorzf8vvco1ns8 A6+JmnMOiYvLBoTvI4fngjoI2fP+GpQOoQfsTaBuDQyzOsJv2E5cbOZQzSkcykro lx1Dwkqdy/2Bz25YtPX+PBi6xpVCLSBkad5iZW5+yd6mloG76610KoBRB0S+GCD6 aCVOHpeleZ5nJYHO6owAoGCndHoMR4MM60eHvB2qGgnoqd4WuEQZsrh2mqSfX0dH 9JJUHvBPLfz3Ex0uh69qoKRra2y/Nro6vdDzy50F2VCMs6Fru8un6y0RWBUXj2iP +uMY+bj3D1Jp+IdMTH6jAQIDAQABo1AwTjAdBgNVHQ4EFgQU6p1ApP9amffHE/US lXsqax3qhFIwHwYDVR0jBBgwFoAU6p1ApP9amffHE/USlXsqax3qhFIwDAYDVR0T BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAoPMNVOSchGgKjTjnQcBspTKN3jI6 We3k2DCBV8i2J03v9wy8QtslOfAwY7Mm8wJJDLjtZwmxNAGEWiabvbEs2aehL98O zWnXOxL4ZxIH4Mgld4L+ihml6n2yFpF8z66wx+x8NqG5tfpeVztgJMns4jmfE8Kg g1aZhPYjkvMRqcom/Lg+lSNh/7g4DUyx9gNikQUySDDKnrRu1qtrI+c+TsGBq45K uQnbCefDQdEc340P/GAqkBHbOdVOwGjnhlk8LyAjqse0YicLs7qnFojp55Cwn8Nd KI6aj9+JN/EYOnv0Q9ywUDCrRPs87QHudv81v2vscBnTzJu+ox8iUPorDQ== -----END CERTIFICATE----- ubuntu-make-18.09+disco1/tests/data/github.com.pem0000644000000000000000000000565513352651520016666 0ustar -----BEGIN PRIVATE KEY----- MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCv2ir1GPdJjOYE KNnPsnAmdPBBu31JcTCfegv5GmpdBrdNcNsc8OivN/y+9yjWezwDr4macw6Ji8sG hO8jh+eCOgjZ8/4alA6hB+xNoG4NDLM6wm/YTlxs5lDNKRzKSuiXHUPCSp3L/YHP bli09f48GLrGlUItIGRp3mJlbn7J3qaWgbvrrXQqgFEHRL4YIPpoJU4el6V5nmcl gc7qjACgYKd0egxHgwzrR4e8HaoaCeip3ha4RBmyuHaapJ9fR0f0klQe8E8t/PcT HS6Hr2qgpGtrbL82ujq90PPLnQXZUIyzoWu7y6frLRFYFRePaI/64xj5uPcPUmn4 h0xMfqMBAgMBAAECggEACGHp8k0CXKsuu7wGxfPHjM2+NiPt0PZoTvHOaE1uDIkp a7OZfkOtk8yja6b0d2Tgc3yGnqolY0EaqHDlxVfRHVAO4/TRhArSt7Jc/UZMeKrG UGK8Wh9CIJ7J8z2mda4kcC+g7z4HT5YB/hVQfS/MsqirHpQ211fX8YP8RMGDobO7 Bmc9A7XGQWo+aFYuqcctpK05WrWOK8GCgfCyLLaOklEkCgxJmgoRS9tdQ9HI4RHY EnnyJQJbUeE9QpMshR5fRE2RvnFSsDVrsVwMdSvqDHi1rPGQDozF5mv3V0Cy/P/T QM+jC0hQs9GuuOXatfpxtizyBcJmjBLJPs3VDXwlEQKBgQDn2Ii72pJqK6QlAug1 ordK3t+97/xiKPkT/G6fWOKR/22da7CW+1TyD+CXcjWPA4LCEnM7OeepEYKew3HU EvrCBg3wO7kXOUFyjNNL7LfKx73jItBq9JPuhwlbUZnirzzIJrwumcSp6cl3IE4y t77tf3MX8ktH0bUt282wPPM5QwKBgQDCLEAtYyatoGrF3U6FLx2v4DpAiSoa49jt 64RDHuCPAf9NS/TBJyrhqi4j0VwVnAp/uQON5Oqr8H0K/YOA3e0bLrHI2CXA2DTO YElokcJCZZ86IqZokmOOfhV2x13ACL2KJwuZ/A6IUdQm9DS74g6eK5Fr/jc/Q2ey o9kWtU48awKBgQDfNBH/eJ/44ub2UuQnru1zgTo6a+64ueWCHkaJ1lLaZ+Sp52Ft Ga5gFHUOmH+Dncem+4hAfrDOjfMI0fSmTVdor9d/bp/1AcRGedl6gP04li/zmjK4 pZo9y3dwmRDjsf18W/5ThupVAqRYsZtXLJr9nvO5HCTpkbUx3ykZALTQbQKBgQCN o7XU5eTK9p+sYfjrEil3p/sWJHhAUUBmnUxHofhwmSZgfi210BpprrgljIy9fqvx 60X6dafxcGXmZHNOx5Q0JeWt+m3ftFcgzAAAdYLc6EA0Kh51XYOd579Ee72ZXUbV xhGia8k2C2rUV4M4InhDTMixnCk0zriQCRFMjUjarQKBgCVNex03rtGulS4TNt1R ggsUa1xRoNnAfbXAE4W97akEuljL6jZiiF6IT3kM8Sckkt02bloy/+DlBjixroqp zr3gRzDmE85lDYnOYm8z42fJ8JkVgbyGUdFlolqzROAP9PaBTMs2lT4trS/UMSm4 N6DD3fKNNZRv6ZhkrvlbS+2D -----END PRIVATE KEY----- -----BEGIN CERTIFICATE----- MIIDhzCCAm+gAwIBAgIJAPN26r3EAAhsMA0GCSqGSIb3DQEBCwUAMFoxCzAJBgNV BAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX aWRnaXRzIFB0eSBMdGQxEzARBgNVBAMMCmdpdGh1Yi5jb20wHhcNMTYwMTMxMTQx OTQxWhcNMjUxMjA5MTQxOTQxWjBaMQswCQYDVQQGEwJBVTETMBEGA1UECAwKU29t ZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMRMwEQYD VQQDDApnaXRodWIuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA r9oq9Rj3SYzmBCjZz7JwJnTwQbt9SXEwn3oL+RpqXQa3TXDbHPDorzf8vvco1ns8 A6+JmnMOiYvLBoTvI4fngjoI2fP+GpQOoQfsTaBuDQyzOsJv2E5cbOZQzSkcykro lx1Dwkqdy/2Bz25YtPX+PBi6xpVCLSBkad5iZW5+yd6mloG76610KoBRB0S+GCD6 aCVOHpeleZ5nJYHO6owAoGCndHoMR4MM60eHvB2qGgnoqd4WuEQZsrh2mqSfX0dH 9JJUHvBPLfz3Ex0uh69qoKRra2y/Nro6vdDzy50F2VCMs6Fru8un6y0RWBUXj2iP +uMY+bj3D1Jp+IdMTH6jAQIDAQABo1AwTjAdBgNVHQ4EFgQU6p1ApP9amffHE/US lXsqax3qhFIwHwYDVR0jBBgwFoAU6p1ApP9amffHE/USlXsqax3qhFIwDAYDVR0T BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAoPMNVOSchGgKjTjnQcBspTKN3jI6 We3k2DCBV8i2J03v9wy8QtslOfAwY7Mm8wJJDLjtZwmxNAGEWiabvbEs2aehL98O zWnXOxL4ZxIH4Mgld4L+ihml6n2yFpF8z66wx+x8NqG5tfpeVztgJMns4jmfE8Kg g1aZhPYjkvMRqcom/Lg+lSNh/7g4DUyx9gNikQUySDDKnrRu1qtrI+c+TsGBq45K uQnbCefDQdEc340P/GAqkBHbOdVOwGjnhlk8LyAjqse0YicLs7qnFojp55Cwn8Nd KI6aj9+JN/EYOnv0Q9ywUDCrRPs87QHudv81v2vscBnTzJu+ox8iUPorDQ== -----END CERTIFICATE----- ubuntu-make-18.09+disco1/tests/data/go.microsoft.com.crt0000644000000000000000000000242613352651520020015 0ustar -----BEGIN CERTIFICATE----- MIIDkzCCAnugAwIBAgIJAJwSEg63rhRqMA0GCSqGSIb3DQEBCwUAMGAxCzAJBgNV BAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX aWRnaXRzIFB0eSBMdGQxGTAXBgNVBAMMEGdvLm1pY3Jvc29mdC5jb20wHhcNMTcw MzI3MTMyNTU4WhcNMjcwMjAzMTMyNTU4WjBgMQswCQYDVQQGEwJBVTETMBEGA1UE CAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0cyBQdHkgTHRk MRkwFwYDVQQDDBBnby5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOC AQ8AMIIBCgKCAQEAupRNVQsP1r4sreFNEndyyF8iTY3h1pmoZxAUebe0efVdhEc8 wSw0UkSF2mh8mt/ZU0NCLtKLkmwTszVxCmiBXJYvjXr8cZKMTzC2JnvzQg9VIZbI jVwHajrL6elWE8ZjEyXi8sSNTwTHjA4fHmi1Fwt7otgJHwJgu3ngmyve5gKH8DH/ 4XAPLZLcB+f7hmbaUPFdfYyva3yEyZqanJW3UBgTkfiMvEsIyxjASC21jVyTdUOs iDhrcLDqRpTkiQXiTRQJUAyyLdspmMQFpZT8BE1Eu9pDDfyvqfyhXoBrl/ekzULY 5ATehQuj9fsWr7wVLu3c8gB8OZxn3UWI88QJAwIDAQABo1AwTjAdBgNVHQ4EFgQU 28Disu0B0n9sFyLunpVZ5KT49cswHwYDVR0jBBgwFoAU28Disu0B0n9sFyLunpVZ 5KT49cswDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAbsYGsAqCrXyq 0VyFncWIPqyPxb0cKAD+r8WW0Drr5h0EJoGIJYMv4iAH3PBK4DGGPeUSTl496atA sLsByyAqFBv4wQO6Lx00G/ucvxXFuaMKAeh5QHLhN2zNDbTe2+4ZiVS5mS27RDya uMwwTsFUf0rPZGT9e4WxDn4bQt/RL9CTlnIXYAABEdvnkpuY0CAAWs9bZ3JAPVh9 N4Gosn0ADf93DXoQp1a2MdO2zAGh2bYR2hmSOa4dimIbYIZFoPlOgPHIVsOF2YAA vySIBX3ZlmxbFECumkZnRhtUPxO4gzX8oHxlZJDl3J8wPwac0R9b+4jM2H54Pbxu vNgz9lyE1g== -----END CERTIFICATE----- ubuntu-make-18.09+disco1/tests/data/go.microsoft.com.pem0000644000000000000000000000567613352651520020020 0ustar -----BEGIN PRIVATE KEY----- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC6lE1VCw/Wviyt 4U0Sd3LIXyJNjeHWmahnEBR5t7R59V2ERzzBLDRSRIXaaHya39lTQ0Iu0ouSbBOz NXEKaIFcli+NevxxkoxPMLYme/NCD1UhlsiNXAdqOsvp6VYTxmMTJeLyxI1PBMeM Dh8eaLUXC3ui2AkfAmC7eeCbK97mAofwMf/hcA8tktwH5/uGZtpQ8V19jK9rfITJ mpqclbdQGBOR+Iy8SwjLGMBILbWNXJN1Q6yIOGtwsOpGlOSJBeJNFAlQDLIt2ymY xAWllPwETUS72kMN/K+p/KFegGuX96TNQtjkBN6FC6P1+xavvBUu7dzyAHw5nGfd RYjzxAkDAgMBAAECggEAYhF3QD8LOTVGaLKmfxFXvKf8cMUlslWbpWhXSs7bRstI NzH2Zhak/aTUskL/U6xbH5+XluLFx9WU2To6y1y4ugCayAOf0tZTd4BEDaBS8SL7 /SazDVIU96ol6jHiM4ywIK1mR3I2UBVUCXKWurYQkSdQ+fwRd0IZtBDQlN8PTteZ fRhdb9hc2eASdihjH0HFY/eiGueCrC36dGDXybgYO/zed9p6Oe+fhe2j7HJlLtWY wR5ai5X1YnLLpKTdhLKEYQv8jaBxS9Tb89++WHmXxwVs8gheH7BsHj4+aIicZbXy zluvbHvId9EpgaevrECQikkAA+udhn3POzqTCZ/4yQKBgQDpSdLiDxm/cZ9ru+S8 VWDWQpkEJkj4Tjp0YpcsMa0pmTZ3tFAo/Z9cQ/vd5WNgUv1vMGCrZJW7tLQW1puP w93kqiIvG/pt0aI69H4Fa+52Eh8XTBecAuq7ZX1vxJSdTeo1re2IPwwx1q4KN3PC u6kSjsjAp6yDTTNvVImpu1fdVQKBgQDMvly4MuvNcJJbE+O6FbhfOuuZrFSnwVhm KWFK487sBan+duCvKKAk2bcMenrzPybhGJP+OA+/OfYMKvOwc2/Y7VdA57A0y9Si ryfdGfCZwR9G9CGwIb1+h47RWtkbsCd0wNuV1RUs7PVNNNrV6YEt7mWV9JVvWNBZ ElsMuSeM9wKBgDAP85B7R/S3Nf7+IOvkMyUxZ1EBijsN8uEThs2mFmThmeUjkvg+ +FwL7ZITtlub/Xaw4tmsyWR4oDmsUTRXSBnaK1zFSNzjOacnw+beC6zrotgr5xlP SIj/Kc6jE3MtIDma8bsGMj76WbTlI8ZU30phfF6krNgISbaAFjSP0lRZAoGAC1mO KEPiYHwaEOR0Xk9v7g+FGfq8oqQMM3WdyBoC0YCq4MlUQUF+RyyuggmUIUHh9N54 7cHL1azv39LNuX1cuOjHSnjNgs+91Nri2dXjSZK0GinUaEAmkgoPt7lSib9lIIrE YXTzfI8SNhp0+yC7oYEyrnJlikuhGR70XyswbxcCgYEA2ILwbvuMSh4lrTevFsOj dZog10y0UJDhRjaF6Z9pJnFK7fgN4+iHih9h/ECi+IKTUfrLYyppV2T0j/+qHrfn SN9MryFSxFmd7qzD0pM/ZXXy9VmchVtOqNHmxHwVUiHzybtRURWuyhQXCpibWeHS q8COwv/IYVHdSvhoQLrlJ00= -----END PRIVATE KEY----- -----BEGIN CERTIFICATE----- MIIDkzCCAnugAwIBAgIJAJwSEg63rhRqMA0GCSqGSIb3DQEBCwUAMGAxCzAJBgNV BAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX aWRnaXRzIFB0eSBMdGQxGTAXBgNVBAMMEGdvLm1pY3Jvc29mdC5jb20wHhcNMTcw MzI3MTMyNTU4WhcNMjcwMjAzMTMyNTU4WjBgMQswCQYDVQQGEwJBVTETMBEGA1UE CAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0cyBQdHkgTHRk MRkwFwYDVQQDDBBnby5taWNyb3NvZnQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOC AQ8AMIIBCgKCAQEAupRNVQsP1r4sreFNEndyyF8iTY3h1pmoZxAUebe0efVdhEc8 wSw0UkSF2mh8mt/ZU0NCLtKLkmwTszVxCmiBXJYvjXr8cZKMTzC2JnvzQg9VIZbI jVwHajrL6elWE8ZjEyXi8sSNTwTHjA4fHmi1Fwt7otgJHwJgu3ngmyve5gKH8DH/ 4XAPLZLcB+f7hmbaUPFdfYyva3yEyZqanJW3UBgTkfiMvEsIyxjASC21jVyTdUOs iDhrcLDqRpTkiQXiTRQJUAyyLdspmMQFpZT8BE1Eu9pDDfyvqfyhXoBrl/ekzULY 5ATehQuj9fsWr7wVLu3c8gB8OZxn3UWI88QJAwIDAQABo1AwTjAdBgNVHQ4EFgQU 28Disu0B0n9sFyLunpVZ5KT49cswHwYDVR0jBBgwFoAU28Disu0B0n9sFyLunpVZ 5KT49cswDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAbsYGsAqCrXyq 0VyFncWIPqyPxb0cKAD+r8WW0Drr5h0EJoGIJYMv4iAH3PBK4DGGPeUSTl496atA sLsByyAqFBv4wQO6Lx00G/ucvxXFuaMKAeh5QHLhN2zNDbTe2+4ZiVS5mS27RDya uMwwTsFUf0rPZGT9e4WxDn4bQt/RL9CTlnIXYAABEdvnkpuY0CAAWs9bZ3JAPVh9 N4Gosn0ADf93DXoQp1a2MdO2zAGh2bYR2hmSOa4dimIbYIZFoPlOgPHIVsOF2YAA vySIBX3ZlmxbFECumkZnRhtUPxO4gzX8oHxlZJDl3J8wPwac0R9b+4jM2H54Pbxu vNgz9lyE1g== -----END CERTIFICATE----- ubuntu-make-18.09+disco1/tests/data/godotengine.org.crt0000644000000000000000000000242613352651520017717 0ustar -----BEGIN CERTIFICATE----- MIIDlDCCAnygAwIBAgIJAMzG3Q3xDKCbMA0GCSqGSIb3DQEBCwUAMF8xCzAJBgNV BAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX aWRnaXRzIFB0eSBMdGQxGDAWBgNVBAMMD2dvZG90ZW5naW5lLm9yZzAeFw0xODA1 MDUxNzAxMTdaFw0yODAzMTMxNzAxMTdaMF8xCzAJBgNVBAYTAkFVMRMwEQYDVQQI DApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQx GDAWBgNVBAMMD2dvZG90ZW5naW5lLm9yZzCCASIwDQYJKoZIhvcNAQEBBQADggEP ADCCAQoCggEBAONGwVd5rzPI3dFECnNsmMqiYYTISJ6fvs/aJ6isii1RtYh2hNUR x3abgmLxd9ej+B0Owgimpn5sBAriki0D5yUXe6YA5nEY10J836r9ylps8mEymsQW iXoly7aGtWWHfXOhZNCVVYKCNQ4+esQPalc+XtSrGpLHG0fUtepeqiK9ApE31652 w0ooWpWx5wR6/suRlMn8O93r6MkbObux4/IDWBYhJ1cbRFXjAG1hPy0WqT7xxmOa HINmi0vs5hZnfh9+y+zMy9FCVjzfcYxJO15ycXFvrG1629uYdiB+p66Bgr/4i60g qMPtRwKw65/Iiu/ahmBdnpTkYopmhgPQb+UCAwEAAaNTMFEwHQYDVR0OBBYEFB28 7GQrt3Ce6sJ+4eZSo3v2NecbMB8GA1UdIwQYMBaAFB287GQrt3Ce6sJ+4eZSo3v2 NecbMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAB8VWIM1s9q8 84Uo1o8TX3C5/kuVP/yDZNLPYWZrawD7N8950najPgvGvzk9+clkHstRt5PKlLpW s6MLEYMcQrjpYmqayjRkcRDcSGyrQiY6MDYuz3p9LIVjF+RGGeW9FpiWYem2I2A7 D62RxOzbmM6O8NOy+0aKvrBKMEfBkyW8wlV4F1v/V1kVDwtAFwusF5Cn4BSLuGNO tt5XeivSIl0MpxIvEYWVpDuXMKqhSbwOKKwH4uyJ2E0TBVEEeGplL6OhcLCDRupC UIk4HIYMKH1USIGbeEsSFCQopRJbgWB+xRmDQPQt49YX7lyUC31biO/B01uTsva0 7IAUlRTzNY8= -----END CERTIFICATE----- ubuntu-make-18.09+disco1/tests/data/godotengine.org.pem0000644000000000000000000000567613352651520017722 0ustar -----BEGIN PRIVATE KEY----- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDjRsFXea8zyN3R RApzbJjKomGEyEien77P2ieorIotUbWIdoTVEcd2m4Ji8XfXo/gdDsIIpqZ+bAQK 4pItA+clF3umAOZxGNdCfN+q/cpabPJhMprEFol6Jcu2hrVlh31zoWTQlVWCgjUO PnrED2pXPl7UqxqSxxtH1LXqXqoivQKRN9eudsNKKFqVsecEev7LkZTJ/Dvd6+jJ Gzm7sePyA1gWISdXG0RV4wBtYT8tFqk+8cZjmhyDZotL7OYWZ34ffsvszMvRQlY8 33GMSTtecnFxb6xtetvbmHYgfqeugYK/+IutIKjD7UcCsOufyIrv2oZgXZ6U5GKK ZoYD0G/lAgMBAAECggEAVZdq7q+T7LOj3dB7AxcNv5pBkYj/2EUezhZBQ0OfUgvo irjfs4JblO5hvzNix6InqYHKTwm7v/ab2yGSnUNQBGcAmPbT0hnhz1dJwJKNZ1qK OVKeeGRoZ8jeHCJFJDRPaYGJfwgOSPUSWAftofKQQMTrX7oEauxy+K1ByT7XYfcI xLg37NzvqQ/UNgNcPbpmNaOnAB3SiS9/bpiFBfii1yLy3C/pbCLSGQjwB0lWv11W +L4jEmmL3FcBwatxc8xkayBYqC8A8sMy9QThfeGKJuNfxvJx0D9ImStPv9tZt7cO /s+hoC5xj4QEIBvDL1oMSHIAkV5YmGDVwNozj0IJrQKBgQD4FjVjLl4TVwGzdAs6 P4u+58b6OnMXx4BMpLtwCM2lepYRR7mt64Ul4qCxh2IkMPzu861qq1aAFXcLmWal hUZXLQEJXi9jscL8LKFAoNV4h4qtN9YYDnaL4iRM9skDumY2IeyUYRFxuvgtVq/G /9yckJ0DuFh6KnRzizBwJodlWwKBgQDqhp3Li1dsmiaxBz9dFoRPr76QsEh2bFg1 DOGcuBzGeJyLHf5dbL7eltNQIWKA2CYmeg46FkB/G6SGxlATfx1FR+5FaL+6O6WB FPwage8Wh4/P++HTUvvhm6BbtKVpgTGVBIoxZ6t/dIXpkvIu3xORU7FhOO7fiS0q VyNekd9DvwKBgB+410LDXwwiB/mmUPk1vuy+PlcouibEP8eNGNqOhZ0vO5kiDsAK aZAalmmc4hO2n+D+D6KgHgNquzokd1ea3w+ulX9ZJ74bsM8F9eiJqEItMrJLfXi+ ALKKTBH7TGDJqOArHlEqyEw+mBVUDE3p0Y/DfhBHtiiI3TMZDSyKAK4ZAoGAFRAu D9/d5DUcEH40JKonC/kexmPuviQQ8ALOKIMoonKmrJ/u/nkL03X8WJAHBsdi9cW0 jWb+N+xFpI0fGAEsodJKBhXYUmOVA7jcw4yz6nQWaHmY2J/1W1fc2R+qU4V07ItR 1goXjwTqGgZGlgsW+NBpd+/jFFR/p/PXi2DSioUCgYEAkKhLR6iktD58Q5o4Hhsh WOTxFb31WVfusLyPoWyyUGMF0GlaFyVgwv5gEDQpwe2NJ1E7OOaGio2UTFBsKagR BdDTu0ZUNW5GKKJRth03TmJAdttcKhn3ACQEvdgP3TsHv2C7y5nrQmFtxOEgK7f8 muixzvRgeC018QbSOH+At4c= -----END PRIVATE KEY----- -----BEGIN CERTIFICATE----- MIIDlDCCAnygAwIBAgIJAMzG3Q3xDKCbMA0GCSqGSIb3DQEBCwUAMF8xCzAJBgNV BAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX aWRnaXRzIFB0eSBMdGQxGDAWBgNVBAMMD2dvZG90ZW5naW5lLm9yZzAeFw0xODA1 MDUxNzAxMTdaFw0yODAzMTMxNzAxMTdaMF8xCzAJBgNVBAYTAkFVMRMwEQYDVQQI DApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQx GDAWBgNVBAMMD2dvZG90ZW5naW5lLm9yZzCCASIwDQYJKoZIhvcNAQEBBQADggEP ADCCAQoCggEBAONGwVd5rzPI3dFECnNsmMqiYYTISJ6fvs/aJ6isii1RtYh2hNUR x3abgmLxd9ej+B0Owgimpn5sBAriki0D5yUXe6YA5nEY10J836r9ylps8mEymsQW iXoly7aGtWWHfXOhZNCVVYKCNQ4+esQPalc+XtSrGpLHG0fUtepeqiK9ApE31652 w0ooWpWx5wR6/suRlMn8O93r6MkbObux4/IDWBYhJ1cbRFXjAG1hPy0WqT7xxmOa HINmi0vs5hZnfh9+y+zMy9FCVjzfcYxJO15ycXFvrG1629uYdiB+p66Bgr/4i60g qMPtRwKw65/Iiu/ahmBdnpTkYopmhgPQb+UCAwEAAaNTMFEwHQYDVR0OBBYEFB28 7GQrt3Ce6sJ+4eZSo3v2NecbMB8GA1UdIwQYMBaAFB287GQrt3Ce6sJ+4eZSo3v2 NecbMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAB8VWIM1s9q8 84Uo1o8TX3C5/kuVP/yDZNLPYWZrawD7N8950najPgvGvzk9+clkHstRt5PKlLpW s6MLEYMcQrjpYmqayjRkcRDcSGyrQiY6MDYuz3p9LIVjF+RGGeW9FpiWYem2I2A7 D62RxOzbmM6O8NOy+0aKvrBKMEfBkyW8wlV4F1v/V1kVDwtAFwusF5Cn4BSLuGNO tt5XeivSIl0MpxIvEYWVpDuXMKqhSbwOKKwH4uyJ2E0TBVEEeGplL6OhcLCDRupC UIk4HIYMKH1USIGbeEsSFCQopRJbgWB+xRmDQPQt49YX7lyUC31biO/B01uTsva0 7IAUlRTzNY8= -----END CERTIFICATE----- ubuntu-make-18.09+disco1/tests/data/golang.org.crt0000644000000000000000000000240513352651520016661 0ustar -----BEGIN CERTIFICATE----- MIIDhzCCAm+gAwIBAgIJAMXZAeV6XoKqMA0GCSqGSIb3DQEBCwUAMFoxCzAJBgNV BAYTAkZSMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX aWRnaXRzIFB0eSBMdGQxEzARBgNVBAMMCmdvbGFuZy5vcmcwHhcNMTQxMTA0MTA0 NTQ1WhcNMjQwOTEyMTA0NTQ1WjBaMQswCQYDVQQGEwJGUjETMBEGA1UECAwKU29t ZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMRMwEQYD VQQDDApnb2xhbmcub3JnMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA lvXJmIfOCKZ1iCRNqE6bhBZz0UM1wx3DyG0eb2/v56UgN80jTSgyZneTCb6DurHw VQ4dVtCCc/vLr5GfM6Kca7AGWPUHst3i3lHT6vIOz5dYGyf86EAtCdhedPcKtxv8 ERty5oAPzCc/IqCd9fzc/uALjswtBRCFfCquk9zJR754Qiv6dLPmMvTEP4jI7GeJ bZSEzhQfercDF+/h3Wt7qXorTafyW9g7ueg2+y4jKc15lk9xupumXjFiR3RRUzNT bjXq3pGKQSMP8qfMvWisErobbeel8PqFV8ucOZ1wAIc5gEv2OsKc/qOs1mLiWpJb lUdQa+TJFKY9ERdGX9r/1wIDAQABo1AwTjAdBgNVHQ4EFgQU4pdBPfs5FhCf5pAB xjyXIGdyfZswHwYDVR0jBBgwFoAU4pdBPfs5FhCf5pABxjyXIGdyfZswDAYDVR0T BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAbcCgfKm9R9k7UrOK739uh0XsZnX7 zGwYpB7ruDultkZwrFinLf5mzZY1458NIozuiL/unBR4k7z9S5EUiWRSO9hce+Cb SCLW/XfX3LlthgcndtNTFuHTkPmjzYNnN03vIZQcg9PEljjpN1oQ0571MJ07GtVd CwVyUmunOK/rnyP8S9kOcpEYI2SQesZu7Ld/vO4nQIoy5eTgOdWbj3qCf1oXImcR 8nNZu7/vIrluaQS91AT7sbz/ii4vMNOKlTrlpAVFCcjVyk8kx44g8g0+PKoSmpUd Juoopd+AWgef39ASUmidHCWyoGTSPB3fVauC4TC6OOdkpx6r91oDpd3ZpA== -----END CERTIFICATE----- ubuntu-make-18.09+disco1/tests/data/golang.org.pem0000644000000000000000000000565513352651520016664 0ustar -----BEGIN PRIVATE KEY----- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCW9cmYh84IpnWI JE2oTpuEFnPRQzXDHcPIbR5vb+/npSA3zSNNKDJmd5MJvoO6sfBVDh1W0IJz+8uv kZ8zopxrsAZY9Qey3eLeUdPq8g7Pl1gbJ/zoQC0J2F509wq3G/wRG3LmgA/MJz8i oJ31/Nz+4AuOzC0FEIV8Kq6T3MlHvnhCK/p0s+Yy9MQ/iMjsZ4ltlITOFB96twMX 7+Hda3upeitNp/Jb2Du56Db7LiMpzXmWT3G6m6ZeMWJHdFFTM1NuNerekYpBIw/y p8y9aKwSuhtt56Xw+oVXy5w5nXAAhzmAS/Y6wpz+o6zWYuJakluVR1Br5MkUpj0R F0Zf2v/XAgMBAAECggEASgQnHQ9xGNKtC9xo6x3nqGLt1Gu0v38nkGzYIGFs6lIP Muz04w7Tb2QvhvaPVgmKwdlSz08at018+A9ZVJLlSPOcmR9C8BNU+hZ65lZaprQY 8e+wVBurOYmJ/qVl7pPdCnI/6v5dQIb5sLu513Ns09b8M76uUC5ilJfE0yDM28yq FRLVztblpiOv1LRsHyYOWTkxNBFsHoe/JjVaYwgLGKly2apYdwI/CPrMZBrJox2H 94sRW8Daa6xICaJtRy7Zb/Nv9qoBT4uQC5tPaVUu0DWi/1YwHiKcbgTrAQ2y4mmV e0qZhgLQqhsX6x5Ycsv0FPibKwdvTNMZ2oUNloPBsQKBgQDHPrlzYq+1hcA73cUk BY6lC150AydCXRKRNqsNSEAzd6xCqCJR7y00xXGDfUfP0qdspRy/mRak/CqELAwF b+PwDpY6mJg51d6p6ihoZz33UkJ/twKKABvm/XOpt0IjpoJ7ANuZQ5k5DZnLgxvv 6GCAxDr07f1HgmAUlCgZmUFUiQKBgQDB9gw3wS/J/bdFBMvuXCBZ5JvhB3Piks/8 hy7qrgW3lPrSbxk+fBYYBKlkONdfrpFlT3AlLJmM9WaTfWeGO4jO/ekxFtFwqBhq qR1+o1x5WwVw7KuDTPwjrHq4+wR7yycO8MJgMfZru9qET2k9b+/ZnTvvPZtS+pz5 1DhhvDFZXwKBgDvo9mZllCPm1ciqhG6yZRPneT00/YcM6VpUr9ZMlVFkeJ2KZNdy LYuimuFIuGEbHFCkzSInbBGr6TTY8bxoyocSO8XewFcToeJBkGjkMlO9nlU8uDy6 j6lDKJYtjmud07ocpetN0jK/jjENeUcH/ox5dKjVLsVjxHQroGsiE+zRAoGBAIq1 fz9QNPDrNOly6LRpxekDiEaBoepiu8MImhDSqtwC+u0K7q605sf+bXVzAPM4UFp3 WOf84ULhLJ5FjId+g/QjuWSVwOokDHIaxzENetB+u4Fqf63CnH6Wlp07RpWRTzls DFXm5SdejIMal1SMfKbPv1D0aeQJvcEcd8XNZC1ZAoGAKEFnSl9Ux0VV+eiO4kCY O9WnwxrnOSm3HCVgZTkBqc1m3+vM6zi6jCOtTcVGWdpf1cISTgcwl52ss+TaHFYe IypgFfhg8y1yl5P2NqzSfUMplEvLSsmcQ/q+2KnhfFRNLqvDws09lG3Imojm9cOE nzLEXjtAIm6ip318KcEK4zs= -----END PRIVATE KEY----- -----BEGIN CERTIFICATE----- MIIDhzCCAm+gAwIBAgIJAMXZAeV6XoKqMA0GCSqGSIb3DQEBCwUAMFoxCzAJBgNV BAYTAkZSMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX aWRnaXRzIFB0eSBMdGQxEzARBgNVBAMMCmdvbGFuZy5vcmcwHhcNMTQxMTA0MTA0 NTQ1WhcNMjQwOTEyMTA0NTQ1WjBaMQswCQYDVQQGEwJGUjETMBEGA1UECAwKU29t ZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMRMwEQYD VQQDDApnb2xhbmcub3JnMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA lvXJmIfOCKZ1iCRNqE6bhBZz0UM1wx3DyG0eb2/v56UgN80jTSgyZneTCb6DurHw VQ4dVtCCc/vLr5GfM6Kca7AGWPUHst3i3lHT6vIOz5dYGyf86EAtCdhedPcKtxv8 ERty5oAPzCc/IqCd9fzc/uALjswtBRCFfCquk9zJR754Qiv6dLPmMvTEP4jI7GeJ bZSEzhQfercDF+/h3Wt7qXorTafyW9g7ueg2+y4jKc15lk9xupumXjFiR3RRUzNT bjXq3pGKQSMP8qfMvWisErobbeel8PqFV8ucOZ1wAIc5gEv2OsKc/qOs1mLiWpJb lUdQa+TJFKY9ERdGX9r/1wIDAQABo1AwTjAdBgNVHQ4EFgQU4pdBPfs5FhCf5pAB xjyXIGdyfZswHwYDVR0jBBgwFoAU4pdBPfs5FhCf5pABxjyXIGdyfZswDAYDVR0T BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAbcCgfKm9R9k7UrOK739uh0XsZnX7 zGwYpB7ruDultkZwrFinLf5mzZY1458NIozuiL/unBR4k7z9S5EUiWRSO9hce+Cb SCLW/XfX3LlthgcndtNTFuHTkPmjzYNnN03vIZQcg9PEljjpN1oQ0571MJ07GtVd CwVyUmunOK/rnyP8S9kOcpEYI2SQesZu7Ld/vO4nQIoy5eTgOdWbj3qCf1oXImcR 8nNZu7/vIrluaQS91AT7sbz/ii4vMNOKlTrlpAVFCcjVyk8kx44g8g0+PKoSmpUd Juoopd+AWgef39ASUmidHCWyoGTSPB3fVauC4TC6OOdkpx6r91oDpd3ZpA== -----END CERTIFICATE----- ubuntu-make-18.09+disco1/tests/data/invalidframeworks/0000755000000000000000000000000013415340675017646 5ustar ubuntu-make-18.09+disco1/tests/data/invalidframeworks/__init_.py0000644000000000000000000000000013352651520021600 0ustar ubuntu-make-18.09+disco1/tests/data/invalidframeworks/invalid_type.py0000644000000000000000000000176613352651520022713 0ustar # -*- coding: utf-8 -*- # Copyright (C) 2015 Canonical # # Authors: # Didier Roche # # 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; version 3. # # 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 """Framework with an invalid type""" import umake.frameworks class ACategory(umake.frameworks.BaseCategory): def __init__(self): super().__init__(name="Category/A", description="Category A description") class InvalidFramework(umake.frameworks.BaseFramework): pass ubuntu-make-18.09+disco1/tests/data/localhost.pem0000644000000000000000000000513413352651520016607 0ustar -----BEGIN RSA PRIVATE KEY----- MIIEogIBAAKCAQEA+5Z43eFs0XxUlrTV2Zr/TJRp+OmxWQnLWgYgMDKvcgEVacvS ntZTsCijWiGt2cgTxcYvV1zaQKQ+pzSOKV7EvO+s++Px4qwiINotZ9T1+ciWsTGe ToCONDCDtmdzWMazva3WTfltfxx4dnX8HIyNxR8CT3ZLDgfqcfIeaFzHoUrRGHga 56sWjxAbqLb9ZcBnabb7bdh6M/OJm0E5/A4IPZ9+Y1/fd0lBH/EdZ6e1VqSf2gPz luSqlUPRpwJNP7nMfImtYpqZyqE0dJit/SwcyvHi9e5Vyt+2aqmy9cNa4VpaKp5Q WnLzvHRbvIWu1z6BdxaM9DvjqNKuCvA5q5BSlwIDAQABAoIBABvRAUAXAn8O7hNT nylWF9ARwL3CqNcdXBxx/PEXSYqjUAjIflsNe2dItvbqLlyb4IPHa8iO/ZqUDlFS YD12uu3g2hFnnIDhY0yaktaeFyws32xr/gLT9+URUB7ExV4Vah4YsE8iutaJAVCn rt5BNBONYCYFADtm6Kb8jBwh1fihIup1RFMGXvB29Xfhp/7nHOGa7C7xxOcn4MEL uTrF6o1udVPcpvHYEZIu5X6XHkY1+ZpNKrsglGrkfT9Z2QUd7oDi1iIXCC73ZIkg QkLSokgDM+hIQBehTfEGsR7WhPDlDcRtMSXf2GeNSqnHakmGhD0uTKwgDnSP/XXK Xk1iSdECgYEA/zFBrKBLw2m7B1dAb2G39X/gxVGaKG98jEYfQflagOVpcyt3fvSc GzNtFoB8syiydiCjXjvlUUJUF6oxIDhz08hmWxMfed5e5uSAUy1iqAVhs98Xg5jF L/vVvDnQKVnPlP8pEm8B2uwR8ZRiAQYn3wrp6YTuu7ckXpW6D3FQuvMCgYEA/GJL md2R/TGzjcCkRqE2K16k5fypBVoGFB98MQPuw+xHL/M6LCJU2B5ii7DPHtICR6yP iR72CbWLmMh9gHGDCO0vA9hy6yPiFQRNXwNWPeq/mXNBpTCSBpkPYidLdIkYxdL1 StAPt9HO8LnEJQ6axsCX+cQRN1N1SYe7AHn2as0CgYA6xCkPi8pmsc50Hk+kVqh6 THyCdAxAC4xu8Sb5lmaVED98WiImhkX8rZcNe4E78L9IHLQCW2CvmcqruHGfreBe gOOxTXIOKntISI6UmPsDHlolhdZwY5nlNuU9d0LMgvYepbPbntyagYqQS09WVQiR gH3lXMttRvuFHI3ASKQCqQKBgHsc8+YFqG5LLVxLiZcOkt8LFwM9gbGjnW15glpi obke7Abe7hSTVrHp+IZN5GsTZJtT+NyZpslLruIDgv0B4jqbgKCumDhN074O0DM1 7H7doUMYbwBGtiTTyyZFJtCdA+GUK6Wn4tL3XKwe4ih1fFjRoBDtbLyBUKhitnzg Aa1NAoGAZn0OXRBnnFZuPy1Yic4c6H1gNUG8Kv5KTTuU6A6Cm/cPUqSUEB2Tcyka h/sB2fgyZsqHvp3rP4JJPyoJ42FFRJ7VpysfGFs7L1xzv2pCKbMe2DpUrX2ZHe8R Fhqr7W6RmX2YahR73rK3f5zqpzvMtkgyicAAs2lMjUowxvGcpMc= -----END RSA PRIVATE KEY----- -----BEGIN CERTIFICATE----- MIICozCCAYugAwIBAgIBATANBgkqhkiG9w0BAQUFADAUMRIwEAYDVQQDEwlsb2Nh bGhvc3QwIBcNMTQwOTE2MTk1NTAwWhgPOTk5OTEyMzEyMzU5NTlaMBQxEjAQBgNV BAMTCWxvY2FsaG9zdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAPuW eN3hbNF8VJa01dma/0yUafjpsVkJy1oGIDAyr3IBFWnL0p7WU7Aoo1ohrdnIE8XG L1dc2kCkPqc0jilexLzvrPvj8eKsIiDaLWfU9fnIlrExnk6AjjQwg7Znc1jGs72t 1k35bX8ceHZ1/ByMjcUfAk92Sw4H6nHyHmhcx6FK0Rh4GuerFo8QG6i2/WXAZ2m2 +23YejPziZtBOfwOCD2ffmNf33dJQR/xHWentVakn9oD85bkqpVD0acCTT+5zHyJ rWKamcqhNHSYrf0sHMrx4vXuVcrftmqpsvXDWuFaWiqeUFpy87x0W7yFrtc+gXcW jPQ746jSrgrwOauQUpcCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAa920hzrFFEBu yoqYxVjbQDw1iVECcCLiwoBPHspUlCWww3TFo04i1v5oa66ooOhupz8ClpzRyskp C69jZrQn8RnWBBRvkqsqpUK3lSv3ZDZtAZZT8BeoOc8GLF9FtLXdXcVdNiwGCFf/ A7cx+UKM0+7s61FcyC/+zwhAXTBpLP9V3KyhZsARWNr8GRxb9l8PincFo8F/Zop7 eu9HmUBY4XE9HhOZXKfiMJJG11BZaMu8iF3QcJJ4OEUfKOJzb1vEYZpBJbdxfd6e 0DrQMAwuOrFxGLE9+DeRJ8qtiip3r9aMKKNGr+oX6pDGX2teVUcetgkjuXS9Lw8s X8G2zxyT9A== -----END CERTIFICATE----- ubuntu-make-18.09+disco1/tests/data/lsb_releases/0000755000000000000000000000000013352651520016554 5ustar ubuntu-make-18.09+disco1/tests/data/lsb_releases/invalid0000644000000000000000000000000013352651520020113 0ustar ubuntu-make-18.09+disco1/tests/data/lsb_releases/valid0000644000000000000000000000014713352651520017600 0ustar DISTRIB_ID=Ubuntu DISTRIB_RELEASE=14.04 DISTRIB_CODENAME=trusty DISTRIB_DESCRIPTION="Ubuntu 14.04 LTS" ubuntu-make-18.09+disco1/tests/data/maven.apache.org.crt0000644000000000000000000000242613352651520017743 0ustar -----BEGIN CERTIFICATE----- MIIDkzCCAnugAwIBAgIJAPa7rq2BUPQBMA0GCSqGSIb3DQEBCwUAMGAxCzAJBgNV BAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX aWRnaXRzIFB0eSBMdGQxGTAXBgNVBAMMEG1hdmVuLmFwYWNoZS5vcmcwHhcNMTcw ODEyMTcwNzAzWhcNMjcwNjIxMTcwNzAzWjBgMQswCQYDVQQGEwJBVTETMBEGA1UE CAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0cyBQdHkgTHRk MRkwFwYDVQQDDBBtYXZlbi5hcGFjaGUub3JnMIIBIjANBgkqhkiG9w0BAQEFAAOC AQ8AMIIBCgKCAQEA2031fgpLA2NbZLqQ9OhR6zHzu8Vr6Wfbb2o8+uEeuKakHv3j 6HtddcNe/vGAldRHMaiP7/AEOrJUmhp+9AqxQhuRll4IyJhK0CBmB0lqWAzf5LFv BnS8ji84L8vaB2yha7p0vnEm9ozpFoh6ILfPZsM4tciL+zUIX+SgMfAwrAX93mgw Cn6UpGH6ipYnqsKw/k5J+eKqgvFdjRfj54FRmqhGAb91iLDkKDD04J7ibNajNNOk I0Vdw0XTrKZ2t9pGkjb+RLRNHU8QmVCDeeMUY8Kgp5VxsFHwHyuJWhyJcMTJjEBz E/turrFOWH0KTr/LwV2RrgaHrLLz0f4hBTqtewIDAQABo1AwTjAdBgNVHQ4EFgQU Vw9tHTM6vvA3dNYF2bQe3mhC5EQwHwYDVR0jBBgwFoAUVw9tHTM6vvA3dNYF2bQe 3mhC5EQwDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAvqh+5Vl6gkSe QLxCn7cgokjeeO3YEXkNt5FpJ1YHC7KcIKysEAiJ7RXGYloNEoe85HErNK8yUriA AUL7oc6IaGoVkt1FmfWzY3WCZhn29ejDsLCQ6i0n+M7FjD1K8TMjt6EjzTySs0sl MlwI0aaqvM508UINeETcp82fWPhIXiC8p/PM8rg0Kf3kDsNpNtcT3gWvG0C3LXco ehvjEHkAa3DfTcOdH/NZsZk4JBNHuY5lDYuSu+sVodlojMSN8Dn1uwfGwfZcqyL8 URamheEPil5AOUC2g68Nl1ZNhKT2Ypxe5axhfiJZCSWe2CRzQ1R8reyUdGLOZJyC 0TCtvvAw6w== -----END CERTIFICATE----- ubuntu-make-18.09+disco1/tests/data/maven.apache.org.pem0000644000000000000000000000570213352651520017734 0ustar -----BEGIN PRIVATE KEY----- MIIEwAIBADANBgkqhkiG9w0BAQEFAASCBKowggSmAgEAAoIBAQDbTfV+CksDY1tk upD06FHrMfO7xWvpZ9tvajz64R64pqQe/ePoe111w17+8YCV1EcxqI/v8AQ6slSa Gn70CrFCG5GWXgjImErQIGYHSWpYDN/ksW8GdLyOLzgvy9oHbKFrunS+cSb2jOkW iHogt89mwzi1yIv7NQhf5KAx8DCsBf3eaDAKfpSkYfqKlieqwrD+Tkn54qqC8V2N F+PngVGaqEYBv3WIsOQoMPTgnuJs1qM006QjRV3DRdOspna32kaSNv5EtE0dTxCZ UIN54xRjwqCnlXGwUfAfK4laHIlwxMmMQHMT+26usU5YfQpOv8vBXZGuBoessvPR /iEFOq17AgMBAAECggEBAJKLEJ1toVydOwgfRxfwWjUwxu7VaFuqg856jk8SuWWo LQlsnKvQK86yg7sWg9ca54v+WFh76UeTvMbRJ75JmtNS+sEhCvuIEI3s6GC8JSy7 Ra1bB5an0Qut7/y4WnQVmfQTv0k28VNVK7hb8EgGq7e+ghmu7iMp9/OkIYvdNZjs lyCzNhCvGdMB9vttfDh73aXAoKeVWmOyltbU+9hqoZY50Iffn3M5BY2K0sySesgi mIbmynIp3JCaDATvRPVjow7hJt72tG3vdoJxvEjHPuTtD9kP2H7khtJLN9Bra9b6 oSpGxskYoQ1nwEZtNT4V9EyZmNaoJX42ShNTXVqv9lkCgYEA9rZGguZJgLmtq1Ih KoW4rteoAp29n5/xxcNFt65WMPj9hsMq9dedWdnkuAzBJie8tq0jGX5ta9xnJ6Wp oCVWmbM5av768lk7KXh551gqN5UWcgeIM4UVQ6FrvaEe3A52CJOMr3FMgSA3Z/zq lUmKY0cpmpWrmg1ytwTUXXjZJi8CgYEA44+KKdeXxHqsTQmtVmKTewY+y8xqtic6 tojA9AhCvPgjy4cuvDmDBkubSWq5XIyTAHABw+uRk4DG+E7G3Bk2g/c+N+LYx1WE 2zucMJFyk3FnrAsp+hpxNesdqMd8od8cN46845I5rKPZYRY3Uan30lPnFgjsNEnX Rs499Ouy5nUCgYEAhZrSdqMFnStwrH2urlt6V108hCYugZpZkTKdt8o2rRC6I1fg FQCuGvGQFkf59ZLBdOAwSOcZlLboOiVRxgNScawIZTQubD38dwniYnFxc2ZOoHQJ w3THvjdVpHzzvFIsg5p8LqqZtrfeqXbjBvOrePYZxrhVFPlBbXG1G+WNG0sCgYEA gWrpENLkJYH+6/FM+4wkhBsRK6aeKeo1ogo0cpUgH4igEuhW1AWBVts4/ZAMy23H TMBmwJ4AtPrQLfffcN2F+5dpcy84SmWAoY5NTfHqT6B3bYkL3ombSSbmP070urrA uXgcRPCsjFrDDkwsOe2IW74L9qQscbBtFn/FDL3fiOECgYEA6QzMdFYByp0fNqSx tyX78pgcF0KS1vfekAuzurtLLZKTwbJPCPuAsark//Bk0XAklACZYcrZX31f1WHD YE1kD+2MQb33QyXR4SQC1h2DR1qIQxpCN9KHQhePLvKvyEzjnqBqDTS+BNYyT5ip iBFbOo1wtPSGI4MXuCaZF3lEqi0= -----END PRIVATE KEY----- -----BEGIN CERTIFICATE----- MIIDkzCCAnugAwIBAgIJAPa7rq2BUPQBMA0GCSqGSIb3DQEBCwUAMGAxCzAJBgNV BAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX aWRnaXRzIFB0eSBMdGQxGTAXBgNVBAMMEG1hdmVuLmFwYWNoZS5vcmcwHhcNMTcw ODEyMTcwNzAzWhcNMjcwNjIxMTcwNzAzWjBgMQswCQYDVQQGEwJBVTETMBEGA1UE CAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0cyBQdHkgTHRk MRkwFwYDVQQDDBBtYXZlbi5hcGFjaGUub3JnMIIBIjANBgkqhkiG9w0BAQEFAAOC AQ8AMIIBCgKCAQEA2031fgpLA2NbZLqQ9OhR6zHzu8Vr6Wfbb2o8+uEeuKakHv3j 6HtddcNe/vGAldRHMaiP7/AEOrJUmhp+9AqxQhuRll4IyJhK0CBmB0lqWAzf5LFv BnS8ji84L8vaB2yha7p0vnEm9ozpFoh6ILfPZsM4tciL+zUIX+SgMfAwrAX93mgw Cn6UpGH6ipYnqsKw/k5J+eKqgvFdjRfj54FRmqhGAb91iLDkKDD04J7ibNajNNOk I0Vdw0XTrKZ2t9pGkjb+RLRNHU8QmVCDeeMUY8Kgp5VxsFHwHyuJWhyJcMTJjEBz E/turrFOWH0KTr/LwV2RrgaHrLLz0f4hBTqtewIDAQABo1AwTjAdBgNVHQ4EFgQU Vw9tHTM6vvA3dNYF2bQe3mhC5EQwHwYDVR0jBBgwFoAUVw9tHTM6vvA3dNYF2bQe 3mhC5EQwDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAvqh+5Vl6gkSe QLxCn7cgokjeeO3YEXkNt5FpJ1YHC7KcIKysEAiJ7RXGYloNEoe85HErNK8yUriA AUL7oc6IaGoVkt1FmfWzY3WCZhn29ejDsLCQ6i0n+M7FjD1K8TMjt6EjzTySs0sl MlwI0aaqvM508UINeETcp82fWPhIXiC8p/PM8rg0Kf3kDsNpNtcT3gWvG0C3LXco ehvjEHkAa3DfTcOdH/NZsZk4JBNHuY5lDYuSu+sVodlojMSN8Dn1uwfGwfZcqyL8 URamheEPil5AOUC2g68Nl1ZNhKT2Ypxe5axhfiJZCSWe2CRzQ1R8reyUdGLOZJyC 0TCtvvAw6w== -----END CERTIFICATE----- ubuntu-make-18.09+disco1/tests/data/mocks/0000755000000000000000000000000013352651520015225 5ustar ubuntu-make-18.09+disco1/tests/data/mocks/fails/0000755000000000000000000000000013352651520016323 5ustar ubuntu-make-18.09+disco1/tests/data/mocks/fails/git0000755000000000000000000000012713352651520017034 0ustar #!/bin/sh params=$@ if [ "$params" = "describe --tags --dirty" ]; then exit 1 fi ubuntu-make-18.09+disco1/tests/data/mocks/git0000755000000000000000000000015113352651520015733 0ustar #!/bin/sh params=$@ if [ "$params" = "describe --tags --dirty" ]; then echo "42.03-25-g1fd9507" fi ubuntu-make-18.09+disco1/tests/data/multipledefaultsframeworks/0000755000000000000000000000000013415340675021603 5ustar ubuntu-make-18.09+disco1/tests/data/multipledefaultsframeworks/__init__.py0000644000000000000000000000000013352651520023674 0ustar ubuntu-make-18.09+disco1/tests/data/multipledefaultsframeworks/defaultframeworkformain.py0000644000000000000000000000233113352651520027064 0ustar # -*- coding: utf-8 -*- # Copyright (C) 2014 Canonical # # Authors: # Didier Roche # # 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; version 3. # # 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 """Try to get a reject to set a framework as default for main category""" import umake.frameworks class FrameworkA(umake.frameworks.BaseFramework): def __init__(self, **kwargs): super().__init__(name="Framework A", description="Description for framework A", is_category_default=True, install_path_dir="custom/frameworka", **kwargs) def setup(self, install_path=None, auto_accept_license=False): super().setup() def remove(self): super().remove() ubuntu-make-18.09+disco1/tests/data/multipledefaultsframeworks/twodefaultscategory.py0000644000000000000000000000332113352651520026245 0ustar # -*- coding: utf-8 -*- # Copyright (C) 2014 Canonical # # Authors: # Didier Roche # # 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; version 3. # # 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 """Framework with two defaults frameworks""" import umake.frameworks class ACategory(umake.frameworks.BaseCategory): def __init__(self): super().__init__(name="Category A", description="Category A description") class FrameworkA(umake.frameworks.BaseFramework): def __init__(self, **kwargs): super().__init__(name="Framework A", description="Description for framework A", is_category_default=True, install_path_dir="custom/frameworka", **kwargs) def setup(self, install_path=None, auto_accept_license=False): super().setup() def remove(self): super().remove() class FrameworkB(umake.frameworks.BaseFramework): def __init__(self, **kwargs): super().__init__(name="Framework B", description="Description for framework B", is_category_default=True, **kwargs) def setup(self, install_path=None, auto_accept_license=False): super().setup() def remove(self): super().remove() ubuntu-make-18.09+disco1/tests/data/netbeans.org.crt0000644000000000000000000000241113352651520017206 0ustar -----BEGIN CERTIFICATE----- MIIDizCCAnOgAwIBAgIJAKV0wmMGmeB5MA0GCSqGSIb3DQEBCwUAMFwxCzAJBgNV BAYTAkZSMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX aWRnaXRzIFB0eSBMdGQxFTATBgNVBAMMDG5ldGJlYW5zLm9yZzAeFw0xNTExMDIx NjAzMjFaFw0yNTA5MTAxNjAzMjFaMFwxCzAJBgNVBAYTAkZSMRMwEQYDVQQIDApT b21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQxFTAT BgNVBAMMDG5ldGJlYW5zLm9yZzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC ggEBALnF19MaByOa44WkHygDR3TtyIiusMI0JFGC/u049MczUU9TWAul3CEePRit h4UmlzIP9JeBEfhsAkqLNH6t+70fa8qwDMOPdfZKaO1q3ZlR3jPhPKRhEHl9fNo7 5miLC3XYVUNiJZV2VZxKRT2ID8KndNhSD5uogGAaHiTU8jGAw5BkYMWLQqkZpbuk vvloZOLIgWhrBzw2bBVw5PNuoC+0WtMqf/uImeSsD7xf580eOwPHZp1R8dTdlqfx uOFVkpu6cX9G1d9JZeisaH1w57jh6uW0oRStHuXz1/2c4vjU2PaJM+zRN9sFrvr2 Oa02yQ2iawV6DSzVV3XwBuTdDHsCAwEAAaNQME4wHQYDVR0OBBYEFKBhmoDTcTWo KOIpL/UXSM6XE/pMMB8GA1UdIwQYMBaAFKBhmoDTcTWoKOIpL/UXSM6XE/pMMAwG A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAAAzj+bVvCKYm19ig8uqDW5g p4Eq/R06LpV0J35iwKRN/YN5lyuIIdAFUtKLDgYxXaqUeh68zDcMyBpOU1o66Ei5 h8OT6quVA8IFmPHGWCt2KCMt58a2GFC92RHtHUFD91xuu2zFakXhZYxJvVPt1xpV QBOixTsW9O/pCO8KQ4Id9RXAgcMHMb9Ngho63cb7+FvSCcHd9/BJ/drO6PbcxqcG fLvHvdlTDV5aL38N0b2N1Ufpnu+btviQnuIiBCB1WWU/7nxE7phl6xVwVmLUCGze U2frDvRtahVe89R+GBz9QiNK+5i7wiz559vBPDFYneG0LVa+FA1scBpFEXwZ/4o= -----END CERTIFICATE----- ubuntu-make-18.09+disco1/tests/data/netbeans.org.pem0000644000000000000000000000566113352651520017211 0ustar -----BEGIN PRIVATE KEY----- MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC5xdfTGgcjmuOF pB8oA0d07ciIrrDCNCRRgv7tOPTHM1FPU1gLpdwhHj0YrYeFJpcyD/SXgRH4bAJK izR+rfu9H2vKsAzDj3X2Smjtat2ZUd4z4TykYRB5fXzaO+Zoiwt12FVDYiWVdlWc SkU9iA/Cp3TYUg+bqIBgGh4k1PIxgMOQZGDFi0KpGaW7pL75aGTiyIFoawc8NmwV cOTzbqAvtFrTKn/7iJnkrA+8X+fNHjsDx2adUfHU3Zan8bjhVZKbunF/RtXfSWXo rGh9cOe44erltKEUrR7l89f9nOL41Nj2iTPs0TfbBa769jmtNskNomsFeg0s1Vd1 8Abk3Qx7AgMBAAECggEBAKSm66FZAlbWYy4BxvOJ5H2IeyJZ4qRd3oq4VgYfYyRj IX/zWKgKO07HJFOJCgJDr+JZLepSJYFPCcDUHJTi06pN/RXKb6Wss1q1nMZA32OS oiTNTxhKR3XGeTBbwt2Jz4CFWxy8Ep+kIEDDuxbMT1uxW+iW4uqNsCp9O5ZdfsPL 36M4C6o+tJoLyelAqBMgRwYBAR7U9g3vfYq6bUNzPD4/gZ7YaO6JvtieDTbPwpjc p3iCBgSPRA6ED2yR48LwC/u0piXlsNcBHUFVk872KpGOPHGXnqWIvj7kq9sMCpyU Wo90B+XJ8wuwGMPMjmKwHte2WYYlQCbjLYFVA2VBnzECgYEA4zO33WDgLz001EmP PGW6SoFVo5UD1N9p6AwgYToLqvMiTgi3c6dlRkrEYWaM1bcJnaBYU5OdzkCQGpxC JJA+YaJVTjMZiqo02X+XfANQaPBFVhHBCXwTWIKiJuspLy+0gwYyEwMV1GczQbkE mPUufsDaVt3TwejSMqS2nTQ90EcCgYEA0VHTGWyAs2SO9MUGr+Apfy6miEFUHkLu J33nfVfOwsaZHqpEeSYEeDuTsC64EMmruHhlo/jxDarZhWLhz9QnjAd8mA1fzDaq xexYBgusHofEvYQ5VOH79fhnX0HJT3TCIUOeBs4iaKwWvL9TFI3DuWPYCU+TcD3x KRTNiZ+tEC0CgYEAw6oulkBv0T7s2EXhTSpunOt1TUNv4UvmcSjAWfsbQUXSLVHk a32mAjsxlJA0iXjwlwcYCiH+rTl84O3hKIvwrTSYMphfTsP2b7kqRGq2PSlvDQiN LhXksz0NWGb9ON3kn1IenbDyg9G8msUz6GZ+fDqpzlWLoFtZarPfcNMkyNECgYBU sj0url6tN+U4WXjJNXTVB3VO8NAupnpi9Gj0qND6sw1GATNPqfhpBgJOabkE4fVf 4SePX616EEWP2WDxjTCrUmQxykeXBA+5olZDq/lrKRiMbrIcDIy9DFQXkTD5u47J kuigbEwz+l4A5ZGiYXJu012Y9t/7rLSmIMrCAyAtyQKBgCNxkCNw3mcErowwoiHd fhh4IEsRyd6erVid4jTNb7G7N1lEujlUNY2OsAfhROBy5P/ohJgMKre1nyc1xeiu cZxnQwZetmja4xAnNlcqxsloZlyOrP3APeFQYG3norKirZ4YFeFaU9w/L0kUUFSK N189dwTgx9yqDEP0SEgYJBF8 -----END PRIVATE KEY----- -----BEGIN CERTIFICATE----- MIIDizCCAnOgAwIBAgIJAKV0wmMGmeB5MA0GCSqGSIb3DQEBCwUAMFwxCzAJBgNV BAYTAkZSMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX aWRnaXRzIFB0eSBMdGQxFTATBgNVBAMMDG5ldGJlYW5zLm9yZzAeFw0xNTExMDIx NjAzMjFaFw0yNTA5MTAxNjAzMjFaMFwxCzAJBgNVBAYTAkZSMRMwEQYDVQQIDApT b21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQxFTAT BgNVBAMMDG5ldGJlYW5zLm9yZzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC ggEBALnF19MaByOa44WkHygDR3TtyIiusMI0JFGC/u049MczUU9TWAul3CEePRit h4UmlzIP9JeBEfhsAkqLNH6t+70fa8qwDMOPdfZKaO1q3ZlR3jPhPKRhEHl9fNo7 5miLC3XYVUNiJZV2VZxKRT2ID8KndNhSD5uogGAaHiTU8jGAw5BkYMWLQqkZpbuk vvloZOLIgWhrBzw2bBVw5PNuoC+0WtMqf/uImeSsD7xf580eOwPHZp1R8dTdlqfx uOFVkpu6cX9G1d9JZeisaH1w57jh6uW0oRStHuXz1/2c4vjU2PaJM+zRN9sFrvr2 Oa02yQ2iawV6DSzVV3XwBuTdDHsCAwEAAaNQME4wHQYDVR0OBBYEFKBhmoDTcTWo KOIpL/UXSM6XE/pMMB8GA1UdIwQYMBaAFKBhmoDTcTWoKOIpL/UXSM6XE/pMMAwG A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAAAzj+bVvCKYm19ig8uqDW5g p4Eq/R06LpV0J35iwKRN/YN5lyuIIdAFUtKLDgYxXaqUeh68zDcMyBpOU1o66Ei5 h8OT6quVA8IFmPHGWCt2KCMt58a2GFC92RHtHUFD91xuu2zFakXhZYxJvVPt1xpV QBOixTsW9O/pCO8KQ4Id9RXAgcMHMb9Ngho63cb7+FvSCcHd9/BJ/drO6PbcxqcG fLvHvdlTDV5aL38N0b2N1Ufpnu+btviQnuIiBCB1WWU/7nxE7phl6xVwVmLUCGze U2frDvRtahVe89R+GBz9QiNK+5i7wiz559vBPDFYneG0LVa+FA1scBpFEXwZ/4o= -----END CERTIFICATE----- ubuntu-make-18.09+disco1/tests/data/nodejs.org.crt0000644000000000000000000000240513352651520016674 0ustar -----BEGIN CERTIFICATE----- MIIDhzCCAm+gAwIBAgIJAM0RuxL089KdMA0GCSqGSIb3DQEBCwUAMFoxCzAJBgNV BAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX aWRnaXRzIFB0eSBMdGQxEzARBgNVBAMMCm5vZGVqcy5vcmcwHhcNMTYwMTE3MjM1 MzQ2WhcNMjUxMTI1MjM1MzQ2WjBaMQswCQYDVQQGEwJBVTETMBEGA1UECAwKU29t ZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMRMwEQYD VQQDDApub2RlanMub3JnMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA 2BMk7kFXmVV6KDiAIK/KXB1K03JUKqziyr1VbqZE++i/qJ7u/psK5+tbeksktBvP HeJZOqXdcICNo+kZwM9/gvH4WQ8u4LMg+ZWCvPzLcnkDd1r1hg2eND5m+E3VkVES /KL3AcaBNadfk/oAXIT1nVjvl2ZUlsRaYzb09Whr5995XTVw+ZntDoHrgjAHoYNq Erqc0/Cbv2Da0LHtUYRgUFFUQmBKOtbB+r2f7KYP8lCKxkISDxrq/je3tYJcUPfm aBFKcTmHgQa+WHK+AznZCtvpMicm/odh0K/mg8o0tADx7A56lTsedNI5DB8D90Es 2X4LzHuhhXPLxP8jUQbgLQIDAQABo1AwTjAdBgNVHQ4EFgQU44gu/w7Juo2HIvWV pGfZbgnY15MwHwYDVR0jBBgwFoAU44gu/w7Juo2HIvWVpGfZbgnY15MwDAYDVR0T BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAVZItQ973u+yzHF1zQXGmhDIRQrcZ 5r4zmnT0VJhcZiPh3kDJfX9YnSLY2zYWB34UHhrO8Zp+55dv8e99y0RYgtQQgt+b K8D4U2NP1qBDAiFkOhKdVgXLL7r+MjZpGFTr75GDvFZQDyP+T1GUw++XSVVYQhFP x4RwSwMmUNv80uHMRrcPYe6a8XKCa1li/OlBJQq/JpFyhITDuo4aMVRcPK0HAfJE M+ZMM9mmHrrCqazFo0qThbJCz0hRqKZGMphjJ4kdPt3Y8536fZsEzTcR6PhLCOvd 4AovC7EmDmY9o2FXpPDmt8GpxenMdRRZkV+DkBv8OGcpsSLJ2vhflVm2MA== -----END CERTIFICATE----- ubuntu-make-18.09+disco1/tests/data/nodejs.org.pem0000644000000000000000000000565513352651520016677 0ustar -----BEGIN PRIVATE KEY----- MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDYEyTuQVeZVXoo OIAgr8pcHUrTclQqrOLKvVVupkT76L+onu7+mwrn61t6SyS0G88d4lk6pd1wgI2j 6RnAz3+C8fhZDy7gsyD5lYK8/MtyeQN3WvWGDZ40Pmb4TdWRURL8ovcBxoE1p1+T +gBchPWdWO+XZlSWxFpjNvT1aGvn33ldNXD5me0OgeuCMAehg2oSupzT8Ju/YNrQ se1RhGBQUVRCYEo61sH6vZ/spg/yUIrGQhIPGur+N7e1glxQ9+ZoEUpxOYeBBr5Y cr4DOdkK2+kyJyb+h2HQr+aDyjS0APHsDnqVOx500jkMHwP3QSzZfgvMe6GFc8vE /yNRBuAtAgMBAAECggEAfpq5COFAcpei++4fJQfbih2fukVDC75BJInLhQnnYbL+ mc6GOqidu0YsU3u0BdRFhz0ZC0Qke8bXNzNd45uxGwise4Jp9T8AEz2HXTTCAFDn tweU1Pclu3bU3qi8emkGtwDFukSVcNqhJhNWIt/FCm0R9aP/7FcgnwGUhjapAzLa S5dY3Flo6sY9GFiBQ/LGs0/mYxegKr1LRfUlobcP7UafrPmBqArqbe70IcegY2dl z6qKxAF25/osB8ACFquDymZBS7ZIgwdUV3AIahVn5gz8x90yk9toehxS5foBDngS nWiDCEe71HeLFPIhYAMF918WWohYb1A9/qkI7JwAAQKBgQDsNRrV1liFlTFdPYCC W2/okye7yFfZLUuL3RuCO9NtIH+mo4Dk9YY9ob19hpzkpm18Og+iYkLKHYxYquCB qepgmh5sqlNAox/Jkehf+rbTCFlj3TnATHSPmRMTSqKKeIm6v3d//d8FemrwfqgT e8KHpPdh4zVZh7r0Gbq/EQF1DQKBgQDqLixIckfE4tBKOXLDYJv325VEi5wm0lBB RsjmqmgV7mODCV8Vr+W6J8O/TOQI4FCmEuonQhiWybqZDi28NUFmTGNtqDxUI1fd 9QSbuc5scKn391BsxMDs9CrRgFJ/glaRe/t0uCQtRSd/753UoMx43oTdlJcCEsjA 9NH+jyKPoQKBgQDEBVIO0YHG4cgEm8xw4dbeCHj54kndBjTijgyNKH7N2iF1Ncz6 tTLBJN9vM24yZlcHt9tPpAHPX3QgBTapBExn/J5xCWxrgLQZgEd6l0JvoUclk+qg RhKZNKxa3x5CkcOiwdA23ITfM/dZO5LaEGOgU+ukRXz5nqUse8m5VDCEZQKBgHST 0cWq5mF0C/63RJNQl7Q2osNBwNVuozcrtr1lnXU1fGJyGtyf+PvH6eFktKxahqt2 BQzQEY+XEwY4kbn8xPbZFjIzqvyzr302CTpAsCs5ltNzUZ0kAWq0TlCG0grZ5qB8 GPzM4m2K3JQKxAZimgedtoTcAKSulzO/bH6N4MWhAoGBAIyN+JHAwX3qhGVPBEe+ nML36BHlTbkTQseTWu58cAW5NHVEiKT4GK6+oc6LB5mJXksKDmSyTVnleLUNwniK 5YTYuhU/Uqr4PrkSna/OCJZ7vFW1qOmkKJZAZKaApb6SMuExtHEMcqtIKKGzPQAu 26+W0MZLftCuGuGh4UfX7q3I -----END PRIVATE KEY----- -----BEGIN CERTIFICATE----- MIIDhzCCAm+gAwIBAgIJAM0RuxL089KdMA0GCSqGSIb3DQEBCwUAMFoxCzAJBgNV BAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX aWRnaXRzIFB0eSBMdGQxEzARBgNVBAMMCm5vZGVqcy5vcmcwHhcNMTYwMTE3MjM1 MzQ2WhcNMjUxMTI1MjM1MzQ2WjBaMQswCQYDVQQGEwJBVTETMBEGA1UECAwKU29t ZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMRMwEQYD VQQDDApub2RlanMub3JnMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA 2BMk7kFXmVV6KDiAIK/KXB1K03JUKqziyr1VbqZE++i/qJ7u/psK5+tbeksktBvP HeJZOqXdcICNo+kZwM9/gvH4WQ8u4LMg+ZWCvPzLcnkDd1r1hg2eND5m+E3VkVES /KL3AcaBNadfk/oAXIT1nVjvl2ZUlsRaYzb09Whr5995XTVw+ZntDoHrgjAHoYNq Erqc0/Cbv2Da0LHtUYRgUFFUQmBKOtbB+r2f7KYP8lCKxkISDxrq/je3tYJcUPfm aBFKcTmHgQa+WHK+AznZCtvpMicm/odh0K/mg8o0tADx7A56lTsedNI5DB8D90Es 2X4LzHuhhXPLxP8jUQbgLQIDAQABo1AwTjAdBgNVHQ4EFgQU44gu/w7Juo2HIvWV pGfZbgnY15MwHwYDVR0jBBgwFoAU44gu/w7Juo2HIvWVpGfZbgnY15MwDAYDVR0T BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAVZItQ973u+yzHF1zQXGmhDIRQrcZ 5r4zmnT0VJhcZiPh3kDJfX9YnSLY2zYWB34UHhrO8Zp+55dv8e99y0RYgtQQgt+b K8D4U2NP1qBDAiFkOhKdVgXLL7r+MjZpGFTr75GDvFZQDyP+T1GUw++XSVVYQhFP x4RwSwMmUNv80uHMRrcPYe6a8XKCa1li/OlBJQq/JpFyhITDuo4aMVRcPK0HAfJE M+ZMM9mmHrrCqazFo0qThbJCz0hRqKZGMphjJ4kdPt3Y8536fZsEzTcR6PhLCOvd 4AovC7EmDmY9o2FXpPDmt8GpxenMdRRZkV+DkBv8OGcpsSLJ2vhflVm2MA== -----END CERTIFICATE----- ubuntu-make-18.09+disco1/tests/data/overlayframeworks/0000755000000000000000000000000013352651520017673 5ustar ubuntu-make-18.09+disco1/tests/data/overlayframeworks/duplicatedcategory.py0000644000000000000000000000333113352651520024121 0ustar # -*- coding: utf-8 -*- # Copyright (C) 2014 Canonical # # Authors: # Didier Roche # # 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; version 3. # # 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 """Framework with category module""" import umake.frameworks class ACategory(umake.frameworks.BaseCategory): def __init__(self): super().__init__(name="Category A", description="Category A description, same prog_name") class FrameworkA(umake.frameworks.BaseFramework): def __init__(self, **kwargs): super().__init__(name="Framework A from overlay", description="Description for framework A from overlay", is_category_default=True, install_path_dir="custom/frameworka", **kwargs) def setup(self, install_path=None, auto_accept_license=False): super().setup() def remove(self): super().remove() class FrameworkB(umake.frameworks.BaseFramework): def __init__(self, **kwargs): super().__init__(name="Framework/B", description="Description for framework B", **kwargs) def setup(self, install_path=None, auto_accept_license=False): super().setup() def remove(self): super().remove() ubuntu-make-18.09+disco1/tests/data/overlayframeworks/duplicatedcategory2.py0000644000000000000000000000333513352651520024207 0ustar # -*- coding: utf-8 -*- # Copyright (C) 2014 Canonical # # Authors: # Didier Roche # # 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; version 3. # # 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 """Framework with category module""" import umake.frameworks class ACategory(umake.frameworks.BaseCategory): def __init__(self): super().__init__(name="Category A", description="Category A description, same prog_name") class FrameworkA(umake.frameworks.BaseFramework): def __init__(self, **kwargs): super().__init__(name="Framework A from overlay 2", description="Description for framework A from overlay 2", is_category_default=True, install_path_dir="custom/frameworka", **kwargs) def setup(self, install_path=None, auto_accept_license=False): super().setup() def remove(self): super().remove() class FrameworkB(umake.frameworks.BaseFramework): def __init__(self, **kwargs): super().__init__(name="Framework/B", description="Description for framework B", **kwargs) def setup(self, install_path=None, auto_accept_license=False): super().setup() def remove(self): super().remove() ubuntu-make-18.09+disco1/tests/data/overlayframeworks/overlayframeworks.py0000644000000000000000000000326713352651520024037 0ustar # -*- coding: utf-8 -*- # Copyright (C) 2014 Canonical # # Authors: # Didier Roche # # 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; version 3. # # 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 """Framework with category module""" import umake.frameworks class ACategory(umake.frameworks.BaseCategory): def __init__(self): super().__init__(name="Category A overlay", description="Category A description") class FrameworkA(umake.frameworks.BaseFramework): def __init__(self, **kwargs): super().__init__(name="Framework A", description="Description for framework A", is_category_default=True, install_path_dir="custom/frameworka", **kwargs) def setup(self, install_path=None, auto_accept_license=False): super().setup() def remove(self): super().remove() class FrameworkB(umake.frameworks.BaseFramework): def __init__(self, **kwargs): super().__init__(name="Framework/B", description="Description for framework B", **kwargs) def setup(self, install_path=None, auto_accept_license=False): super().setup() def remove(self): super().remove() ubuntu-make-18.09+disco1/tests/data/overlayframeworks/withcategory.py0000644000000000000000000000326713352651520022766 0ustar # -*- coding: utf-8 -*- # Copyright (C) 2014 Canonical # # Authors: # Didier Roche # # 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; version 3. # # 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 """Framework with category module""" import umake.frameworks class ACategory(umake.frameworks.BaseCategory): def __init__(self): super().__init__(name="Category A overlay", description="Category A description") class FrameworkA(umake.frameworks.BaseFramework): def __init__(self, **kwargs): super().__init__(name="Framework A", description="Description for framework A", is_category_default=True, install_path_dir="custom/frameworka", **kwargs) def setup(self, install_path=None, auto_accept_license=False): super().setup() def remove(self): super().remove() class FrameworkB(umake.frameworks.BaseFramework): def __init__(self, **kwargs): super().__init__(name="Framework/B", description="Description for framework B", **kwargs) def setup(self, install_path=None, auto_accept_license=False): super().setup() def remove(self): super().remove() ubuntu-make-18.09+disco1/tests/data/overlayframeworks/withcategory2.py0000644000000000000000000000327113352651520023043 0ustar # -*- coding: utf-8 -*- # Copyright (C) 2014 Canonical # # Authors: # Didier Roche # # 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; version 3. # # 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 """Framework with category module""" import umake.frameworks class ACategory(umake.frameworks.BaseCategory): def __init__(self): super().__init__(name="Category A2 overlay", description="Category A2 description") class FrameworkA(umake.frameworks.BaseFramework): def __init__(self, **kwargs): super().__init__(name="Framework A", description="Description for framework A", is_category_default=True, install_path_dir="custom/frameworka", **kwargs) def setup(self, install_path=None, auto_accept_license=False): super().setup() def remove(self): super().remove() class FrameworkB(umake.frameworks.BaseFramework): def __init__(self, **kwargs): super().__init__(name="Framework/B", description="Description for framework B", **kwargs) def setup(self, install_path=None, auto_accept_license=False): super().setup() def remove(self): super().remove() ubuntu-make-18.09+disco1/tests/data/server-content/0000755000000000000000000000000013352651520017067 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/android-studio-fake.tgz0000644000000000000000000000061713352651520023452 0ustar ‹ãPGUí˜ÝNÂ0€¹ÞSÔ¸ ½@Nÿ¯ŒÏRh ØÈ:ŒoqH†cZF ç»)ÙHN»oç'3¹-‹Ì}µ¶Y1\ÐZ’°R-ápÝA(ãJ ’iT "/²›#Ö¾2e؊̓˜Ìý©ÿµÝßžc·þÌwÿã,ÿœï_ê >øWŒkôß þëŸO~+F› "ø—Œ* œ+ @ÿk?qãþïïjç³$IlVæféH £Wóf†S3wIéªu™O ëžÓ—ĽgI·×fáb’\û ÈïiÈÿùX1Zë?_ýŸ *Bý×ZsÌÿ>8È¿pnE`>ßGùïí|´Z˜jZ”ËaU a Dart SDK - Dart API docs

 
Dart SDK

Welcome to the Dart API reference documentation, covering the official Dart API libraries. Some of the most fundamental Dart libraries include:

  • dart:core: Core functionality such as strings, numbers, collections, errors, dates, and URIs.
  • dart:html: DOM manipulation for web apps.
  • dart:io: I/O for command-line apps.

Except for dart:core, you must import a library before you can use it. Here's an example of importing dart:html and dart:math:

import 'dart:html';
import 'dart:math';

You can install more libraries using the pub package manager. For information on finding, using, and publishing libraries with pub, see pub.dartlang.org.

The main site for learning and using Dart is www.dartlang.org. Check out these additional pages:

This API reference is automatically generated from the source code in the Dart project. If you'd like to contribute to this documentation, see Contributing.

Libraries

dart:async

Support for asynchronous programming, with classes such as Future and Stream.

dart:collection

Classes and utilities that supplement the collection support in dart:core.

dart:convert

Encoders and decoders for converting between different data representations, including JSON and UTF-8.

dart:core

Built-in types, collections, and other core functionality for every Dart program.

dart:developer

Interact with developer tools such as the debugger and inspector.

dart:html

HTML elements and other resources for web-based applications that need to interact with the browser and the DOM (Document Object Model).

dart:indexed_db

A client-side key-value store with support for indexes.

dart:io

File, socket, HTTP, and other I/O support for server applications.

dart:isolate

Concurrent programming using isolates: independent workers that are similar to threads but don't share memory, communicating only via messages.

dart:js

Support for interoperating with JavaScript.

dart:math

Mathematical constants and functions, plus a random number generator.

dart:mirrors

Basic reflection in Dart, with support for introspection and dynamic invocation.

dart:profiler

Please see 'dart:developer'.

dart:svg

Scalable Vector Graphics: Two-dimensional vector graphics with support for events and animation.

dart:typed_data

Lists that efficiently handle fixed sized data (for example, unsigned 8 byte integers) and SIMD numeric types.

dart:web_audio

High-fidelity audio programming in the browser.

dart:web_gl

3D programming in the browser.

dart:web_sql

An API for storing data in the browser that can be queried with SQL.

ubuntu-make-18.09+disco1/tests/data/server-content/api.github.com/0000755000000000000000000000000013352651520021676 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/api.github.com/repos/0000755000000000000000000000000013352651520023026 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/api.github.com/repos/4ian/0000755000000000000000000000000013352651520023661 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/api.github.com/repos/4ian/GD/0000755000000000000000000000000013352651520024153 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/api.github.com/repos/4ian/GD/releases/0000755000000000000000000000000013352651520025756 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/api.github.com/repos/4ian/GD/releases/latest0000644000000000000000000003611213352651520027200 0ustar { "url": "https://api.github.com/repos/4ian/GD/releases/10755553", "assets_url": "https://api.github.com/repos/4ian/GD/releases/10755553/assets", "upload_url": "https://uploads.github.com/repos/4ian/GD/releases/10755553/assets{?name,label}", "html_url": "https://github.com/4ian/GD/releases/tag/v5.0.0-beta34", "id": 10755553, "tag_name": "v5.0.0-beta34", "target_commitish": "master", "name": "5.0.0-beta34", "draft": false, "author": { "login": "4ian", "id": 1280130, "avatar_url": "https://avatars0.githubusercontent.com/u/1280130?v=4", "gravatar_id": "", "url": "https://api.github.com/users/4ian", "html_url": "https://github.com/4ian", "followers_url": "https://api.github.com/users/4ian/followers", "following_url": "https://api.github.com/users/4ian/following{/other_user}", "gists_url": "https://api.github.com/users/4ian/gists{/gist_id}", "starred_url": "https://api.github.com/users/4ian/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/4ian/subscriptions", "organizations_url": "https://api.github.com/users/4ian/orgs", "repos_url": "https://api.github.com/users/4ian/repos", "events_url": "https://api.github.com/users/4ian/events{/privacy}", "received_events_url": "https://api.github.com/users/4ian/received_events", "type": "User", "site_admin": false }, "prerelease": false, "created_at": "2018-04-27T14:14:21Z", "published_at": "2018-04-27T14:21:39Z", "assets": [ { "url": "https://api.github.com/repos/4ian/GD/releases/assets/6998621", "id": 6998621, "name": "gdevelop-5.0.0-beta34-mac.zip", "label": "", "uploader": { "login": "4ian", "id": 1280130, "avatar_url": "https://avatars0.githubusercontent.com/u/1280130?v=4", "gravatar_id": "", "url": "https://api.github.com/users/4ian", "html_url": "https://github.com/4ian", "followers_url": "https://api.github.com/users/4ian/followers", "following_url": "https://api.github.com/users/4ian/following{/other_user}", "gists_url": "https://api.github.com/users/4ian/gists{/gist_id}", "starred_url": "https://api.github.com/users/4ian/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/4ian/subscriptions", "organizations_url": "https://api.github.com/users/4ian/orgs", "repos_url": "https://api.github.com/users/4ian/repos", "events_url": "https://api.github.com/users/4ian/events{/privacy}", "received_events_url": "https://api.github.com/users/4ian/received_events", "type": "User", "site_admin": false }, "content_type": "application/zip", "state": "uploaded", "size": 62104206, "download_count": 82, "created_at": "2018-04-27T14:17:37Z", "updated_at": "2018-04-27T14:17:45Z", "browser_download_url": "https://github.com/4ian/GD/releases/download/v5.0.0-beta34/gdevelop-5.0.0-beta34-mac.zip" }, { "url": "https://api.github.com/repos/4ian/GD/releases/assets/6998606", "id": 6998606, "name": "gdevelop-5.0.0-beta34.dmg", "label": "", "uploader": { "login": "4ian", "id": 1280130, "avatar_url": "https://avatars0.githubusercontent.com/u/1280130?v=4", "gravatar_id": "", "url": "https://api.github.com/users/4ian", "html_url": "https://github.com/4ian", "followers_url": "https://api.github.com/users/4ian/followers", "following_url": "https://api.github.com/users/4ian/following{/other_user}", "gists_url": "https://api.github.com/users/4ian/gists{/gist_id}", "starred_url": "https://api.github.com/users/4ian/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/4ian/subscriptions", "organizations_url": "https://api.github.com/users/4ian/orgs", "repos_url": "https://api.github.com/users/4ian/repos", "events_url": "https://api.github.com/users/4ian/events{/privacy}", "received_events_url": "https://api.github.com/users/4ian/received_events", "type": "User", "site_admin": false }, "content_type": "application/octet-stream", "state": "uploaded", "size": 64452715, "download_count": 1, "created_at": "2018-04-27T14:16:28Z", "updated_at": "2018-04-27T14:16:35Z", "browser_download_url": "https://github.com/4ian/GD/releases/download/v5.0.0-beta34/gdevelop-5.0.0-beta34.dmg" }, { "url": "https://api.github.com/repos/4ian/GD/releases/assets/6998607", "id": 6998607, "name": "gdevelop-5.0.0-beta34.dmg.blockmap", "label": "", "uploader": { "login": "4ian", "id": 1280130, "avatar_url": "https://avatars0.githubusercontent.com/u/1280130?v=4", "gravatar_id": "", "url": "https://api.github.com/users/4ian", "html_url": "https://github.com/4ian", "followers_url": "https://api.github.com/users/4ian/followers", "following_url": "https://api.github.com/users/4ian/following{/other_user}", "gists_url": "https://api.github.com/users/4ian/gists{/gist_id}", "starred_url": "https://api.github.com/users/4ian/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/4ian/subscriptions", "organizations_url": "https://api.github.com/users/4ian/orgs", "repos_url": "https://api.github.com/users/4ian/repos", "events_url": "https://api.github.com/users/4ian/events{/privacy}", "received_events_url": "https://api.github.com/users/4ian/received_events", "type": "User", "site_admin": false }, "content_type": "application/octet-stream", "state": "uploaded", "size": 67967, "download_count": 0, "created_at": "2018-04-27T14:16:28Z", "updated_at": "2018-04-27T14:16:28Z", "browser_download_url": "https://github.com/4ian/GD/releases/download/v5.0.0-beta34/gdevelop-5.0.0-beta34.dmg.blockmap" }, { "url": "https://api.github.com/repos/4ian/GD/releases/assets/6998640", "id": 6998640, "name": "gdevelop-mock.tar.gz", "label": "", "uploader": { "login": "4ian", "id": 1280130, "avatar_url": "https://avatars0.githubusercontent.com/u/1280130?v=4", "gravatar_id": "", "url": "https://api.github.com/users/4ian", "html_url": "https://github.com/4ian", "followers_url": "https://api.github.com/users/4ian/followers", "following_url": "https://api.github.com/users/4ian/following{/other_user}", "gists_url": "https://api.github.com/users/4ian/gists{/gist_id}", "starred_url": "https://api.github.com/users/4ian/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/4ian/subscriptions", "organizations_url": "https://api.github.com/users/4ian/orgs", "repos_url": "https://api.github.com/users/4ian/repos", "events_url": "https://api.github.com/users/4ian/events{/privacy}", "received_events_url": "https://api.github.com/users/4ian/received_events", "type": "User", "site_admin": false }, "content_type": "application/gzip", "state": "uploaded", "size": 64598290, "download_count": 7, "created_at": "2018-04-27T14:19:21Z", "updated_at": "2018-04-27T14:19:46Z", "browser_download_url": "https://github.com/4ian/GD/releases/download/vmock/gdevelop-mock.tar.gz" }, { "url": "https://api.github.com/repos/4ian/GD/releases/assets/6998614", "id": 6998614, "name": "gdevelop-setup-5.0.0-beta34.exe", "label": "", "uploader": { "login": "4ian", "id": 1280130, "avatar_url": "https://avatars0.githubusercontent.com/u/1280130?v=4", "gravatar_id": "", "url": "https://api.github.com/users/4ian", "html_url": "https://github.com/4ian", "followers_url": "https://api.github.com/users/4ian/followers", "following_url": "https://api.github.com/users/4ian/following{/other_user}", "gists_url": "https://api.github.com/users/4ian/gists{/gist_id}", "starred_url": "https://api.github.com/users/4ian/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/4ian/subscriptions", "organizations_url": "https://api.github.com/users/4ian/orgs", "repos_url": "https://api.github.com/users/4ian/repos", "events_url": "https://api.github.com/users/4ian/events{/privacy}", "received_events_url": "https://api.github.com/users/4ian/received_events", "type": "User", "site_admin": false }, "content_type": "application/octet-stream", "state": "uploaded", "size": 47640057, "download_count": 1067, "created_at": "2018-04-27T14:17:20Z", "updated_at": "2018-04-27T14:17:26Z", "browser_download_url": "https://github.com/4ian/GD/releases/download/v5.0.0-beta34/gdevelop-setup-5.0.0-beta34.exe" }, { "url": "https://api.github.com/repos/4ian/GD/releases/assets/6998615", "id": 6998615, "name": "gdevelop-setup-5.0.0-beta34.exe.blockmap", "label": "", "uploader": { "login": "4ian", "id": 1280130, "avatar_url": "https://avatars0.githubusercontent.com/u/1280130?v=4", "gravatar_id": "", "url": "https://api.github.com/users/4ian", "html_url": "https://github.com/4ian", "followers_url": "https://api.github.com/users/4ian/followers", "following_url": "https://api.github.com/users/4ian/following{/other_user}", "gists_url": "https://api.github.com/users/4ian/gists{/gist_id}", "starred_url": "https://api.github.com/users/4ian/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/4ian/subscriptions", "organizations_url": "https://api.github.com/users/4ian/orgs", "repos_url": "https://api.github.com/users/4ian/repos", "events_url": "https://api.github.com/users/4ian/events{/privacy}", "received_events_url": "https://api.github.com/users/4ian/received_events", "type": "User", "site_admin": false }, "content_type": "application/octet-stream", "state": "uploaded", "size": 49757, "download_count": 0, "created_at": "2018-04-27T14:17:20Z", "updated_at": "2018-04-27T14:17:20Z", "browser_download_url": "https://github.com/4ian/GD/releases/download/v5.0.0-beta34/gdevelop-setup-5.0.0-beta34.exe.blockmap" }, { "url": "https://api.github.com/repos/4ian/GD/releases/assets/6998622", "id": 6998622, "name": "latest-mac.json", "label": "", "uploader": { "login": "4ian", "id": 1280130, "avatar_url": "https://avatars0.githubusercontent.com/u/1280130?v=4", "gravatar_id": "", "url": "https://api.github.com/users/4ian", "html_url": "https://github.com/4ian", "followers_url": "https://api.github.com/users/4ian/followers", "following_url": "https://api.github.com/users/4ian/following{/other_user}", "gists_url": "https://api.github.com/users/4ian/gists{/gist_id}", "starred_url": "https://api.github.com/users/4ian/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/4ian/subscriptions", "organizations_url": "https://api.github.com/users/4ian/orgs", "repos_url": "https://api.github.com/users/4ian/repos", "events_url": "https://api.github.com/users/4ian/events{/privacy}", "received_events_url": "https://api.github.com/users/4ian/received_events", "type": "User", "site_admin": false }, "content_type": "application/json", "state": "uploaded", "size": 178, "download_count": 0, "created_at": "2018-04-27T14:17:37Z", "updated_at": "2018-04-27T14:17:37Z", "browser_download_url": "https://github.com/4ian/GD/releases/download/v5.0.0-beta34/latest-mac.json" }, { "url": "https://api.github.com/repos/4ian/GD/releases/assets/6998644", "id": 6998644, "name": "latest-mac.yml", "label": "", "uploader": { "login": "4ian", "id": 1280130, "avatar_url": "https://avatars0.githubusercontent.com/u/1280130?v=4", "gravatar_id": "", "url": "https://api.github.com/users/4ian", "html_url": "https://github.com/4ian", "followers_url": "https://api.github.com/users/4ian/followers", "following_url": "https://api.github.com/users/4ian/following{/other_user}", "gists_url": "https://api.github.com/users/4ian/gists{/gist_id}", "starred_url": "https://api.github.com/users/4ian/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/4ian/subscriptions", "organizations_url": "https://api.github.com/users/4ian/orgs", "repos_url": "https://api.github.com/users/4ian/repos", "events_url": "https://api.github.com/users/4ian/events{/privacy}", "received_events_url": "https://api.github.com/users/4ian/received_events", "type": "User", "site_admin": false }, "content_type": "text/yaml", "state": "uploaded", "size": 497, "download_count": 220, "created_at": "2018-04-27T14:19:46Z", "updated_at": "2018-04-27T14:19:47Z", "browser_download_url": "https://github.com/4ian/GD/releases/download/v5.0.0-beta34/latest-mac.yml" }, { "url": "https://api.github.com/repos/4ian/GD/releases/assets/6998645", "id": 6998645, "name": "latest.yml", "label": "", "uploader": { "login": "4ian", "id": 1280130, "avatar_url": "https://avatars0.githubusercontent.com/u/1280130?v=4", "gravatar_id": "", "url": "https://api.github.com/users/4ian", "html_url": "https://github.com/4ian", "followers_url": "https://api.github.com/users/4ian/followers", "following_url": "https://api.github.com/users/4ian/following{/other_user}", "gists_url": "https://api.github.com/users/4ian/gists{/gist_id}", "starred_url": "https://api.github.com/users/4ian/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/4ian/subscriptions", "organizations_url": "https://api.github.com/users/4ian/orgs", "repos_url": "https://api.github.com/users/4ian/repos", "events_url": "https://api.github.com/users/4ian/events{/privacy}", "received_events_url": "https://api.github.com/users/4ian/received_events", "type": "User", "site_admin": false }, "content_type": "text/yaml", "state": "uploaded", "size": 436, "download_count": 1778, "created_at": "2018-04-27T14:19:46Z", "updated_at": "2018-04-27T14:19:47Z", "browser_download_url": "https://github.com/4ian/GD/releases/download/v5.0.0-beta34/latest.yml" } ], "tarball_url": "https://api.github.com/repos/4ian/GD/tarball/v5.0.0-beta34", "zipball_url": "https://api.github.com/repos/4ian/GD/zipball/v5.0.0-beta34", "body": "* Fix issue with points not being displayed when editing points of a Sprite object.\r\n" } ubuntu-make-18.09+disco1/tests/data/server-content/api.github.com/repos/Atom/0000755000000000000000000000000013352651520023726 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/api.github.com/repos/Atom/Atom/0000755000000000000000000000000013352651520024626 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/api.github.com/repos/Atom/Atom/releases/0000755000000000000000000000000013352651520026431 5ustar ././@LongLink0000644000000000000000000000014600000000000007774 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/api.github.com/repos/Atom/Atom/releases/index.htmlubuntu-make-18.09+disco1/tests/data/server-content/api.github.com/repos/Atom/Atom/releases/index.htm0000644000000000000000000010164613352651520030262 0ustar [{ "url": "https://api.github.com/repos/atom/atom/releases/3384604", "assets_url": "https://api.github.com/repos/atom/atom/releases/3384604/assets", "upload_url": "https://uploads.github.com/repos/atom/atom/releases/3384604/assets{?name,label}", "html_url": "https://github.com/atom/atom/releases/tag/v1.8.0", "id": 3384604, "tag_name": "v1.8.0-beta", "target_commitish": "1.8-releases", "name": "1.8.0", "draft": false, "author": { "login": "mhubot", "id": 3697332, "avatar_url": "https://avatars.githubusercontent.com/u/3697332?v=3", "gravatar_id": "", "url": "https://api.github.com/users/mhubot", "html_url": "https://github.com/mhubot", "followers_url": "https://api.github.com/users/mhubot/followers", "following_url": "https://api.github.com/users/mhubot/following{/other_user}", "gists_url": "https://api.github.com/users/mhubot/gists{/gist_id}", "starred_url": "https://api.github.com/users/mhubot/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/mhubot/subscriptions", "organizations_url": "https://api.github.com/users/mhubot/orgs", "repos_url": "https://api.github.com/users/mhubot/repos", "events_url": "https://api.github.com/users/mhubot/events{/privacy}", "received_events_url": "https://api.github.com/users/mhubot/received_events", "type": "User", "site_admin": false }, "prerelease": false, "created_at": "2016-06-06T21:29:19Z", "published_at": "2016-06-06T22:32:56Z", "assets": [ { "url": "https://api.github.com/repos/atom/atom/releases/assets/1803746", "id": 1803746, "name": "atom-1.8.0-delta.nupkg", "label": "", "uploader": { "login": "mhubot", "id": 3697332, "avatar_url": "https://avatars.githubusercontent.com/u/3697332?v=3", "gravatar_id": "", "url": "https://api.github.com/users/mhubot", "html_url": "https://github.com/mhubot", "followers_url": "https://api.github.com/users/mhubot/followers", "following_url": "https://api.github.com/users/mhubot/following{/other_user}", "gists_url": "https://api.github.com/users/mhubot/gists{/gist_id}", "starred_url": "https://api.github.com/users/mhubot/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/mhubot/subscriptions", "organizations_url": "https://api.github.com/users/mhubot/orgs", "repos_url": "https://api.github.com/users/mhubot/repos", "events_url": "https://api.github.com/users/mhubot/events{/privacy}", "received_events_url": "https://api.github.com/users/mhubot/received_events", "type": "User", "site_admin": false }, "content_type": "application/zip", "state": "uploaded", "size": 50310671, "download_count": 186, "created_at": "2016-06-06T22:14:56Z", "updated_at": "2016-06-06T22:15:11Z", "browser_download_url": "https://github.com/atom/atom/releases/download/v1.8.0/atom-1.8.0-delta.nupkg" }, { "url": "https://api.github.com/repos/atom/atom/releases/assets/1803743", "id": 1803743, "name": "atom-1.8.0-full.nupkg", "label": "", "uploader": { "login": "mhubot", "id": 3697332, "avatar_url": "https://avatars.githubusercontent.com/u/3697332?v=3", "gravatar_id": "", "url": "https://api.github.com/users/mhubot", "html_url": "https://github.com/mhubot", "followers_url": "https://api.github.com/users/mhubot/followers", "following_url": "https://api.github.com/users/mhubot/following{/other_user}", "gists_url": "https://api.github.com/users/mhubot/gists{/gist_id}", "starred_url": "https://api.github.com/users/mhubot/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/mhubot/subscriptions", "organizations_url": "https://api.github.com/users/mhubot/orgs", "repos_url": "https://api.github.com/users/mhubot/repos", "events_url": "https://api.github.com/users/mhubot/events{/privacy}", "received_events_url": "https://api.github.com/users/mhubot/received_events", "type": "User", "site_admin": false }, "content_type": "application/zip", "state": "uploaded", "size": 111525622, "download_count": 615, "created_at": "2016-06-06T22:14:56Z", "updated_at": "2016-06-06T22:15:16Z", "browser_download_url": "https://github.com/atom/atom/releases/download/v1.8.0/atom-1.8.0-full.nupkg" }, { "url": "https://api.github.com/repos/atom/atom/releases/assets/1803494", "id": 1803494, "name": "atom-amd64.deb", "label": "", "uploader": { "login": "mhubot", "id": 3697332, "avatar_url": "https://avatars.githubusercontent.com/u/3697332?v=3", "gravatar_id": "", "url": "https://api.github.com/users/mhubot", "html_url": "https://github.com/mhubot", "followers_url": "https://api.github.com/users/mhubot/followers", "following_url": "https://api.github.com/users/mhubot/following{/other_user}", "gists_url": "https://api.github.com/users/mhubot/gists{/gist_id}", "starred_url": "https://api.github.com/users/mhubot/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/mhubot/subscriptions", "organizations_url": "https://api.github.com/users/mhubot/orgs", "repos_url": "https://api.github.com/users/mhubot/repos", "events_url": "https://api.github.com/users/mhubot/events{/privacy}", "received_events_url": "https://api.github.com/users/mhubot/received_events", "type": "User", "site_admin": false }, "content_type": "application/zip", "state": "uploaded", "size": 79083138, "download_count": 9785, "created_at": "2016-06-06T21:37:42Z", "updated_at": "2016-06-06T21:37:49Z", "browser_download_url": "https://github.com/atom/atom/releases/download/v1.8.0/atom-amd64.deb" }, { "url": "https://api.github.com/repos/atom/atom/releases/assets/1803495", "id": 1803495, "name": "atom-amd64.tar.gz", "label": "", "uploader": { "login": "mhubot", "id": 3697332, "avatar_url": "https://avatars.githubusercontent.com/u/3697332?v=3", "gravatar_id": "", "url": "https://api.github.com/users/mhubot", "html_url": "https://github.com/mhubot", "followers_url": "https://api.github.com/users/mhubot/followers", "following_url": "https://api.github.com/users/mhubot/following{/other_user}", "gists_url": "https://api.github.com/users/mhubot/gists{/gist_id}", "starred_url": "https://api.github.com/users/mhubot/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/mhubot/subscriptions", "organizations_url": "https://api.github.com/users/mhubot/orgs", "repos_url": "https://api.github.com/users/mhubot/repos", "events_url": "https://api.github.com/users/mhubot/events{/privacy}", "received_events_url": "https://api.github.com/users/mhubot/received_events", "type": "User", "site_admin": false }, "content_type": "application/zip", "state": "uploaded", "size": 79659902, "download_count": 1678, "created_at": "2016-06-06T21:37:42Z", "updated_at": "2016-06-06T21:37:50Z", "browser_download_url": "https://github.com/atom/atom/releases/download/mock/atom-amd64.tar.gz" }, { "url": "https://api.github.com/repos/atom/atom/releases/assets/1803625", "id": 1803625, "name": "atom-api.json", "label": "", "uploader": { "login": "mhubot", "id": 3697332, "avatar_url": "https://avatars.githubusercontent.com/u/3697332?v=3", "gravatar_id": "", "url": "https://api.github.com/users/mhubot", "html_url": "https://github.com/mhubot", "followers_url": "https://api.github.com/users/mhubot/followers", "following_url": "https://api.github.com/users/mhubot/following{/other_user}", "gists_url": "https://api.github.com/users/mhubot/gists{/gist_id}", "starred_url": "https://api.github.com/users/mhubot/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/mhubot/subscriptions", "organizations_url": "https://api.github.com/users/mhubot/orgs", "repos_url": "https://api.github.com/users/mhubot/repos", "events_url": "https://api.github.com/users/mhubot/events{/privacy}", "received_events_url": "https://api.github.com/users/mhubot/received_events", "type": "User", "site_admin": false }, "content_type": "application/zip", "state": "uploaded", "size": 862495, "download_count": 163, "created_at": "2016-06-06T21:57:27Z", "updated_at": "2016-06-06T21:57:28Z", "browser_download_url": "https://github.com/atom/atom/releases/download/v1.8.0/atom-api.json" }, { "url": "https://api.github.com/repos/atom/atom/releases/assets/1803627", "id": 1803627, "name": "atom-mac-symbols.zip", "label": "", "uploader": { "login": "mhubot", "id": 3697332, "avatar_url": "https://avatars.githubusercontent.com/u/3697332?v=3", "gravatar_id": "", "url": "https://api.github.com/users/mhubot", "html_url": "https://github.com/mhubot", "followers_url": "https://api.github.com/users/mhubot/followers", "following_url": "https://api.github.com/users/mhubot/following{/other_user}", "gists_url": "https://api.github.com/users/mhubot/gists{/gist_id}", "starred_url": "https://api.github.com/users/mhubot/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/mhubot/subscriptions", "organizations_url": "https://api.github.com/users/mhubot/orgs", "repos_url": "https://api.github.com/users/mhubot/repos", "events_url": "https://api.github.com/users/mhubot/events{/privacy}", "received_events_url": "https://api.github.com/users/mhubot/received_events", "type": "User", "site_admin": false }, "content_type": "application/zip", "state": "uploaded", "size": 293053, "download_count": 134, "created_at": "2016-06-06T21:57:27Z", "updated_at": "2016-06-06T21:57:28Z", "browser_download_url": "https://github.com/atom/atom/releases/download/v1.8.0/atom-mac-symbols.zip" }, { "url": "https://api.github.com/repos/atom/atom/releases/assets/1803626", "id": 1803626, "name": "atom-mac.zip", "label": "", "uploader": { "login": "mhubot", "id": 3697332, "avatar_url": "https://avatars.githubusercontent.com/u/3697332?v=3", "gravatar_id": "", "url": "https://api.github.com/users/mhubot", "html_url": "https://github.com/mhubot", "followers_url": "https://api.github.com/users/mhubot/followers", "following_url": "https://api.github.com/users/mhubot/following{/other_user}", "gists_url": "https://api.github.com/users/mhubot/gists{/gist_id}", "starred_url": "https://api.github.com/users/mhubot/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/mhubot/subscriptions", "organizations_url": "https://api.github.com/users/mhubot/orgs", "repos_url": "https://api.github.com/users/mhubot/repos", "events_url": "https://api.github.com/users/mhubot/events{/privacy}", "received_events_url": "https://api.github.com/users/mhubot/received_events", "type": "User", "site_admin": false }, "content_type": "application/zip", "state": "uploaded", "size": 87042184, "download_count": 15179, "created_at": "2016-06-06T21:57:27Z", "updated_at": "2016-06-06T21:57:32Z", "browser_download_url": "https://github.com/atom/atom/releases/download/v1.8.0/atom-mac.zip" }, { "url": "https://api.github.com/repos/atom/atom/releases/assets/1803745", "id": 1803745, "name": "atom-windows.zip", "label": "", "uploader": { "login": "mhubot", "id": 3697332, "avatar_url": "https://avatars.githubusercontent.com/u/3697332?v=3", "gravatar_id": "", "url": "https://api.github.com/users/mhubot", "html_url": "https://github.com/mhubot", "followers_url": "https://api.github.com/users/mhubot/followers", "following_url": "https://api.github.com/users/mhubot/following{/other_user}", "gists_url": "https://api.github.com/users/mhubot/gists{/gist_id}", "starred_url": "https://api.github.com/users/mhubot/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/mhubot/subscriptions", "organizations_url": "https://api.github.com/users/mhubot/orgs", "repos_url": "https://api.github.com/users/mhubot/repos", "events_url": "https://api.github.com/users/mhubot/events{/privacy}", "received_events_url": "https://api.github.com/users/mhubot/received_events", "type": "User", "site_admin": false }, "content_type": "application/zip", "state": "uploaded", "size": 109372322, "download_count": 11659, "created_at": "2016-06-06T22:14:56Z", "updated_at": "2016-06-06T22:15:16Z", "browser_download_url": "https://github.com/atom/atom/releases/download/v1.8.0/atom-windows.zip" }, { "url": "https://api.github.com/repos/atom/atom/releases/assets/1803533", "id": 1803533, "name": "atom.x86_64.rpm", "label": "", "uploader": { "login": "mhubot", "id": 3697332, "avatar_url": "https://avatars.githubusercontent.com/u/3697332?v=3", "gravatar_id": "", "url": "https://api.github.com/users/mhubot", "html_url": "https://github.com/mhubot", "followers_url": "https://api.github.com/users/mhubot/followers", "following_url": "https://api.github.com/users/mhubot/following{/other_user}", "gists_url": "https://api.github.com/users/mhubot/gists{/gist_id}", "starred_url": "https://api.github.com/users/mhubot/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/mhubot/subscriptions", "organizations_url": "https://api.github.com/users/mhubot/orgs", "repos_url": "https://api.github.com/users/mhubot/repos", "events_url": "https://api.github.com/users/mhubot/events{/privacy}", "received_events_url": "https://api.github.com/users/mhubot/received_events", "type": "User", "site_admin": false }, "content_type": "application/zip", "state": "uploaded", "size": 64364944, "download_count": 2830, "created_at": "2016-06-06T21:42:42Z", "updated_at": "2016-06-06T21:42:46Z", "browser_download_url": "https://github.com/atom/atom/releases/download/v1.8.0/atom.x86_64.rpm" }, { "url": "https://api.github.com/repos/atom/atom/releases/assets/1803769", "id": 1803769, "name": "AtomSetup.exe", "label": null, "uploader": { "login": "BinaryMuse", "id": 189606, "avatar_url": "https://avatars.githubusercontent.com/u/189606?v=3", "gravatar_id": "", "url": "https://api.github.com/users/BinaryMuse", "html_url": "https://github.com/BinaryMuse", "followers_url": "https://api.github.com/users/BinaryMuse/followers", "following_url": "https://api.github.com/users/BinaryMuse/following{/other_user}", "gists_url": "https://api.github.com/users/BinaryMuse/gists{/gist_id}", "starred_url": "https://api.github.com/users/BinaryMuse/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/BinaryMuse/subscriptions", "organizations_url": "https://api.github.com/users/BinaryMuse/orgs", "repos_url": "https://api.github.com/users/BinaryMuse/repos", "events_url": "https://api.github.com/users/BinaryMuse/events{/privacy}", "received_events_url": "https://api.github.com/users/BinaryMuse/received_events", "type": "User", "site_admin": true }, "content_type": "application/x-msdownload", "state": "uploaded", "size": 109668104, "download_count": 9448, "created_at": "2016-06-06T22:18:52Z", "updated_at": "2016-06-06T22:19:54Z", "browser_download_url": "https://github.com/atom/atom/releases/download/v1.8.0/AtomSetup.exe" }, { "url": "https://api.github.com/repos/atom/atom/releases/assets/1803768", "id": 1803768, "name": "AtomSetup.msi", "label": null, "uploader": { "login": "BinaryMuse", "id": 189606, "avatar_url": "https://avatars.githubusercontent.com/u/189606?v=3", "gravatar_id": "", "url": "https://api.github.com/users/BinaryMuse", "html_url": "https://github.com/BinaryMuse", "followers_url": "https://api.github.com/users/BinaryMuse/followers", "following_url": "https://api.github.com/users/BinaryMuse/following{/other_user}", "gists_url": "https://api.github.com/users/BinaryMuse/gists{/gist_id}", "starred_url": "https://api.github.com/users/BinaryMuse/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/BinaryMuse/subscriptions", "organizations_url": "https://api.github.com/users/BinaryMuse/orgs", "repos_url": "https://api.github.com/users/BinaryMuse/repos", "events_url": "https://api.github.com/users/BinaryMuse/events{/privacy}", "received_events_url": "https://api.github.com/users/BinaryMuse/received_events", "type": "User", "site_admin": true }, "content_type": "application/octet-stream", "state": "uploaded", "size": 109498368, "download_count": 2895, "created_at": "2016-06-06T22:18:52Z", "updated_at": "2016-06-06T22:19:54Z", "browser_download_url": "https://github.com/atom/atom/releases/download/v1.8.0/AtomSetup.msi" }, { "url": "https://api.github.com/repos/atom/atom/releases/assets/1803742", "id": 1803742, "name": "RELEASES", "label": "", "uploader": { "login": "mhubot", "id": 3697332, "avatar_url": "https://avatars.githubusercontent.com/u/3697332?v=3", "gravatar_id": "", "url": "https://api.github.com/users/mhubot", "html_url": "https://github.com/mhubot", "followers_url": "https://api.github.com/users/mhubot/followers", "following_url": "https://api.github.com/users/mhubot/following{/other_user}", "gists_url": "https://api.github.com/users/mhubot/gists{/gist_id}", "starred_url": "https://api.github.com/users/mhubot/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/mhubot/subscriptions", "organizations_url": "https://api.github.com/users/mhubot/orgs", "repos_url": "https://api.github.com/users/mhubot/repos", "events_url": "https://api.github.com/users/mhubot/events{/privacy}", "received_events_url": "https://api.github.com/users/mhubot/received_events", "type": "User", "site_admin": false }, "content_type": "application/zip", "state": "uploaded", "size": 11935, "download_count": 700, "created_at": "2016-06-06T22:14:56Z", "updated_at": "2016-06-06T22:14:56Z", "browser_download_url": "https://github.com/atom/atom/releases/download/v1.8.0/RELEASES" } ], "tarball_url": "https://api.github.com/repos/atom/atom/tarball/v1.8.0", "zipball_url": "https://api.github.com/repos/atom/atom/zipball/v1.8.0", "body": "### Notable Changes\r\n\r\n* Better environment handling\r\n* Shortcut for moving text left/right\r\n* `core.restorePreviousWindowsOnStart` setting\r\n\r\n### [Atom Core](https://github.com/atom/atom)\r\n\r\n* [atom/atom#11188 - Bump status-bar](https://github.com/atom/atom/pull/11188)\r\n* [atom/atom#11194 - Fix typo: destory -> destroy](https://github.com/atom/atom/pull/11194)\r\n* [atom/atom#11201 - Remove an unnecessary call to then().](https://github.com/atom/atom/pull/11201)\r\n* [atom/atom#11240 - More accurate block decoration measurements](https://github.com/atom/atom/pull/11240)\r\n* [atom/atom#10862 - Fix for Default Directory Provider incorrectly identifying file paths as URLs on Windows](https://github.com/atom/atom/pull/10862)\r\n* [atom/atom#11265 - fix link in ISSUE_TEMPLATE](https://github.com/atom/atom/pull/11265)\r\n* [atom/atom#11271 - Fix typo in error message.](https://github.com/atom/atom/pull/11271)\r\n* [atom/atom#11280 - Remove GitRepository git status](https://github.com/atom/atom/pull/11280)\r\n* [atom/atom#11251 - Fallback to ~/.atom/storage when no state is found in IndexedDb](https://github.com/atom/atom/pull/11251)\r\n* [atom/atom#11277 - Less disk IO](https://github.com/atom/atom/pull/11277)\r\n* [atom/atom#11296 - Improve build on Windows](https://github.com/atom/atom/pull/11296)\r\n* [atom/atom#11286 - Correctly (un)subscribe to model events on PaneAxisElement attach/detach](https://github.com/atom/atom/pull/11286)\r\n* [atom/atom#11295 - Take the submodule into account in more instances.](https://github.com/atom/atom/pull/11295)\r\n* [atom/atom#11306 - Warn rather than failing if we detect leaked pathwatcher subscriptions](https://github.com/atom/atom/pull/11306)\r\n* [atom/atom#11312 - https link to nodejs.org and visualstudio.com](https://github.com/atom/atom/pull/11312)\r\n* [atom/atom#11311 - https link to nodejs.org](https://github.com/atom/atom/pull/11311)\r\n* [atom/atom#11315 - Serialize async git](https://github.com/atom/atom/pull/11315)\r\n* [atom/atom#11320 - Update nodegit](https://github.com/atom/atom/pull/11320)\r\n* [atom/atom#6631 - Add commands to move selections left and right by one column](https://github.com/atom/atom/pull/6631)\r\n* [atom/atom#11324 - Add restorePreviousWindowsOnStart setting](https://github.com/atom/atom/pull/11324)\r\n* [atom/atom#11329 - Fix potential null reference callback invokation in script/clean](https://github.com/atom/atom/pull/11329)\r\n* [atom/atom#11325 - Fix emoji rendering on OSX](https://github.com/atom/atom/pull/11325)\r\n* [atom/atom#11316 - Add request for OS and version to Issue Template](https://github.com/atom/atom/pull/11316)\r\n* [atom/atom#11314 - Handle auto-updater errors](https://github.com/atom/atom/pull/11314)\r\n* [atom/atom#11341 - Use application-level events to control updates in the browser process](https://github.com/atom/atom/pull/11341)\r\n* [atom/atom#11339 - HTTPS a couple of links](https://github.com/atom/atom/pull/11339)\r\n* [atom/atom#11345 - Disable zoom every time a display gets added or removed](https://github.com/atom/atom/pull/11345)\r\n* [atom/atom#11351 - :arrow_up: language-perl@0.33.0](https://github.com/atom/atom/pull/11351)\r\n* [atom/atom#11246 - Improve the Windows build process](https://github.com/atom/atom/pull/11246)\r\n* [atom/atom#11369 - :racehorse: Avoid setting hidden input value on textInput](https://github.com/atom/atom/pull/11369)\r\n* [atom/atom#9554 - Add a linux archive to distribute atom](https://github.com/atom/atom/pull/9554)\r\n* [atom/atom#11398 - Fix build lint](https://github.com/atom/atom/pull/11398)\r\n* [atom/atom#11397 - Defer the callback to the next tick.](https://github.com/atom/atom/pull/11397)\r\n* [atom/atom#11403 - Fix dead atom.io/docs links in CONTRIBUTING.md](https://github.com/atom/atom/pull/11403)\r\n* [atom/atom#11410 - Use #index instead of #openIndex.](https://github.com/atom/atom/pull/11410)\r\n* [atom/atom#11418 - :memo: Add the --no-install flag to the windows build readme](https://github.com/atom/atom/pull/11418)\r\n* [atom/atom#11419 - :memo: Fix linking the decorateMarker](https://github.com/atom/atom/pull/11419)\r\n* [atom/atom#11426 - Bump nodegit](https://github.com/atom/atom/pull/11426)\r\n* [atom/atom#11412 - Signing support on Windows with P12 keys](https://github.com/atom/atom/pull/11412)\r\n* [atom/atom#11412 - Signing support on Windows with P12 keys](https://github.com/atom/atom/pull/11412)\r\n* [atom/atom#11427 - Code sign on AppVeyor](https://github.com/atom/atom/pull/11427)\r\n* [atom/atom#11436 - Allow A Window's Environment To Reflect The Most Recent atom Invocation](https://github.com/atom/atom/pull/11436)\r\n* [atom/atom#11437 - Ignore autorun on our buffered process commands. Fixes #10082](https://github.com/atom/atom/pull/11437)\r\n* [atom/atom#11438 - Don't load packages starting with a dot](https://github.com/atom/atom/pull/11438)\r\n* [atom/atom#11475 - Add ELECTRON_NO_ATTACH_CONSOLE in BufferedNodeProcess](https://github.com/atom/atom/pull/11475)\r\n* [atom/atom#11498 - Copy active item when splitting from TextEditor context menu](https://github.com/atom/atom/pull/11498)\r\n* [atom/atom#11494 - Correctly autoindent single newline in Selection#insertText](https://github.com/atom/atom/pull/11494)\r\n* [atom/atom#11463 - Fixes #11190](https://github.com/atom/atom/pull/11463)\r\n* [atom/atom#11734 - Attach msi to release on github.com](https://github.com/atom/atom/pull/11734)\r\n* [atom/atom#11552 - Content Security Policy fixes](https://github.com/atom/atom/pull/11552)\r\n\r\n### [one-dark-ui](https://github.com/atom/one-dark-ui)\r\n\r\nv1.2.0...v1.3.1\r\n\r\n* [atom/one-dark-ui#123 - Shrink modals when window gets narrow](https://github.com/atom/one-dark-ui/pull/123)\r\n* [atom/one-dark-ui#124 - Use auto-size for tabs in compact mode](https://github.com/atom/one-dark-ui/pull/124)\r\n* [atom/one-dark-ui#128 - Add tree-view bottom border](https://github.com/atom/one-dark-ui/pull/128)\r\n* [atom/one-dark-ui#131 - Add config for tab sizing](https://github.com/atom/one-dark-ui/pull/131)\r\n\r\n### [one-light-ui](https://github.com/atom/one-light-ui)\r\n\r\nv1.2.0...v1.3.1\r\n\r\n* [atom/one-light-ui#56 - Remove top border](https://github.com/atom/one-light-ui/pull/56)\r\n* [atom/one-light-ui#51 - Shrink modals when window gets narrow](https://github.com/atom/one-light-ui/pull/51)\r\n* [atom/one-light-ui#57 - Add tree-view bottom border](https://github.com/atom/one-light-ui/pull/57)\r\n* [atom/one-light-ui#58 - Add config for tab sizing](https://github.com/atom/one-light-ui/pull/58)\r\n\r\n### [solarized-dark-syntax](https://github.com/atom/solarized-dark-syntax)\r\n\r\nv1.0.0...v1.0.2\r\n\r\n* [atom/solarized-dark-syntax#63 - Rename c++ to cpp](https://github.com/atom/solarized-dark-syntax/pull/63)\r\n* [atom/solarized-dark-syntax#61 - Fix missing keywords in ruby](https://github.com/atom/solarized-dark-syntax/pull/61)\r\n\r\n### [solarized-light-syntax](https://github.com/atom/solarized-light-syntax)\r\n\r\nv1.0.0...v1.0.2\r\n\r\n* [atom/solarized-light-syntax#22 - Fix missing keywords in ruby](https://github.com/atom/solarized-light-syntax/pull/22)\r\n\r\n### [about](https://github.com/atom/about)\r\n\r\nv1.4.2...v1.5.0\r\n\r\n* [atom/about#20 - Handle update errors](https://github.com/atom/about/pull/20)\r\n\r\n### [autocomplete-css](https://github.com/atom/autocomplete-css)\r\n\r\nv0.11.0...v0.11.1\r\n\r\n* [atom/autocomplete-css#48 - Added currentColor & transparent color keywords](https://github.com/atom/autocomplete-css/pull/48)\r\n\r\n### [autocomplete-plus](https://github.com/atom/autocomplete-plus)\r\n\r\nv2.29.1...v2.29.2\r\n\r\n* [atom/autocomplete-plus#702 - Avoid deprecations introduced in atom/ns-use-display-layers branch](https://github.com/atom/autocomplete-plus/pull/702)\r\n\r\n### [bookmarks](https://github.com/atom/bookmarks)\r\n\r\nv0.38.2...v0.39.0\r\n\r\n* [atom/bookmarks#47 - Implement ranged single- and multi-line bookmarks](https://github.com/atom/bookmarks/pull/47)\r\n* [atom/bookmarks#52 - Use TextEditor APIs instead of private, deprecated displayBuffer field](https://github.com/atom/bookmarks/pull/52)\r\n* [atom/bookmarks#53 - Use MarkerLayers and refactor package](https://github.com/atom/bookmarks/pull/53)\r\n\r\n### [bracket-matcher](https://github.com/atom/bracket-matcher)\r\n\r\nv0.81.0...v0.82.0\r\n\r\n* [atom/bracket-matcher#223 - Allow scoped settings](https://github.com/atom/bracket-matcher/pull/223)\r\n\r\n### [exception-reporting](https://github.com/atom/exception-reporting)\r\n\r\nv0.37.0...v0.38.0\r\n\r\n* [atom/exception-reporting#17 - Set notifier version to version of bugsnag-atom](https://github.com/atom/exception-reporting/pull/17)\r\n\r\n### [incompatible-packages](https://github.com/atom/incompatible-packages)\r\n\r\nv0.25.1...v0.26.1\r\n\r\n* [atom/incompatible-packages#14 - Try to find the status-bar in the footer first.](https://github.com/atom/incompatible-packages/pull/14)\r\n* [atom/incompatible-packages#15 - Fix specs again](https://github.com/atom/incompatible-packages/pull/15)\r\n\r\n### [line-ending-selector](https://github.com/atom/line-ending-selector)\r\n\r\nv0.3.1...v0.4.1\r\n\r\n* [atom/line-ending-selector#25 - Try to find the status-bar in the footer first.](https://github.com/atom/line-ending-selector/pull/25)\r\n* [atom/line-ending-selector#26 - Fix specs again](https://github.com/atom/line-ending-selector/pull/26)\r\n\r\n### [snippets](https://github.com/atom/snippets)\r\n\r\nv1.0.1...v1.0.2\r\n\r\n* [atom/snippets#194 - Added more formatting options for snippets](https://github.com/atom/snippets/pull/194)\r\n\r\n### [spell-check](https://github.com/atom/spell-check)\r\n\r\nv0.67.0...v0.67.1\r\n\r\n* [atom/spell-check#122 - Add marker layers on TextEditor and stop using marker custom properties](https://github.com/atom/spell-check/pull/122)\r\n\r\n### [status-bar](https://github.com/atom/status-bar)\r\n\r\nv1.1.2...v1.2.3\r\n\r\n* [atom/status-bar#133 - Move to the footer](https://github.com/atom/status-bar/pull/133)\r\n* [atom/status-bar#134 - Use public release for CI](https://github.com/atom/status-bar/pull/134)\r\n* [atom/status-bar#138 - :racehorse: Defer updatePosition](https://github.com/atom/status-bar/pull/138)\r\n* [atom/status-bar#139 - Don't log errors caused by the repo being destroyed.](https://github.com/atom/status-bar/pull/139)\r\n* [atom/status-bar#140 - Track disposable for updatePosition](https://github.com/atom/status-bar/pull/140)\r\n* [atom/status-bar#141 - Fix spec races](https://github.com/atom/status-bar/pull/141)\r\n\r\n### [language-c](https://github.com/atom/language-c)\r\n\r\nv0.51.1...v0.51.3\r\n\r\n* [atom/language-c#128 - Add `decltype` to `storage.type.cpp`](https://github.com/atom/language-c/pull/128)\r\n* [atom/language-c#131 - Add `noexcept` to the list of storage modifiers](https://github.com/atom/language-c/pull/131)\r\n\r\n### [language-csharp](https://github.com/atom/language-csharp)\r\n\r\nv0.12.0...v0.12.1\r\n\r\n* [atom/language-csharp#59 - Add `dynamic` as a C# 4 keyword](https://github.com/atom/language-csharp/pull/59)\r\n* [atom/language-csharp#60 - Add `alias` and `global` as keywords](https://github.com/atom/language-csharp/pull/60)\r\n\r\n### [language-css](https://github.com/atom/language-css)\r\n\r\nv0.36.0...v0.36.1\r\n\r\n* [atom/language-css#54 - Added @keyframes & @supports snippet. Alphabetized](https://github.com/atom/language-css/pull/54)\r\n\r\n### [language-json](https://github.com/atom/language-json)\r\n\r\nv0.17.6...v0.18.0\r\n\r\n* [atom/language-json#45 - Mark trailing commas as syntax errors](https://github.com/atom/language-json/pull/45)\r\n\r\n### [language-less](https://github.com/atom/language-less)\r\n\r\nv0.29.0...v0.29.3\r\n\r\n* [atom/language-less#49 - Parse non-quoted relative urls](https://github.com/atom/language-less/pull/49)\r\n* [atom/language-less#53 - Add missing HTML elements](https://github.com/atom/language-less/pull/53)\r\n* [atom/language-less#55 - Fix not parsing ::shadow correctly](https://github.com/atom/language-less/pull/55)\r\n\r\n### [language-make](https://github.com/atom/language-make)\r\n\r\nv0.21.0...v0.21.1\r\n\r\n* [atom/language-make#30 - tests for comments and each function](https://github.com/atom/language-make/pull/30)\r\n* [atom/language-make#37 - Add \"mkfile\" to recognised file extensions](https://github.com/atom/language-make/pull/37)\r\n\r\n### [language-perl](https://github.com/atom/language-perl)\r\n\r\nv0.32.0...v0.34.0\r\n\r\n* [atom/language-perl#65 - Added \"n\" regex modifer (new in perl 5.22)](https://github.com/atom/language-perl/pull/65)\r\n\r\n### [language-python](https://github.com/atom/language-python)\r\n\r\nv0.43.0...v0.43.1\r\n\r\n* [atom/language-python#136 - Give self and cls the class 'variable.language.self.python'.](https://github.com/atom/language-python/pull/136)\r\n\r\n### [language-ruby](https://github.com/atom/language-ruby)\r\n\r\nv0.68.3...v0.68.5\r\n\r\n* [atom/language-ruby#141 - Add Dangerfile fileType](https://github.com/atom/language-ruby/pull/141)\r\n* [atom/language-ruby#145 - Add Brewfile to fileTypes](https://github.com/atom/language-ruby/pull/145)\r\n\r\n### [language-shellscript](https://github.com/atom/language-shellscript)\r\n\r\nv0.21.0...v0.21.1\r\n\r\n* [atom/language-shellscript#38 - Bats file support](https://github.com/atom/language-shellscript/pull/38)\r\n\r\n### [language-yaml](https://github.com/atom/language-yaml)\r\n\r\nv0.25.1...v0.25.2\r\n\r\n* [atom/language-yaml#42 - Add .clang-format as YAML file](https://github.com/atom/language-yaml/pull/42)\r\n" } ] ubuntu-make-18.09+disco1/tests/data/server-content/api.github.com/repos/Atom/Atom/releases/latest0000644000000000000000000010163613352651520027657 0ustar { "url": "https://api.github.com/repos/atom/atom/releases/3384604", "assets_url": "https://api.github.com/repos/atom/atom/releases/3384604/assets", "upload_url": "https://uploads.github.com/repos/atom/atom/releases/3384604/assets{?name,label}", "html_url": "https://github.com/atom/atom/releases/tag/v1.8.0", "id": 3384604, "tag_name": "v1.8.0", "target_commitish": "1.8-releases", "name": "1.8.0", "draft": false, "author": { "login": "mhubot", "id": 3697332, "avatar_url": "https://avatars.githubusercontent.com/u/3697332?v=3", "gravatar_id": "", "url": "https://api.github.com/users/mhubot", "html_url": "https://github.com/mhubot", "followers_url": "https://api.github.com/users/mhubot/followers", "following_url": "https://api.github.com/users/mhubot/following{/other_user}", "gists_url": "https://api.github.com/users/mhubot/gists{/gist_id}", "starred_url": "https://api.github.com/users/mhubot/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/mhubot/subscriptions", "organizations_url": "https://api.github.com/users/mhubot/orgs", "repos_url": "https://api.github.com/users/mhubot/repos", "events_url": "https://api.github.com/users/mhubot/events{/privacy}", "received_events_url": "https://api.github.com/users/mhubot/received_events", "type": "User", "site_admin": false }, "prerelease": false, "created_at": "2016-06-06T21:29:19Z", "published_at": "2016-06-06T22:32:56Z", "assets": [ { "url": "https://api.github.com/repos/atom/atom/releases/assets/1803746", "id": 1803746, "name": "atom-1.8.0-delta.nupkg", "label": "", "uploader": { "login": "mhubot", "id": 3697332, "avatar_url": "https://avatars.githubusercontent.com/u/3697332?v=3", "gravatar_id": "", "url": "https://api.github.com/users/mhubot", "html_url": "https://github.com/mhubot", "followers_url": "https://api.github.com/users/mhubot/followers", "following_url": "https://api.github.com/users/mhubot/following{/other_user}", "gists_url": "https://api.github.com/users/mhubot/gists{/gist_id}", "starred_url": "https://api.github.com/users/mhubot/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/mhubot/subscriptions", "organizations_url": "https://api.github.com/users/mhubot/orgs", "repos_url": "https://api.github.com/users/mhubot/repos", "events_url": "https://api.github.com/users/mhubot/events{/privacy}", "received_events_url": "https://api.github.com/users/mhubot/received_events", "type": "User", "site_admin": false }, "content_type": "application/zip", "state": "uploaded", "size": 50310671, "download_count": 186, "created_at": "2016-06-06T22:14:56Z", "updated_at": "2016-06-06T22:15:11Z", "browser_download_url": "https://github.com/atom/atom/releases/download/v1.8.0/atom-1.8.0-delta.nupkg" }, { "url": "https://api.github.com/repos/atom/atom/releases/assets/1803743", "id": 1803743, "name": "atom-1.8.0-full.nupkg", "label": "", "uploader": { "login": "mhubot", "id": 3697332, "avatar_url": "https://avatars.githubusercontent.com/u/3697332?v=3", "gravatar_id": "", "url": "https://api.github.com/users/mhubot", "html_url": "https://github.com/mhubot", "followers_url": "https://api.github.com/users/mhubot/followers", "following_url": "https://api.github.com/users/mhubot/following{/other_user}", "gists_url": "https://api.github.com/users/mhubot/gists{/gist_id}", "starred_url": "https://api.github.com/users/mhubot/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/mhubot/subscriptions", "organizations_url": "https://api.github.com/users/mhubot/orgs", "repos_url": "https://api.github.com/users/mhubot/repos", "events_url": "https://api.github.com/users/mhubot/events{/privacy}", "received_events_url": "https://api.github.com/users/mhubot/received_events", "type": "User", "site_admin": false }, "content_type": "application/zip", "state": "uploaded", "size": 111525622, "download_count": 615, "created_at": "2016-06-06T22:14:56Z", "updated_at": "2016-06-06T22:15:16Z", "browser_download_url": "https://github.com/atom/atom/releases/download/v1.8.0/atom-1.8.0-full.nupkg" }, { "url": "https://api.github.com/repos/atom/atom/releases/assets/1803494", "id": 1803494, "name": "atom-amd64.deb", "label": "", "uploader": { "login": "mhubot", "id": 3697332, "avatar_url": "https://avatars.githubusercontent.com/u/3697332?v=3", "gravatar_id": "", "url": "https://api.github.com/users/mhubot", "html_url": "https://github.com/mhubot", "followers_url": "https://api.github.com/users/mhubot/followers", "following_url": "https://api.github.com/users/mhubot/following{/other_user}", "gists_url": "https://api.github.com/users/mhubot/gists{/gist_id}", "starred_url": "https://api.github.com/users/mhubot/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/mhubot/subscriptions", "organizations_url": "https://api.github.com/users/mhubot/orgs", "repos_url": "https://api.github.com/users/mhubot/repos", "events_url": "https://api.github.com/users/mhubot/events{/privacy}", "received_events_url": "https://api.github.com/users/mhubot/received_events", "type": "User", "site_admin": false }, "content_type": "application/zip", "state": "uploaded", "size": 79083138, "download_count": 9785, "created_at": "2016-06-06T21:37:42Z", "updated_at": "2016-06-06T21:37:49Z", "browser_download_url": "https://github.com/atom/atom/releases/download/v1.8.0/atom-amd64.deb" }, { "url": "https://api.github.com/repos/atom/atom/releases/assets/1803495", "id": 1803495, "name": "atom-amd64.tar.gz", "label": "", "uploader": { "login": "mhubot", "id": 3697332, "avatar_url": "https://avatars.githubusercontent.com/u/3697332?v=3", "gravatar_id": "", "url": "https://api.github.com/users/mhubot", "html_url": "https://github.com/mhubot", "followers_url": "https://api.github.com/users/mhubot/followers", "following_url": "https://api.github.com/users/mhubot/following{/other_user}", "gists_url": "https://api.github.com/users/mhubot/gists{/gist_id}", "starred_url": "https://api.github.com/users/mhubot/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/mhubot/subscriptions", "organizations_url": "https://api.github.com/users/mhubot/orgs", "repos_url": "https://api.github.com/users/mhubot/repos", "events_url": "https://api.github.com/users/mhubot/events{/privacy}", "received_events_url": "https://api.github.com/users/mhubot/received_events", "type": "User", "site_admin": false }, "content_type": "application/zip", "state": "uploaded", "size": 79659902, "download_count": 1678, "created_at": "2016-06-06T21:37:42Z", "updated_at": "2016-06-06T21:37:50Z", "browser_download_url": "https://github.com/atom/atom/releases/download/mock/atom-amd64.tar.gz" }, { "url": "https://api.github.com/repos/atom/atom/releases/assets/1803625", "id": 1803625, "name": "atom-api.json", "label": "", "uploader": { "login": "mhubot", "id": 3697332, "avatar_url": "https://avatars.githubusercontent.com/u/3697332?v=3", "gravatar_id": "", "url": "https://api.github.com/users/mhubot", "html_url": "https://github.com/mhubot", "followers_url": "https://api.github.com/users/mhubot/followers", "following_url": "https://api.github.com/users/mhubot/following{/other_user}", "gists_url": "https://api.github.com/users/mhubot/gists{/gist_id}", "starred_url": "https://api.github.com/users/mhubot/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/mhubot/subscriptions", "organizations_url": "https://api.github.com/users/mhubot/orgs", "repos_url": "https://api.github.com/users/mhubot/repos", "events_url": "https://api.github.com/users/mhubot/events{/privacy}", "received_events_url": "https://api.github.com/users/mhubot/received_events", "type": "User", "site_admin": false }, "content_type": "application/zip", "state": "uploaded", "size": 862495, "download_count": 163, "created_at": "2016-06-06T21:57:27Z", "updated_at": "2016-06-06T21:57:28Z", "browser_download_url": "https://github.com/atom/atom/releases/download/v1.8.0/atom-api.json" }, { "url": "https://api.github.com/repos/atom/atom/releases/assets/1803627", "id": 1803627, "name": "atom-mac-symbols.zip", "label": "", "uploader": { "login": "mhubot", "id": 3697332, "avatar_url": "https://avatars.githubusercontent.com/u/3697332?v=3", "gravatar_id": "", "url": "https://api.github.com/users/mhubot", "html_url": "https://github.com/mhubot", "followers_url": "https://api.github.com/users/mhubot/followers", "following_url": "https://api.github.com/users/mhubot/following{/other_user}", "gists_url": "https://api.github.com/users/mhubot/gists{/gist_id}", "starred_url": "https://api.github.com/users/mhubot/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/mhubot/subscriptions", "organizations_url": "https://api.github.com/users/mhubot/orgs", "repos_url": "https://api.github.com/users/mhubot/repos", "events_url": "https://api.github.com/users/mhubot/events{/privacy}", "received_events_url": "https://api.github.com/users/mhubot/received_events", "type": "User", "site_admin": false }, "content_type": "application/zip", "state": "uploaded", "size": 293053, "download_count": 134, "created_at": "2016-06-06T21:57:27Z", "updated_at": "2016-06-06T21:57:28Z", "browser_download_url": "https://github.com/atom/atom/releases/download/v1.8.0/atom-mac-symbols.zip" }, { "url": "https://api.github.com/repos/atom/atom/releases/assets/1803626", "id": 1803626, "name": "atom-mac.zip", "label": "", "uploader": { "login": "mhubot", "id": 3697332, "avatar_url": "https://avatars.githubusercontent.com/u/3697332?v=3", "gravatar_id": "", "url": "https://api.github.com/users/mhubot", "html_url": "https://github.com/mhubot", "followers_url": "https://api.github.com/users/mhubot/followers", "following_url": "https://api.github.com/users/mhubot/following{/other_user}", "gists_url": "https://api.github.com/users/mhubot/gists{/gist_id}", "starred_url": "https://api.github.com/users/mhubot/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/mhubot/subscriptions", "organizations_url": "https://api.github.com/users/mhubot/orgs", "repos_url": "https://api.github.com/users/mhubot/repos", "events_url": "https://api.github.com/users/mhubot/events{/privacy}", "received_events_url": "https://api.github.com/users/mhubot/received_events", "type": "User", "site_admin": false }, "content_type": "application/zip", "state": "uploaded", "size": 87042184, "download_count": 15179, "created_at": "2016-06-06T21:57:27Z", "updated_at": "2016-06-06T21:57:32Z", "browser_download_url": "https://github.com/atom/atom/releases/download/v1.8.0/atom-mac.zip" }, { "url": "https://api.github.com/repos/atom/atom/releases/assets/1803745", "id": 1803745, "name": "atom-windows.zip", "label": "", "uploader": { "login": "mhubot", "id": 3697332, "avatar_url": "https://avatars.githubusercontent.com/u/3697332?v=3", "gravatar_id": "", "url": "https://api.github.com/users/mhubot", "html_url": "https://github.com/mhubot", "followers_url": "https://api.github.com/users/mhubot/followers", "following_url": "https://api.github.com/users/mhubot/following{/other_user}", "gists_url": "https://api.github.com/users/mhubot/gists{/gist_id}", "starred_url": "https://api.github.com/users/mhubot/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/mhubot/subscriptions", "organizations_url": "https://api.github.com/users/mhubot/orgs", "repos_url": "https://api.github.com/users/mhubot/repos", "events_url": "https://api.github.com/users/mhubot/events{/privacy}", "received_events_url": "https://api.github.com/users/mhubot/received_events", "type": "User", "site_admin": false }, "content_type": "application/zip", "state": "uploaded", "size": 109372322, "download_count": 11659, "created_at": "2016-06-06T22:14:56Z", "updated_at": "2016-06-06T22:15:16Z", "browser_download_url": "https://github.com/atom/atom/releases/download/v1.8.0/atom-windows.zip" }, { "url": "https://api.github.com/repos/atom/atom/releases/assets/1803533", "id": 1803533, "name": "atom.x86_64.rpm", "label": "", "uploader": { "login": "mhubot", "id": 3697332, "avatar_url": "https://avatars.githubusercontent.com/u/3697332?v=3", "gravatar_id": "", "url": "https://api.github.com/users/mhubot", "html_url": "https://github.com/mhubot", "followers_url": "https://api.github.com/users/mhubot/followers", "following_url": "https://api.github.com/users/mhubot/following{/other_user}", "gists_url": "https://api.github.com/users/mhubot/gists{/gist_id}", "starred_url": "https://api.github.com/users/mhubot/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/mhubot/subscriptions", "organizations_url": "https://api.github.com/users/mhubot/orgs", "repos_url": "https://api.github.com/users/mhubot/repos", "events_url": "https://api.github.com/users/mhubot/events{/privacy}", "received_events_url": "https://api.github.com/users/mhubot/received_events", "type": "User", "site_admin": false }, "content_type": "application/zip", "state": "uploaded", "size": 64364944, "download_count": 2830, "created_at": "2016-06-06T21:42:42Z", "updated_at": "2016-06-06T21:42:46Z", "browser_download_url": "https://github.com/atom/atom/releases/download/v1.8.0/atom.x86_64.rpm" }, { "url": "https://api.github.com/repos/atom/atom/releases/assets/1803769", "id": 1803769, "name": "AtomSetup.exe", "label": null, "uploader": { "login": "BinaryMuse", "id": 189606, "avatar_url": "https://avatars.githubusercontent.com/u/189606?v=3", "gravatar_id": "", "url": "https://api.github.com/users/BinaryMuse", "html_url": "https://github.com/BinaryMuse", "followers_url": "https://api.github.com/users/BinaryMuse/followers", "following_url": "https://api.github.com/users/BinaryMuse/following{/other_user}", "gists_url": "https://api.github.com/users/BinaryMuse/gists{/gist_id}", "starred_url": "https://api.github.com/users/BinaryMuse/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/BinaryMuse/subscriptions", "organizations_url": "https://api.github.com/users/BinaryMuse/orgs", "repos_url": "https://api.github.com/users/BinaryMuse/repos", "events_url": "https://api.github.com/users/BinaryMuse/events{/privacy}", "received_events_url": "https://api.github.com/users/BinaryMuse/received_events", "type": "User", "site_admin": true }, "content_type": "application/x-msdownload", "state": "uploaded", "size": 109668104, "download_count": 9448, "created_at": "2016-06-06T22:18:52Z", "updated_at": "2016-06-06T22:19:54Z", "browser_download_url": "https://github.com/atom/atom/releases/download/v1.8.0/AtomSetup.exe" }, { "url": "https://api.github.com/repos/atom/atom/releases/assets/1803768", "id": 1803768, "name": "AtomSetup.msi", "label": null, "uploader": { "login": "BinaryMuse", "id": 189606, "avatar_url": "https://avatars.githubusercontent.com/u/189606?v=3", "gravatar_id": "", "url": "https://api.github.com/users/BinaryMuse", "html_url": "https://github.com/BinaryMuse", "followers_url": "https://api.github.com/users/BinaryMuse/followers", "following_url": "https://api.github.com/users/BinaryMuse/following{/other_user}", "gists_url": "https://api.github.com/users/BinaryMuse/gists{/gist_id}", "starred_url": "https://api.github.com/users/BinaryMuse/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/BinaryMuse/subscriptions", "organizations_url": "https://api.github.com/users/BinaryMuse/orgs", "repos_url": "https://api.github.com/users/BinaryMuse/repos", "events_url": "https://api.github.com/users/BinaryMuse/events{/privacy}", "received_events_url": "https://api.github.com/users/BinaryMuse/received_events", "type": "User", "site_admin": true }, "content_type": "application/octet-stream", "state": "uploaded", "size": 109498368, "download_count": 2895, "created_at": "2016-06-06T22:18:52Z", "updated_at": "2016-06-06T22:19:54Z", "browser_download_url": "https://github.com/atom/atom/releases/download/v1.8.0/AtomSetup.msi" }, { "url": "https://api.github.com/repos/atom/atom/releases/assets/1803742", "id": 1803742, "name": "RELEASES", "label": "", "uploader": { "login": "mhubot", "id": 3697332, "avatar_url": "https://avatars.githubusercontent.com/u/3697332?v=3", "gravatar_id": "", "url": "https://api.github.com/users/mhubot", "html_url": "https://github.com/mhubot", "followers_url": "https://api.github.com/users/mhubot/followers", "following_url": "https://api.github.com/users/mhubot/following{/other_user}", "gists_url": "https://api.github.com/users/mhubot/gists{/gist_id}", "starred_url": "https://api.github.com/users/mhubot/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/mhubot/subscriptions", "organizations_url": "https://api.github.com/users/mhubot/orgs", "repos_url": "https://api.github.com/users/mhubot/repos", "events_url": "https://api.github.com/users/mhubot/events{/privacy}", "received_events_url": "https://api.github.com/users/mhubot/received_events", "type": "User", "site_admin": false }, "content_type": "application/zip", "state": "uploaded", "size": 11935, "download_count": 700, "created_at": "2016-06-06T22:14:56Z", "updated_at": "2016-06-06T22:14:56Z", "browser_download_url": "https://github.com/atom/atom/releases/download/v1.8.0/RELEASES" } ], "tarball_url": "https://api.github.com/repos/atom/atom/tarball/v1.8.0", "zipball_url": "https://api.github.com/repos/atom/atom/zipball/v1.8.0", "body": "### Notable Changes\r\n\r\n* Better environment handling\r\n* Shortcut for moving text left/right\r\n* `core.restorePreviousWindowsOnStart` setting\r\n\r\n### [Atom Core](https://github.com/atom/atom)\r\n\r\n* [atom/atom#11188 - Bump status-bar](https://github.com/atom/atom/pull/11188)\r\n* [atom/atom#11194 - Fix typo: destory -> destroy](https://github.com/atom/atom/pull/11194)\r\n* [atom/atom#11201 - Remove an unnecessary call to then().](https://github.com/atom/atom/pull/11201)\r\n* [atom/atom#11240 - More accurate block decoration measurements](https://github.com/atom/atom/pull/11240)\r\n* [atom/atom#10862 - Fix for Default Directory Provider incorrectly identifying file paths as URLs on Windows](https://github.com/atom/atom/pull/10862)\r\n* [atom/atom#11265 - fix link in ISSUE_TEMPLATE](https://github.com/atom/atom/pull/11265)\r\n* [atom/atom#11271 - Fix typo in error message.](https://github.com/atom/atom/pull/11271)\r\n* [atom/atom#11280 - Remove GitRepository git status](https://github.com/atom/atom/pull/11280)\r\n* [atom/atom#11251 - Fallback to ~/.atom/storage when no state is found in IndexedDb](https://github.com/atom/atom/pull/11251)\r\n* [atom/atom#11277 - Less disk IO](https://github.com/atom/atom/pull/11277)\r\n* [atom/atom#11296 - Improve build on Windows](https://github.com/atom/atom/pull/11296)\r\n* [atom/atom#11286 - Correctly (un)subscribe to model events on PaneAxisElement attach/detach](https://github.com/atom/atom/pull/11286)\r\n* [atom/atom#11295 - Take the submodule into account in more instances.](https://github.com/atom/atom/pull/11295)\r\n* [atom/atom#11306 - Warn rather than failing if we detect leaked pathwatcher subscriptions](https://github.com/atom/atom/pull/11306)\r\n* [atom/atom#11312 - https link to nodejs.org and visualstudio.com](https://github.com/atom/atom/pull/11312)\r\n* [atom/atom#11311 - https link to nodejs.org](https://github.com/atom/atom/pull/11311)\r\n* [atom/atom#11315 - Serialize async git](https://github.com/atom/atom/pull/11315)\r\n* [atom/atom#11320 - Update nodegit](https://github.com/atom/atom/pull/11320)\r\n* [atom/atom#6631 - Add commands to move selections left and right by one column](https://github.com/atom/atom/pull/6631)\r\n* [atom/atom#11324 - Add restorePreviousWindowsOnStart setting](https://github.com/atom/atom/pull/11324)\r\n* [atom/atom#11329 - Fix potential null reference callback invokation in script/clean](https://github.com/atom/atom/pull/11329)\r\n* [atom/atom#11325 - Fix emoji rendering on OSX](https://github.com/atom/atom/pull/11325)\r\n* [atom/atom#11316 - Add request for OS and version to Issue Template](https://github.com/atom/atom/pull/11316)\r\n* [atom/atom#11314 - Handle auto-updater errors](https://github.com/atom/atom/pull/11314)\r\n* [atom/atom#11341 - Use application-level events to control updates in the browser process](https://github.com/atom/atom/pull/11341)\r\n* [atom/atom#11339 - HTTPS a couple of links](https://github.com/atom/atom/pull/11339)\r\n* [atom/atom#11345 - Disable zoom every time a display gets added or removed](https://github.com/atom/atom/pull/11345)\r\n* [atom/atom#11351 - :arrow_up: language-perl@0.33.0](https://github.com/atom/atom/pull/11351)\r\n* [atom/atom#11246 - Improve the Windows build process](https://github.com/atom/atom/pull/11246)\r\n* [atom/atom#11369 - :racehorse: Avoid setting hidden input value on textInput](https://github.com/atom/atom/pull/11369)\r\n* [atom/atom#9554 - Add a linux archive to distribute atom](https://github.com/atom/atom/pull/9554)\r\n* [atom/atom#11398 - Fix build lint](https://github.com/atom/atom/pull/11398)\r\n* [atom/atom#11397 - Defer the callback to the next tick.](https://github.com/atom/atom/pull/11397)\r\n* [atom/atom#11403 - Fix dead atom.io/docs links in CONTRIBUTING.md](https://github.com/atom/atom/pull/11403)\r\n* [atom/atom#11410 - Use #index instead of #openIndex.](https://github.com/atom/atom/pull/11410)\r\n* [atom/atom#11418 - :memo: Add the --no-install flag to the windows build readme](https://github.com/atom/atom/pull/11418)\r\n* [atom/atom#11419 - :memo: Fix linking the decorateMarker](https://github.com/atom/atom/pull/11419)\r\n* [atom/atom#11426 - Bump nodegit](https://github.com/atom/atom/pull/11426)\r\n* [atom/atom#11412 - Signing support on Windows with P12 keys](https://github.com/atom/atom/pull/11412)\r\n* [atom/atom#11412 - Signing support on Windows with P12 keys](https://github.com/atom/atom/pull/11412)\r\n* [atom/atom#11427 - Code sign on AppVeyor](https://github.com/atom/atom/pull/11427)\r\n* [atom/atom#11436 - Allow A Window's Environment To Reflect The Most Recent atom Invocation](https://github.com/atom/atom/pull/11436)\r\n* [atom/atom#11437 - Ignore autorun on our buffered process commands. Fixes #10082](https://github.com/atom/atom/pull/11437)\r\n* [atom/atom#11438 - Don't load packages starting with a dot](https://github.com/atom/atom/pull/11438)\r\n* [atom/atom#11475 - Add ELECTRON_NO_ATTACH_CONSOLE in BufferedNodeProcess](https://github.com/atom/atom/pull/11475)\r\n* [atom/atom#11498 - Copy active item when splitting from TextEditor context menu](https://github.com/atom/atom/pull/11498)\r\n* [atom/atom#11494 - Correctly autoindent single newline in Selection#insertText](https://github.com/atom/atom/pull/11494)\r\n* [atom/atom#11463 - Fixes #11190](https://github.com/atom/atom/pull/11463)\r\n* [atom/atom#11734 - Attach msi to release on github.com](https://github.com/atom/atom/pull/11734)\r\n* [atom/atom#11552 - Content Security Policy fixes](https://github.com/atom/atom/pull/11552)\r\n\r\n### [one-dark-ui](https://github.com/atom/one-dark-ui)\r\n\r\nv1.2.0...v1.3.1\r\n\r\n* [atom/one-dark-ui#123 - Shrink modals when window gets narrow](https://github.com/atom/one-dark-ui/pull/123)\r\n* [atom/one-dark-ui#124 - Use auto-size for tabs in compact mode](https://github.com/atom/one-dark-ui/pull/124)\r\n* [atom/one-dark-ui#128 - Add tree-view bottom border](https://github.com/atom/one-dark-ui/pull/128)\r\n* [atom/one-dark-ui#131 - Add config for tab sizing](https://github.com/atom/one-dark-ui/pull/131)\r\n\r\n### [one-light-ui](https://github.com/atom/one-light-ui)\r\n\r\nv1.2.0...v1.3.1\r\n\r\n* [atom/one-light-ui#56 - Remove top border](https://github.com/atom/one-light-ui/pull/56)\r\n* [atom/one-light-ui#51 - Shrink modals when window gets narrow](https://github.com/atom/one-light-ui/pull/51)\r\n* [atom/one-light-ui#57 - Add tree-view bottom border](https://github.com/atom/one-light-ui/pull/57)\r\n* [atom/one-light-ui#58 - Add config for tab sizing](https://github.com/atom/one-light-ui/pull/58)\r\n\r\n### [solarized-dark-syntax](https://github.com/atom/solarized-dark-syntax)\r\n\r\nv1.0.0...v1.0.2\r\n\r\n* [atom/solarized-dark-syntax#63 - Rename c++ to cpp](https://github.com/atom/solarized-dark-syntax/pull/63)\r\n* [atom/solarized-dark-syntax#61 - Fix missing keywords in ruby](https://github.com/atom/solarized-dark-syntax/pull/61)\r\n\r\n### [solarized-light-syntax](https://github.com/atom/solarized-light-syntax)\r\n\r\nv1.0.0...v1.0.2\r\n\r\n* [atom/solarized-light-syntax#22 - Fix missing keywords in ruby](https://github.com/atom/solarized-light-syntax/pull/22)\r\n\r\n### [about](https://github.com/atom/about)\r\n\r\nv1.4.2...v1.5.0\r\n\r\n* [atom/about#20 - Handle update errors](https://github.com/atom/about/pull/20)\r\n\r\n### [autocomplete-css](https://github.com/atom/autocomplete-css)\r\n\r\nv0.11.0...v0.11.1\r\n\r\n* [atom/autocomplete-css#48 - Added currentColor & transparent color keywords](https://github.com/atom/autocomplete-css/pull/48)\r\n\r\n### [autocomplete-plus](https://github.com/atom/autocomplete-plus)\r\n\r\nv2.29.1...v2.29.2\r\n\r\n* [atom/autocomplete-plus#702 - Avoid deprecations introduced in atom/ns-use-display-layers branch](https://github.com/atom/autocomplete-plus/pull/702)\r\n\r\n### [bookmarks](https://github.com/atom/bookmarks)\r\n\r\nv0.38.2...v0.39.0\r\n\r\n* [atom/bookmarks#47 - Implement ranged single- and multi-line bookmarks](https://github.com/atom/bookmarks/pull/47)\r\n* [atom/bookmarks#52 - Use TextEditor APIs instead of private, deprecated displayBuffer field](https://github.com/atom/bookmarks/pull/52)\r\n* [atom/bookmarks#53 - Use MarkerLayers and refactor package](https://github.com/atom/bookmarks/pull/53)\r\n\r\n### [bracket-matcher](https://github.com/atom/bracket-matcher)\r\n\r\nv0.81.0...v0.82.0\r\n\r\n* [atom/bracket-matcher#223 - Allow scoped settings](https://github.com/atom/bracket-matcher/pull/223)\r\n\r\n### [exception-reporting](https://github.com/atom/exception-reporting)\r\n\r\nv0.37.0...v0.38.0\r\n\r\n* [atom/exception-reporting#17 - Set notifier version to version of bugsnag-atom](https://github.com/atom/exception-reporting/pull/17)\r\n\r\n### [incompatible-packages](https://github.com/atom/incompatible-packages)\r\n\r\nv0.25.1...v0.26.1\r\n\r\n* [atom/incompatible-packages#14 - Try to find the status-bar in the footer first.](https://github.com/atom/incompatible-packages/pull/14)\r\n* [atom/incompatible-packages#15 - Fix specs again](https://github.com/atom/incompatible-packages/pull/15)\r\n\r\n### [line-ending-selector](https://github.com/atom/line-ending-selector)\r\n\r\nv0.3.1...v0.4.1\r\n\r\n* [atom/line-ending-selector#25 - Try to find the status-bar in the footer first.](https://github.com/atom/line-ending-selector/pull/25)\r\n* [atom/line-ending-selector#26 - Fix specs again](https://github.com/atom/line-ending-selector/pull/26)\r\n\r\n### [snippets](https://github.com/atom/snippets)\r\n\r\nv1.0.1...v1.0.2\r\n\r\n* [atom/snippets#194 - Added more formatting options for snippets](https://github.com/atom/snippets/pull/194)\r\n\r\n### [spell-check](https://github.com/atom/spell-check)\r\n\r\nv0.67.0...v0.67.1\r\n\r\n* [atom/spell-check#122 - Add marker layers on TextEditor and stop using marker custom properties](https://github.com/atom/spell-check/pull/122)\r\n\r\n### [status-bar](https://github.com/atom/status-bar)\r\n\r\nv1.1.2...v1.2.3\r\n\r\n* [atom/status-bar#133 - Move to the footer](https://github.com/atom/status-bar/pull/133)\r\n* [atom/status-bar#134 - Use public release for CI](https://github.com/atom/status-bar/pull/134)\r\n* [atom/status-bar#138 - :racehorse: Defer updatePosition](https://github.com/atom/status-bar/pull/138)\r\n* [atom/status-bar#139 - Don't log errors caused by the repo being destroyed.](https://github.com/atom/status-bar/pull/139)\r\n* [atom/status-bar#140 - Track disposable for updatePosition](https://github.com/atom/status-bar/pull/140)\r\n* [atom/status-bar#141 - Fix spec races](https://github.com/atom/status-bar/pull/141)\r\n\r\n### [language-c](https://github.com/atom/language-c)\r\n\r\nv0.51.1...v0.51.3\r\n\r\n* [atom/language-c#128 - Add `decltype` to `storage.type.cpp`](https://github.com/atom/language-c/pull/128)\r\n* [atom/language-c#131 - Add `noexcept` to the list of storage modifiers](https://github.com/atom/language-c/pull/131)\r\n\r\n### [language-csharp](https://github.com/atom/language-csharp)\r\n\r\nv0.12.0...v0.12.1\r\n\r\n* [atom/language-csharp#59 - Add `dynamic` as a C# 4 keyword](https://github.com/atom/language-csharp/pull/59)\r\n* [atom/language-csharp#60 - Add `alias` and `global` as keywords](https://github.com/atom/language-csharp/pull/60)\r\n\r\n### [language-css](https://github.com/atom/language-css)\r\n\r\nv0.36.0...v0.36.1\r\n\r\n* [atom/language-css#54 - Added @keyframes & @supports snippet. Alphabetized](https://github.com/atom/language-css/pull/54)\r\n\r\n### [language-json](https://github.com/atom/language-json)\r\n\r\nv0.17.6...v0.18.0\r\n\r\n* [atom/language-json#45 - Mark trailing commas as syntax errors](https://github.com/atom/language-json/pull/45)\r\n\r\n### [language-less](https://github.com/atom/language-less)\r\n\r\nv0.29.0...v0.29.3\r\n\r\n* [atom/language-less#49 - Parse non-quoted relative urls](https://github.com/atom/language-less/pull/49)\r\n* [atom/language-less#53 - Add missing HTML elements](https://github.com/atom/language-less/pull/53)\r\n* [atom/language-less#55 - Fix not parsing ::shadow correctly](https://github.com/atom/language-less/pull/55)\r\n\r\n### [language-make](https://github.com/atom/language-make)\r\n\r\nv0.21.0...v0.21.1\r\n\r\n* [atom/language-make#30 - tests for comments and each function](https://github.com/atom/language-make/pull/30)\r\n* [atom/language-make#37 - Add \"mkfile\" to recognised file extensions](https://github.com/atom/language-make/pull/37)\r\n\r\n### [language-perl](https://github.com/atom/language-perl)\r\n\r\nv0.32.0...v0.34.0\r\n\r\n* [atom/language-perl#65 - Added \"n\" regex modifer (new in perl 5.22)](https://github.com/atom/language-perl/pull/65)\r\n\r\n### [language-python](https://github.com/atom/language-python)\r\n\r\nv0.43.0...v0.43.1\r\n\r\n* [atom/language-python#136 - Give self and cls the class 'variable.language.self.python'.](https://github.com/atom/language-python/pull/136)\r\n\r\n### [language-ruby](https://github.com/atom/language-ruby)\r\n\r\nv0.68.3...v0.68.5\r\n\r\n* [atom/language-ruby#141 - Add Dangerfile fileType](https://github.com/atom/language-ruby/pull/141)\r\n* [atom/language-ruby#145 - Add Brewfile to fileTypes](https://github.com/atom/language-ruby/pull/145)\r\n\r\n### [language-shellscript](https://github.com/atom/language-shellscript)\r\n\r\nv0.21.0...v0.21.1\r\n\r\n* [atom/language-shellscript#38 - Bats file support](https://github.com/atom/language-shellscript/pull/38)\r\n\r\n### [language-yaml](https://github.com/atom/language-yaml)\r\n\r\nv0.25.1...v0.25.2\r\n\r\n* [atom/language-yaml#42 - Add .clang-format as YAML file](https://github.com/atom/language-yaml/pull/42)\r\n" } ubuntu-make-18.09+disco1/tests/data/server-content/api.github.com/repos/DBeaver/0000755000000000000000000000000013352651520024336 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/api.github.com/repos/DBeaver/DBeaver/0000755000000000000000000000000013352651520025646 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/api.github.com/repos/DBeaver/DBeaver/releases/0000755000000000000000000000000013352651520027451 5ustar ././@LongLink0000644000000000000000000000015000000000000007767 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/api.github.com/repos/DBeaver/DBeaver/releases/latestubuntu-make-18.09+disco1/tests/data/server-content/api.github.com/repos/DBeaver/DBeaver/releases/lat0000644000000000000000000005772613352651520030175 0ustar { "url": "https://api.github.com/repos/dbeaver/dbeaver/releases/10978087", "assets_url": "https://api.github.com/repos/dbeaver/dbeaver/releases/10978087/assets", "upload_url": "https://uploads.github.com/repos/dbeaver/dbeaver/releases/10978087/assets{?name,label}", "html_url": "https://github.com/dbeaver/dbeaver/releases/tag/5.0.5", "id": 10978087, "tag_name": "5.0.5", "target_commitish": "devel", "name": "5.0.5", "draft": false, "author": { "login": "serge-rider", "id": 6398845, "avatar_url": "https://avatars0.githubusercontent.com/u/6398845?v=4", "gravatar_id": "", "url": "https://api.github.com/users/serge-rider", "html_url": "https://github.com/serge-rider", "followers_url": "https://api.github.com/users/serge-rider/followers", "following_url": "https://api.github.com/users/serge-rider/following{/other_user}", "gists_url": "https://api.github.com/users/serge-rider/gists{/gist_id}", "starred_url": "https://api.github.com/users/serge-rider/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/serge-rider/subscriptions", "organizations_url": "https://api.github.com/users/serge-rider/orgs", "repos_url": "https://api.github.com/users/serge-rider/repos", "events_url": "https://api.github.com/users/serge-rider/events{/privacy}", "received_events_url": "https://api.github.com/users/serge-rider/received_events", "type": "User", "site_admin": false }, "prerelease": false, "created_at": "2018-05-13T21:10:33Z", "published_at": "2018-05-13T21:58:37Z", "assets": [ { "url": "https://api.github.com/repos/dbeaver/dbeaver/releases/assets/7159808", "id": 7159808, "name": "dbeaver-ce-5.0.5-installer.pkg", "label": "", "uploader": { "login": "serge-rider", "id": 6398845, "avatar_url": "https://avatars0.githubusercontent.com/u/6398845?v=4", "gravatar_id": "", "url": "https://api.github.com/users/serge-rider", "html_url": "https://github.com/serge-rider", "followers_url": "https://api.github.com/users/serge-rider/followers", "following_url": "https://api.github.com/users/serge-rider/following{/other_user}", "gists_url": "https://api.github.com/users/serge-rider/gists{/gist_id}", "starred_url": "https://api.github.com/users/serge-rider/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/serge-rider/subscriptions", "organizations_url": "https://api.github.com/users/serge-rider/orgs", "repos_url": "https://api.github.com/users/serge-rider/repos", "events_url": "https://api.github.com/users/serge-rider/events{/privacy}", "received_events_url": "https://api.github.com/users/serge-rider/received_events", "type": "User", "site_admin": false }, "content_type": "application/octet-stream", "state": "uploaded", "size": 46721511, "download_count": 67, "created_at": "2018-05-13T21:59:03Z", "updated_at": "2018-05-13T21:59:05Z", "browser_download_url": "https://github.com/dbeaver/dbeaver/releases/download/5.0.5/dbeaver-ce-5.0.5-installer.pkg" }, { "url": "https://api.github.com/repos/dbeaver/dbeaver/releases/assets/7159814", "id": 7159814, "name": "dbeaver-ce-mock-linux.gtk.x86.tar.gz", "label": "", "uploader": { "login": "serge-rider", "id": 6398845, "avatar_url": "https://avatars0.githubusercontent.com/u/6398845?v=4", "gravatar_id": "", "url": "https://api.github.com/users/serge-rider", "html_url": "https://github.com/serge-rider", "followers_url": "https://api.github.com/users/serge-rider/followers", "following_url": "https://api.github.com/users/serge-rider/following{/other_user}", "gists_url": "https://api.github.com/users/serge-rider/gists{/gist_id}", "starred_url": "https://api.github.com/users/serge-rider/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/serge-rider/subscriptions", "organizations_url": "https://api.github.com/users/serge-rider/orgs", "repos_url": "https://api.github.com/users/serge-rider/repos", "events_url": "https://api.github.com/users/serge-rider/events{/privacy}", "received_events_url": "https://api.github.com/users/serge-rider/received_events", "type": "User", "site_admin": false }, "content_type": "application/x-gzip", "state": "uploaded", "size": 54138150, "download_count": 13, "created_at": "2018-05-13T21:59:14Z", "updated_at": "2018-05-13T21:59:17Z", "browser_download_url": "https://github.com/dbeaver/dbeaver/releases/download/mock/dbeaver-ce-mock-linux.gtk.x86.tar.gz" }, { "url": "https://api.github.com/repos/dbeaver/dbeaver/releases/assets/7159804", "id": 7159804, "name": "dbeaver-ce-mock-linux.gtk.x86_64.tar.gz", "label": "", "uploader": { "login": "serge-rider", "id": 6398845, "avatar_url": "https://avatars0.githubusercontent.com/u/6398845?v=4", "gravatar_id": "", "url": "https://api.github.com/users/serge-rider", "html_url": "https://github.com/serge-rider", "followers_url": "https://api.github.com/users/serge-rider/followers", "following_url": "https://api.github.com/users/serge-rider/following{/other_user}", "gists_url": "https://api.github.com/users/serge-rider/gists{/gist_id}", "starred_url": "https://api.github.com/users/serge-rider/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/serge-rider/subscriptions", "organizations_url": "https://api.github.com/users/serge-rider/orgs", "repos_url": "https://api.github.com/users/serge-rider/repos", "events_url": "https://api.github.com/users/serge-rider/events{/privacy}", "received_events_url": "https://api.github.com/users/serge-rider/received_events", "type": "User", "site_admin": false }, "content_type": "application/x-gzip", "state": "uploaded", "size": 54250407, "download_count": 51, "created_at": "2018-05-13T21:58:50Z", "updated_at": "2018-05-13T21:58:54Z", "browser_download_url": "https://github.com/dbeaver/dbeaver/releases/download/mock/dbeaver-ce-mock-linux.gtk.x86_64.tar.gz" }, { "url": "https://api.github.com/repos/dbeaver/dbeaver/releases/assets/7159806", "id": 7159806, "name": "dbeaver-ce-5.0.5-macos.dmg", "label": "", "uploader": { "login": "serge-rider", "id": 6398845, "avatar_url": "https://avatars0.githubusercontent.com/u/6398845?v=4", "gravatar_id": "", "url": "https://api.github.com/users/serge-rider", "html_url": "https://github.com/serge-rider", "followers_url": "https://api.github.com/users/serge-rider/followers", "following_url": "https://api.github.com/users/serge-rider/following{/other_user}", "gists_url": "https://api.github.com/users/serge-rider/gists{/gist_id}", "starred_url": "https://api.github.com/users/serge-rider/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/serge-rider/subscriptions", "organizations_url": "https://api.github.com/users/serge-rider/orgs", "repos_url": "https://api.github.com/users/serge-rider/repos", "events_url": "https://api.github.com/users/serge-rider/events{/privacy}", "received_events_url": "https://api.github.com/users/serge-rider/received_events", "type": "User", "site_admin": false }, "content_type": "application/x-apple-diskimage", "state": "uploaded", "size": 54462526, "download_count": 1331, "created_at": "2018-05-13T21:58:57Z", "updated_at": "2018-05-13T21:58:59Z", "browser_download_url": "https://github.com/dbeaver/dbeaver/releases/download/5.0.5/dbeaver-ce-5.0.5-macos.dmg" }, { "url": "https://api.github.com/repos/dbeaver/dbeaver/releases/assets/7159807", "id": 7159807, "name": "dbeaver-ce-5.0.5-macosx.cocoa.x86_64.tar.gz", "label": "", "uploader": { "login": "serge-rider", "id": 6398845, "avatar_url": "https://avatars0.githubusercontent.com/u/6398845?v=4", "gravatar_id": "", "url": "https://api.github.com/users/serge-rider", "html_url": "https://github.com/serge-rider", "followers_url": "https://api.github.com/users/serge-rider/followers", "following_url": "https://api.github.com/users/serge-rider/following{/other_user}", "gists_url": "https://api.github.com/users/serge-rider/gists{/gist_id}", "starred_url": "https://api.github.com/users/serge-rider/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/serge-rider/subscriptions", "organizations_url": "https://api.github.com/users/serge-rider/orgs", "repos_url": "https://api.github.com/users/serge-rider/repos", "events_url": "https://api.github.com/users/serge-rider/events{/privacy}", "received_events_url": "https://api.github.com/users/serge-rider/received_events", "type": "User", "site_admin": false }, "content_type": "application/x-gzip", "state": "uploaded", "size": 54266612, "download_count": 8, "created_at": "2018-05-13T21:59:00Z", "updated_at": "2018-05-13T21:59:02Z", "browser_download_url": "https://github.com/dbeaver/dbeaver/releases/download/5.0.5/dbeaver-ce-5.0.5-macosx.cocoa.x86_64.tar.gz" }, { "url": "https://api.github.com/repos/dbeaver/dbeaver/releases/assets/7159810", "id": 7159810, "name": "dbeaver-ce-5.0.5-stable.i386.rpm", "label": "", "uploader": { "login": "serge-rider", "id": 6398845, "avatar_url": "https://avatars0.githubusercontent.com/u/6398845?v=4", "gravatar_id": "", "url": "https://api.github.com/users/serge-rider", "html_url": "https://github.com/serge-rider", "followers_url": "https://api.github.com/users/serge-rider/followers", "following_url": "https://api.github.com/users/serge-rider/following{/other_user}", "gists_url": "https://api.github.com/users/serge-rider/gists{/gist_id}", "starred_url": "https://api.github.com/users/serge-rider/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/serge-rider/subscriptions", "organizations_url": "https://api.github.com/users/serge-rider/orgs", "repos_url": "https://api.github.com/users/serge-rider/repos", "events_url": "https://api.github.com/users/serge-rider/events{/privacy}", "received_events_url": "https://api.github.com/users/serge-rider/received_events", "type": "User", "site_admin": false }, "content_type": "application/x-rpm", "state": "uploaded", "size": 54219867, "download_count": 1, "created_at": "2018-05-13T21:59:05Z", "updated_at": "2018-05-13T21:59:08Z", "browser_download_url": "https://github.com/dbeaver/dbeaver/releases/download/5.0.5/dbeaver-ce-5.0.5-stable.i386.rpm" }, { "url": "https://api.github.com/repos/dbeaver/dbeaver/releases/assets/7159813", "id": 7159813, "name": "dbeaver-ce-5.0.5-stable.x86_64.rpm", "label": "", "uploader": { "login": "serge-rider", "id": 6398845, "avatar_url": "https://avatars0.githubusercontent.com/u/6398845?v=4", "gravatar_id": "", "url": "https://api.github.com/users/serge-rider", "html_url": "https://github.com/serge-rider", "followers_url": "https://api.github.com/users/serge-rider/followers", "following_url": "https://api.github.com/users/serge-rider/following{/other_user}", "gists_url": "https://api.github.com/users/serge-rider/gists{/gist_id}", "starred_url": "https://api.github.com/users/serge-rider/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/serge-rider/subscriptions", "organizations_url": "https://api.github.com/users/serge-rider/orgs", "repos_url": "https://api.github.com/users/serge-rider/repos", "events_url": "https://api.github.com/users/serge-rider/events{/privacy}", "received_events_url": "https://api.github.com/users/serge-rider/received_events", "type": "User", "site_admin": false }, "content_type": "application/x-rpm", "state": "uploaded", "size": 54333821, "download_count": 21, "created_at": "2018-05-13T21:59:11Z", "updated_at": "2018-05-13T21:59:14Z", "browser_download_url": "https://github.com/dbeaver/dbeaver/releases/download/5.0.5/dbeaver-ce-5.0.5-stable.x86_64.rpm" }, { "url": "https://api.github.com/repos/dbeaver/dbeaver/releases/assets/7159802", "id": 7159802, "name": "dbeaver-ce-5.0.5-win32.win32.x86.zip", "label": "", "uploader": { "login": "serge-rider", "id": 6398845, "avatar_url": "https://avatars0.githubusercontent.com/u/6398845?v=4", "gravatar_id": "", "url": "https://api.github.com/users/serge-rider", "html_url": "https://github.com/serge-rider", "followers_url": "https://api.github.com/users/serge-rider/followers", "following_url": "https://api.github.com/users/serge-rider/following{/other_user}", "gists_url": "https://api.github.com/users/serge-rider/gists{/gist_id}", "starred_url": "https://api.github.com/users/serge-rider/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/serge-rider/subscriptions", "organizations_url": "https://api.github.com/users/serge-rider/orgs", "repos_url": "https://api.github.com/users/serge-rider/repos", "events_url": "https://api.github.com/users/serge-rider/events{/privacy}", "received_events_url": "https://api.github.com/users/serge-rider/received_events", "type": "User", "site_admin": false }, "content_type": "application/zip", "state": "uploaded", "size": 54611024, "download_count": 41, "created_at": "2018-05-13T21:58:44Z", "updated_at": "2018-05-13T21:58:47Z", "browser_download_url": "https://github.com/dbeaver/dbeaver/releases/download/5.0.5/dbeaver-ce-5.0.5-win32.win32.x86.zip" }, { "url": "https://api.github.com/repos/dbeaver/dbeaver/releases/assets/7159803", "id": 7159803, "name": "dbeaver-ce-5.0.5-win32.win32.x86_64.zip", "label": "", "uploader": { "login": "serge-rider", "id": 6398845, "avatar_url": "https://avatars0.githubusercontent.com/u/6398845?v=4", "gravatar_id": "", "url": "https://api.github.com/users/serge-rider", "html_url": "https://github.com/serge-rider", "followers_url": "https://api.github.com/users/serge-rider/followers", "following_url": "https://api.github.com/users/serge-rider/following{/other_user}", "gists_url": "https://api.github.com/users/serge-rider/gists{/gist_id}", "starred_url": "https://api.github.com/users/serge-rider/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/serge-rider/subscriptions", "organizations_url": "https://api.github.com/users/serge-rider/orgs", "repos_url": "https://api.github.com/users/serge-rider/repos", "events_url": "https://api.github.com/users/serge-rider/events{/privacy}", "received_events_url": "https://api.github.com/users/serge-rider/received_events", "type": "User", "site_admin": false }, "content_type": "application/zip", "state": "uploaded", "size": 54590405, "download_count": 356, "created_at": "2018-05-13T21:58:47Z", "updated_at": "2018-05-13T21:58:50Z", "browser_download_url": "https://github.com/dbeaver/dbeaver/releases/download/5.0.5/dbeaver-ce-5.0.5-win32.win32.x86_64.zip" }, { "url": "https://api.github.com/repos/dbeaver/dbeaver/releases/assets/7159798", "id": 7159798, "name": "dbeaver-ce-5.0.5-x86-setup.exe", "label": "", "uploader": { "login": "serge-rider", "id": 6398845, "avatar_url": "https://avatars0.githubusercontent.com/u/6398845?v=4", "gravatar_id": "", "url": "https://api.github.com/users/serge-rider", "html_url": "https://github.com/serge-rider", "followers_url": "https://api.github.com/users/serge-rider/followers", "following_url": "https://api.github.com/users/serge-rider/following{/other_user}", "gists_url": "https://api.github.com/users/serge-rider/gists{/gist_id}", "starred_url": "https://api.github.com/users/serge-rider/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/serge-rider/subscriptions", "organizations_url": "https://api.github.com/users/serge-rider/orgs", "repos_url": "https://api.github.com/users/serge-rider/repos", "events_url": "https://api.github.com/users/serge-rider/events{/privacy}", "received_events_url": "https://api.github.com/users/serge-rider/received_events", "type": "User", "site_admin": false }, "content_type": "application/octet-stream", "state": "uploaded", "size": 33743856, "download_count": 146, "created_at": "2018-05-13T21:58:38Z", "updated_at": "2018-05-13T21:58:40Z", "browser_download_url": "https://github.com/dbeaver/dbeaver/releases/download/5.0.5/dbeaver-ce-5.0.5-x86-setup.exe" }, { "url": "https://api.github.com/repos/dbeaver/dbeaver/releases/assets/7159812", "id": 7159812, "name": "dbeaver-ce-5.0.5-x86_64-setup.exe", "label": "", "uploader": { "login": "serge-rider", "id": 6398845, "avatar_url": "https://avatars0.githubusercontent.com/u/6398845?v=4", "gravatar_id": "", "url": "https://api.github.com/users/serge-rider", "html_url": "https://github.com/serge-rider", "followers_url": "https://api.github.com/users/serge-rider/followers", "following_url": "https://api.github.com/users/serge-rider/following{/other_user}", "gists_url": "https://api.github.com/users/serge-rider/gists{/gist_id}", "starred_url": "https://api.github.com/users/serge-rider/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/serge-rider/subscriptions", "organizations_url": "https://api.github.com/users/serge-rider/orgs", "repos_url": "https://api.github.com/users/serge-rider/repos", "events_url": "https://api.github.com/users/serge-rider/events{/privacy}", "received_events_url": "https://api.github.com/users/serge-rider/received_events", "type": "User", "site_admin": false }, "content_type": "application/octet-stream", "state": "uploaded", "size": 34987208, "download_count": 411, "created_at": "2018-05-13T21:59:09Z", "updated_at": "2018-05-13T21:59:11Z", "browser_download_url": "https://github.com/dbeaver/dbeaver/releases/download/5.0.5/dbeaver-ce-5.0.5-x86_64-setup.exe" }, { "url": "https://api.github.com/repos/dbeaver/dbeaver/releases/assets/7159805", "id": 7159805, "name": "dbeaver-ce_5.0.5_amd64.deb", "label": "", "uploader": { "login": "serge-rider", "id": 6398845, "avatar_url": "https://avatars0.githubusercontent.com/u/6398845?v=4", "gravatar_id": "", "url": "https://api.github.com/users/serge-rider", "html_url": "https://github.com/serge-rider", "followers_url": "https://api.github.com/users/serge-rider/followers", "following_url": "https://api.github.com/users/serge-rider/following{/other_user}", "gists_url": "https://api.github.com/users/serge-rider/gists{/gist_id}", "starred_url": "https://api.github.com/users/serge-rider/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/serge-rider/subscriptions", "organizations_url": "https://api.github.com/users/serge-rider/orgs", "repos_url": "https://api.github.com/users/serge-rider/repos", "events_url": "https://api.github.com/users/serge-rider/events{/privacy}", "received_events_url": "https://api.github.com/users/serge-rider/received_events", "type": "User", "site_admin": false }, "content_type": "application/x-deb", "state": "uploaded", "size": 54278382, "download_count": 123, "created_at": "2018-05-13T21:58:54Z", "updated_at": "2018-05-13T21:58:57Z", "browser_download_url": "https://github.com/dbeaver/dbeaver/releases/download/5.0.5/dbeaver-ce_5.0.5_amd64.deb" }, { "url": "https://api.github.com/repos/dbeaver/dbeaver/releases/assets/7159799", "id": 7159799, "name": "dbeaver-ce_5.0.5_i386.deb", "label": "", "uploader": { "login": "serge-rider", "id": 6398845, "avatar_url": "https://avatars0.githubusercontent.com/u/6398845?v=4", "gravatar_id": "", "url": "https://api.github.com/users/serge-rider", "html_url": "https://github.com/serge-rider", "followers_url": "https://api.github.com/users/serge-rider/followers", "following_url": "https://api.github.com/users/serge-rider/following{/other_user}", "gists_url": "https://api.github.com/users/serge-rider/gists{/gist_id}", "starred_url": "https://api.github.com/users/serge-rider/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/serge-rider/subscriptions", "organizations_url": "https://api.github.com/users/serge-rider/orgs", "repos_url": "https://api.github.com/users/serge-rider/repos", "events_url": "https://api.github.com/users/serge-rider/events{/privacy}", "received_events_url": "https://api.github.com/users/serge-rider/received_events", "type": "User", "site_admin": false }, "content_type": "application/x-deb", "state": "uploaded", "size": 54165066, "download_count": 7, "created_at": "2018-05-13T21:58:40Z", "updated_at": "2018-05-13T21:58:44Z", "browser_download_url": "https://github.com/dbeaver/dbeaver/releases/download/5.0.5/dbeaver-ce_5.0.5_i386.deb" } ], "tarball_url": "https://api.github.com/repos/dbeaver/dbeaver/tarball/5.0.5", "zipball_url": "https://api.github.com/repos/dbeaver/dbeaver/zipball/5.0.5", "body": "\n - PostgreSQL procedures debugger was added in CE\n - Search in query history feature was added\n - Query manager view was redesigned\n - DBUnit data export format support was added (thanks to Henrik Hansen)\n - Eclipse Mars support fixed\n - Foreign key values browser was improved (progress visualizing, values ordering)\n - Results viewer/editor key bindings activation was fixed\n - Results viewer now respects database navigator filters (default column visibility)\n - Results viewer shortcuts (fetch page/fetch all) were changed to avoid conflicts with Linux def shortcuts\n - XLS data exporter was improved (column comments support)\n - SQL formatter was fixed (special characters processing)\n - SQL Editor: auto-completion was fixed for Generic driver (including SQL Server and Informix)\n - Connect, disconnect and invalidate timeouts were added\n - PostgreSQL: view comments and permissions support was added\n - PostgreSQL: asynchronous server output reading is now supported\n - PostgreSQL: schema create was fixed\n - MariaDB: packages support was added, procedures read was fixed\n - DB2: table columns create/edit supports was added\n - ORacle CASE statement parsing was fixed\n - Misc minor UI bugfixes\n " } ubuntu-make-18.09+disco1/tests/data/server-content/api.github.com/repos/Jetbrains/0000755000000000000000000000000013352651520024747 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/api.github.com/repos/Jetbrains/kotlin/0000755000000000000000000000000013352651520026247 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/api.github.com/repos/Jetbrains/kotlin/releases/0000755000000000000000000000000013352651520030052 5ustar ././@LongLink0000644000000000000000000000015100000000000007770 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/api.github.com/repos/Jetbrains/kotlin/releases/latestubuntu-make-18.09+disco1/tests/data/server-content/api.github.com/repos/Jetbrains/kotlin/releases/la0000644000000000000000000001152613352651520030376 0ustar { "url": "https://api.github.com/repos/JetBrains/kotlin/releases/2613025", "assets_url": "https://api.github.com/repos/JetBrains/kotlin/releases/2613025/assets", "upload_url": "https://uploads.github.com/repos/JetBrains/kotlin/releases/2613025/assets{?name,label}", "html_url": "https://github.com/JetBrains/kotlin/releases/tag/build-1.0.0", "id": 2613025, "tag_name": "build-1.0.0", "target_commitish": "master", "name": "Kotlin 1.0.0", "draft": false, "author": { "login": "abreslav", "id": 888318, "avatar_url": "https://avatars.githubusercontent.com/u/888318?v=3", "gravatar_id": "", "url": "https://api.github.com/users/abreslav", "html_url": "https://github.com/abreslav", "followers_url": "https://api.github.com/users/abreslav/followers", "following_url": "https://api.github.com/users/abreslav/following{/other_user}", "gists_url": "https://api.github.com/users/abreslav/gists{/gist_id}", "starred_url": "https://api.github.com/users/abreslav/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/abreslav/subscriptions", "organizations_url": "https://api.github.com/users/abreslav/orgs", "repos_url": "https://api.github.com/users/abreslav/repos", "events_url": "https://api.github.com/users/abreslav/events{/privacy}", "received_events_url": "https://api.github.com/users/abreslav/received_events", "type": "User", "site_admin": false }, "prerelease": false, "created_at": "2016-02-14T21:14:19Z", "published_at": "2016-02-15T12:01:42Z", "assets": [ { "url": "https://api.github.com/repos/JetBrains/kotlin/releases/assets/1311082", "id": 1311082, "name": "kotlin-compiler-1.0.0.zip", "label": null, "uploader": { "login": "abreslav", "id": 888318, "avatar_url": "https://avatars.githubusercontent.com/u/888318?v=3", "gravatar_id": "", "url": "https://api.github.com/users/abreslav", "html_url": "https://github.com/abreslav", "followers_url": "https://api.github.com/users/abreslav/followers", "following_url": "https://api.github.com/users/abreslav/following{/other_user}", "gists_url": "https://api.github.com/users/abreslav/gists{/gist_id}", "starred_url": "https://api.github.com/users/abreslav/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/abreslav/subscriptions", "organizations_url": "https://api.github.com/users/abreslav/orgs", "repos_url": "https://api.github.com/users/abreslav/repos", "events_url": "https://api.github.com/users/abreslav/events{/privacy}", "received_events_url": "https://api.github.com/users/abreslav/received_events", "type": "User", "site_admin": false }, "content_type": "application/zip", "state": "uploaded", "size": 20491203, "download_count": 2730, "created_at": "2016-02-14T21:17:55Z", "updated_at": "2016-02-14T21:18:21Z", "browser_download_url": "https://github.com/JetBrains/kotlin/releases/download/build-1.0.0/kotlin-compiler-1.0.0.zip" } ], "tarball_url": "https://api.github.com/repos/JetBrains/kotlin/tarball/build-1.0.0", "zipball_url": "https://api.github.com/repos/JetBrains/kotlin/zipball/build-1.0.0", "body": "Welcome Kotlin 1.0.0 — the first official release of the Kotlin programming language!\r\n\r\nFind installation instructions and documentation [here](https://kotlinlang.org).\r\n\r\nThis release is a result of over five years of hard work. Below, find the changes made since the [RC build](https://github.com/JetBrains/kotlin/releases/tag/build-1.0.0-rc-1036).\r\n\r\n## Library\r\n\r\n* [KT-5587](https://youtrack.jetbrains.com/issue/KT-5587) Make `Throwable#message` and `Throwable#cause` open\r\n* `kotlin.Metadata` annotation is used instead of `KotlinClass`\r\n* Old metadata annotations deleted from the `kotlin.jvm.internal` package\r\n* [KT-10462](https://youtrack.jetbrains.com/issue/KT-10462): Use HALF_EVEN rounding mode by default for BigDecimal division operator.\r\n* Default buffer size for IO operations changed to 8K (same default as in Java's `BufferedReader`).\r\n* Last deprecations dropped\r\n\r\n## Compiler\r\n\r\n* [KT-10858](https://youtrack.jetbrains.com/issue/KT-10858) Proguard issue with inline-only functions in multi-file classes\r\n* [KT-10939](https://youtrack.jetbrains.com/issue/KT-10939) CANNOT_COMPLETE_RESOLVE for inherited generic interface method\r\n* [KT-10595](https://youtrack.jetbrains.com/issue/KT-10595) Internal visibility fixed for Gradle projects in IntelliJ IDEA 16\r\n* [KT-10934](https://youtrack.jetbrains.com/issue/KT-10934) UninferredParameterTypeConstructor exception fixed for exhaustive when\r\n* [KT-10896](https://youtrack.jetbrains.com/issue/KT-10896) Wrong inference of if / else result type fixed\r\n* RoboVM incompatibility fixed" } ubuntu-make-18.09+disco1/tests/data/server-content/api.github.com/repos/LightTable/0000755000000000000000000000000013352651520025045 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/api.github.com/repos/LightTable/LightTable/0000755000000000000000000000000013352651520027064 5ustar ././@LongLink0000644000000000000000000000015000000000000007767 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/api.github.com/repos/LightTable/LightTable/releases/ubuntu-make-18.09+disco1/tests/data/server-content/api.github.com/repos/LightTable/LightTable/releas0000755000000000000000000000000013352651520030260 5ustar ././@LongLink0000644000000000000000000000015600000000000007775 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/api.github.com/repos/LightTable/LightTable/releases/latestubuntu-make-18.09+disco1/tests/data/server-content/api.github.com/repos/LightTable/LightTable/releas0000644000000000000000000002251213352651520030264 0ustar { "url": "https://api.github.com/repos/LightTable/LightTable/releases/2471387", "assets_url": "https://api.github.com/repos/LightTable/LightTable/releases/2471387/assets", "upload_url": "https://uploads.github.com/repos/LightTable/LightTable/releases/2471387/assets{?name,label}", "html_url": "https://github.com/LightTable/LightTable/releases/tag/mock", "id": 2471387, "tag_name": "mock", "target_commitish": "master", "name": "mock", "draft": false, "author": { "login": "kenny-evitt", "id": 1461730, "avatar_url": "https://avatars.githubusercontent.com/u/1461730?v=3", "gravatar_id": "", "url": "https://api.github.com/users/kenny-evitt", "html_url": "https://github.com/kenny-evitt", "followers_url": "https://api.github.com/users/kenny-evitt/followers", "following_url": "https://api.github.com/users/kenny-evitt/following{/other_user}", "gists_url": "https://api.github.com/users/kenny-evitt/gists{/gist_id}", "starred_url": "https://api.github.com/users/kenny-evitt/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/kenny-evitt/subscriptions", "organizations_url": "https://api.github.com/users/kenny-evitt/orgs", "repos_url": "https://api.github.com/users/kenny-evitt/repos", "events_url": "https://api.github.com/users/kenny-evitt/events{/privacy}", "received_events_url": "https://api.github.com/users/kenny-evitt/received_events", "type": "User", "site_admin": false }, "prerelease": false, "created_at": "2016-01-22T00:15:44Z", "published_at": "2016-01-22T01:12:34Z", "assets": [ { "url": "https://api.github.com/repos/LightTable/LightTable/releases/assets/1233655", "id": 1233655, "name": "lighttable-mock-linux.tar.gz", "label": null, "uploader": { "login": "rundis", "id": 399197, "avatar_url": "https://avatars.githubusercontent.com/u/399197?v=3", "gravatar_id": "", "url": "https://api.github.com/users/rundis", "html_url": "https://github.com/rundis", "followers_url": "https://api.github.com/users/rundis/followers", "following_url": "https://api.github.com/users/rundis/following{/other_user}", "gists_url": "https://api.github.com/users/rundis/gists{/gist_id}", "starred_url": "https://api.github.com/users/rundis/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/rundis/subscriptions", "organizations_url": "https://api.github.com/users/rundis/orgs", "repos_url": "https://api.github.com/users/rundis/repos", "events_url": "https://api.github.com/users/rundis/events{/privacy}", "received_events_url": "https://api.github.com/users/rundis/received_events", "type": "User", "site_admin": false }, "content_type": "application/gzip", "state": "uploaded", "size": 55599081, "download_count": 17654, "created_at": "2016-01-22T00:25:21Z", "updated_at": "2016-01-22T00:25:49Z", "browser_download_url": "https://github.com/LightTable/LightTable/releases/download/mock/lighttable-mock-linux.tar.gz" }, { "url": "https://api.github.com/repos/LightTable/LightTable/releases/assets/1233738", "id": 1233738, "name": "lighttable-mock-mac.tar.gz", "label": null, "uploader": { "login": "cldwalker", "id": 11994, "avatar_url": "https://avatars.githubusercontent.com/u/11994?v=3", "gravatar_id": "", "url": "https://api.github.com/users/cldwalker", "html_url": "https://github.com/cldwalker", "followers_url": "https://api.github.com/users/cldwalker/followers", "following_url": "https://api.github.com/users/cldwalker/following{/other_user}", "gists_url": "https://api.github.com/users/cldwalker/gists{/gist_id}", "starred_url": "https://api.github.com/users/cldwalker/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/cldwalker/subscriptions", "organizations_url": "https://api.github.com/users/cldwalker/orgs", "repos_url": "https://api.github.com/users/cldwalker/repos", "events_url": "https://api.github.com/users/cldwalker/events{/privacy}", "received_events_url": "https://api.github.com/users/cldwalker/received_events", "type": "User", "site_admin": false }, "content_type": "application/x-gzip", "state": "uploaded", "size": 57551242, "download_count": 8307, "created_at": "2016-01-22T00:52:03Z", "updated_at": "2016-01-22T00:52:42Z", "browser_download_url": "https://github.com/LightTable/LightTable/releases/download/mock/lighttable-mock-mac.tar.gz" }, { "url": "https://api.github.com/repos/LightTable/LightTable/releases/assets/1233669", "id": 1233669, "name": "lighttable-mock-windows.zip", "label": null, "uploader": { "login": "kenny-evitt", "id": 1461730, "avatar_url": "https://avatars.githubusercontent.com/u/1461730?v=3", "gravatar_id": "", "url": "https://api.github.com/users/kenny-evitt", "html_url": "https://github.com/kenny-evitt", "followers_url": "https://api.github.com/users/kenny-evitt/followers", "following_url": "https://api.github.com/users/kenny-evitt/following{/other_user}", "gists_url": "https://api.github.com/users/kenny-evitt/gists{/gist_id}", "starred_url": "https://api.github.com/users/kenny-evitt/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/kenny-evitt/subscriptions", "organizations_url": "https://api.github.com/users/kenny-evitt/orgs", "repos_url": "https://api.github.com/users/kenny-evitt/repos", "events_url": "https://api.github.com/users/kenny-evitt/events{/privacy}", "received_events_url": "https://api.github.com/users/kenny-evitt/received_events", "type": "User", "site_admin": false }, "content_type": "application/octet-stream", "state": "uploaded", "size": 58300432, "download_count": 23657, "created_at": "2016-01-22T00:28:52Z", "updated_at": "2016-01-22T00:29:00Z", "browser_download_url": "https://github.com/LightTable/LightTable/releases/download/mock/lighttable-mock-windows.zip" } ], "tarball_url": "https://api.github.com/repos/LightTable/LightTable/tarball/mock", "zipball_url": "https://api.github.com/repos/LightTable/LightTable/zipball/mock", "body": "## Changes\r\n- CHANGED: [:app :lt.objs.settings/pair-keymap-diffs] behavior is being deprecated. Use [:editor :lt.objs.editor/autoclose-brackets] in your user.behaviors instead. lt.objs.editor/autoclose-brackets should fix autoclosing characters e.g. '[{\" for international users.\r\n- CHANGED: Backspace key uses the same CodeMirror plugin that lt.objs.editor/autoclose-brackets does\r\n- CHANGED: lt.util.cljs/js->clj is being deprecated. Plugin authors can use the js->clj that comes with ClojureScript\r\n- CHANGED: Removed unused lt.objs.titlebar ns and lt.objs.titlebar/add-titlebar behavior\r\n- CHANGED: Removed unused styling in structure.css\r\n- CHANGED: Removed harbor and jshint node packages that belong to other LightTable plugins\r\n- CHANGED: Removed :hide-connect command which is the same as :show-connect\r\n- CHANGED: Removed light skin which was just a confusing pointer to dark skin\r\n- CHANGED: files/open-sync logs an error when trying to open a nonexistent file. Previously the error was ignored\r\n- CHANGED: Check for updates every hour instead of every 5 minutes\r\n- FIX: Git (vcs) friendly! Changing branches and doing rebases doesn't cause buggy dialogs. If a file is removed, the tab is closed. If a file has a local modification, the user decides whether to overwrite the current file or not\r\n- FIX: LightTable documentation supports navigation as it is now in a browser tab\r\n- FIX: Save and remove trailing whitespace behavior refreshes tab\r\n- FIX: Navigator no longer cuts off end of files i.e. can scroll horizontally\r\n- FIX: Case sensitive renaming of files e.g. readme -> README\r\n- FIX: Faster detection of binaries in build scripts\r\n- FIX: In linux, middle click to close tab doesn't paste clipboard contents\r\n- FIX: :open-path command resolves relative paths before opening them\r\n- FIX: Clearer description of font-settings behavior\r\n- FIX: Clear console error when github endpoints returns invalid JSON\r\n- FIX: All errors are consistently caught and logged to console\r\n- ADDED: Light Table builds without warnings on ClojureScript 1.7.x\r\n- ADDED: Add build target for generating cljsdeps.js (need for ClojureScript upgrade)\r\n- ADDED: Linux and Windows users have access keys on menus\r\n- ADDED: Linux and Windows users have additional menu items under File: Quit Light Table and About Light Table\r\n- ADDED: Added file type definitions for html templates: ERB, ASPX, EJS, JSP\r\n- ADDED: Command-0/Ctrl-0 to reset zoom and Command-=/Ctrl-= to zoom in\r\n- ADDED: Disply notification to user after installing/updating/uninstalling a plugin\r\n\r\n## Checksums\r\n\r\nThe MD5 checksums are reproducible on OSX and Linux with `openssl md5 FILE` and on Windows with `certUtil -hashfile FILE MD5`.\r\n\r\n - Windows – 9cdda77518e86243a52bdb88e9ddebb8\r\n - Ubuntu (14.04) - 7e4efcce58f2f4a44edb5bde6f5a91db\r\n - OSX 10.10 - 4f9fb2dd330d589a109c582a6472a4a5 " } ubuntu-make-18.09+disco1/tests/data/server-content/api.github.com/repos/crystal-lang/0000755000000000000000000000000013352651520025426 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/api.github.com/repos/crystal-lang/crystal/0000755000000000000000000000000013352651520027107 5ustar ././@LongLink0000644000000000000000000000014700000000000007775 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/api.github.com/repos/crystal-lang/crystal/releases/ubuntu-make-18.09+disco1/tests/data/server-content/api.github.com/repos/crystal-lang/crystal/release0000755000000000000000000000000013352651520030450 5ustar ././@LongLink0000644000000000000000000000015500000000000007774 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/api.github.com/repos/crystal-lang/crystal/releases/latestubuntu-make-18.09+disco1/tests/data/server-content/api.github.com/repos/crystal-lang/crystal/release0000644000000000000000000005210213352651520030452 0ustar { "url": "https://api.github.com/repos/crystal-lang/crystal/releases/8888247", "assets_url": "https://api.github.com/repos/crystal-lang/crystal/releases/8888247/assets", "upload_url": "https://uploads.github.com/repos/crystal-lang/crystal/releases/8888247/assets{?name,label}", "html_url": "https://github.com/crystal-lang/crystal/releases/tag/v0.24.1", "id": 8888247, "tag_name": "v0.24.1", "target_commitish": "master", "name": "0.24.1", "draft": false, "author": { "login": "RX14", "id": 2788811, "avatar_url": "https://avatars0.githubusercontent.com/u/2788811?v=4", "gravatar_id": "", "url": "https://api.github.com/users/RX14", "html_url": "https://github.com/RX14", "followers_url": "https://api.github.com/users/RX14/followers", "following_url": "https://api.github.com/users/RX14/following{/other_user}", "gists_url": "https://api.github.com/users/RX14/gists{/gist_id}", "starred_url": "https://api.github.com/users/RX14/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/RX14/subscriptions", "organizations_url": "https://api.github.com/users/RX14/orgs", "repos_url": "https://api.github.com/users/RX14/repos", "events_url": "https://api.github.com/users/RX14/events{/privacy}", "received_events_url": "https://api.github.com/users/RX14/received_events", "type": "User", "site_admin": false }, "prerelease": false, "created_at": "2017-12-13T12:24:18Z", "published_at": "2017-12-23T20:42:57Z", "assets": [ { "url": "https://api.github.com/repos/crystal-lang/crystal/releases/assets/5704740", "id": 5704740, "name": "crystal-0.24.1-2-darwin-x86_64.tar.gz", "label": null, "uploader": { "login": "waj", "id": 22697, "avatar_url": "https://avatars3.githubusercontent.com/u/22697?v=4", "gravatar_id": "", "url": "https://api.github.com/users/waj", "html_url": "https://github.com/waj", "followers_url": "https://api.github.com/users/waj/followers", "following_url": "https://api.github.com/users/waj/following{/other_user}", "gists_url": "https://api.github.com/users/waj/gists{/gist_id}", "starred_url": "https://api.github.com/users/waj/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/waj/subscriptions", "organizations_url": "https://api.github.com/users/waj/orgs", "repos_url": "https://api.github.com/users/waj/repos", "events_url": "https://api.github.com/users/waj/events{/privacy}", "received_events_url": "https://api.github.com/users/waj/received_events", "type": "User", "site_admin": false }, "content_type": "application/x-gzip", "state": "uploaded", "size": 15445870, "download_count": 10, "created_at": "2017-12-23T20:30:05Z", "updated_at": "2017-12-23T20:42:12Z", "browser_download_url": "https://github.com/crystal-lang/crystal/releases/download/v0.24.1/crystal-0.24.1-2-darwin-x86_64.tar.gz" }, { "url": "https://api.github.com/repos/crystal-lang/crystal/releases/assets/5704739", "id": 5704739, "name": "crystal-mock-linux-i686.tar.gz", "label": null, "uploader": { "login": "waj", "id": 22697, "avatar_url": "https://avatars3.githubusercontent.com/u/22697?v=4", "gravatar_id": "", "url": "https://api.github.com/users/waj", "html_url": "https://github.com/waj", "followers_url": "https://api.github.com/users/waj/followers", "following_url": "https://api.github.com/users/waj/following{/other_user}", "gists_url": "https://api.github.com/users/waj/gists{/gist_id}", "starred_url": "https://api.github.com/users/waj/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/waj/subscriptions", "organizations_url": "https://api.github.com/users/waj/orgs", "repos_url": "https://api.github.com/users/waj/repos", "events_url": "https://api.github.com/users/waj/events{/privacy}", "received_events_url": "https://api.github.com/users/waj/received_events", "type": "User", "site_admin": false }, "content_type": "application/x-gzip", "state": "uploaded", "size": 18200813, "download_count": 16, "created_at": "2017-12-23T20:30:05Z", "updated_at": "2017-12-23T20:39:59Z", "browser_download_url": "https://github.com/crystal-lang/crystal/releases/download/mock/crystal-mock-linux-i686.tar.gz" }, { "url": "https://api.github.com/repos/crystal-lang/crystal/releases/assets/5704738", "id": 5704738, "name": "crystal-mock-linux-x86_64.tar.gz", "label": null, "uploader": { "login": "waj", "id": 22697, "avatar_url": "https://avatars3.githubusercontent.com/u/22697?v=4", "gravatar_id": "", "url": "https://api.github.com/users/waj", "html_url": "https://github.com/waj", "followers_url": "https://api.github.com/users/waj/followers", "following_url": "https://api.github.com/users/waj/following{/other_user}", "gists_url": "https://api.github.com/users/waj/gists{/gist_id}", "starred_url": "https://api.github.com/users/waj/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/waj/subscriptions", "organizations_url": "https://api.github.com/users/waj/orgs", "repos_url": "https://api.github.com/users/waj/repos", "events_url": "https://api.github.com/users/waj/events{/privacy}", "received_events_url": "https://api.github.com/users/waj/received_events", "type": "User", "site_admin": false }, "content_type": "application/x-gzip", "state": "uploaded", "size": 34917825, "download_count": 107, "created_at": "2017-12-23T20:30:04Z", "updated_at": "2017-12-23T20:37:18Z", "browser_download_url": "https://github.com/crystal-lang/crystal/releases/download/mock/crystal-mock-linux-x86_64.tar.gz" }, { "url": "https://api.github.com/repos/crystal-lang/crystal/releases/assets/5704675", "id": 5704675, "name": "crystal-0.24.1-2.el6.i386.rpm", "label": null, "uploader": { "login": "waj", "id": 22697, "avatar_url": "https://avatars3.githubusercontent.com/u/22697?v=4", "gravatar_id": "", "url": "https://api.github.com/users/waj", "html_url": "https://github.com/waj", "followers_url": "https://api.github.com/users/waj/followers", "following_url": "https://api.github.com/users/waj/following{/other_user}", "gists_url": "https://api.github.com/users/waj/gists{/gist_id}", "starred_url": "https://api.github.com/users/waj/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/waj/subscriptions", "organizations_url": "https://api.github.com/users/waj/orgs", "repos_url": "https://api.github.com/users/waj/repos", "events_url": "https://api.github.com/users/waj/events{/privacy}", "received_events_url": "https://api.github.com/users/waj/received_events", "type": "User", "site_admin": false }, "content_type": "application/x-rpm", "state": "uploaded", "size": 18120228, "download_count": 1, "created_at": "2017-12-23T20:17:35Z", "updated_at": "2017-12-23T20:20:41Z", "browser_download_url": "https://github.com/crystal-lang/crystal/releases/download/v0.24.1/crystal-0.24.1-2.el6.i386.rpm" }, { "url": "https://api.github.com/repos/crystal-lang/crystal/releases/assets/5704737", "id": 5704737, "name": "crystal-0.24.1-2.pkg", "label": null, "uploader": { "login": "waj", "id": 22697, "avatar_url": "https://avatars3.githubusercontent.com/u/22697?v=4", "gravatar_id": "", "url": "https://api.github.com/users/waj", "html_url": "https://github.com/waj", "followers_url": "https://api.github.com/users/waj/followers", "following_url": "https://api.github.com/users/waj/following{/other_user}", "gists_url": "https://api.github.com/users/waj/gists{/gist_id}", "starred_url": "https://api.github.com/users/waj/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/waj/subscriptions", "organizations_url": "https://api.github.com/users/waj/orgs", "repos_url": "https://api.github.com/users/waj/repos", "events_url": "https://api.github.com/users/waj/events{/privacy}", "received_events_url": "https://api.github.com/users/waj/received_events", "type": "User", "site_admin": false }, "content_type": "application/octet-stream", "state": "uploaded", "size": 15488318, "download_count": 3, "created_at": "2017-12-23T20:30:04Z", "updated_at": "2017-12-23T20:32:20Z", "browser_download_url": "https://github.com/crystal-lang/crystal/releases/download/v0.24.1/crystal-0.24.1-2.pkg" }, { "url": "https://api.github.com/repos/crystal-lang/crystal/releases/assets/5704676", "id": 5704676, "name": "crystal-0.24.1-2.x86_64.rpm", "label": null, "uploader": { "login": "waj", "id": 22697, "avatar_url": "https://avatars3.githubusercontent.com/u/22697?v=4", "gravatar_id": "", "url": "https://api.github.com/users/waj", "html_url": "https://github.com/waj", "followers_url": "https://api.github.com/users/waj/followers", "following_url": "https://api.github.com/users/waj/following{/other_user}", "gists_url": "https://api.github.com/users/waj/gists{/gist_id}", "starred_url": "https://api.github.com/users/waj/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/waj/subscriptions", "organizations_url": "https://api.github.com/users/waj/orgs", "repos_url": "https://api.github.com/users/waj/repos", "events_url": "https://api.github.com/users/waj/events{/privacy}", "received_events_url": "https://api.github.com/users/waj/received_events", "type": "User", "site_admin": false }, "content_type": "application/x-rpm", "state": "uploaded", "size": 34707489, "download_count": 0, "created_at": "2017-12-23T20:17:35Z", "updated_at": "2017-12-23T20:25:28Z", "browser_download_url": "https://github.com/crystal-lang/crystal/releases/download/v0.24.1/crystal-0.24.1-2.x86_64.rpm" }, { "url": "https://api.github.com/repos/crystal-lang/crystal/releases/assets/5704624", "id": 5704624, "name": "crystal_0.24.1-2_amd64.deb", "label": null, "uploader": { "login": "waj", "id": 22697, "avatar_url": "https://avatars3.githubusercontent.com/u/22697?v=4", "gravatar_id": "", "url": "https://api.github.com/users/waj", "html_url": "https://github.com/waj", "followers_url": "https://api.github.com/users/waj/followers", "following_url": "https://api.github.com/users/waj/following{/other_user}", "gists_url": "https://api.github.com/users/waj/gists{/gist_id}", "starred_url": "https://api.github.com/users/waj/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/waj/subscriptions", "organizations_url": "https://api.github.com/users/waj/orgs", "repos_url": "https://api.github.com/users/waj/repos", "events_url": "https://api.github.com/users/waj/events{/privacy}", "received_events_url": "https://api.github.com/users/waj/received_events", "type": "User", "site_admin": false }, "content_type": "application/x-deb", "state": "uploaded", "size": 34977778, "download_count": 6, "created_at": "2017-12-23T20:07:08Z", "updated_at": "2017-12-23T20:12:15Z", "browser_download_url": "https://github.com/crystal-lang/crystal/releases/download/v0.24.1/crystal_0.24.1-2_amd64.deb" }, { "url": "https://api.github.com/repos/crystal-lang/crystal/releases/assets/5704629", "id": 5704629, "name": "crystal_0.24.1-2_i386.deb", "label": null, "uploader": { "login": "waj", "id": 22697, "avatar_url": "https://avatars3.githubusercontent.com/u/22697?v=4", "gravatar_id": "", "url": "https://api.github.com/users/waj", "html_url": "https://github.com/waj", "followers_url": "https://api.github.com/users/waj/followers", "following_url": "https://api.github.com/users/waj/following{/other_user}", "gists_url": "https://api.github.com/users/waj/gists{/gist_id}", "starred_url": "https://api.github.com/users/waj/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/waj/subscriptions", "organizations_url": "https://api.github.com/users/waj/orgs", "repos_url": "https://api.github.com/users/waj/repos", "events_url": "https://api.github.com/users/waj/events{/privacy}", "received_events_url": "https://api.github.com/users/waj/received_events", "type": "User", "site_admin": false }, "content_type": "application/x-deb", "state": "uploaded", "size": 18146030, "download_count": 0, "created_at": "2017-12-23T20:07:08Z", "updated_at": "2017-12-23T20:14:59Z", "browser_download_url": "https://github.com/crystal-lang/crystal/releases/download/v0.24.1/crystal_0.24.1-2_i386.deb" } ], "tarball_url": "https://api.github.com/repos/crystal-lang/crystal/tarball/v0.24.1", "zipball_url": "https://api.github.com/repos/crystal-lang/crystal/zipball/v0.24.1", "body": "## New features\r\n- Add ThinLTO support for faster release builds in LLVM 4.0 and above. ([#4367](https://github.com/crystal-lang/crystal/issues/4367), thanks @bcardiff)\r\n- **(breaking-change)** Add `UUID` type. `Random::Secure.uuid` has been replaced with `UUID.random`. ([#4453](https://github.com/crystal-lang/crystal/issues/4453), thanks @wontruefree)\r\n- Add a `BigDecimal` class for arbitrary precision, exact, decimal numbers. ([#4876](https://github.com/crystal-lang/crystal/issues/4876) and [#5255](https://github.com/crystal-lang/crystal/issues/5255), thanks @vegai and @Sija)\r\n- Allow `Set` to work as a case condition, which matches when the case variable is inside the set. ([#5269](https://github.com/crystal-lang/crystal/issues/5269), thanks @MakeNowJust)\r\n- **(breaking-change)** Change `Time::Format` codes to allow more robust options for parsing sub-second precision times. ([#5317](https://github.com/crystal-lang/crystal/issues/5317), thanks @bcardiff)\r\n- Add `Time.utc`, an alias of `Time.new` which shortens creating UTC times. ([#5321](https://github.com/crystal-lang/crystal/issues/5321), thanks @straight-shoota)\r\n- Add custom extension support to `Tempfile`. ([#5264](https://github.com/crystal-lang/crystal/issues/5264), thanks @jreinert)\r\n- Add `reduce` method to `TupleLiteral` and `ArrayLiteral` when using macros. ([#5294](https://github.com/crystal-lang/crystal/issues/5294), thanks @javanut13)\r\n- Export a JSON representation of the documentation in the generated output. ([#4746](https://github.com/crystal-lang/crystal/issues/4746) and [#5228](https://github.com/crystal-lang/crystal/issues/5228), thanks @straight-shoota)\r\n- Make `gc/none` garbage collection compile again and allow it to be enbled using `-Dgc_none` compiler flag. ([#5314](https://github.com/crystal-lang/crystal/issues/5314), thanks @ysbaddaden)\r\n\r\n## Standard library bugs fixed\r\n- Make `String#[]` unable to read out-of-bounds when the string ends in a unicode character. ([#5257](https://github.com/crystal-lang/crystal/issues/5257), thanks @Papierkorb)\r\n- Fix incorrect parsing of long JSON floating point values. ([#5323](https://github.com/crystal-lang/crystal/issues/5323), thanks @benoist)\r\n- Replace the default hash function with one resistant to hash DoS. ([#5146](https://github.com/crystal-lang/crystal/issues/5146), thanks @funny-falcon)\r\n- Ensure equal numbers always have the same hashcode. ([#5276](https://github.com/crystal-lang/crystal/issues/5276), thanks @akzhan)\r\n- Fix struct equality when two structs descend from the same abstract struct. ([#5254](https://github.com/crystal-lang/crystal/issues/5254), thanks @hinrik)\r\n- Fix `URI#full_path` not to append a `?` unless the query params are nonempty. ([#5340](https://github.com/crystal-lang/crystal/issues/5340), thanks @paulcsmith)\r\n- Fix `HTTP::Params.parse` to parse `&&` correctly. ([#5274](https://github.com/crystal-lang/crystal/issues/5274), thanks @akiicat)\r\n- Disallow null bytes in `ENV` keys and values. ([#5216](https://github.com/crystal-lang/crystal/issues/5216), thanks @Papierkorb)\r\n- Disallow null bytes in `XML::Node` names and content. ([#5200](https://github.com/crystal-lang/crystal/issues/5200), thanks @RX14)\r\n- Fix `IO#blocking=` on OpenBSD. ([#5283](https://github.com/crystal-lang/crystal/issues/5283), thanks @wmoxam)\r\n- Fix linking programs in OpenBSD. ([#5282](https://github.com/crystal-lang/crystal/issues/5282), thanks @wmoxam)\r\n\r\n## Compiler bugs fixed\r\n- Stop incorrectly finding top-level methods when searching for a `super` method. ([#5202](https://github.com/crystal-lang/crystal/issues/5202), thanks @lbguilherme)\r\n- Fix parsing regex literals starting with a `;` directly after a call (ex `p /;/`). ([#5208](https://github.com/crystal-lang/crystal/issues/5208), thanks @MakeNowJust)\r\n- Correct a case where `Expressions#to_s` could produce invalid output, causing macro expansion to fail. ([#5226](https://github.com/crystal-lang/crystal/issues/5226), thanks @asterite)\r\n- Give error instead of crashing when `self` is used at the top level. ([#5227](https://github.com/crystal-lang/crystal/issues/5227), thanks @MakeNowJust)\r\n- Give error instead of crashing when using `instance_sizeof` on a generic type without providing it's type arguments. ([#5209](https://github.com/crystal-lang/crystal/issues/5209), thanks @lbguilherme)\r\n- Fix parsing calls when short block syntax (`&.foo`) is followed by a newline. ([#5237](https://github.com/crystal-lang/crystal/issues/5237), thanks @MakeNowJust)\r\n- Give error instead of crashing when an unterminated string array literal (`%w()`) sits at the end of a file. ([#5241](https://github.com/crystal-lang/crystal/issues/5241), thanks @asterite)\r\n- Give error when attempting to use macro yield (`{{yield}}`) outside a macro. ([#5307](https://github.com/crystal-lang/crystal/issues/5307), thanks @MakeNowJust)\r\n- Fix error related to generic inheritance. ([#5284](https://github.com/crystal-lang/crystal/issues/5284), thanks @MakeNowJust)\r\n- Fix compiler crash when using recursive alias and generics. ([#5330](https://github.com/crystal-lang/crystal/issues/5330), thanks @MakeNowJust)\r\n- Fix parsing `foo(+1)` as `foo + 1` instead of `foo(1)` where `foo` was a local variable. ([#5336](https://github.com/crystal-lang/crystal/issues/5336), thanks @MakeNowJust)\r\n- Documentation generator: Keep quoted symbol literals quoted when syntax highlighting code blocks in documentation output. ([#5238](https://github.com/crystal-lang/crystal/issues/5238), thanks @MakeNowJust)\r\n- Documentation generator: Keep the original delimiter used when syntax highlighting string array literals. ([#5297](https://github.com/crystal-lang/crystal/issues/5297), thanks @MakeNowJust)\r\n- Documentation generator: Fix XSS vulnerability when syntax highlighting string array literals. ([#5259](https://github.com/crystal-lang/crystal/issues/5259), thanks @MakeNowJust)\r\n- Formatter: fix indentation of the last comment in a `begin`/`end` block. ([#5198](https://github.com/crystal-lang/crystal/issues/5198), thanks @MakeNowJust)\r\n- Formatter: fix formatting parentheses with multiple lines in. ([#5268](https://github.com/crystal-lang/crystal/issues/5268), thanks @MakeNowJust)\r\n- Formatter: fix formatting `$1?`. ([#5313](https://github.com/crystal-lang/crystal/issues/5313), thanks @MakeNowJust)\r\n- Formatter: ensure to insert a space between `{` and `%` characters to avoid forming `{%` macros. ([#5278](https://github.com/crystal-lang/crystal/issues/5278), thanks @MakeNowJust)\r\n\r\n## Misc\r\n- Fix `Makefile`, CI, and gitignore to use the new documentation path after [#4937](https://github.com/crystal-lang/crystal/issues/4937). ([#5217](https://github.com/crystal-lang/crystal/issues/5217), thanks @straight-shoota)\r\n- Miscellaneous code cleanups. ([#5318](https://github.com/crystal-lang/crystal/issues/5318), [#5341](https://github.com/crystal-lang/crystal/issues/5341) and [#5366](https://github.com/crystal-lang/crystal/issues/5366), thanks @bew and @mig-hub)\r\n- Documentation fixes. ([#5253](https://github.com/crystal-lang/crystal/issues/5253), [#5296](https://github.com/crystal-lang/crystal/issues/5296), [#5300](https://github.com/crystal-lang/crystal/issues/5300) and [#5322](https://github.com/crystal-lang/crystal/issues/5322), thanks @arcage, @icyleaf, @straight-shoota and @bew)\r\n- Fix the in-repository changelog to include 0.24.0. ([#5331](https://github.com/crystal-lang/crystal/pull/5331), thanks @sdogruyol)" } ubuntu-make-18.09+disco1/tests/data/server-content/api.github.com/repos/processing/0000755000000000000000000000000013352651520025202 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/api.github.com/repos/processing/processing/0000755000000000000000000000000013352651520027356 5ustar ././@LongLink0000644000000000000000000000015000000000000007767 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/api.github.com/repos/processing/processing/releases/ubuntu-make-18.09+disco1/tests/data/server-content/api.github.com/repos/processing/processing/releas0000755000000000000000000000000013352651520030552 5ustar ././@LongLink0000644000000000000000000000015600000000000007775 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/api.github.com/repos/processing/processing/releases/latestubuntu-make-18.09+disco1/tests/data/server-content/api.github.com/repos/processing/processing/releas0000644000000000000000000003720713352651520030565 0ustar { "url": "https://api.github.com/repos/processing/processing/releases/5433123", "assets_url": "https://api.github.com/repos/processing/processing/releases/5433123/assets", "upload_url": "https://uploads.github.com/repos/processing/processing/releases/5433123/assets{?name,label}", "html_url": "https://github.com/processing/processing/releases/tag/processing-0257-3.3", "id": 5433123, "tag_name": "processing-0257-3.3", "target_commitish": "master", "name": "Processing 3.3", "draft": false, "author": { "login": "benfry", "id": 1623101, "avatar_url": "https://avatars2.githubusercontent.com/u/1623101?v=3", "gravatar_id": "", "url": "https://api.github.com/users/benfry", "html_url": "https://github.com/benfry", "followers_url": "https://api.github.com/users/benfry/followers", "following_url": "https://api.github.com/users/benfry/following{/other_user}", "gists_url": "https://api.github.com/users/benfry/gists{/gist_id}", "starred_url": "https://api.github.com/users/benfry/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/benfry/subscriptions", "organizations_url": "https://api.github.com/users/benfry/orgs", "repos_url": "https://api.github.com/users/benfry/repos", "events_url": "https://api.github.com/users/benfry/events{/privacy}", "received_events_url": "https://api.github.com/users/benfry/received_events", "type": "User", "site_admin": false }, "prerelease": false, "created_at": "2017-02-12T17:37:34Z", "published_at": "2017-02-12T17:52:45Z", "assets": [ { "url": "https://api.github.com/repos/processing/processing/releases/assets/3179303", "id": 3179303, "name": "processing-3.3-linux-armv6hf.tgz", "label": null, "uploader": { "login": "gohai", "id": 4945451, "avatar_url": "https://avatars0.githubusercontent.com/u/4945451?v=3", "gravatar_id": "", "url": "https://api.github.com/users/gohai", "html_url": "https://github.com/gohai", "followers_url": "https://api.github.com/users/gohai/followers", "following_url": "https://api.github.com/users/gohai/following{/other_user}", "gists_url": "https://api.github.com/users/gohai/gists{/gist_id}", "starred_url": "https://api.github.com/users/gohai/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/gohai/subscriptions", "organizations_url": "https://api.github.com/users/gohai/orgs", "repos_url": "https://api.github.com/users/gohai/repos", "events_url": "https://api.github.com/users/gohai/events{/privacy}", "received_events_url": "https://api.github.com/users/gohai/received_events", "type": "User", "site_admin": false }, "content_type": "application/gzip", "state": "uploaded", "size": 95060631, "download_count": 12431, "created_at": "2017-02-13T03:07:00Z", "updated_at": "2017-02-13T03:20:36Z", "browser_download_url": "https://github.com/processing/processing/releases/download/mock/processing-mock-linux-armv6hf.tgz" }, { "url": "https://api.github.com/repos/processing/processing/releases/assets/3328081", "id": 3328081, "name": "processing-3.3-linux-raspbian.zip", "label": null, "uploader": { "login": "gohai", "id": 4945451, "avatar_url": "https://avatars0.githubusercontent.com/u/4945451?v=3", "gravatar_id": "", "url": "https://api.github.com/users/gohai", "html_url": "https://github.com/gohai", "followers_url": "https://api.github.com/users/gohai/followers", "following_url": "https://api.github.com/users/gohai/following{/other_user}", "gists_url": "https://api.github.com/users/gohai/gists{/gist_id}", "starred_url": "https://api.github.com/users/gohai/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/gohai/subscriptions", "organizations_url": "https://api.github.com/users/gohai/orgs", "repos_url": "https://api.github.com/users/gohai/repos", "events_url": "https://api.github.com/users/gohai/events{/privacy}", "received_events_url": "https://api.github.com/users/gohai/received_events", "type": "User", "site_admin": false }, "content_type": "application/zip", "state": "uploaded", "size": 1793287099, "download_count": 1038, "created_at": "2017-03-05T21:35:20Z", "updated_at": "2017-03-06T01:34:57Z", "browser_download_url": "https://github.com/processing/processing/releases/download/mock/processing-mock-linux-raspbian.zip" }, { "url": "https://api.github.com/repos/processing/processing/releases/assets/3176680", "id": 3176680, "name": "processing-3.3-linux32.tgz", "label": null, "uploader": { "login": "benfry", "id": 1623101, "avatar_url": "https://avatars2.githubusercontent.com/u/1623101?v=3", "gravatar_id": "", "url": "https://api.github.com/users/benfry", "html_url": "https://github.com/benfry", "followers_url": "https://api.github.com/users/benfry/followers", "following_url": "https://api.github.com/users/benfry/following{/other_user}", "gists_url": "https://api.github.com/users/benfry/gists{/gist_id}", "starred_url": "https://api.github.com/users/benfry/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/benfry/subscriptions", "organizations_url": "https://api.github.com/users/benfry/orgs", "repos_url": "https://api.github.com/users/benfry/repos", "events_url": "https://api.github.com/users/benfry/events{/privacy}", "received_events_url": "https://api.github.com/users/benfry/received_events", "type": "User", "site_admin": false }, "content_type": "application/gzip", "state": "uploaded", "size": 124782500, "download_count": 4701, "created_at": "2017-02-12T17:47:15Z", "updated_at": "2017-02-12T17:52:33Z", "browser_download_url": "https://github.com/processing/processing/releases/download/mock/processing-mock-linux32.tgz" }, { "url": "https://api.github.com/repos/processing/processing/releases/assets/3176679", "id": 3176679, "name": "processing-3.3-linux64.tgz", "label": null, "uploader": { "login": "benfry", "id": 1623101, "avatar_url": "https://avatars2.githubusercontent.com/u/1623101?v=3", "gravatar_id": "", "url": "https://api.github.com/users/benfry", "html_url": "https://github.com/benfry", "followers_url": "https://api.github.com/users/benfry/followers", "following_url": "https://api.github.com/users/benfry/following{/other_user}", "gists_url": "https://api.github.com/users/benfry/gists{/gist_id}", "starred_url": "https://api.github.com/users/benfry/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/benfry/subscriptions", "organizations_url": "https://api.github.com/users/benfry/orgs", "repos_url": "https://api.github.com/users/benfry/repos", "events_url": "https://api.github.com/users/benfry/events{/privacy}", "received_events_url": "https://api.github.com/users/benfry/received_events", "type": "User", "site_admin": false }, "content_type": "application/gzip", "state": "uploaded", "size": 122565364, "download_count": 17384, "created_at": "2017-02-12T17:47:15Z", "updated_at": "2017-02-12T17:51:08Z", "browser_download_url": "https://github.com/processing/processing/releases/download/mock/processing-mock-linux64.tgz" }, { "url": "https://api.github.com/repos/processing/processing/releases/assets/3176660", "id": 3176660, "name": "processing-3.3-macosx.zip", "label": null, "uploader": { "login": "benfry", "id": 1623101, "avatar_url": "https://avatars2.githubusercontent.com/u/1623101?v=3", "gravatar_id": "", "url": "https://api.github.com/users/benfry", "html_url": "https://github.com/benfry", "followers_url": "https://api.github.com/users/benfry/followers", "following_url": "https://api.github.com/users/benfry/following{/other_user}", "gists_url": "https://api.github.com/users/benfry/gists{/gist_id}", "starred_url": "https://api.github.com/users/benfry/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/benfry/subscriptions", "organizations_url": "https://api.github.com/users/benfry/orgs", "repos_url": "https://api.github.com/users/benfry/repos", "events_url": "https://api.github.com/users/benfry/events{/privacy}", "received_events_url": "https://api.github.com/users/benfry/received_events", "type": "User", "site_admin": false }, "content_type": "application/zip", "state": "uploaded", "size": 116564864, "download_count": 64988, "created_at": "2017-02-12T17:40:30Z", "updated_at": "2017-02-12T17:44:30Z", "browser_download_url": "https://github.com/processing/processing/releases/download/processing-0257-3.3/processing-3.3-macosx.zip" }, { "url": "https://api.github.com/repos/processing/processing/releases/assets/3176658", "id": 3176658, "name": "processing-3.3-windows32.zip", "label": null, "uploader": { "login": "benfry", "id": 1623101, "avatar_url": "https://avatars2.githubusercontent.com/u/1623101?v=3", "gravatar_id": "", "url": "https://api.github.com/users/benfry", "html_url": "https://github.com/benfry", "followers_url": "https://api.github.com/users/benfry/followers", "following_url": "https://api.github.com/users/benfry/following{/other_user}", "gists_url": "https://api.github.com/users/benfry/gists{/gist_id}", "starred_url": "https://api.github.com/users/benfry/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/benfry/subscriptions", "organizations_url": "https://api.github.com/users/benfry/orgs", "repos_url": "https://api.github.com/users/benfry/repos", "events_url": "https://api.github.com/users/benfry/events{/privacy}", "received_events_url": "https://api.github.com/users/benfry/received_events", "type": "User", "site_admin": false }, "content_type": "application/zip", "state": "uploaded", "size": 117330690, "download_count": 65864, "created_at": "2017-02-12T17:40:30Z", "updated_at": "2017-02-12T17:41:50Z", "browser_download_url": "https://github.com/processing/processing/releases/download/processing-0257-3.3/processing-3.3-windows32.zip" }, { "url": "https://api.github.com/repos/processing/processing/releases/assets/3176659", "id": 3176659, "name": "processing-3.3-windows64.zip", "label": null, "uploader": { "login": "benfry", "id": 1623101, "avatar_url": "https://avatars2.githubusercontent.com/u/1623101?v=3", "gravatar_id": "", "url": "https://api.github.com/users/benfry", "html_url": "https://github.com/benfry", "followers_url": "https://api.github.com/users/benfry/followers", "following_url": "https://api.github.com/users/benfry/following{/other_user}", "gists_url": "https://api.github.com/users/benfry/gists{/gist_id}", "starred_url": "https://api.github.com/users/benfry/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/benfry/subscriptions", "organizations_url": "https://api.github.com/users/benfry/orgs", "repos_url": "https://api.github.com/users/benfry/repos", "events_url": "https://api.github.com/users/benfry/events{/privacy}", "received_events_url": "https://api.github.com/users/benfry/received_events", "type": "User", "site_admin": false }, "content_type": "application/zip", "state": "uploaded", "size": 120877891, "download_count": 210343, "created_at": "2017-02-12T17:40:30Z", "updated_at": "2017-02-12T17:43:11Z", "browser_download_url": "https://github.com/processing/processing/releases/download/processing-0257-3.3/processing-3.3-windows64.zip" } ], "tarball_url": "https://api.github.com/repos/processing/processing/tarball/processing-0257-3.3", "zipball_url": "https://api.github.com/repos/processing/processing/zipball/processing-0257-3.3", "body": "```\r\nPROCESSING 3.3 (REV 0257) - 12 February 2017\r\n\r\nThis release adds the ability to the scale the UI or high-resolution\r\n(known as HiDPI) screens on Windows and Linux. Sketches don't scale yet,\r\nbut this will at least make the Editor and Contribution Manager usable\r\nagain on more recent Windows and Linux laptops.\r\n\r\nNote: the scaling feature is only meant to patch up problems on HiDPI\r\ndevices, it does not provide an all-purpose means for scaling UI elements\r\nindependent of the OS.\r\n\r\nThis release also attempts to fix several other Windows bugs, detailed\r\nbelow. The \"unconfirmed\" fixes section is a handful of issues that I've\r\nnever been able to reproduce, but that should now be fixed. Please\r\nconfirm at the links listed to let me know if it's working.\r\n\r\nThis is release 3.3 instead of 3.2.5 due to the huge change to the PDE\r\nfor scaling, as well as minor API modifications (see below). \r\n\r\n\r\n[ big fixes ]\r\n\r\n+ PDE was too small on high-res Windows and Linux machines. If you're\r\n having trouble with this, change the \"Interface scaling\" option in\r\n the Preferences window. On Windows, it will attempt to auto-detect. \r\n https://github.com/processing/processing/issues/2411\r\n https://github.com/processing/processing/issues/4183\r\n\r\n\r\n[ unconfirmed fixes ]\r\n\r\n+ Visual artifacts on Windows 10 when using menus\r\n https://github.com/processing/processing/issues/4700\r\n\r\n+ Broken characters in the Welcome Page and the Contribution Manager\r\n https://github.com/processing/processing/issues/4747\r\n\r\n+ Add a dialog box to warn Windows users about NVIDIA driver problems\r\n https://github.com/processing/processing/issues/4853\r\n\r\n+ Blank window on startup where the \"Welcome\" screen should be\r\n https://github.com/processing/processing/issues/3933\r\n\r\n\r\n[ minor fixes ]\r\n\r\n+ Prevent unnecessary 'file not found' errors in the console during Export\r\n\r\n\r\n[ fixed earlier ]\r\n\r\n+ Contribution Manager does not show all libraries until filter cleared\r\n https://github.com/processing/processing/issues/4840\r\n\r\n\r\n[ changes to core ]\r\n\r\n+ StringDict(TableRow) constructor to create a dictionary from a table row\r\n\r\n+ Allow lone double quotes in the midst of CSV strings. This improves\r\n compatibility with spreadsheets exported from Google Sheets. \r\n\r\n+ Return null (rather than NullPointerException) for PApplet.trim(null)\r\n\r\n+ Make trim() work on column titles as well\r\n\r\n+ Make Table.trim() also remove unused rows and columns. This will remove\r\n extra rows or columns at the beginning as well, since that's what trim()\r\n does to whitespace on strings.\r\n\r\n+ Consume Unicode BOM (0xFEFF) in createReader() and Table parser\r\n\r\n+ Return null for getString(), getJSONObject(), and getJSONArray()\r\n when key is not present, more in line w/ other API\r\n\r\n+ Several fixes for memory leaks from jdf\r\n https://github.com/processing/processing/pull/4862\r\n https://github.com/jdf/processing.py/issues/233\r\n https://github.com/processing/processing/pull/4873\r\n```\r\n" } ubuntu-make-18.09+disco1/tests/data/server-content/api.github.com/repos/superpowers/0000755000000000000000000000000013352651520025424 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/api.github.com/repos/superpowers/superpowers-app/0000755000000000000000000000000013352651520030600 5ustar ././@LongLink0000644000000000000000000000015600000000000007775 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/api.github.com/repos/superpowers/superpowers-app/releases/ubuntu-make-18.09+disco1/tests/data/server-content/api.github.com/repos/superpowers/superpowers-app/0000755000000000000000000000000013352651520030600 5ustar ././@LongLink0000644000000000000000000000016400000000000007774 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/api.github.com/repos/superpowers/superpowers-app/releases/latestubuntu-make-18.09+disco1/tests/data/server-content/api.github.com/repos/superpowers/superpowers-app/0000644000000000000000000004112013352651520030600 0ustar { "url": "https://api.github.com/repos/superpowers/superpowers-app/releases/2424025", "assets_url": "https://api.github.com/repos/superpowers/superpowers-app/releases/2424025/assets", "upload_url": "https://uploads.github.com/repos/superpowers/superpowers-app/releases/2424025/assets{?name,label}", "html_url": "https://github.com/superpowers/superpowers-app/releases/tag/vmock", "id": 2424025, "tag_name": "vmock", "target_commitish": "master", "name": "vmock — A week of Open Source", "draft": false, "author": { "login": "elisee", "id": 446986, "avatar_url": "https://avatars.githubusercontent.com/u/446986?v=3", "gravatar_id": "", "url": "https://api.github.com/users/elisee", "html_url": "https://github.com/elisee", "followers_url": "https://api.github.com/users/elisee/followers", "following_url": "https://api.github.com/users/elisee/following{/other_user}", "gists_url": "https://api.github.com/users/elisee/gists{/gist_id}", "starred_url": "https://api.github.com/users/elisee/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/elisee/subscriptions", "organizations_url": "https://api.github.com/users/elisee/orgs", "repos_url": "https://api.github.com/users/elisee/repos", "events_url": "https://api.github.com/users/elisee/events{/privacy}", "received_events_url": "https://api.github.com/users/elisee/received_events", "type": "User", "site_admin": false }, "prerelease": false, "created_at": "2016-01-14T00:18:59Z", "published_at": "2016-01-14T03:21:49Z", "assets": [ { "url": "https://api.github.com/repos/superpowers/superpowers-app/releases/assets/1308704", "id": 1308704, "name": "superpowers-mock-app.zip", "label": null, "uploader": { "login": "bilou84", "id": 11774622, "avatar_url": "https://avatars.githubusercontent.com/u/11774622?v=3", "gravatar_id": "", "url": "https://api.github.com/users/bilou84", "html_url": "https://github.com/bilou84", "followers_url": "https://api.github.com/users/bilou84/followers", "following_url": "https://api.github.com/users/bilou84/following{/other_user}", "gists_url": "https://api.github.com/users/bilou84/gists{/gist_id}", "starred_url": "https://api.github.com/users/bilou84/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/bilou84/subscriptions", "organizations_url": "https://api.github.com/users/bilou84/orgs", "repos_url": "https://api.github.com/users/bilou84/repos", "events_url": "https://api.github.com/users/bilou84/events{/privacy}", "received_events_url": "https://api.github.com/users/bilou84/received_events", "type": "User", "site_admin": false }, "content_type": "application/x-zip-compressed", "state": "uploaded", "size": 8506907, "download_count": 86, "created_at": "2016-02-13T18:46:23Z", "updated_at": "2016-02-13T18:47:38Z", "browser_download_url": "https://github.com/superpowers/superpowers-app/releases/download/vmock/superpowers-mock-app.zip" }, { "url": "https://api.github.com/repos/superpowers/superpowers-app/releases/assets/1208948", "id": 1208948, "name": "superpowers-mock-linux-ia32.zip", "label": null, "uploader": { "login": "elisee", "id": 446986, "avatar_url": "https://avatars.githubusercontent.com/u/446986?v=3", "gravatar_id": "", "url": "https://api.github.com/users/elisee", "html_url": "https://github.com/elisee", "followers_url": "https://api.github.com/users/elisee/followers", "following_url": "https://api.github.com/users/elisee/following{/other_user}", "gists_url": "https://api.github.com/users/elisee/gists{/gist_id}", "starred_url": "https://api.github.com/users/elisee/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/elisee/subscriptions", "organizations_url": "https://api.github.com/users/elisee/orgs", "repos_url": "https://api.github.com/users/elisee/repos", "events_url": "https://api.github.com/users/elisee/events{/privacy}", "received_events_url": "https://api.github.com/users/elisee/received_events", "type": "User", "site_admin": false }, "content_type": "application/x-zip-compressed", "state": "uploaded", "size": 69206121, "download_count": 402, "created_at": "2016-01-14T00:58:35Z", "updated_at": "2016-01-14T01:10:13Z", "browser_download_url": "https://github.com/superpowers/superpowers-app/releases/download/vmock/superpowers-mock-linux-ia32.zip" }, { "url": "https://api.github.com/repos/superpowers/superpowers-app/releases/assets/1209114", "id": 1209114, "name": "superpowers-mock-linux-x64.zip", "label": null, "uploader": { "login": "elisee", "id": 446986, "avatar_url": "https://avatars.githubusercontent.com/u/446986?v=3", "gravatar_id": "", "url": "https://api.github.com/users/elisee", "html_url": "https://github.com/elisee", "followers_url": "https://api.github.com/users/elisee/followers", "following_url": "https://api.github.com/users/elisee/following{/other_user}", "gists_url": "https://api.github.com/users/elisee/gists{/gist_id}", "starred_url": "https://api.github.com/users/elisee/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/elisee/subscriptions", "organizations_url": "https://api.github.com/users/elisee/orgs", "repos_url": "https://api.github.com/users/elisee/repos", "events_url": "https://api.github.com/users/elisee/events{/privacy}", "received_events_url": "https://api.github.com/users/elisee/received_events", "type": "User", "site_admin": false }, "content_type": "application/x-zip-compressed", "state": "uploaded", "size": 68747873, "download_count": 2030, "created_at": "2016-01-14T02:08:36Z", "updated_at": "2016-01-14T02:18:21Z", "browser_download_url": "https://github.com/superpowers/superpowers-app/releases/download/vmock/superpowers-mock-linux-x64.zip" }, { "url": "https://api.github.com/repos/superpowers/superpowers-app/releases/assets/1209188", "id": 1209188, "name": "superpowers-mock-osx-x64.zip", "label": null, "uploader": { "login": "elisee", "id": 446986, "avatar_url": "https://avatars.githubusercontent.com/u/446986?v=3", "gravatar_id": "", "url": "https://api.github.com/users/elisee", "html_url": "https://github.com/elisee", "followers_url": "https://api.github.com/users/elisee/followers", "following_url": "https://api.github.com/users/elisee/following{/other_user}", "gists_url": "https://api.github.com/users/elisee/gists{/gist_id}", "starred_url": "https://api.github.com/users/elisee/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/elisee/subscriptions", "organizations_url": "https://api.github.com/users/elisee/orgs", "repos_url": "https://api.github.com/users/elisee/repos", "events_url": "https://api.github.com/users/elisee/events{/privacy}", "received_events_url": "https://api.github.com/users/elisee/received_events", "type": "User", "site_admin": false }, "content_type": "application/zip", "state": "uploaded", "size": 56477197, "download_count": 2029, "created_at": "2016-01-14T02:34:28Z", "updated_at": "2016-01-14T02:42:31Z", "browser_download_url": "https://github.com/superpowers/superpowers-app/releases/download/vmock/superpowers-mock-osx-x64.zip" }, { "url": "https://api.github.com/repos/superpowers/superpowers-app/releases/assets/1209066", "id": 1209066, "name": "superpowers-mock-win-ia32.zip", "label": null, "uploader": { "login": "elisee", "id": 446986, "avatar_url": "https://avatars.githubusercontent.com/u/446986?v=3", "gravatar_id": "", "url": "https://api.github.com/users/elisee", "html_url": "https://github.com/elisee", "followers_url": "https://api.github.com/users/elisee/followers", "following_url": "https://api.github.com/users/elisee/following{/other_user}", "gists_url": "https://api.github.com/users/elisee/gists{/gist_id}", "starred_url": "https://api.github.com/users/elisee/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/elisee/subscriptions", "organizations_url": "https://api.github.com/users/elisee/orgs", "repos_url": "https://api.github.com/users/elisee/repos", "events_url": "https://api.github.com/users/elisee/events{/privacy}", "received_events_url": "https://api.github.com/users/elisee/received_events", "type": "User", "site_admin": false }, "content_type": "application/x-zip-compressed", "state": "uploaded", "size": 58303602, "download_count": 1831, "created_at": "2016-01-14T01:51:28Z", "updated_at": "2016-01-14T01:59:49Z", "browser_download_url": "https://github.com/superpowers/superpowers-app/releases/download/vmock/superpowers-mock-win-ia32.zip" }, { "url": "https://api.github.com/repos/superpowers/superpowers-app/releases/assets/1209052", "id": 1209052, "name": "superpowers-mock-win-x64.zip", "label": null, "uploader": { "login": "elisee", "id": 446986, "avatar_url": "https://avatars.githubusercontent.com/u/446986?v=3", "gravatar_id": "", "url": "https://api.github.com/users/elisee", "html_url": "https://github.com/elisee", "followers_url": "https://api.github.com/users/elisee/followers", "following_url": "https://api.github.com/users/elisee/following{/other_user}", "gists_url": "https://api.github.com/users/elisee/gists{/gist_id}", "starred_url": "https://api.github.com/users/elisee/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/elisee/subscriptions", "organizations_url": "https://api.github.com/users/elisee/orgs", "repos_url": "https://api.github.com/users/elisee/repos", "events_url": "https://api.github.com/users/elisee/events{/privacy}", "received_events_url": "https://api.github.com/users/elisee/received_events", "type": "User", "site_admin": false }, "content_type": "application/x-zip-compressed", "state": "uploaded", "size": 66509528, "download_count": 7238, "created_at": "2016-01-14T01:40:50Z", "updated_at": "2016-01-14T01:50:28Z", "browser_download_url": "https://github.com/superpowers/superpowers-app/releases/download/vmock/superpowers-mock-win-x64.zip" } ], "tarball_url": "https://api.github.com/repos/superpowers/superpowers-app/tarball/vmock", "zipball_url": "https://api.github.com/repos/superpowers/superpowers-app/zipball/vmock", "body": "## First week of Open Source\r\n\r\nIt's been almost a full week since we went open source. Some highlights:\r\n\r\n * :star2: Superpowers has been [starred over 500 times](https://github.com/superpowers/superpowers/stargazers), taking [the top weekly spot for TypeScript](https://github.com/trending?l=typescript&since=weekly)\r\n * :+1: We [were on the front page of Hacker News](https://news.ycombinator.com/item?id=10882766), [the top of r/gamedev](https://www.reddit.com/r/gamedev/comments/3zw1b2/superpowers_html5_2d3d_game_maker_going_open/) and featured in [HTML5Weekly](http://html5weekly.com/issues/222)\r\n * :heart: Our [all-new Patreon page](http://patreon.com/SparklinLabs) went from $0 to $167/month and we [received over 40 donations](sparklinlabs.itch.io/superpowers).\r\n * :octocat: 36 pull requests were submitted across all repos, 32 of them have been merged or closed\r\n * :chart_with_upwards_trend: Superpowers has been downloaded ~4000 times!\r\n\r\nWe're thrilled with the warm welcome and the many contributions popping up!\r\n\r\nAll commits in this release: https://github.com/superpowers/superpowers/compare/v0.18.1...vmock and https://github.com/superpowers/superpowers-game/compare/v0.18.1...vmock\r\n\r\n## Continuous integration!\r\n\r\nThanks to @BaptisteDixneuf (#26) and some work on our end to [correctly report build errors](https://github.com/superpowers/superpowers/commit/24b518930a4a63f2538d1961d5ff830d7a9860ad), every pull request and push made to the app repository is [now automatically checked for build errors on Travis](https://travis-ci.org/superpowers/superpowers). The other repositories will be following soon.\r\n\r\n## Registry and system installation\r\n\r\nFollowing an interesting experiment by @risq (#15), we've spent more time exploring how systems and plugins should be installed and updated. We've set up [a registry of systems and plugins](https://github.com/superpowers/superpowers/blob/master/registry.json) and added support for installing systems from the command line:\r\n\r\n```bash\r\n# List all available systems from the registry\r\nnode server install\r\n# Install Superpowers LÖVE\r\nnode server install love2d\r\n```\r\n\r\nSystem releases are automatically fetched from GitHub. Support for installing individual plugins, as well as updating it all, is planned for soon. The redesigned launcher will feature a graphical user interface to manage it all.\r\n\r\n**NOTE:** If you run your server from the command line, you must now start it with `node server start` rather than just `node server`.\r\n\r\n## Work on the redesigned launcher\r\n\r\nCoding on the [upcoming redesigned launcher](https://github.com/superpowers/superpowers-launcher) itself hasn't resumed yet but community member Kilkonie has started [a very interesting discussion](http://itch.io/t/13632/startup-sequence) and created some quality mockups:\r\n\r\n![](http://i.imgur.com/SHZtfma.png)\r\n\r\n## Noteworthy fixes and improvements in this release\r\n\r\n * **Superpowers** ([all commits](https://github.com/superpowers/superpowers/compare/v0.18.1...vmock))\r\n * The app of Superpowers is now available [in 8 different languages!](https://github.com/superpowers/superpowers/tree/master/public/locales)\r\n * There is now a 32-bit package for Linux\r\n * Dashes are now accepted in usernames and there's better feedback for invalid usernames.\r\n * You can now use an URL ending with `?build=latest` to access the latest build of a project\r\n * The Documentation tool actually displays something again\r\n * You can now open the documentation page for an editor by pressing F1 while it is focused\r\n * Cut-Copy-Paste in the OS X app has been fixed\r\n * A crash when exporting on OS X has been fixed\r\n * Worked around a major layout bug in Microsoft Edge. Oh and [Superpowers runs on Xbox One!](http://itch.io/t/13535/solved-updates-for-edge-support-further-down-the-line-pcxbox-one)\r\n * Project migration should now be more robust\r\n * Now shipping with Electron v0.36.3\r\n * **Superpowers Game** ([all commits](https://github.com/superpowers/superpowers-game/compare/v0.18.1...vmock))\r\n * The \"Stretch\" transform mode in the cubic model editor has been fixed\r\n * The API for editing shader uniforms has been improved\r\n\r\n## For plugin developers\r\n\r\n### Documentation\r\n\r\n[The documentation for extending Superpowers](http://docs.superpowers-html5.com/en/development/extending-superpowers) has been massively improved. [A repository has been created](https://github.com/superpowers/superpowers-dummy) to host a simple and heavily-commented example system. Work on it will start soon.\r\n\r\n### Setting up new systems and plugins easily\r\n\r\nThe server has gained a new command for generating the basic structure of a system or plugin:\r\n\r\n * `node server init $SYSTEM_ID` will generate a new system skeleton in `systems/$SYSTEM_ID`\r\n * `node server init $SYSTEM_ID:$AUTHOR/$NAME` will generate a new plugin skeleton in `systems/$SYSTEM_ID/plugins/$AUTHOR/$NAME`\r\n\r\n### Systems now require a `package.json` file\r\n\r\nSee Superpowers Dummy's [package.json](https://github.com/superpowers/superpowers-dummy/blob/master/package.json) for an example.\r\n\r\n * `superpowers.systemId` must contain a unique lowercase identifier for the system\r\n * `publishedPluginBundles` was added in v0.18.0 and lists the names of the Browserify-ied JavaScript bundles that should be published for runtime use for each plugin when exporting the project. Previously, this list was hard-coded." } ubuntu-make-18.09+disco1/tests/data/server-content/beta.unity3d.com/0000755000000000000000000000000013352651520022155 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/beta.unity3d.com/download/0000755000000000000000000000000013352651520023764 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/beta.unity3d.com/download/e06241adb51f/0000755000000000000000000000000013352651520025570 5ustar ././@LongLink0000644000000000000000000000016000000000000007770 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/beta.unity3d.com/download/e06241adb51f/LinuxEditorInstaller/ubuntu-make-18.09+disco1/tests/data/server-content/beta.unity3d.com/download/e06241adb51f/LinuxEdito0000755000000000000000000000000013352651520027575 5ustar ././@LongLink0000644000000000000000000000017400000000000007775 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/beta.unity3d.com/download/e06241adb51f/LinuxEditorInstaller/Unity.tar.xzubuntu-make-18.09+disco1/tests/data/server-content/beta.unity3d.com/download/e06241adb51f/LinuxEdito0000644000000000000000000000047413352651520027604 0ustar ý7zXZæÖ´F!t/å£à'ÿù]"™ 'w÷ºém8"R¯ t iU—fÓpÒ/ÍÎ}ÚhŸaýkˆ6p’Ôÿ[º§~GFÛѺÕM~ø‹ "Ã1_ņ$º«æÏ›O‹T‚raê°ç2;Ýt †eÅ(àLX¶g—hïÇׯ½¡‰è¨è1Ï–ßéèSÅãjR纋7!¬imÌËøƒï-èüî\Ð[o/mÙǨÃÍ…ëƒj‡ôj:}ŸÛGˆqW¡ó‹¹9w1c"ø'« Wï÷§õÓ Ë“Ð!F(‹ÖªýT9¯ÃAõH›?‡²‘¿BâkQh~™MÏp†ÌÕ•€PƘÛu±ÄgûYZ././@LongLink0000644000000000000000000000015700000000000007776 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/beta.unity3d.com/download/e06241adb51f/public_download.htmlubuntu-make-18.09+disco1/tests/data/server-content/beta.unity3d.com/download/e06241adb51f/public_dow0000644000000000000000000000124213352651520027641 0ustar

Unity 5.5.2xf1Linux Linux Editor downloads

Welcome to the Linux Editor download repository. Here, you will find the download links to experimental releases of the Linux Editor.

Debian Package

Linux Editor Installer (.deb package)

Platform-Agnostic Self-Extracting Shell Script

Linux Editor Installer (self-extracting shell script)
ubuntu-make-18.09+disco1/tests/data/server-content/biggerfile0000644000000000000000000002145013352651520021113 0ustar aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaubuntu-make-18.09+disco1/tests/data/server-content/bitbucket.org/0000755000000000000000000000000013352651520021631 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/bitbucket.org/ariya/0000755000000000000000000000000013352651520022736 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/bitbucket.org/ariya/phantomjs/0000755000000000000000000000000013352651520024741 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/bitbucket.org/ariya/phantomjs/downloads/0000755000000000000000000000000013352651520026733 5ustar ././@LongLink0000644000000000000000000000017500000000000007776 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/bitbucket.org/ariya/phantomjs/downloads/phantomjs-mock-linux-i686.tar.bz2ubuntu-make-18.09+disco1/tests/data/server-content/bitbucket.org/ariya/phantomjs/downloads/phantomjs0000777000000000000000000000000013352651520037105 2phantomjs-mock-linux-x86_64.tar.bz2ustar ././@LongLink0000644000000000000000000000017700000000000010000 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/bitbucket.org/ariya/phantomjs/downloads/phantomjs-mock-linux-x86_64.tar.bz2ubuntu-make-18.09+disco1/tests/data/server-content/bitbucket.org/ariya/phantomjs/downloads/phantomjs0000644000000000000000000000044213352651520030661 0ustar BZh61AY&SY_Is ŒÄ|ÿŠ w÷ÞÀ0ú¶Á’(õ=M©£F€6§©dõ4ÔÊj~©‚a†FhÂda6§¨§©£ =OPhɵý´ç¸Î†Š•Sµ¤in¾ZKâÔ6¤GU“Ûøðƒä¡XªeÁ–”Áî†éOæð NÄO(n•5ë^Á”ÃnBc°¦©Îc²8I}ç€mƒ Á ƒ[aI³jÙ‹#% S(Ú¼ïrÊwEò“m€]x ,èÊÔ³÷D­²ˆá‘¿ò ­ñÜVbe@P †Uó|ç ´;úìÉ'›i{·]‘ Ùu"EÜ‘N$ÒFœÀubuntu-make-18.09+disco1/tests/data/server-content/bitbucket.org/klembot/0000755000000000000000000000000013352651520023266 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/bitbucket.org/klembot/twinejs/0000755000000000000000000000000013352651520024751 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/bitbucket.org/klembot/twinejs/downloads/0000755000000000000000000000000013352651520026743 5ustar ././@LongLink0000644000000000000000000000016200000000000007772 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/bitbucket.org/klembot/twinejs/downloads/twine_fake_linux32.zipubuntu-make-18.09+disco1/tests/data/server-content/bitbucket.org/klembot/twinejs/downloads/twine_fak0000777000000000000000000000000013352651520035063 2twine_fake_linux64.zipustar ././@LongLink0000644000000000000000000000016200000000000007772 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/bitbucket.org/klembot/twinejs/downloads/twine_fake_linux64.zipubuntu-make-18.09+disco1/tests/data/server-content/bitbucket.org/klembot/twinejs/downloads/twine_fak0000644000000000000000000002400013352651520030631 0ustar twine-foo/0000775000175000017500000000000012616634105013161 5ustar didrocksdidrockstwine-foo/Twine0000775000175000017500000000002412616634105014171 0ustar didrocksdidrocks#!/bin/sh sleep 60 ubuntu-make-18.09+disco1/tests/data/server-content/code.visualstudio.com/0000755000000000000000000000000013352651520023310 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/code.visualstudio.com/License0000644000000000000000000003456513352651520024632 0ustar Index

MICROSOFT PRE-RELEASE SOFTWARE LICENSE TERMS

MICROSOFT VISUAL STUDIO CODE PREVIEW

These license terms are an agreement between Microsoft Corporation (or based on where you live, one of its affiliates) and you. They apply to the software named above. The terms also apply to any Microsoft services or updates for the software, except to the extent those have additional terms.

IF YOU COMPLY WITH THESE LICENSE TERMS, YOU HAVE THE RIGHTS BELOW.

  1. INSTALLATION AND USE RIGHTS.
    1. General. You may use the software to develop and test your applications.
    2. Demo use. The uses permitted above include use of the software in demonstrating your applications.
    3. Backup copy. You may make one backup copy of the software, for reinstalling the software.
    4. Third Party Programs.
      1. The software may include third party components with separate legal notices or governed by other agreements, as described in the ThirdPartyNotices file accompanying the software. Even if such components are governed by other agreements, the disclaimers and the limitations on and exclusions of damages below also apply.
      2. The software contains third party components licensed under open source licenses with source code availability obligations. Copies of those licenses are included in the ThirdPartyNotices file or accompanying credits file. You may obtain the complete corresponding source code from us if and as required under the relevant open source licenses by sending a money order or check for $5.00 to: Source Code Compliance Team, Microsoft Corporation, 1 Microsoft Way, Redmond, WA 98052 USA. Please write third party source code for Visual Studio Code in the memo line of your payment. We may also make the source available at http://thirdpartysource.microsoft.com/.
  2. TERM. The term of this agreement is until 30/04/2016 (day/month/year) or next public release of the software, whichever is first.
  3. PRE-RELEASE SOFTWARE. This software is a pre-release version. It may not operate correctly or work the way a final version of the software will. Microsoft may change it for the final, commercial version. Microsoft also may not release a commercial version. Microsoft is not obligated to provide maintenance, technical support or updates to you for the software.
  4. DATA. The software may collect information about you and your use of the software, and send that to Microsoft. Microsoft may use this information to provide services and improve our products and services. For this pre-release version, users cannot opt out of data collection. Some features in the software may enable collection of data from users of applications you develop using the software. If you use these features to enable data collection in your applications, you must comply with applicable law, including providing appropriate notices to users of your applications. You can learn more about data collection and use in the help documentation and the privacy statement at http://go.microsoft.com/fwlink/?LinkID=528096&clcid=0x409. Your use of the software operates as your consent to these practices.
  5. FEEDBACK. If you give feedback about the software to Microsoft, you give to Microsoft, without charge, the right to use, share and commercialize your feedback in any way and for any purpose. You also give to third parties, without charge, any patent rights needed for their products, technologies and services to use or interface with any specific parts of a Microsoft software or service that includes the feedback. You will not give feedback that is subject to a license that requires Microsoft to license its software or documentation to third parties because we include your feedback in them. These rights survive this agreement.
  6. SCOPE OF LICENSE. The software is licensed, not sold. This agreement only gives you some rights to use the software. Microsoft reserves all other rights. Unless applicable law gives you more rights despite this limitation, you may use the software only as expressly permitted in this agreement. In doing so, you must comply with any technical limitations in the software that only allow you to use it in certain ways. You may not
    • work around any technical limitations in the software;
    • reverse engineer, decompile or disassemble the software, or otherwise attempt to derive the source code for the software except, and solely to the extent: (i) permitted by applicable law, despite this limitation; or (ii) required to debug changes to any libraries licensed under the GNU Lesser General Public License which are included with and linked to by the software;
    • remove, minimize, block or modify any notices of Microsoft or its suppliers in the software;
    • use the software in any way that is against the law; or
    • share, publish, or lend the software, or provide it as a hosted solution for others to use, or transfer the software or this agreement to any third party.
  7. SUPPORT SERVICES. Because this software is as is, we may not provide support services for it.
  8. ENTIRE AGREEMENT. This agreement, and the terms for supplements, updates, Internet-based services and support services that you use, are the entire agreement for the software and support services.
  9. EXPORT RESTRICTIONS. Microsoft software, online services, professional services and related technology are subject to U.S. export jurisdiction. You must comply with all applicable international and national laws including the U.S. Export Administration Regulations, the International Traffic in Arms Regulations, Office of Foreign Assets Control sanction programs, and end-user, end use and destination restrictions by the U.S. and other governments related to Microsoft products, services and technologies. For additional information, see http://www.microsoft.com/exporting.
  10. APPLICABLE LAW. If you acquired the software in the United States, Washington law applies to interpretation of and claims for breach of this agreement, and the laws of the state where you live apply to all other claims. If you acquired the software in any other country, its laws apply.
  11. LEGAL EFFECT. This agreement describes certain legal rights. You may have other rights under the laws of your state or country. This agreement does not change your rights under the laws of your state or country if the laws of your state or country do not permit it to do so. Without limitation of the foregoing, for Australia, YOU HAVE STATUTORY GUARANTEES UNDER THE AUSTRALIAN CONSUMER LAW AND NOTHING IN THESE TERMS IS INTENDED TO AFFECT THOSE RIGHTS.
  12. DISCLAIMER OF WARRANTY. THE SOFTWARE IS LICENSED AS-IS. YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
  13. LIMITATION ON AND EXCLUSION OF DAMAGES. YOU CAN RECOVER FROM MICROSOFT AND ITS SUPPLIERS ONLY DIRECT DAMAGES UP TO U.S. $5.00. YOU CANNOT RECOVER ANY OTHER DAMAGES, INCLUDING CONSEQUENTIAL, LOST PROFITS, SPECIAL, INDIRECT OR INCIDENTAL DAMAGES.

    This limitation applies to (a) anything related to the software, services, content (including code) on third party Internet sites, or third party applications; and (b) claims for breach of contract, breach of warranty, guarantee or condition, strict liability, negligence, or other tort to the extent permitted by applicable law. It also applies even if Microsoft knew or should have known about the possibility of the damages. The above limitation or exclusion may not apply to you because your state or country may not allow the exclusion or limitation of incidental, consequential or other damages.

* * *

ubuntu-make-18.09+disco1/tests/data/server-content/data.services.jetbrains.com/0000755000000000000000000000000013352651520024357 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/data.services.jetbrains.com/products/0000755000000000000000000000000013352651520026222 5ustar ././@LongLink0000644000000000000000000000015100000000000007770 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/data.services.jetbrains.com/products/releases?code=CLubuntu-make-18.09+disco1/tests/data/server-content/data.services.jetbrains.com/products/releases?cod0000644000000000000000000000121013352651520030527 0ustar {"CL":[{"date":"2015-12-10","type":"release","downloads":{"windows":{"link":"https://download.jetbrains.com/cpp/clion-1.2.2.exe","size":175081456,"checksumLink":"https://download.jetbrains.com/cpp/clion-1.2.2.exe.sha256"},"mac":{"link":"https://download.jetbrains.com/cpp/CLion-1.2.2-custom-jdk-bundled.dmg","size":227019443,"checksumLink":"https://download.jetbrains.com/cpp/CLion-1.2.2-custom-jdk-bundled.dmg.sha256"},"linux":{"link":"https://download.jetbrains.com/cpp/clion-fake.tar.gz","size":220687306,"checksumLink":"https://download.jetbrains.com/cpp/clion-fake.tar.gz.sha256"}},"version":"1.2.2","majorVersion":"1.2","build":"143.1184"}]} ././@LongLink0000644000000000000000000000016200000000000007772 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/data.services.jetbrains.com/products/releases?code=CL&type=eapubuntu-make-18.09+disco1/tests/data/server-content/data.services.jetbrains.com/products/releases?cod0000644000000000000000000000121013352651520030527 0ustar {"CL":[{"date":"2015-12-10","type":"release","downloads":{"windows":{"link":"https://download.jetbrains.com/cpp/clion-1.2.2.exe","size":175081456,"checksumLink":"https://download.jetbrains.com/cpp/clion-1.2.2.exe.sha256"},"mac":{"link":"https://download.jetbrains.com/cpp/CLion-1.2.2-custom-jdk-bundled.dmg","size":227019443,"checksumLink":"https://download.jetbrains.com/cpp/CLion-1.2.2-custom-jdk-bundled.dmg.sha256"},"linux":{"link":"https://download.jetbrains.com/cpp/clion-fake.tar.gz","size":220687306,"checksumLink":"https://download.jetbrains.com/cpp/clion-fake.tar.gz.sha256"}},"version":"1.2.2","majorVersion":"1.2","build":"143.1184"}]} ././@LongLink0000644000000000000000000000015100000000000007770 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/data.services.jetbrains.com/products/releases?code=DGubuntu-make-18.09+disco1/tests/data/server-content/data.services.jetbrains.com/products/releases?cod0000644000000000000000000000124413352651520030536 0ustar {"DG":[{"date":"2016-01-27","type":"release","downloads":{"windows":{"link":"https://download.jetbrains.com/datagrip/datagrip-1.0.2.exe","size":127639968,"checksumLink":"https://download.jetbrains.com/datagrip/datagrip-1.0.2.exe.sha256"},"mac":{"link":"https://download.jetbrains.com/datagrip/datagrip-1.0.2-custom-jdk-bundled.dmg","size":142337722,"checksumLink":"https://download.jetbrains.com/datagrip/datagrip-1.0.2-custom-jdk-bundled.dmg.sha256"},"linux":{"link":"https://download.jetbrains.com/datagrip/datagrip-fake.tar.gz","size":136235809,"checksumLink":"https://download.jetbrains.com/datagrip/datagrip-fake.tar.gz.sha256"}},"version":"1.0.2","majorVersion":"1.0"}]}././@LongLink0000644000000000000000000000016200000000000007772 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/data.services.jetbrains.com/products/releases?code=DG&type=eapubuntu-make-18.09+disco1/tests/data/server-content/data.services.jetbrains.com/products/releases?cod0000644000000000000000000000124413352651520030536 0ustar {"DG":[{"date":"2016-01-27","type":"release","downloads":{"windows":{"link":"https://download.jetbrains.com/datagrip/datagrip-1.0.2.exe","size":127639968,"checksumLink":"https://download.jetbrains.com/datagrip/datagrip-1.0.2.exe.sha256"},"mac":{"link":"https://download.jetbrains.com/datagrip/datagrip-1.0.2-custom-jdk-bundled.dmg","size":142337722,"checksumLink":"https://download.jetbrains.com/datagrip/datagrip-1.0.2-custom-jdk-bundled.dmg.sha256"},"linux":{"link":"https://download.jetbrains.com/datagrip/datagrip-fake.tar.gz","size":136235809,"checksumLink":"https://download.jetbrains.com/datagrip/datagrip-fake.tar.gz.sha256"}},"version":"1.0.2","majorVersion":"1.0"}]}././@LongLink0000644000000000000000000000015100000000000007770 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/data.services.jetbrains.com/products/releases?code=GOubuntu-make-18.09+disco1/tests/data/server-content/data.services.jetbrains.com/products/releases?cod0000644000000000000000000000117413352651520030540 0ustar {"GO":[{"date":"2017-03-22","type":"eap","downloads":{"windows":{"link":"https://download.jetbrains.com/go/goland-171.3780.106.exe","size":133999656,"checksumLink":"https://download.jetbrains.com/go/goland-171.3780.106.exe.sha256"},"mac":{"link":"https://download.jetbrains.com/go/goland-171.3780.106.dmg","size":169664088,"checksumLink":"https://download.jetbrains.com/go/goland-171.3780.106.dmg.sha256"},"linux":{"link":"https://download.jetbrains.com/go/goland-mock.tar.gz","size":180118206,"checksumLink":"https://download.jetbrains.com/go/goland-mock.tar.gz.sha256"}},"version":"1.0","majorVersion":"1.0","build":"171.3780.106"}]} ././@LongLink0000644000000000000000000000016200000000000007772 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/data.services.jetbrains.com/products/releases?code=GO&type=eapubuntu-make-18.09+disco1/tests/data/server-content/data.services.jetbrains.com/products/releases?cod0000644000000000000000000000117413352651520030540 0ustar {"GO":[{"date":"2017-03-22","type":"eap","downloads":{"windows":{"link":"https://download.jetbrains.com/go/goland-171.3780.106.exe","size":133999656,"checksumLink":"https://download.jetbrains.com/go/goland-171.3780.106.exe.sha256"},"mac":{"link":"https://download.jetbrains.com/go/goland-171.3780.106.dmg","size":169664088,"checksumLink":"https://download.jetbrains.com/go/goland-171.3780.106.dmg.sha256"},"linux":{"link":"https://download.jetbrains.com/go/goland-mock.tar.gz","size":180118206,"checksumLink":"https://download.jetbrains.com/go/goland-mock.tar.gz.sha256"}},"version":"1.0","majorVersion":"1.0","build":"171.3780.106"}]} ././@LongLink0000644000000000000000000000015200000000000007771 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/data.services.jetbrains.com/products/releases?code=IICubuntu-make-18.09+disco1/tests/data/server-content/data.services.jetbrains.com/products/releases?cod0000644000000000000000000000122713352651520030537 0ustar {"IIC":[{"date":"2015-12-08","type":"release","downloads":{"windows":{"link":"https://download.jetbrains.com/idea/ideaIC-15.0.2.exe","size":247237112,"checksumLink":"https://download.jetbrains.com/idea/ideaIC-15.0.2.exe.sha256"},"mac":{"link":"https://download.jetbrains.com/idea/ideaIC-15.0.2-custom-jdk-bundled.dmg","size":283902393,"checksumLink":"https://download.jetbrains.com/idea/ideaIC-15.0.2-custom-jdk-bundled.dmg.sha256"},"linux":{"link":"https://download.jetbrains.com/idea/idea-fake.tar.gz","size":230939309,"checksumLink":"https://download.jetbrains.com/idea/idea-fake.tar.gz.sha256"}},"version":"15.0.2","majorVersion":"15.0","build":"143.1184"}]} ././@LongLink0000644000000000000000000000016300000000000007773 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/data.services.jetbrains.com/products/releases?code=IIC&type=eapubuntu-make-18.09+disco1/tests/data/server-content/data.services.jetbrains.com/products/releases?cod0000644000000000000000000000122713352651520030537 0ustar {"IIC":[{"date":"2015-12-08","type":"release","downloads":{"windows":{"link":"https://download.jetbrains.com/idea/ideaIC-15.0.2.exe","size":247237112,"checksumLink":"https://download.jetbrains.com/idea/ideaIC-15.0.2.exe.sha256"},"mac":{"link":"https://download.jetbrains.com/idea/ideaIC-15.0.2-custom-jdk-bundled.dmg","size":283902393,"checksumLink":"https://download.jetbrains.com/idea/ideaIC-15.0.2-custom-jdk-bundled.dmg.sha256"},"linux":{"link":"https://download.jetbrains.com/idea/idea-fake.tar.gz","size":230939309,"checksumLink":"https://download.jetbrains.com/idea/idea-fake.tar.gz.sha256"}},"version":"15.0.2","majorVersion":"15.0","build":"143.1184"}]} ././@LongLink0000644000000000000000000000015200000000000007771 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/data.services.jetbrains.com/products/releases?code=IIUubuntu-make-18.09+disco1/tests/data/server-content/data.services.jetbrains.com/products/releases?cod0000644000000000000000000000125113352651520030534 0ustar {"IIU":[{"date":"2015-12-08","type":"release","downloads":{"windows":{"link":"https://download.jetbrains.com/idea/ideaIU-15.0.2.exe","size":386606040,"checksumLink":"https://download.jetbrains.com/idea/ideaIU-15.0.2.exe.sha256"},"mac":{"link":"https://download.jetbrains.com/idea/ideaIU-15.0.2-custom-jdk-bundled.dmg","size":438180436,"checksumLink":"https://download.jetbrains.com/idea/ideaIU-15.0.2-custom-jdk-bundled.dmg.sha256"},"linux":{"link":"https://download.jetbrains.com/idea/idea-ultimate-fake.tar.gz","size":390459277,"checksumLink":"https://download.jetbrains.com/idea/idea-ultimate-fake.tar.gz.sha256"}},"version":"15.0.2","majorVersion":"15.0","build":"143.1184"}]} ././@LongLink0000644000000000000000000000016300000000000007773 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/data.services.jetbrains.com/products/releases?code=IIU&type=eapubuntu-make-18.09+disco1/tests/data/server-content/data.services.jetbrains.com/products/releases?cod0000644000000000000000000000125113352651520030534 0ustar {"IIU":[{"date":"2015-12-08","type":"release","downloads":{"windows":{"link":"https://download.jetbrains.com/idea/ideaIU-15.0.2.exe","size":386606040,"checksumLink":"https://download.jetbrains.com/idea/ideaIU-15.0.2.exe.sha256"},"mac":{"link":"https://download.jetbrains.com/idea/ideaIU-15.0.2-custom-jdk-bundled.dmg","size":438180436,"checksumLink":"https://download.jetbrains.com/idea/ideaIU-15.0.2-custom-jdk-bundled.dmg.sha256"},"linux":{"link":"https://download.jetbrains.com/idea/idea-ultimate-fake.tar.gz","size":390459277,"checksumLink":"https://download.jetbrains.com/idea/idea-ultimate-fake.tar.gz.sha256"}},"version":"15.0.2","majorVersion":"15.0","build":"143.1184"}]} ././@LongLink0000644000000000000000000000015200000000000007771 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/data.services.jetbrains.com/products/releases?code=PCCubuntu-make-18.09+disco1/tests/data/server-content/data.services.jetbrains.com/products/releases?cod0000644000000000000000000000130113352651520030530 0ustar {"PCC":[{"date":"2015-12-10","type":"release","downloads":{"windows":{"link":"https://download.jetbrains.com/python/pycharm-community-5.0.2.exe","size":169759968,"checksumLink":"https://download.jetbrains.com/python/pycharm-community-5.0.2.exe.sha256"},"mac":{"link":"https://download.jetbrains.com/python/pycharm-community-5.0.2-jdk-bundled.dmg","size":170811847,"checksumLink":"https://download.jetbrains.com/python/pycharm-community-5.0.2-jdk-bundled.dmg.sha256"},"linux":{"link":"https://download.jetbrains.com/python/pycharm-fake.tar.gz","size":136420461,"checksumLink":"https://download.jetbrains.com/python/pycharm-fake.tar.gz.sha256"}},"version":"5.0.2","majorVersion":"5.0","build":"143.1184"}]} ././@LongLink0000644000000000000000000000016300000000000007773 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/data.services.jetbrains.com/products/releases?code=PCC&type=eapubuntu-make-18.09+disco1/tests/data/server-content/data.services.jetbrains.com/products/releases?cod0000644000000000000000000000130113352651520030530 0ustar {"PCC":[{"date":"2015-12-10","type":"release","downloads":{"windows":{"link":"https://download.jetbrains.com/python/pycharm-community-5.0.2.exe","size":169759968,"checksumLink":"https://download.jetbrains.com/python/pycharm-community-5.0.2.exe.sha256"},"mac":{"link":"https://download.jetbrains.com/python/pycharm-community-5.0.2-jdk-bundled.dmg","size":170811847,"checksumLink":"https://download.jetbrains.com/python/pycharm-community-5.0.2-jdk-bundled.dmg.sha256"},"linux":{"link":"https://download.jetbrains.com/python/pycharm-fake.tar.gz","size":136420461,"checksumLink":"https://download.jetbrains.com/python/pycharm-fake.tar.gz.sha256"}},"version":"5.0.2","majorVersion":"5.0","build":"143.1184"}]} ././@LongLink0000644000000000000000000000015200000000000007771 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/data.services.jetbrains.com/products/releases?code=PCEubuntu-make-18.09+disco1/tests/data/server-content/data.services.jetbrains.com/products/releases?cod0000644000000000000000000000125113352651520030534 0ustar {"PCE":[{"date":"2015-12-10","type":"release","downloads":{"windows":{"link":"https://download.jetbrains.com/python/pycharm-edu-2.0.3.exe","size":150777464,"checksumLink":"https://download.jetbrains.com/python/pycharm-edu-2.0.3.exe.sha256"},"mac":{"link":"https://download.jetbrains.com/python/pycharm-edu-2.0.3.dmg","size":181589445,"checksumLink":"https://download.jetbrains.com/python/pycharm-edu-2.0.3.dmg.sha256"},"linux":{"link":"https://download.jetbrains.com/python/pycharm-educational-fake.tar.gz","size":117436402,"checksumLink":"https://download.jetbrains.com/python/pycharm-educational-fake.tar.gz.sha256"}},"version":"2.0.3","majorVersion":"2.0","build":"143.1371"}]} ././@LongLink0000644000000000000000000000016300000000000007773 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/data.services.jetbrains.com/products/releases?code=PCE&type=eapubuntu-make-18.09+disco1/tests/data/server-content/data.services.jetbrains.com/products/releases?cod0000644000000000000000000000125113352651520030534 0ustar {"PCE":[{"date":"2015-12-10","type":"release","downloads":{"windows":{"link":"https://download.jetbrains.com/python/pycharm-edu-2.0.3.exe","size":150777464,"checksumLink":"https://download.jetbrains.com/python/pycharm-edu-2.0.3.exe.sha256"},"mac":{"link":"https://download.jetbrains.com/python/pycharm-edu-2.0.3.dmg","size":181589445,"checksumLink":"https://download.jetbrains.com/python/pycharm-edu-2.0.3.dmg.sha256"},"linux":{"link":"https://download.jetbrains.com/python/pycharm-educational-fake.tar.gz","size":117436402,"checksumLink":"https://download.jetbrains.com/python/pycharm-educational-fake.tar.gz.sha256"}},"version":"2.0.3","majorVersion":"2.0","build":"143.1371"}]} ././@LongLink0000644000000000000000000000015200000000000007771 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/data.services.jetbrains.com/products/releases?code=PCPubuntu-make-18.09+disco1/tests/data/server-content/data.services.jetbrains.com/products/releases?cod0000644000000000000000000000134713352651520030542 0ustar {"PCP":[{"date":"2015-12-10","type":"release","downloads":{"windows":{"link":"https://download.jetbrains.com/python/pycharm-professional-5.0.2.exe","size":208571048,"checksumLink":"https://download.jetbrains.com/python/pycharm-professional-5.0.2.exe.sha256"},"mac":{"link":"https://download.jetbrains.com/python/pycharm-professional-5.0.2-jdk-bundled.dmg","size":241356892,"checksumLink":"https://download.jetbrains.com/python/pycharm-professional-5.0.2-jdk-bundled.dmg.sha256"},"linux":{"link":"https://download.jetbrains.com/python/pycharm-professional-fake.tar.gz","size":187822566,"checksumLink":"https://download.jetbrains.com/python/pycharm-professional-fake.tar.gz.sha256"}},"version":"5.0.2","majorVersion":"5.0","build":"143.1184"}]} ././@LongLink0000644000000000000000000000016300000000000007773 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/data.services.jetbrains.com/products/releases?code=PCP&type=eapubuntu-make-18.09+disco1/tests/data/server-content/data.services.jetbrains.com/products/releases?cod0000644000000000000000000000134713352651520030542 0ustar {"PCP":[{"date":"2015-12-10","type":"release","downloads":{"windows":{"link":"https://download.jetbrains.com/python/pycharm-professional-5.0.2.exe","size":208571048,"checksumLink":"https://download.jetbrains.com/python/pycharm-professional-5.0.2.exe.sha256"},"mac":{"link":"https://download.jetbrains.com/python/pycharm-professional-5.0.2-jdk-bundled.dmg","size":241356892,"checksumLink":"https://download.jetbrains.com/python/pycharm-professional-5.0.2-jdk-bundled.dmg.sha256"},"linux":{"link":"https://download.jetbrains.com/python/pycharm-professional-fake.tar.gz","size":187822566,"checksumLink":"https://download.jetbrains.com/python/pycharm-professional-fake.tar.gz.sha256"}},"version":"5.0.2","majorVersion":"5.0","build":"143.1184"}]} ././@LongLink0000644000000000000000000000015100000000000007770 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/data.services.jetbrains.com/products/releases?code=PSubuntu-make-18.09+disco1/tests/data/server-content/data.services.jetbrains.com/products/releases?cod0000644000000000000000000000126613352651520030542 0ustar {"PS":[{"date":"2015-12-10","type":"release","downloads":{"windows":{"link":"https://download.jetbrains.com/webide/PhpStorm-10.0.2.exe","size":166004232,"checksumLink":"https://download.jetbrains.com/webide/PhpStorm-10.0.2.exe.sha256"},"mac":{"link":"https://download.jetbrains.com/webide/PhpStorm-10.0.2-custom-jdk-bundled.dmg","size":195039438,"checksumLink":"https://download.jetbrains.com/webide/PhpStorm-10.0.2-custom-jdk-bundled.dmg.sha256"},"linux":{"link":"https://download.jetbrains.com/phpstorm/PhpStorm-fake.tar.gz","size":212579385,"checksumLink":"https://download.jetbrains.com/phpstorm/PhpStorm-fake.tar.gz.sha256"}},"version":"10.0.2","majorVersion":"10.0","build":"143.1184"}]} ././@LongLink0000644000000000000000000000016200000000000007772 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/data.services.jetbrains.com/products/releases?code=PS&type=eapubuntu-make-18.09+disco1/tests/data/server-content/data.services.jetbrains.com/products/releases?cod0000644000000000000000000000126613352651520030542 0ustar {"PS":[{"date":"2015-12-10","type":"release","downloads":{"windows":{"link":"https://download.jetbrains.com/webide/PhpStorm-10.0.2.exe","size":166004232,"checksumLink":"https://download.jetbrains.com/webide/PhpStorm-10.0.2.exe.sha256"},"mac":{"link":"https://download.jetbrains.com/webide/PhpStorm-10.0.2-custom-jdk-bundled.dmg","size":195039438,"checksumLink":"https://download.jetbrains.com/webide/PhpStorm-10.0.2-custom-jdk-bundled.dmg.sha256"},"linux":{"link":"https://download.jetbrains.com/phpstorm/PhpStorm-fake.tar.gz","size":212579385,"checksumLink":"https://download.jetbrains.com/phpstorm/PhpStorm-fake.tar.gz.sha256"}},"version":"10.0.2","majorVersion":"10.0","build":"143.1184"}]} ././@LongLink0000644000000000000000000000015100000000000007770 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/data.services.jetbrains.com/products/releases?code=RDubuntu-make-18.09+disco1/tests/data/server-content/data.services.jetbrains.com/products/releases?cod0000644000000000000000000000123113352651520030532 0ustar {"RD":[{"date":"2017-01-17","type":"eap","downloads":{"windows":{"link":"https://download.jetbrains.com/resharper/riderRS-163.12057.exe","size":234803128,"checksumLink":"https://download.jetbrains.com/resharper/riderRS-163.12057.exe.sha256"},"mac":{"link":"https://download.jetbrains.com/resharper/riderRS-163.12057.dmg","size":291555464,"checksumLink":"https://download.jetbrains.com/resharper/riderRS-163.12057.dmg.sha256"},"linux":{"link":"https://download.jetbrains.com/resharper/rider-fake.tar.gz","size":328566419,"checksumLink":"https://download.jetbrains.com/resharper/rider-fake.tar.gz.sha256"}},"version":"1.0","majorVersion":"1.0","build":"163.12057"}]} ././@LongLink0000644000000000000000000000016200000000000007772 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/data.services.jetbrains.com/products/releases?code=RD&type=eapubuntu-make-18.09+disco1/tests/data/server-content/data.services.jetbrains.com/products/releases?cod0000644000000000000000000000123113352651520030532 0ustar {"RD":[{"date":"2017-01-17","type":"eap","downloads":{"windows":{"link":"https://download.jetbrains.com/resharper/riderRS-163.12057.exe","size":234803128,"checksumLink":"https://download.jetbrains.com/resharper/riderRS-163.12057.exe.sha256"},"mac":{"link":"https://download.jetbrains.com/resharper/riderRS-163.12057.dmg","size":291555464,"checksumLink":"https://download.jetbrains.com/resharper/riderRS-163.12057.dmg.sha256"},"linux":{"link":"https://download.jetbrains.com/resharper/rider-fake.tar.gz","size":328566419,"checksumLink":"https://download.jetbrains.com/resharper/rider-fake.tar.gz.sha256"}},"version":"1.0","majorVersion":"1.0","build":"163.12057"}]} ././@LongLink0000644000000000000000000000015100000000000007770 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/data.services.jetbrains.com/products/releases?code=RMubuntu-make-18.09+disco1/tests/data/server-content/data.services.jetbrains.com/products/releases?cod0000644000000000000000000000136513352651520030542 0ustar {"RM":[{"date":"2015-12-10","type":"release","downloads":{"windows":{"link":"https://download.jetbrains.com/ruby/RubyMine-8.0.2.exe","size":198777656,"checksumLink":"https://download.jetbrains.com/ruby/RubyMine-8.0.2.exe.sha256"},"mac":{"link":"https://download.jetbrains.com/ruby/RubyMine-8.0.2-custom-jdk-bundled.dmg","size":225350927,"checksumLink":"https://download.jetbrains.com/ruby/RubyMine-8.0.2-custom-jdk-bundled.dmg.sha256"},"linux":{"link":"https://download.jetbrains.com/ruby/rubymine-fake.tar.gz","size":175331255,"checksumLink":"https://download.jetbrains.com/ruby/rubymine-fake.tar.gz.sha256"}},"notesLink":"https://confluence.jetbrains.com/display/RUBYDEV/RubyMine+8.0+Kusunoki","version":"8.0.2","majorVersion":"8.0","build":"143.1184"}]} ././@LongLink0000644000000000000000000000016200000000000007772 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/data.services.jetbrains.com/products/releases?code=RM&type=eapubuntu-make-18.09+disco1/tests/data/server-content/data.services.jetbrains.com/products/releases?cod0000644000000000000000000000136513352651520030542 0ustar {"RM":[{"date":"2015-12-10","type":"release","downloads":{"windows":{"link":"https://download.jetbrains.com/ruby/RubyMine-8.0.2.exe","size":198777656,"checksumLink":"https://download.jetbrains.com/ruby/RubyMine-8.0.2.exe.sha256"},"mac":{"link":"https://download.jetbrains.com/ruby/RubyMine-8.0.2-custom-jdk-bundled.dmg","size":225350927,"checksumLink":"https://download.jetbrains.com/ruby/RubyMine-8.0.2-custom-jdk-bundled.dmg.sha256"},"linux":{"link":"https://download.jetbrains.com/ruby/rubymine-fake.tar.gz","size":175331255,"checksumLink":"https://download.jetbrains.com/ruby/rubymine-fake.tar.gz.sha256"}},"notesLink":"https://confluence.jetbrains.com/display/RUBYDEV/RubyMine+8.0+Kusunoki","version":"8.0.2","majorVersion":"8.0","build":"143.1184"}]} ././@LongLink0000644000000000000000000000015100000000000007770 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/data.services.jetbrains.com/products/releases?code=WSubuntu-make-18.09+disco1/tests/data/server-content/data.services.jetbrains.com/products/releases?cod0000644000000000000000000000127613352651520030543 0ustar {"WS":[{"date":"2015-12-07","type":"release","downloads":{"windows":{"link":"https://download.jetbrains.com/webstorm/WebStorm-11.0.2.exe","size":157871800,"checksumLink":"https://download.jetbrains.com/webstorm/WebStorm-11.0.2.exe.sha256"},"mac":{"link":"https://download.jetbrains.com/webstorm/WebStorm-11.0.2-custom-jdk-bundled.dmg","size":183965019,"checksumLink":"https://download.jetbrains.com/webstorm/WebStorm-11.0.2-custom-jdk-bundled.dmg.sha256"},"linux":{"link":"https://download.jetbrains.com/webstorm/WebStorm-fake.tar.gz","size":132160662,"checksumLink":"https://download.jetbrains.com/webstorm/WebStorm-fake.tar.gz.sha256"}},"version":"11.0.2","majorVersion":"11.0","build":"143.1184"}]} ././@LongLink0000644000000000000000000000016200000000000007772 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/data.services.jetbrains.com/products/releases?code=WS&type=eapubuntu-make-18.09+disco1/tests/data/server-content/data.services.jetbrains.com/products/releases?cod0000644000000000000000000000127613352651520030543 0ustar {"WS":[{"date":"2015-12-07","type":"release","downloads":{"windows":{"link":"https://download.jetbrains.com/webstorm/WebStorm-11.0.2.exe","size":157871800,"checksumLink":"https://download.jetbrains.com/webstorm/WebStorm-11.0.2.exe.sha256"},"mac":{"link":"https://download.jetbrains.com/webstorm/WebStorm-11.0.2-custom-jdk-bundled.dmg","size":183965019,"checksumLink":"https://download.jetbrains.com/webstorm/WebStorm-11.0.2-custom-jdk-bundled.dmg.sha256"},"linux":{"link":"https://download.jetbrains.com/webstorm/WebStorm-fake.tar.gz","size":132160662,"checksumLink":"https://download.jetbrains.com/webstorm/WebStorm-fake.tar.gz.sha256"}},"version":"11.0.2","majorVersion":"11.0","build":"143.1184"}]} ubuntu-make-18.09+disco1/tests/data/server-content/developer.android.com/0000755000000000000000000000000013352651520023250 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/developer.android.com/ndk/0000755000000000000000000000000013352651520024024 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/developer.android.com/ndk/downloads/0000755000000000000000000000000013352651520026016 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/developer.android.com/ndk/downloads/index.html0000644000000000000000000032061113352651520030016 0ustar NDK Downloads  |  Android NDK  |  Android Developers

NDK Downloads

Select the NDK package for your development platform. For information about the changes in the latest version of the NDK and earlier revisions, see NDK Revision History.

Latest Stable Version (r17)

Platform Package Size (Bytes) SHA1 Checksum
Windows 32-bit 605250211 22018a545e3e1f4236f65a2074ab2d66ef3f9a92
Windows 64-bit 647471060 7856db171bd58a99d77158b9828c6c43453ae12d
Mac 672193611 08015290bf88ba8fb348d7f5380929c2106524b3
Linux 64-bit (x86) 706134114 f3ba966ba157abc7dd2f21778afda0e4a049dcbf

For additional information about what's new and changed in this release, see this changelog.

Older Versions

You can download older versions of the NDK from the NDK Archives.

Download the Android NDK

Before downloading, you must agree to the following terms and conditions.

Terms and Conditions

This is the Android Software Development Kit License Agreement

1. Introduction

1.1 The Android Software Development Kit (referred to in the License Agreement as the "SDK" and specifically including the Android system files, packaged APIs, and Google APIs add-ons) is licensed to you subject to the terms of the License Agreement. The License Agreement forms a legally binding contract between you and Google in relation to your use of the SDK. 1.2 "Android" means the Android software stack for devices, as made available under the Android Open Source Project, which is located at the following URL: http://source.android.com/, as updated from time to time. 1.3 A "compatible implementation" means any Android device that (i) complies with the Android Compatibility Definition document, which can be found at the Android compatibility website (http://source.android.com/compatibility) and which may be updated from time to time; and (ii) successfully passes the Android Compatibility Test Suite (CTS). 1.4 "Google" means Google LLC, a Delaware corporation with principal place of business at 1600 Amphitheatre Parkway, Mountain View, CA 94043, United States.

2. Accepting this License Agreement

2.1 In order to use the SDK, you must first agree to the License Agreement. You may not use the SDK if you do not accept the License Agreement. 2.2 By clicking to accept, you hereby agree to the terms of the License Agreement. 2.3 You may not use the SDK and may not accept the License Agreement if you are a person barred from receiving the SDK under the laws of the United States or other countries, including the country in which you are resident or from which you use the SDK. 2.4 If you are agreeing to be bound by the License Agreement on behalf of your employer or other entity, you represent and warrant that you have full legal authority to bind your employer or such entity to the License Agreement. If you do not have the requisite authority, you may not accept the License Agreement or use the SDK on behalf of your employer or other entity.

3. SDK License from Google

3.1 Subject to the terms of the License Agreement, Google grants you a limited, worldwide, royalty-free, non-assignable, non-exclusive, and non-sublicensable license to use the SDK solely to develop applications for compatible implementations of Android. 3.2 You may not use this SDK to develop applications for other platforms (including non-compatible implementations of Android) or to develop another SDK. You are of course free to develop applications for other platforms, including non-compatible implementations of Android, provided that this SDK is not used for that purpose. 3.3 You agree that Google or third parties own all legal right, title and interest in and to the SDK, including any Intellectual Property Rights that subsist in the SDK. "Intellectual Property Rights" means any and all rights under patent law, copyright law, trade secret law, trademark law, and any and all other proprietary rights. Google reserves all rights not expressly granted to you. 3.4 You may not use the SDK for any purpose not expressly permitted by the License Agreement. Except to the extent required by applicable third party licenses, you may not copy (except for backup purposes), modify, adapt, redistribute, decompile, reverse engineer, disassemble, or create derivative works of the SDK or any part of the SDK. 3.5 Use, reproduction and distribution of components of the SDK licensed under an open source software license are governed solely by the terms of that open source software license and not the License Agreement. 3.6 You agree that the form and nature of the SDK that Google provides may change without prior notice to you and that future versions of the SDK may be incompatible with applications developed on previous versions of the SDK. You agree that Google may stop (permanently or temporarily) providing the SDK (or any features within the SDK) to you or to users generally at Google's sole discretion, without prior notice to you. 3.7 Nothing in the License Agreement gives you a right to use any of Google's trade names, trademarks, service marks, logos, domain names, or other distinctive brand features. 3.8 You agree that you will not remove, obscure, or alter any proprietary rights notices (including copyright and trademark notices) that may be affixed to or contained within the SDK.

4. Use of the SDK by You

4.1 Google agrees that it obtains no right, title or interest from you (or your licensors) under the License Agreement in or to any software applications that you develop using the SDK, including any intellectual property rights that subsist in those applications. 4.2 You agree to use the SDK and write applications only for purposes that are permitted by (a) the License Agreement and (b) any applicable law, regulation or generally accepted practices or guidelines in the relevant jurisdictions (including any laws regarding the export of data or software to and from the United States or other relevant countries). 4.3 You agree that if you use the SDK to develop applications for general public users, you will protect the privacy and legal rights of those users. If the users provide you with user names, passwords, or other login information or personal information, you must make the users aware that the information will be available to your application, and you must provide legally adequate privacy notice and protection for those users. If your application stores personal or sensitive information provided by users, it must do so securely. If the user provides your application with Google Account information, your application may only use that information to access the user's Google Account when, and for the limited purposes for which, the user has given you permission to do so. 4.4 You agree that you will not engage in any activity with the SDK, including the development or distribution of an application, that interferes with, disrupts, damages, or accesses in an unauthorized manner the servers, networks, or other properties or services of any third party including, but not limited to, Google or any mobile communications carrier. 4.5 You agree that you are solely responsible for (and that Google has no responsibility to you or to any third party for) any data, content, or resources that you create, transmit or display through Android and/or applications for Android, and for the consequences of your actions (including any loss or damage which Google may suffer) by doing so. 4.6 You agree that you are solely responsible for (and that Google has no responsibility to you or to any third party for) any breach of your obligations under the License Agreement, any applicable third party contract or Terms of Service, or any applicable law or regulation, and for the consequences (including any loss or damage which Google or any third party may suffer) of any such breach.

5. Your Developer Credentials

5.1 You agree that you are responsible for maintaining the confidentiality of any developer credentials that may be issued to you by Google or which you may choose yourself and that you will be solely responsible for all applications that are developed under your developer credentials.

6. Privacy and Information

6.1 In order to continually innovate and improve the SDK, Google may collect certain usage statistics from the software including but not limited to a unique identifier, associated IP address, version number of the software, and information on which tools and/or services in the SDK are being used and how they are being used. Before any of this information is collected, the SDK will notify you and seek your consent. If you withhold consent, the information will not be collected. 6.2 The data collected is examined in the aggregate to improve the SDK and is maintained in accordance with Google's Privacy Policy.

7. Third Party Applications

7.1 If you use the SDK to run applications developed by a third party or that access data, content or resources provided by a third party, you agree that Google is not responsible for those applications, data, content, or resources. You understand that all data, content or resources which you may access through such third party applications are the sole responsibility of the person from which they originated and that Google is not liable for any loss or damage that you may experience as a result of the use or access of any of those third party applications, data, content, or resources. 7.2 You should be aware the data, content, and resources presented to you through such a third party application may be protected by intellectual property rights which are owned by the providers (or by other persons or companies on their behalf). You may not modify, rent, lease, loan, sell, distribute or create derivative works based on these data, content, or resources (either in whole or in part) unless you have been specifically given permission to do so by the relevant owners. 7.3 You acknowledge that your use of such third party applications, data, content, or resources may be subject to separate terms between you and the relevant third party. In that case, the License Agreement does not affect your legal relationship with these third parties.

8. Using Android APIs

8.1 Google Data APIs 8.1.1 If you use any API to retrieve data from Google, you acknowledge that the data may be protected by intellectual property rights which are owned by Google or those parties that provide the data (or by other persons or companies on their behalf). Your use of any such API may be subject to additional Terms of Service. You may not modify, rent, lease, loan, sell, distribute or create derivative works based on this data (either in whole or in part) unless allowed by the relevant Terms of Service. 8.1.2 If you use any API to retrieve a user's data from Google, you acknowledge and agree that you shall retrieve data only with the user's explicit consent and only when, and for the limited purposes for which, the user has given you permission to do so.

9. Terminating this License Agreement

9.1 The License Agreement will continue to apply until terminated by either you or Google as set out below. 9.2 If you want to terminate the License Agreement, you may do so by ceasing your use of the SDK and any relevant developer credentials. 9.3 Google may at any time, terminate the License Agreement with you if: (A) you have breached any provision of the License Agreement; or (B) Google is required to do so by law; or (C) the partner with whom Google offered certain parts of SDK (such as APIs) to you has terminated its relationship with Google or ceased to offer certain parts of the SDK to you; or (D) Google decides to no longer provide the SDK or certain parts of the SDK to users in the country in which you are resident or from which you use the service, or the provision of the SDK or certain SDK services to you by Google is, in Google's sole discretion, no longer commercially viable. 9.4 When the License Agreement comes to an end, all of the legal rights, obligations and liabilities that you and Google have benefited from, been subject to (or which have accrued over time whilst the License Agreement has been in force) or which are expressed to continue indefinitely, shall be unaffected by this cessation, and the provisions of paragraph 14.7 shall continue to apply to such rights, obligations and liabilities indefinitely.

10. DISCLAIMER OF WARRANTIES

10.1 YOU EXPRESSLY UNDERSTAND AND AGREE THAT YOUR USE OF THE SDK IS AT YOUR SOLE RISK AND THAT THE SDK IS PROVIDED "AS IS" AND "AS AVAILABLE" WITHOUT WARRANTY OF ANY KIND FROM GOOGLE. 10.2 YOUR USE OF THE SDK AND ANY MATERIAL DOWNLOADED OR OTHERWISE OBTAINED THROUGH THE USE OF THE SDK IS AT YOUR OWN DISCRETION AND RISK AND YOU ARE SOLELY RESPONSIBLE FOR ANY DAMAGE TO YOUR COMPUTER SYSTEM OR OTHER DEVICE OR LOSS OF DATA THAT RESULTS FROM SUCH USE. 10.3 GOOGLE FURTHER EXPRESSLY DISCLAIMS ALL WARRANTIES AND CONDITIONS OF ANY KIND, WHETHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO THE IMPLIED WARRANTIES AND CONDITIONS OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.

11. LIMITATION OF LIABILITY

11.1 YOU EXPRESSLY UNDERSTAND AND AGREE THAT GOOGLE, ITS SUBSIDIARIES AND AFFILIATES, AND ITS LICENSORS SHALL NOT BE LIABLE TO YOU UNDER ANY THEORY OF LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, CONSEQUENTIAL OR EXEMPLARY DAMAGES THAT MAY BE INCURRED BY YOU, INCLUDING ANY LOSS OF DATA, WHETHER OR NOT GOOGLE OR ITS REPRESENTATIVES HAVE BEEN ADVISED OF OR SHOULD HAVE BEEN AWARE OF THE POSSIBILITY OF ANY SUCH LOSSES ARISING.

12. Indemnification

12.1 To the maximum extent permitted by law, you agree to defend, indemnify and hold harmless Google, its affiliates and their respective directors, officers, employees and agents from and against any and all claims, actions, suits or proceedings, as well as any and all losses, liabilities, damages, costs and expenses (including reasonable attorneys fees) arising out of or accruing from (a) your use of the SDK, (b) any application you develop on the SDK that infringes any copyright, trademark, trade secret, trade dress, patent or other intellectual property right of any person or defames any person or violates their rights of publicity or privacy, and (c) any non-compliance by you with the License Agreement.

13. Changes to the License Agreement

13.1 Google may make changes to the License Agreement as it distributes new versions of the SDK. When these changes are made, Google will make a new version of the License Agreement available on the website where the SDK is made available.

14. General Legal Terms

14.1 The License Agreement constitutes the whole legal agreement between you and Google and governs your use of the SDK (excluding any services which Google may provide to you under a separate written agreement), and completely replaces any prior agreements between you and Google in relation to the SDK. 14.2 You agree that if Google does not exercise or enforce any legal right or remedy which is contained in the License Agreement (or which Google has the benefit of under any applicable law), this will not be taken to be a formal waiver of Google's rights and that those rights or remedies will still be available to Google. 14.3 If any court of law, having the jurisdiction to decide on this matter, rules that any provision of the License Agreement is invalid, then that provision will be removed from the License Agreement without affecting the rest of the License Agreement. The remaining provisions of the License Agreement will continue to be valid and enforceable. 14.4 You acknowledge and agree that each member of the group of companies of which Google is the parent shall be third party beneficiaries to the License Agreement and that such other companies shall be entitled to directly enforce, and rely upon, any provision of the License Agreement that confers a benefit on (or rights in favor of) them. Other than this, no other person or company shall be third party beneficiaries to the License Agreement. 14.5 EXPORT RESTRICTIONS. THE SDK IS SUBJECT TO UNITED STATES EXPORT LAWS AND REGULATIONS. YOU MUST COMPLY WITH ALL DOMESTIC AND INTERNATIONAL EXPORT LAWS AND REGULATIONS THAT APPLY TO THE SDK. THESE LAWS INCLUDE RESTRICTIONS ON DESTINATIONS, END USERS AND END USE. 14.6 The rights granted in the License Agreement may not be assigned or transferred by either you or Google without the prior written approval of the other party. Neither you nor Google shall be permitted to delegate their responsibilities or obligations under the License Agreement without the prior written approval of the other party. 14.7 The License Agreement, and your relationship with Google under the License Agreement, shall be governed by the laws of the State of California without regard to its conflict of laws provisions. You and Google agree to submit to the exclusive jurisdiction of the courts located within the county of Santa Clara, California to resolve any legal matter arising from the License Agreement. Notwithstanding this, you agree that Google shall still be allowed to apply for injunctive remedies (or an equivalent type of urgent legal relief) in any jurisdiction. December 9, 2016

Download the Android NDK for Windows (32-bit)

Download the Android NDK for Windows (32-bit)

android-ndk-r17-windows-x86.zip

Download the Android NDK

Before downloading, you must agree to the following terms and conditions.

Terms and Conditions

This is the Android Software Development Kit License Agreement

1. Introduction

1.1 The Android Software Development Kit (referred to in the License Agreement as the "SDK" and specifically including the Android system files, packaged APIs, and Google APIs add-ons) is licensed to you subject to the terms of the License Agreement. The License Agreement forms a legally binding contract between you and Google in relation to your use of the SDK. 1.2 "Android" means the Android software stack for devices, as made available under the Android Open Source Project, which is located at the following URL: http://source.android.com/, as updated from time to time. 1.3 A "compatible implementation" means any Android device that (i) complies with the Android Compatibility Definition document, which can be found at the Android compatibility website (http://source.android.com/compatibility) and which may be updated from time to time; and (ii) successfully passes the Android Compatibility Test Suite (CTS). 1.4 "Google" means Google LLC, a Delaware corporation with principal place of business at 1600 Amphitheatre Parkway, Mountain View, CA 94043, United States.

2. Accepting this License Agreement

2.1 In order to use the SDK, you must first agree to the License Agreement. You may not use the SDK if you do not accept the License Agreement. 2.2 By clicking to accept, you hereby agree to the terms of the License Agreement. 2.3 You may not use the SDK and may not accept the License Agreement if you are a person barred from receiving the SDK under the laws of the United States or other countries, including the country in which you are resident or from which you use the SDK. 2.4 If you are agreeing to be bound by the License Agreement on behalf of your employer or other entity, you represent and warrant that you have full legal authority to bind your employer or such entity to the License Agreement. If you do not have the requisite authority, you may not accept the License Agreement or use the SDK on behalf of your employer or other entity.

3. SDK License from Google

3.1 Subject to the terms of the License Agreement, Google grants you a limited, worldwide, royalty-free, non-assignable, non-exclusive, and non-sublicensable license to use the SDK solely to develop applications for compatible implementations of Android. 3.2 You may not use this SDK to develop applications for other platforms (including non-compatible implementations of Android) or to develop another SDK. You are of course free to develop applications for other platforms, including non-compatible implementations of Android, provided that this SDK is not used for that purpose. 3.3 You agree that Google or third parties own all legal right, title and interest in and to the SDK, including any Intellectual Property Rights that subsist in the SDK. "Intellectual Property Rights" means any and all rights under patent law, copyright law, trade secret law, trademark law, and any and all other proprietary rights. Google reserves all rights not expressly granted to you. 3.4 You may not use the SDK for any purpose not expressly permitted by the License Agreement. Except to the extent required by applicable third party licenses, you may not copy (except for backup purposes), modify, adapt, redistribute, decompile, reverse engineer, disassemble, or create derivative works of the SDK or any part of the SDK. 3.5 Use, reproduction and distribution of components of the SDK licensed under an open source software license are governed solely by the terms of that open source software license and not the License Agreement. 3.6 You agree that the form and nature of the SDK that Google provides may change without prior notice to you and that future versions of the SDK may be incompatible with applications developed on previous versions of the SDK. You agree that Google may stop (permanently or temporarily) providing the SDK (or any features within the SDK) to you or to users generally at Google's sole discretion, without prior notice to you. 3.7 Nothing in the License Agreement gives you a right to use any of Google's trade names, trademarks, service marks, logos, domain names, or other distinctive brand features. 3.8 You agree that you will not remove, obscure, or alter any proprietary rights notices (including copyright and trademark notices) that may be affixed to or contained within the SDK.

4. Use of the SDK by You

4.1 Google agrees that it obtains no right, title or interest from you (or your licensors) under the License Agreement in or to any software applications that you develop using the SDK, including any intellectual property rights that subsist in those applications. 4.2 You agree to use the SDK and write applications only for purposes that are permitted by (a) the License Agreement and (b) any applicable law, regulation or generally accepted practices or guidelines in the relevant jurisdictions (including any laws regarding the export of data or software to and from the United States or other relevant countries). 4.3 You agree that if you use the SDK to develop applications for general public users, you will protect the privacy and legal rights of those users. If the users provide you with user names, passwords, or other login information or personal information, you must make the users aware that the information will be available to your application, and you must provide legally adequate privacy notice and protection for those users. If your application stores personal or sensitive information provided by users, it must do so securely. If the user provides your application with Google Account information, your application may only use that information to access the user's Google Account when, and for the limited purposes for which, the user has given you permission to do so. 4.4 You agree that you will not engage in any activity with the SDK, including the development or distribution of an application, that interferes with, disrupts, damages, or accesses in an unauthorized manner the servers, networks, or other properties or services of any third party including, but not limited to, Google or any mobile communications carrier. 4.5 You agree that you are solely responsible for (and that Google has no responsibility to you or to any third party for) any data, content, or resources that you create, transmit or display through Android and/or applications for Android, and for the consequences of your actions (including any loss or damage which Google may suffer) by doing so. 4.6 You agree that you are solely responsible for (and that Google has no responsibility to you or to any third party for) any breach of your obligations under the License Agreement, any applicable third party contract or Terms of Service, or any applicable law or regulation, and for the consequences (including any loss or damage which Google or any third party may suffer) of any such breach.

5. Your Developer Credentials

5.1 You agree that you are responsible for maintaining the confidentiality of any developer credentials that may be issued to you by Google or which you may choose yourself and that you will be solely responsible for all applications that are developed under your developer credentials.

6. Privacy and Information

6.1 In order to continually innovate and improve the SDK, Google may collect certain usage statistics from the software including but not limited to a unique identifier, associated IP address, version number of the software, and information on which tools and/or services in the SDK are being used and how they are being used. Before any of this information is collected, the SDK will notify you and seek your consent. If you withhold consent, the information will not be collected. 6.2 The data collected is examined in the aggregate to improve the SDK and is maintained in accordance with Google's Privacy Policy.

7. Third Party Applications

7.1 If you use the SDK to run applications developed by a third party or that access data, content or resources provided by a third party, you agree that Google is not responsible for those applications, data, content, or resources. You understand that all data, content or resources which you may access through such third party applications are the sole responsibility of the person from which they originated and that Google is not liable for any loss or damage that you may experience as a result of the use or access of any of those third party applications, data, content, or resources. 7.2 You should be aware the data, content, and resources presented to you through such a third party application may be protected by intellectual property rights which are owned by the providers (or by other persons or companies on their behalf). You may not modify, rent, lease, loan, sell, distribute or create derivative works based on these data, content, or resources (either in whole or in part) unless you have been specifically given permission to do so by the relevant owners. 7.3 You acknowledge that your use of such third party applications, data, content, or resources may be subject to separate terms between you and the relevant third party. In that case, the License Agreement does not affect your legal relationship with these third parties.

8. Using Android APIs

8.1 Google Data APIs 8.1.1 If you use any API to retrieve data from Google, you acknowledge that the data may be protected by intellectual property rights which are owned by Google or those parties that provide the data (or by other persons or companies on their behalf). Your use of any such API may be subject to additional Terms of Service. You may not modify, rent, lease, loan, sell, distribute or create derivative works based on this data (either in whole or in part) unless allowed by the relevant Terms of Service. 8.1.2 If you use any API to retrieve a user's data from Google, you acknowledge and agree that you shall retrieve data only with the user's explicit consent and only when, and for the limited purposes for which, the user has given you permission to do so.

9. Terminating this License Agreement

9.1 The License Agreement will continue to apply until terminated by either you or Google as set out below. 9.2 If you want to terminate the License Agreement, you may do so by ceasing your use of the SDK and any relevant developer credentials. 9.3 Google may at any time, terminate the License Agreement with you if: (A) you have breached any provision of the License Agreement; or (B) Google is required to do so by law; or (C) the partner with whom Google offered certain parts of SDK (such as APIs) to you has terminated its relationship with Google or ceased to offer certain parts of the SDK to you; or (D) Google decides to no longer provide the SDK or certain parts of the SDK to users in the country in which you are resident or from which you use the service, or the provision of the SDK or certain SDK services to you by Google is, in Google's sole discretion, no longer commercially viable. 9.4 When the License Agreement comes to an end, all of the legal rights, obligations and liabilities that you and Google have benefited from, been subject to (or which have accrued over time whilst the License Agreement has been in force) or which are expressed to continue indefinitely, shall be unaffected by this cessation, and the provisions of paragraph 14.7 shall continue to apply to such rights, obligations and liabilities indefinitely.

10. DISCLAIMER OF WARRANTIES

10.1 YOU EXPRESSLY UNDERSTAND AND AGREE THAT YOUR USE OF THE SDK IS AT YOUR SOLE RISK AND THAT THE SDK IS PROVIDED "AS IS" AND "AS AVAILABLE" WITHOUT WARRANTY OF ANY KIND FROM GOOGLE. 10.2 YOUR USE OF THE SDK AND ANY MATERIAL DOWNLOADED OR OTHERWISE OBTAINED THROUGH THE USE OF THE SDK IS AT YOUR OWN DISCRETION AND RISK AND YOU ARE SOLELY RESPONSIBLE FOR ANY DAMAGE TO YOUR COMPUTER SYSTEM OR OTHER DEVICE OR LOSS OF DATA THAT RESULTS FROM SUCH USE. 10.3 GOOGLE FURTHER EXPRESSLY DISCLAIMS ALL WARRANTIES AND CONDITIONS OF ANY KIND, WHETHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO THE IMPLIED WARRANTIES AND CONDITIONS OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.

11. LIMITATION OF LIABILITY

11.1 YOU EXPRESSLY UNDERSTAND AND AGREE THAT GOOGLE, ITS SUBSIDIARIES AND AFFILIATES, AND ITS LICENSORS SHALL NOT BE LIABLE TO YOU UNDER ANY THEORY OF LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, CONSEQUENTIAL OR EXEMPLARY DAMAGES THAT MAY BE INCURRED BY YOU, INCLUDING ANY LOSS OF DATA, WHETHER OR NOT GOOGLE OR ITS REPRESENTATIVES HAVE BEEN ADVISED OF OR SHOULD HAVE BEEN AWARE OF THE POSSIBILITY OF ANY SUCH LOSSES ARISING.

12. Indemnification

12.1 To the maximum extent permitted by law, you agree to defend, indemnify and hold harmless Google, its affiliates and their respective directors, officers, employees and agents from and against any and all claims, actions, suits or proceedings, as well as any and all losses, liabilities, damages, costs and expenses (including reasonable attorneys fees) arising out of or accruing from (a) your use of the SDK, (b) any application you develop on the SDK that infringes any copyright, trademark, trade secret, trade dress, patent or other intellectual property right of any person or defames any person or violates their rights of publicity or privacy, and (c) any non-compliance by you with the License Agreement.

13. Changes to the License Agreement

13.1 Google may make changes to the License Agreement as it distributes new versions of the SDK. When these changes are made, Google will make a new version of the License Agreement available on the website where the SDK is made available.

14. General Legal Terms

14.1 The License Agreement constitutes the whole legal agreement between you and Google and governs your use of the SDK (excluding any services which Google may provide to you under a separate written agreement), and completely replaces any prior agreements between you and Google in relation to the SDK. 14.2 You agree that if Google does not exercise or enforce any legal right or remedy which is contained in the License Agreement (or which Google has the benefit of under any applicable law), this will not be taken to be a formal waiver of Google's rights and that those rights or remedies will still be available to Google. 14.3 If any court of law, having the jurisdiction to decide on this matter, rules that any provision of the License Agreement is invalid, then that provision will be removed from the License Agreement without affecting the rest of the License Agreement. The remaining provisions of the License Agreement will continue to be valid and enforceable. 14.4 You acknowledge and agree that each member of the group of companies of which Google is the parent shall be third party beneficiaries to the License Agreement and that such other companies shall be entitled to directly enforce, and rely upon, any provision of the License Agreement that confers a benefit on (or rights in favor of) them. Other than this, no other person or company shall be third party beneficiaries to the License Agreement. 14.5 EXPORT RESTRICTIONS. THE SDK IS SUBJECT TO UNITED STATES EXPORT LAWS AND REGULATIONS. YOU MUST COMPLY WITH ALL DOMESTIC AND INTERNATIONAL EXPORT LAWS AND REGULATIONS THAT APPLY TO THE SDK. THESE LAWS INCLUDE RESTRICTIONS ON DESTINATIONS, END USERS AND END USE. 14.6 The rights granted in the License Agreement may not be assigned or transferred by either you or Google without the prior written approval of the other party. Neither you nor Google shall be permitted to delegate their responsibilities or obligations under the License Agreement without the prior written approval of the other party. 14.7 The License Agreement, and your relationship with Google under the License Agreement, shall be governed by the laws of the State of California without regard to its conflict of laws provisions. You and Google agree to submit to the exclusive jurisdiction of the courts located within the county of Santa Clara, California to resolve any legal matter arising from the License Agreement. Notwithstanding this, you agree that Google shall still be allowed to apply for injunctive remedies (or an equivalent type of urgent legal relief) in any jurisdiction. December 9, 2016

Download the Android NDK for Windows (64-bit)

Download the Android NDK for Windows (64-bit)

android-ndk-r17-windows-x86_64.zip

Download the Android NDK

Before downloading, you must agree to the following terms and conditions.

Terms and Conditions

This is the Android Software Development Kit License Agreement

1. Introduction

1.1 The Android Software Development Kit (referred to in the License Agreement as the "SDK" and specifically including the Android system files, packaged APIs, and Google APIs add-ons) is licensed to you subject to the terms of the License Agreement. The License Agreement forms a legally binding contract between you and Google in relation to your use of the SDK. 1.2 "Android" means the Android software stack for devices, as made available under the Android Open Source Project, which is located at the following URL: http://source.android.com/, as updated from time to time. 1.3 A "compatible implementation" means any Android device that (i) complies with the Android Compatibility Definition document, which can be found at the Android compatibility website (http://source.android.com/compatibility) and which may be updated from time to time; and (ii) successfully passes the Android Compatibility Test Suite (CTS). 1.4 "Google" means Google LLC, a Delaware corporation with principal place of business at 1600 Amphitheatre Parkway, Mountain View, CA 94043, United States.

2. Accepting this License Agreement

2.1 In order to use the SDK, you must first agree to the License Agreement. You may not use the SDK if you do not accept the License Agreement. 2.2 By clicking to accept, you hereby agree to the terms of the License Agreement. 2.3 You may not use the SDK and may not accept the License Agreement if you are a person barred from receiving the SDK under the laws of the United States or other countries, including the country in which you are resident or from which you use the SDK. 2.4 If you are agreeing to be bound by the License Agreement on behalf of your employer or other entity, you represent and warrant that you have full legal authority to bind your employer or such entity to the License Agreement. If you do not have the requisite authority, you may not accept the License Agreement or use the SDK on behalf of your employer or other entity.

3. SDK License from Google

3.1 Subject to the terms of the License Agreement, Google grants you a limited, worldwide, royalty-free, non-assignable, non-exclusive, and non-sublicensable license to use the SDK solely to develop applications for compatible implementations of Android. 3.2 You may not use this SDK to develop applications for other platforms (including non-compatible implementations of Android) or to develop another SDK. You are of course free to develop applications for other platforms, including non-compatible implementations of Android, provided that this SDK is not used for that purpose. 3.3 You agree that Google or third parties own all legal right, title and interest in and to the SDK, including any Intellectual Property Rights that subsist in the SDK. "Intellectual Property Rights" means any and all rights under patent law, copyright law, trade secret law, trademark law, and any and all other proprietary rights. Google reserves all rights not expressly granted to you. 3.4 You may not use the SDK for any purpose not expressly permitted by the License Agreement. Except to the extent required by applicable third party licenses, you may not copy (except for backup purposes), modify, adapt, redistribute, decompile, reverse engineer, disassemble, or create derivative works of the SDK or any part of the SDK. 3.5 Use, reproduction and distribution of components of the SDK licensed under an open source software license are governed solely by the terms of that open source software license and not the License Agreement. 3.6 You agree that the form and nature of the SDK that Google provides may change without prior notice to you and that future versions of the SDK may be incompatible with applications developed on previous versions of the SDK. You agree that Google may stop (permanently or temporarily) providing the SDK (or any features within the SDK) to you or to users generally at Google's sole discretion, without prior notice to you. 3.7 Nothing in the License Agreement gives you a right to use any of Google's trade names, trademarks, service marks, logos, domain names, or other distinctive brand features. 3.8 You agree that you will not remove, obscure, or alter any proprietary rights notices (including copyright and trademark notices) that may be affixed to or contained within the SDK.

4. Use of the SDK by You

4.1 Google agrees that it obtains no right, title or interest from you (or your licensors) under the License Agreement in or to any software applications that you develop using the SDK, including any intellectual property rights that subsist in those applications. 4.2 You agree to use the SDK and write applications only for purposes that are permitted by (a) the License Agreement and (b) any applicable law, regulation or generally accepted practices or guidelines in the relevant jurisdictions (including any laws regarding the export of data or software to and from the United States or other relevant countries). 4.3 You agree that if you use the SDK to develop applications for general public users, you will protect the privacy and legal rights of those users. If the users provide you with user names, passwords, or other login information or personal information, you must make the users aware that the information will be available to your application, and you must provide legally adequate privacy notice and protection for those users. If your application stores personal or sensitive information provided by users, it must do so securely. If the user provides your application with Google Account information, your application may only use that information to access the user's Google Account when, and for the limited purposes for which, the user has given you permission to do so. 4.4 You agree that you will not engage in any activity with the SDK, including the development or distribution of an application, that interferes with, disrupts, damages, or accesses in an unauthorized manner the servers, networks, or other properties or services of any third party including, but not limited to, Google or any mobile communications carrier. 4.5 You agree that you are solely responsible for (and that Google has no responsibility to you or to any third party for) any data, content, or resources that you create, transmit or display through Android and/or applications for Android, and for the consequences of your actions (including any loss or damage which Google may suffer) by doing so. 4.6 You agree that you are solely responsible for (and that Google has no responsibility to you or to any third party for) any breach of your obligations under the License Agreement, any applicable third party contract or Terms of Service, or any applicable law or regulation, and for the consequences (including any loss or damage which Google or any third party may suffer) of any such breach.

5. Your Developer Credentials

5.1 You agree that you are responsible for maintaining the confidentiality of any developer credentials that may be issued to you by Google or which you may choose yourself and that you will be solely responsible for all applications that are developed under your developer credentials.

6. Privacy and Information

6.1 In order to continually innovate and improve the SDK, Google may collect certain usage statistics from the software including but not limited to a unique identifier, associated IP address, version number of the software, and information on which tools and/or services in the SDK are being used and how they are being used. Before any of this information is collected, the SDK will notify you and seek your consent. If you withhold consent, the information will not be collected. 6.2 The data collected is examined in the aggregate to improve the SDK and is maintained in accordance with Google's Privacy Policy.

7. Third Party Applications

7.1 If you use the SDK to run applications developed by a third party or that access data, content or resources provided by a third party, you agree that Google is not responsible for those applications, data, content, or resources. You understand that all data, content or resources which you may access through such third party applications are the sole responsibility of the person from which they originated and that Google is not liable for any loss or damage that you may experience as a result of the use or access of any of those third party applications, data, content, or resources. 7.2 You should be aware the data, content, and resources presented to you through such a third party application may be protected by intellectual property rights which are owned by the providers (or by other persons or companies on their behalf). You may not modify, rent, lease, loan, sell, distribute or create derivative works based on these data, content, or resources (either in whole or in part) unless you have been specifically given permission to do so by the relevant owners. 7.3 You acknowledge that your use of such third party applications, data, content, or resources may be subject to separate terms between you and the relevant third party. In that case, the License Agreement does not affect your legal relationship with these third parties.

8. Using Android APIs

8.1 Google Data APIs 8.1.1 If you use any API to retrieve data from Google, you acknowledge that the data may be protected by intellectual property rights which are owned by Google or those parties that provide the data (or by other persons or companies on their behalf). Your use of any such API may be subject to additional Terms of Service. You may not modify, rent, lease, loan, sell, distribute or create derivative works based on this data (either in whole or in part) unless allowed by the relevant Terms of Service. 8.1.2 If you use any API to retrieve a user's data from Google, you acknowledge and agree that you shall retrieve data only with the user's explicit consent and only when, and for the limited purposes for which, the user has given you permission to do so.

9. Terminating this License Agreement

9.1 The License Agreement will continue to apply until terminated by either you or Google as set out below. 9.2 If you want to terminate the License Agreement, you may do so by ceasing your use of the SDK and any relevant developer credentials. 9.3 Google may at any time, terminate the License Agreement with you if: (A) you have breached any provision of the License Agreement; or (B) Google is required to do so by law; or (C) the partner with whom Google offered certain parts of SDK (such as APIs) to you has terminated its relationship with Google or ceased to offer certain parts of the SDK to you; or (D) Google decides to no longer provide the SDK or certain parts of the SDK to users in the country in which you are resident or from which you use the service, or the provision of the SDK or certain SDK services to you by Google is, in Google's sole discretion, no longer commercially viable. 9.4 When the License Agreement comes to an end, all of the legal rights, obligations and liabilities that you and Google have benefited from, been subject to (or which have accrued over time whilst the License Agreement has been in force) or which are expressed to continue indefinitely, shall be unaffected by this cessation, and the provisions of paragraph 14.7 shall continue to apply to such rights, obligations and liabilities indefinitely.

10. DISCLAIMER OF WARRANTIES

10.1 YOU EXPRESSLY UNDERSTAND AND AGREE THAT YOUR USE OF THE SDK IS AT YOUR SOLE RISK AND THAT THE SDK IS PROVIDED "AS IS" AND "AS AVAILABLE" WITHOUT WARRANTY OF ANY KIND FROM GOOGLE. 10.2 YOUR USE OF THE SDK AND ANY MATERIAL DOWNLOADED OR OTHERWISE OBTAINED THROUGH THE USE OF THE SDK IS AT YOUR OWN DISCRETION AND RISK AND YOU ARE SOLELY RESPONSIBLE FOR ANY DAMAGE TO YOUR COMPUTER SYSTEM OR OTHER DEVICE OR LOSS OF DATA THAT RESULTS FROM SUCH USE. 10.3 GOOGLE FURTHER EXPRESSLY DISCLAIMS ALL WARRANTIES AND CONDITIONS OF ANY KIND, WHETHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO THE IMPLIED WARRANTIES AND CONDITIONS OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.

11. LIMITATION OF LIABILITY

11.1 YOU EXPRESSLY UNDERSTAND AND AGREE THAT GOOGLE, ITS SUBSIDIARIES AND AFFILIATES, AND ITS LICENSORS SHALL NOT BE LIABLE TO YOU UNDER ANY THEORY OF LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, CONSEQUENTIAL OR EXEMPLARY DAMAGES THAT MAY BE INCURRED BY YOU, INCLUDING ANY LOSS OF DATA, WHETHER OR NOT GOOGLE OR ITS REPRESENTATIVES HAVE BEEN ADVISED OF OR SHOULD HAVE BEEN AWARE OF THE POSSIBILITY OF ANY SUCH LOSSES ARISING.

12. Indemnification

12.1 To the maximum extent permitted by law, you agree to defend, indemnify and hold harmless Google, its affiliates and their respective directors, officers, employees and agents from and against any and all claims, actions, suits or proceedings, as well as any and all losses, liabilities, damages, costs and expenses (including reasonable attorneys fees) arising out of or accruing from (a) your use of the SDK, (b) any application you develop on the SDK that infringes any copyright, trademark, trade secret, trade dress, patent or other intellectual property right of any person or defames any person or violates their rights of publicity or privacy, and (c) any non-compliance by you with the License Agreement.

13. Changes to the License Agreement

13.1 Google may make changes to the License Agreement as it distributes new versions of the SDK. When these changes are made, Google will make a new version of the License Agreement available on the website where the SDK is made available.

14. General Legal Terms

14.1 The License Agreement constitutes the whole legal agreement between you and Google and governs your use of the SDK (excluding any services which Google may provide to you under a separate written agreement), and completely replaces any prior agreements between you and Google in relation to the SDK. 14.2 You agree that if Google does not exercise or enforce any legal right or remedy which is contained in the License Agreement (or which Google has the benefit of under any applicable law), this will not be taken to be a formal waiver of Google's rights and that those rights or remedies will still be available to Google. 14.3 If any court of law, having the jurisdiction to decide on this matter, rules that any provision of the License Agreement is invalid, then that provision will be removed from the License Agreement without affecting the rest of the License Agreement. The remaining provisions of the License Agreement will continue to be valid and enforceable. 14.4 You acknowledge and agree that each member of the group of companies of which Google is the parent shall be third party beneficiaries to the License Agreement and that such other companies shall be entitled to directly enforce, and rely upon, any provision of the License Agreement that confers a benefit on (or rights in favor of) them. Other than this, no other person or company shall be third party beneficiaries to the License Agreement. 14.5 EXPORT RESTRICTIONS. THE SDK IS SUBJECT TO UNITED STATES EXPORT LAWS AND REGULATIONS. YOU MUST COMPLY WITH ALL DOMESTIC AND INTERNATIONAL EXPORT LAWS AND REGULATIONS THAT APPLY TO THE SDK. THESE LAWS INCLUDE RESTRICTIONS ON DESTINATIONS, END USERS AND END USE. 14.6 The rights granted in the License Agreement may not be assigned or transferred by either you or Google without the prior written approval of the other party. Neither you nor Google shall be permitted to delegate their responsibilities or obligations under the License Agreement without the prior written approval of the other party. 14.7 The License Agreement, and your relationship with Google under the License Agreement, shall be governed by the laws of the State of California without regard to its conflict of laws provisions. You and Google agree to submit to the exclusive jurisdiction of the courts located within the county of Santa Clara, California to resolve any legal matter arising from the License Agreement. Notwithstanding this, you agree that Google shall still be allowed to apply for injunctive remedies (or an equivalent type of urgent legal relief) in any jurisdiction. December 9, 2016

Download the Android NDK for Mac

Download the Android NDK for Mac

android-ndk-r17-darwin-x86_64.zip

Download the Android NDK

Before downloading, you must agree to the following terms and conditions.

Terms and Conditions

This is the Android Software Development Kit License Agreement

1. Introduction

1.1 The Android Software Development Kit (referred to in the License Agreement as the "SDK" and specifically including the Android system files, packaged APIs, and Google APIs add-ons) is licensed to you subject to the terms of the License Agreement. The License Agreement forms a legally binding contract between you and Google in relation to your use of the SDK. 1.2 "Android" means the Android software stack for devices, as made available under the Android Open Source Project, which is located at the following URL: http://source.android.com/, as updated from time to time. 1.3 A "compatible implementation" means any Android device that (i) complies with the Android Compatibility Definition document, which can be found at the Android compatibility website (http://source.android.com/compatibility) and which may be updated from time to time; and (ii) successfully passes the Android Compatibility Test Suite (CTS). 1.4 "Google" means Google LLC, a Delaware corporation with principal place of business at 1600 Amphitheatre Parkway, Mountain View, CA 94043, United States.

2. Accepting this License Agreement

2.1 In order to use the SDK, you must first agree to the License Agreement. You may not use the SDK if you do not accept the License Agreement. 2.2 By clicking to accept, you hereby agree to the terms of the License Agreement. 2.3 You may not use the SDK and may not accept the License Agreement if you are a person barred from receiving the SDK under the laws of the United States or other countries, including the country in which you are resident or from which you use the SDK. 2.4 If you are agreeing to be bound by the License Agreement on behalf of your employer or other entity, you represent and warrant that you have full legal authority to bind your employer or such entity to the License Agreement. If you do not have the requisite authority, you may not accept the License Agreement or use the SDK on behalf of your employer or other entity.

3. SDK License from Google

3.1 Subject to the terms of the License Agreement, Google grants you a limited, worldwide, royalty-free, non-assignable, non-exclusive, and non-sublicensable license to use the SDK solely to develop applications for compatible implementations of Android. 3.2 You may not use this SDK to develop applications for other platforms (including non-compatible implementations of Android) or to develop another SDK. You are of course free to develop applications for other platforms, including non-compatible implementations of Android, provided that this SDK is not used for that purpose. 3.3 You agree that Google or third parties own all legal right, title and interest in and to the SDK, including any Intellectual Property Rights that subsist in the SDK. "Intellectual Property Rights" means any and all rights under patent law, copyright law, trade secret law, trademark law, and any and all other proprietary rights. Google reserves all rights not expressly granted to you. 3.4 You may not use the SDK for any purpose not expressly permitted by the License Agreement. Except to the extent required by applicable third party licenses, you may not copy (except for backup purposes), modify, adapt, redistribute, decompile, reverse engineer, disassemble, or create derivative works of the SDK or any part of the SDK. 3.5 Use, reproduction and distribution of components of the SDK licensed under an open source software license are governed solely by the terms of that open source software license and not the License Agreement. 3.6 You agree that the form and nature of the SDK that Google provides may change without prior notice to you and that future versions of the SDK may be incompatible with applications developed on previous versions of the SDK. You agree that Google may stop (permanently or temporarily) providing the SDK (or any features within the SDK) to you or to users generally at Google's sole discretion, without prior notice to you. 3.7 Nothing in the License Agreement gives you a right to use any of Google's trade names, trademarks, service marks, logos, domain names, or other distinctive brand features. 3.8 You agree that you will not remove, obscure, or alter any proprietary rights notices (including copyright and trademark notices) that may be affixed to or contained within the SDK.

4. Use of the SDK by You

4.1 Google agrees that it obtains no right, title or interest from you (or your licensors) under the License Agreement in or to any software applications that you develop using the SDK, including any intellectual property rights that subsist in those applications. 4.2 You agree to use the SDK and write applications only for purposes that are permitted by (a) the License Agreement and (b) any applicable law, regulation or generally accepted practices or guidelines in the relevant jurisdictions (including any laws regarding the export of data or software to and from the United States or other relevant countries). 4.3 You agree that if you use the SDK to develop applications for general public users, you will protect the privacy and legal rights of those users. If the users provide you with user names, passwords, or other login information or personal information, you must make the users aware that the information will be available to your application, and you must provide legally adequate privacy notice and protection for those users. If your application stores personal or sensitive information provided by users, it must do so securely. If the user provides your application with Google Account information, your application may only use that information to access the user's Google Account when, and for the limited purposes for which, the user has given you permission to do so. 4.4 You agree that you will not engage in any activity with the SDK, including the development or distribution of an application, that interferes with, disrupts, damages, or accesses in an unauthorized manner the servers, networks, or other properties or services of any third party including, but not limited to, Google or any mobile communications carrier. 4.5 You agree that you are solely responsible for (and that Google has no responsibility to you or to any third party for) any data, content, or resources that you create, transmit or display through Android and/or applications for Android, and for the consequences of your actions (including any loss or damage which Google may suffer) by doing so. 4.6 You agree that you are solely responsible for (and that Google has no responsibility to you or to any third party for) any breach of your obligations under the License Agreement, any applicable third party contract or Terms of Service, or any applicable law or regulation, and for the consequences (including any loss or damage which Google or any third party may suffer) of any such breach.

5. Your Developer Credentials

5.1 You agree that you are responsible for maintaining the confidentiality of any developer credentials that may be issued to you by Google or which you may choose yourself and that you will be solely responsible for all applications that are developed under your developer credentials.

6. Privacy and Information

6.1 In order to continually innovate and improve the SDK, Google may collect certain usage statistics from the software including but not limited to a unique identifier, associated IP address, version number of the software, and information on which tools and/or services in the SDK are being used and how they are being used. Before any of this information is collected, the SDK will notify you and seek your consent. If you withhold consent, the information will not be collected. 6.2 The data collected is examined in the aggregate to improve the SDK and is maintained in accordance with Google's Privacy Policy.

7. Third Party Applications

7.1 If you use the SDK to run applications developed by a third party or that access data, content or resources provided by a third party, you agree that Google is not responsible for those applications, data, content, or resources. You understand that all data, content or resources which you may access through such third party applications are the sole responsibility of the person from which they originated and that Google is not liable for any loss or damage that you may experience as a result of the use or access of any of those third party applications, data, content, or resources. 7.2 You should be aware the data, content, and resources presented to you through such a third party application may be protected by intellectual property rights which are owned by the providers (or by other persons or companies on their behalf). You may not modify, rent, lease, loan, sell, distribute or create derivative works based on these data, content, or resources (either in whole or in part) unless you have been specifically given permission to do so by the relevant owners. 7.3 You acknowledge that your use of such third party applications, data, content, or resources may be subject to separate terms between you and the relevant third party. In that case, the License Agreement does not affect your legal relationship with these third parties.

8. Using Android APIs

8.1 Google Data APIs 8.1.1 If you use any API to retrieve data from Google, you acknowledge that the data may be protected by intellectual property rights which are owned by Google or those parties that provide the data (or by other persons or companies on their behalf). Your use of any such API may be subject to additional Terms of Service. You may not modify, rent, lease, loan, sell, distribute or create derivative works based on this data (either in whole or in part) unless allowed by the relevant Terms of Service. 8.1.2 If you use any API to retrieve a user's data from Google, you acknowledge and agree that you shall retrieve data only with the user's explicit consent and only when, and for the limited purposes for which, the user has given you permission to do so.

9. Terminating this License Agreement

9.1 The License Agreement will continue to apply until terminated by either you or Google as set out below. 9.2 If you want to terminate the License Agreement, you may do so by ceasing your use of the SDK and any relevant developer credentials. 9.3 Google may at any time, terminate the License Agreement with you if: (A) you have breached any provision of the License Agreement; or (B) Google is required to do so by law; or (C) the partner with whom Google offered certain parts of SDK (such as APIs) to you has terminated its relationship with Google or ceased to offer certain parts of the SDK to you; or (D) Google decides to no longer provide the SDK or certain parts of the SDK to users in the country in which you are resident or from which you use the service, or the provision of the SDK or certain SDK services to you by Google is, in Google's sole discretion, no longer commercially viable. 9.4 When the License Agreement comes to an end, all of the legal rights, obligations and liabilities that you and Google have benefited from, been subject to (or which have accrued over time whilst the License Agreement has been in force) or which are expressed to continue indefinitely, shall be unaffected by this cessation, and the provisions of paragraph 14.7 shall continue to apply to such rights, obligations and liabilities indefinitely.

10. DISCLAIMER OF WARRANTIES

10.1 YOU EXPRESSLY UNDERSTAND AND AGREE THAT YOUR USE OF THE SDK IS AT YOUR SOLE RISK AND THAT THE SDK IS PROVIDED "AS IS" AND "AS AVAILABLE" WITHOUT WARRANTY OF ANY KIND FROM GOOGLE. 10.2 YOUR USE OF THE SDK AND ANY MATERIAL DOWNLOADED OR OTHERWISE OBTAINED THROUGH THE USE OF THE SDK IS AT YOUR OWN DISCRETION AND RISK AND YOU ARE SOLELY RESPONSIBLE FOR ANY DAMAGE TO YOUR COMPUTER SYSTEM OR OTHER DEVICE OR LOSS OF DATA THAT RESULTS FROM SUCH USE. 10.3 GOOGLE FURTHER EXPRESSLY DISCLAIMS ALL WARRANTIES AND CONDITIONS OF ANY KIND, WHETHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO THE IMPLIED WARRANTIES AND CONDITIONS OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.

11. LIMITATION OF LIABILITY

11.1 YOU EXPRESSLY UNDERSTAND AND AGREE THAT GOOGLE, ITS SUBSIDIARIES AND AFFILIATES, AND ITS LICENSORS SHALL NOT BE LIABLE TO YOU UNDER ANY THEORY OF LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, CONSEQUENTIAL OR EXEMPLARY DAMAGES THAT MAY BE INCURRED BY YOU, INCLUDING ANY LOSS OF DATA, WHETHER OR NOT GOOGLE OR ITS REPRESENTATIVES HAVE BEEN ADVISED OF OR SHOULD HAVE BEEN AWARE OF THE POSSIBILITY OF ANY SUCH LOSSES ARISING.

12. Indemnification

12.1 To the maximum extent permitted by law, you agree to defend, indemnify and hold harmless Google, its affiliates and their respective directors, officers, employees and agents from and against any and all claims, actions, suits or proceedings, as well as any and all losses, liabilities, damages, costs and expenses (including reasonable attorneys fees) arising out of or accruing from (a) your use of the SDK, (b) any application you develop on the SDK that infringes any copyright, trademark, trade secret, trade dress, patent or other intellectual property right of any person or defames any person or violates their rights of publicity or privacy, and (c) any non-compliance by you with the License Agreement.

13. Changes to the License Agreement

13.1 Google may make changes to the License Agreement as it distributes new versions of the SDK. When these changes are made, Google will make a new version of the License Agreement available on the website where the SDK is made available.

14. General Legal Terms

14.1 The License Agreement constitutes the whole legal agreement between you and Google and governs your use of the SDK (excluding any services which Google may provide to you under a separate written agreement), and completely replaces any prior agreements between you and Google in relation to the SDK. 14.2 You agree that if Google does not exercise or enforce any legal right or remedy which is contained in the License Agreement (or which Google has the benefit of under any applicable law), this will not be taken to be a formal waiver of Google's rights and that those rights or remedies will still be available to Google. 14.3 If any court of law, having the jurisdiction to decide on this matter, rules that any provision of the License Agreement is invalid, then that provision will be removed from the License Agreement without affecting the rest of the License Agreement. The remaining provisions of the License Agreement will continue to be valid and enforceable. 14.4 You acknowledge and agree that each member of the group of companies of which Google is the parent shall be third party beneficiaries to the License Agreement and that such other companies shall be entitled to directly enforce, and rely upon, any provision of the License Agreement that confers a benefit on (or rights in favor of) them. Other than this, no other person or company shall be third party beneficiaries to the License Agreement. 14.5 EXPORT RESTRICTIONS. THE SDK IS SUBJECT TO UNITED STATES EXPORT LAWS AND REGULATIONS. YOU MUST COMPLY WITH ALL DOMESTIC AND INTERNATIONAL EXPORT LAWS AND REGULATIONS THAT APPLY TO THE SDK. THESE LAWS INCLUDE RESTRICTIONS ON DESTINATIONS, END USERS AND END USE. 14.6 The rights granted in the License Agreement may not be assigned or transferred by either you or Google without the prior written approval of the other party. Neither you nor Google shall be permitted to delegate their responsibilities or obligations under the License Agreement without the prior written approval of the other party. 14.7 The License Agreement, and your relationship with Google under the License Agreement, shall be governed by the laws of the State of California without regard to its conflict of laws provisions. You and Google agree to submit to the exclusive jurisdiction of the courts located within the county of Santa Clara, California to resolve any legal matter arising from the License Agreement. Notwithstanding this, you agree that Google shall still be allowed to apply for injunctive remedies (or an equivalent type of urgent legal relief) in any jurisdiction. December 9, 2016

Download the Android NDK for Linux

Download the Android NDK for Linux

android-ndk-r17-linux-x86_64.zip

ubuntu-make-18.09+disco1/tests/data/server-content/developer.android.com/studio/0000755000000000000000000000000013352651520024557 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/developer.android.com/studio/index.html0000644000000000000000000064250513352651520026570 0ustar Download Android Studio and SDK Tools  |  Android Developers
lightbulb_outline Please take our April 2018 developer survey. Start survey

Android Studio provides the fastest tools for building apps on every type of Android device.

3.1.2 for Linux 64-bit (853 MB)

Visual layout editor

Create complex layouts with ConstraintLayout by adding constraints from each view to other views and guidelines. Then preview your layout on any screen size by selecting one of various device configurations or by simply resizing the preview window.

APK analyzer

Find opportunities to reduce your Android app size by inspecting the contents of your app APK file, even if it wasn't built with Android Studio. Inspect the manifest file, resources, and DEX files. Compare two APKs to see how your app size changed between app versions.

Fast emulator

Install and run your apps faster than with a physical device and simulate different configurations and features, including Google ARCore, the built-in platform for augmented reality.

Intelligent code editor

Write better code, work faster, and be more productive with an intelligent code editor that provides code completion for Kotlin, Java, and C/C++ languages.

Flexible build system

Powered by Gradle, Android Studio's build system allows you to customize your build to generate multiple build variants for different devices from a single project.

Realtime profilers

The built-in profiling tools provide realtime statistics for your app's CPU, memory, and network activity. Identify performance bottlenecks by recording method traces, inspecting the heap and allocations, and see incoming and outgoing network payloads.

Latest videos

More videos

Latest news

More news

Android Studio downloads

PlatformAndroid Studio packageSizeSHA-256 checksum
Windows
(64-bit)

Recommended
758 MBe2695b73300ec398325cc5f242c6ecfd6e84db190b7d48e6e78a8b0115d49b0d

No .exe installer
854 MBe8903b443dd73ec120c5a967b2c7d9db82d8ffb4735a39d3b979d22c61e882ad
Windows
(32-bit)

No .exe installer
854 MBc238f54f795db03f9d4a4077464bd9303113504327d5878b27c9e965676c6473
Mac848 MB4665cb18c838a3695a417cebc7751cbe658a297a9d6c01cbd9e9a1979b8b167e
Linux853 MB48685a6824453275ac7e4bac8c9efa173c3ac8eb79cf7455a290286544bc074c

See the Android Studio release notes.

Command line tools only

If you do not need Android Studio, you can download the basic Android command line tools below. You can use the included sdkmanager to download other SDK packages.

These tools are included in Android Studio.

PlatformSDK tools packageSizeSHA-256 checksum
Windows132 MB7f6037d3a7d6789b4fdc06ee7af041e071e9860c51f66f7a4eb5913df9871fd2
Mac82 MB4a81754a760fce88cba74d69c364b05b31c53d57b26f9f82355c61d5fe4b9df9
Linux131 MBbaea07c35490480d624168ca65d08d8060ff28cc9ad87edf477c2b83335d87fd

See the SDK tools release notes.

System requirements

Windows

  • Microsoft® Windows® 7/8/10 (32- or 64-bit)
  • 3 GB RAM minimum, 8 GB RAM recommended; plus 1 GB for the Android Emulator
  • 2 GB of available disk space minimum,
    4 GB Recommended (500 MB for IDE + 1.5 GB for Android SDK and emulator system image)
  • 1280 x 800 minimum screen resolution

Mac

  • Mac® OS X® 10.10 (Yosemite) or higher, up to 10.13 (macOS High Sierra)
  • 3 GB RAM minimum, 8 GB RAM recommended; plus 1 GB for the Android Emulator
  • 2 GB of available disk space minimum,
    4 GB Recommended (500 MB for IDE + 1.5 GB for Android SDK and emulator system image)
  • 1280 x 800 minimum screen resolution

Linux

  • GNOME or KDE desktop

    Tested on Ubuntu® 14.04 LTS, Trusty Tahr (64-bit distribution capable of running 32-bit applications)

  • 64-bit distribution capable of running 32-bit applications
  • GNU C Library (glibc) 2.19 or later
  • 3 GB RAM minimum, 8 GB RAM recommended; plus 1 GB for the Android Emulator
  • 2 GB of available disk space minimum,
    4 GB Recommended (500 MB for IDE + 1.5 GB for Android SDK and emulator system image)
  • 1280 x 800 minimum screen resolution

Thank you for downloading Android Studio!

If you're new to Android development, check out the following resources to get started.

For help installing Android Studio, see the Install guide.

Download Android Studio

Before downloading, you must agree to the following terms and conditions.

Terms and Conditions

This is the Android Software Development Kit License Agreement

1. Introduction

1.1 The Android Software Development Kit (referred to in the License Agreement as the "SDK" and specifically including the Android system files, packaged APIs, and Google APIs add-ons) is licensed to you subject to the terms of the License Agreement. The License Agreement forms a legally binding contract between you and Google in relation to your use of the SDK. 1.2 "Android" means the Android software stack for devices, as made available under the Android Open Source Project, which is located at the following URL: http://source.android.com/, as updated from time to time. 1.3 A "compatible implementation" means any Android device that (i) complies with the Android Compatibility Definition document, which can be found at the Android compatibility website (http://source.android.com/compatibility) and which may be updated from time to time; and (ii) successfully passes the Android Compatibility Test Suite (CTS). 1.4 "Google" means Google LLC, a Delaware corporation with principal place of business at 1600 Amphitheatre Parkway, Mountain View, CA 94043, United States.

2. Accepting this License Agreement

2.1 In order to use the SDK, you must first agree to the License Agreement. You may not use the SDK if you do not accept the License Agreement. 2.2 By clicking to accept, you hereby agree to the terms of the License Agreement. 2.3 You may not use the SDK and may not accept the License Agreement if you are a person barred from receiving the SDK under the laws of the United States or other countries, including the country in which you are resident or from which you use the SDK. 2.4 If you are agreeing to be bound by the License Agreement on behalf of your employer or other entity, you represent and warrant that you have full legal authority to bind your employer or such entity to the License Agreement. If you do not have the requisite authority, you may not accept the License Agreement or use the SDK on behalf of your employer or other entity.

3. SDK License from Google

3.1 Subject to the terms of the License Agreement, Google grants you a limited, worldwide, royalty-free, non-assignable, non-exclusive, and non-sublicensable license to use the SDK solely to develop applications for compatible implementations of Android. 3.2 You may not use this SDK to develop applications for other platforms (including non-compatible implementations of Android) or to develop another SDK. You are of course free to develop applications for other platforms, including non-compatible implementations of Android, provided that this SDK is not used for that purpose. 3.3 You agree that Google or third parties own all legal right, title and interest in and to the SDK, including any Intellectual Property Rights that subsist in the SDK. "Intellectual Property Rights" means any and all rights under patent law, copyright law, trade secret law, trademark law, and any and all other proprietary rights. Google reserves all rights not expressly granted to you. 3.4 You may not use the SDK for any purpose not expressly permitted by the License Agreement. Except to the extent required by applicable third party licenses, you may not copy (except for backup purposes), modify, adapt, redistribute, decompile, reverse engineer, disassemble, or create derivative works of the SDK or any part of the SDK. 3.5 Use, reproduction and distribution of components of the SDK licensed under an open source software license are governed solely by the terms of that open source software license and not the License Agreement. 3.6 You agree that the form and nature of the SDK that Google provides may change without prior notice to you and that future versions of the SDK may be incompatible with applications developed on previous versions of the SDK. You agree that Google may stop (permanently or temporarily) providing the SDK (or any features within the SDK) to you or to users generally at Google's sole discretion, without prior notice to you. 3.7 Nothing in the License Agreement gives you a right to use any of Google's trade names, trademarks, service marks, logos, domain names, or other distinctive brand features. 3.8 You agree that you will not remove, obscure, or alter any proprietary rights notices (including copyright and trademark notices) that may be affixed to or contained within the SDK.

4. Use of the SDK by You

4.1 Google agrees that it obtains no right, title or interest from you (or your licensors) under the License Agreement in or to any software applications that you develop using the SDK, including any intellectual property rights that subsist in those applications. 4.2 You agree to use the SDK and write applications only for purposes that are permitted by (a) the License Agreement and (b) any applicable law, regulation or generally accepted practices or guidelines in the relevant jurisdictions (including any laws regarding the export of data or software to and from the United States or other relevant countries). 4.3 You agree that if you use the SDK to develop applications for general public users, you will protect the privacy and legal rights of those users. If the users provide you with user names, passwords, or other login information or personal information, you must make the users aware that the information will be available to your application, and you must provide legally adequate privacy notice and protection for those users. If your application stores personal or sensitive information provided by users, it must do so securely. If the user provides your application with Google Account information, your application may only use that information to access the user's Google Account when, and for the limited purposes for which, the user has given you permission to do so. 4.4 You agree that you will not engage in any activity with the SDK, including the development or distribution of an application, that interferes with, disrupts, damages, or accesses in an unauthorized manner the servers, networks, or other properties or services of any third party including, but not limited to, Google or any mobile communications carrier. 4.5 You agree that you are solely responsible for (and that Google has no responsibility to you or to any third party for) any data, content, or resources that you create, transmit or display through Android and/or applications for Android, and for the consequences of your actions (including any loss or damage which Google may suffer) by doing so. 4.6 You agree that you are solely responsible for (and that Google has no responsibility to you or to any third party for) any breach of your obligations under the License Agreement, any applicable third party contract or Terms of Service, or any applicable law or regulation, and for the consequences (including any loss or damage which Google or any third party may suffer) of any such breach.

5. Your Developer Credentials

5.1 You agree that you are responsible for maintaining the confidentiality of any developer credentials that may be issued to you by Google or which you may choose yourself and that you will be solely responsible for all applications that are developed under your developer credentials.

6. Privacy and Information

6.1 In order to continually innovate and improve the SDK, Google may collect certain usage statistics from the software including but not limited to a unique identifier, associated IP address, version number of the software, and information on which tools and/or services in the SDK are being used and how they are being used. Before any of this information is collected, the SDK will notify you and seek your consent. If you withhold consent, the information will not be collected. 6.2 The data collected is examined in the aggregate to improve the SDK and is maintained in accordance with Google's Privacy Policy.

7. Third Party Applications

7.1 If you use the SDK to run applications developed by a third party or that access data, content or resources provided by a third party, you agree that Google is not responsible for those applications, data, content, or resources. You understand that all data, content or resources which you may access through such third party applications are the sole responsibility of the person from which they originated and that Google is not liable for any loss or damage that you may experience as a result of the use or access of any of those third party applications, data, content, or resources. 7.2 You should be aware the data, content, and resources presented to you through such a third party application may be protected by intellectual property rights which are owned by the providers (or by other persons or companies on their behalf). You may not modify, rent, lease, loan, sell, distribute or create derivative works based on these data, content, or resources (either in whole or in part) unless you have been specifically given permission to do so by the relevant owners. 7.3 You acknowledge that your use of such third party applications, data, content, or resources may be subject to separate terms between you and the relevant third party. In that case, the License Agreement does not affect your legal relationship with these third parties.

8. Using Android APIs

8.1 Google Data APIs 8.1.1 If you use any API to retrieve data from Google, you acknowledge that the data may be protected by intellectual property rights which are owned by Google or those parties that provide the data (or by other persons or companies on their behalf). Your use of any such API may be subject to additional Terms of Service. You may not modify, rent, lease, loan, sell, distribute or create derivative works based on this data (either in whole or in part) unless allowed by the relevant Terms of Service. 8.1.2 If you use any API to retrieve a user's data from Google, you acknowledge and agree that you shall retrieve data only with the user's explicit consent and only when, and for the limited purposes for which, the user has given you permission to do so.

9. Terminating this License Agreement

9.1 The License Agreement will continue to apply until terminated by either you or Google as set out below. 9.2 If you want to terminate the License Agreement, you may do so by ceasing your use of the SDK and any relevant developer credentials. 9.3 Google may at any time, terminate the License Agreement with you if: (A) you have breached any provision of the License Agreement; or (B) Google is required to do so by law; or (C) the partner with whom Google offered certain parts of SDK (such as APIs) to you has terminated its relationship with Google or ceased to offer certain parts of the SDK to you; or (D) Google decides to no longer provide the SDK or certain parts of the SDK to users in the country in which you are resident or from which you use the service, or the provision of the SDK or certain SDK services to you by Google is, in Google's sole discretion, no longer commercially viable. 9.4 When the License Agreement comes to an end, all of the legal rights, obligations and liabilities that you and Google have benefited from, been subject to (or which have accrued over time whilst the License Agreement has been in force) or which are expressed to continue indefinitely, shall be unaffected by this cessation, and the provisions of paragraph 14.7 shall continue to apply to such rights, obligations and liabilities indefinitely.

10. DISCLAIMER OF WARRANTIES

10.1 YOU EXPRESSLY UNDERSTAND AND AGREE THAT YOUR USE OF THE SDK IS AT YOUR SOLE RISK AND THAT THE SDK IS PROVIDED "AS IS" AND "AS AVAILABLE" WITHOUT WARRANTY OF ANY KIND FROM GOOGLE. 10.2 YOUR USE OF THE SDK AND ANY MATERIAL DOWNLOADED OR OTHERWISE OBTAINED THROUGH THE USE OF THE SDK IS AT YOUR OWN DISCRETION AND RISK AND YOU ARE SOLELY RESPONSIBLE FOR ANY DAMAGE TO YOUR COMPUTER SYSTEM OR OTHER DEVICE OR LOSS OF DATA THAT RESULTS FROM SUCH USE. 10.3 GOOGLE FURTHER EXPRESSLY DISCLAIMS ALL WARRANTIES AND CONDITIONS OF ANY KIND, WHETHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO THE IMPLIED WARRANTIES AND CONDITIONS OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.

11. LIMITATION OF LIABILITY

11.1 YOU EXPRESSLY UNDERSTAND AND AGREE THAT GOOGLE, ITS SUBSIDIARIES AND AFFILIATES, AND ITS LICENSORS SHALL NOT BE LIABLE TO YOU UNDER ANY THEORY OF LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, CONSEQUENTIAL OR EXEMPLARY DAMAGES THAT MAY BE INCURRED BY YOU, INCLUDING ANY LOSS OF DATA, WHETHER OR NOT GOOGLE OR ITS REPRESENTATIVES HAVE BEEN ADVISED OF OR SHOULD HAVE BEEN AWARE OF THE POSSIBILITY OF ANY SUCH LOSSES ARISING.

12. Indemnification

12.1 To the maximum extent permitted by law, you agree to defend, indemnify and hold harmless Google, its affiliates and their respective directors, officers, employees and agents from and against any and all claims, actions, suits or proceedings, as well as any and all losses, liabilities, damages, costs and expenses (including reasonable attorneys fees) arising out of or accruing from (a) your use of the SDK, (b) any application you develop on the SDK that infringes any copyright, trademark, trade secret, trade dress, patent or other intellectual property right of any person or defames any person or violates their rights of publicity or privacy, and (c) any non-compliance by you with the License Agreement.

13. Changes to the License Agreement

13.1 Google may make changes to the License Agreement as it distributes new versions of the SDK. When these changes are made, Google will make a new version of the License Agreement available on the website where the SDK is made available.

14. General Legal Terms

14.1 The License Agreement constitutes the whole legal agreement between you and Google and governs your use of the SDK (excluding any services which Google may provide to you under a separate written agreement), and completely replaces any prior agreements between you and Google in relation to the SDK. 14.2 You agree that if Google does not exercise or enforce any legal right or remedy which is contained in the License Agreement (or which Google has the benefit of under any applicable law), this will not be taken to be a formal waiver of Google's rights and that those rights or remedies will still be available to Google. 14.3 If any court of law, having the jurisdiction to decide on this matter, rules that any provision of the License Agreement is invalid, then that provision will be removed from the License Agreement without affecting the rest of the License Agreement. The remaining provisions of the License Agreement will continue to be valid and enforceable. 14.4 You acknowledge and agree that each member of the group of companies of which Google is the parent shall be third party beneficiaries to the License Agreement and that such other companies shall be entitled to directly enforce, and rely upon, any provision of the License Agreement that confers a benefit on (or rights in favor of) them. Other than this, no other person or company shall be third party beneficiaries to the License Agreement. 14.5 EXPORT RESTRICTIONS. THE SDK IS SUBJECT TO UNITED STATES EXPORT LAWS AND REGULATIONS. YOU MUST COMPLY WITH ALL DOMESTIC AND INTERNATIONAL EXPORT LAWS AND REGULATIONS THAT APPLY TO THE SDK. THESE LAWS INCLUDE RESTRICTIONS ON DESTINATIONS, END USERS AND END USE. 14.6 The rights granted in the License Agreement may not be assigned or transferred by either you or Google without the prior written approval of the other party. Neither you nor Google shall be permitted to delegate their responsibilities or obligations under the License Agreement without the prior written approval of the other party. 14.7 The License Agreement, and your relationship with Google under the License Agreement, shall be governed by the laws of the State of California without regard to its conflict of laws provisions. You and Google agree to submit to the exclusive jurisdiction of the courts located within the county of Santa Clara, California to resolve any legal matter arising from the License Agreement. Notwithstanding this, you agree that Google shall still be allowed to apply for injunctive remedies (or an equivalent type of urgent legal relief) in any jurisdiction. December 9, 2016

Download Android Studio for Linux

Download Android Studio for Linux

android-studio-ide-173.4720617-linux.zip

Download Android Studio

Before downloading, you must agree to the following terms and conditions.

Terms and Conditions

This is the Android Software Development Kit License Agreement

1. Introduction

1.1 The Android Software Development Kit (referred to in the License Agreement as the "SDK" and specifically including the Android system files, packaged APIs, and Google APIs add-ons) is licensed to you subject to the terms of the License Agreement. The License Agreement forms a legally binding contract between you and Google in relation to your use of the SDK. 1.2 "Android" means the Android software stack for devices, as made available under the Android Open Source Project, which is located at the following URL: http://source.android.com/, as updated from time to time. 1.3 A "compatible implementation" means any Android device that (i) complies with the Android Compatibility Definition document, which can be found at the Android compatibility website (http://source.android.com/compatibility) and which may be updated from time to time; and (ii) successfully passes the Android Compatibility Test Suite (CTS). 1.4 "Google" means Google LLC, a Delaware corporation with principal place of business at 1600 Amphitheatre Parkway, Mountain View, CA 94043, United States.

2. Accepting this License Agreement

2.1 In order to use the SDK, you must first agree to the License Agreement. You may not use the SDK if you do not accept the License Agreement. 2.2 By clicking to accept, you hereby agree to the terms of the License Agreement. 2.3 You may not use the SDK and may not accept the License Agreement if you are a person barred from receiving the SDK under the laws of the United States or other countries, including the country in which you are resident or from which you use the SDK. 2.4 If you are agreeing to be bound by the License Agreement on behalf of your employer or other entity, you represent and warrant that you have full legal authority to bind your employer or such entity to the License Agreement. If you do not have the requisite authority, you may not accept the License Agreement or use the SDK on behalf of your employer or other entity.

3. SDK License from Google

3.1 Subject to the terms of the License Agreement, Google grants you a limited, worldwide, royalty-free, non-assignable, non-exclusive, and non-sublicensable license to use the SDK solely to develop applications for compatible implementations of Android. 3.2 You may not use this SDK to develop applications for other platforms (including non-compatible implementations of Android) or to develop another SDK. You are of course free to develop applications for other platforms, including non-compatible implementations of Android, provided that this SDK is not used for that purpose. 3.3 You agree that Google or third parties own all legal right, title and interest in and to the SDK, including any Intellectual Property Rights that subsist in the SDK. "Intellectual Property Rights" means any and all rights under patent law, copyright law, trade secret law, trademark law, and any and all other proprietary rights. Google reserves all rights not expressly granted to you. 3.4 You may not use the SDK for any purpose not expressly permitted by the License Agreement. Except to the extent required by applicable third party licenses, you may not copy (except for backup purposes), modify, adapt, redistribute, decompile, reverse engineer, disassemble, or create derivative works of the SDK or any part of the SDK. 3.5 Use, reproduction and distribution of components of the SDK licensed under an open source software license are governed solely by the terms of that open source software license and not the License Agreement. 3.6 You agree that the form and nature of the SDK that Google provides may change without prior notice to you and that future versions of the SDK may be incompatible with applications developed on previous versions of the SDK. You agree that Google may stop (permanently or temporarily) providing the SDK (or any features within the SDK) to you or to users generally at Google's sole discretion, without prior notice to you. 3.7 Nothing in the License Agreement gives you a right to use any of Google's trade names, trademarks, service marks, logos, domain names, or other distinctive brand features. 3.8 You agree that you will not remove, obscure, or alter any proprietary rights notices (including copyright and trademark notices) that may be affixed to or contained within the SDK.

4. Use of the SDK by You

4.1 Google agrees that it obtains no right, title or interest from you (or your licensors) under the License Agreement in or to any software applications that you develop using the SDK, including any intellectual property rights that subsist in those applications. 4.2 You agree to use the SDK and write applications only for purposes that are permitted by (a) the License Agreement and (b) any applicable law, regulation or generally accepted practices or guidelines in the relevant jurisdictions (including any laws regarding the export of data or software to and from the United States or other relevant countries). 4.3 You agree that if you use the SDK to develop applications for general public users, you will protect the privacy and legal rights of those users. If the users provide you with user names, passwords, or other login information or personal information, you must make the users aware that the information will be available to your application, and you must provide legally adequate privacy notice and protection for those users. If your application stores personal or sensitive information provided by users, it must do so securely. If the user provides your application with Google Account information, your application may only use that information to access the user's Google Account when, and for the limited purposes for which, the user has given you permission to do so. 4.4 You agree that you will not engage in any activity with the SDK, including the development or distribution of an application, that interferes with, disrupts, damages, or accesses in an unauthorized manner the servers, networks, or other properties or services of any third party including, but not limited to, Google or any mobile communications carrier. 4.5 You agree that you are solely responsible for (and that Google has no responsibility to you or to any third party for) any data, content, or resources that you create, transmit or display through Android and/or applications for Android, and for the consequences of your actions (including any loss or damage which Google may suffer) by doing so. 4.6 You agree that you are solely responsible for (and that Google has no responsibility to you or to any third party for) any breach of your obligations under the License Agreement, any applicable third party contract or Terms of Service, or any applicable law or regulation, and for the consequences (including any loss or damage which Google or any third party may suffer) of any such breach.

5. Your Developer Credentials

5.1 You agree that you are responsible for maintaining the confidentiality of any developer credentials that may be issued to you by Google or which you may choose yourself and that you will be solely responsible for all applications that are developed under your developer credentials.

6. Privacy and Information

6.1 In order to continually innovate and improve the SDK, Google may collect certain usage statistics from the software including but not limited to a unique identifier, associated IP address, version number of the software, and information on which tools and/or services in the SDK are being used and how they are being used. Before any of this information is collected, the SDK will notify you and seek your consent. If you withhold consent, the information will not be collected. 6.2 The data collected is examined in the aggregate to improve the SDK and is maintained in accordance with Google's Privacy Policy.

7. Third Party Applications

7.1 If you use the SDK to run applications developed by a third party or that access data, content or resources provided by a third party, you agree that Google is not responsible for those applications, data, content, or resources. You understand that all data, content or resources which you may access through such third party applications are the sole responsibility of the person from which they originated and that Google is not liable for any loss or damage that you may experience as a result of the use or access of any of those third party applications, data, content, or resources. 7.2 You should be aware the data, content, and resources presented to you through such a third party application may be protected by intellectual property rights which are owned by the providers (or by other persons or companies on their behalf). You may not modify, rent, lease, loan, sell, distribute or create derivative works based on these data, content, or resources (either in whole or in part) unless you have been specifically given permission to do so by the relevant owners. 7.3 You acknowledge that your use of such third party applications, data, content, or resources may be subject to separate terms between you and the relevant third party. In that case, the License Agreement does not affect your legal relationship with these third parties.

8. Using Android APIs

8.1 Google Data APIs 8.1.1 If you use any API to retrieve data from Google, you acknowledge that the data may be protected by intellectual property rights which are owned by Google or those parties that provide the data (or by other persons or companies on their behalf). Your use of any such API may be subject to additional Terms of Service. You may not modify, rent, lease, loan, sell, distribute or create derivative works based on this data (either in whole or in part) unless allowed by the relevant Terms of Service. 8.1.2 If you use any API to retrieve a user's data from Google, you acknowledge and agree that you shall retrieve data only with the user's explicit consent and only when, and for the limited purposes for which, the user has given you permission to do so.

9. Terminating this License Agreement

9.1 The License Agreement will continue to apply until terminated by either you or Google as set out below. 9.2 If you want to terminate the License Agreement, you may do so by ceasing your use of the SDK and any relevant developer credentials. 9.3 Google may at any time, terminate the License Agreement with you if: (A) you have breached any provision of the License Agreement; or (B) Google is required to do so by law; or (C) the partner with whom Google offered certain parts of SDK (such as APIs) to you has terminated its relationship with Google or ceased to offer certain parts of the SDK to you; or (D) Google decides to no longer provide the SDK or certain parts of the SDK to users in the country in which you are resident or from which you use the service, or the provision of the SDK or certain SDK services to you by Google is, in Google's sole discretion, no longer commercially viable. 9.4 When the License Agreement comes to an end, all of the legal rights, obligations and liabilities that you and Google have benefited from, been subject to (or which have accrued over time whilst the License Agreement has been in force) or which are expressed to continue indefinitely, shall be unaffected by this cessation, and the provisions of paragraph 14.7 shall continue to apply to such rights, obligations and liabilities indefinitely.

10. DISCLAIMER OF WARRANTIES

10.1 YOU EXPRESSLY UNDERSTAND AND AGREE THAT YOUR USE OF THE SDK IS AT YOUR SOLE RISK AND THAT THE SDK IS PROVIDED "AS IS" AND "AS AVAILABLE" WITHOUT WARRANTY OF ANY KIND FROM GOOGLE. 10.2 YOUR USE OF THE SDK AND ANY MATERIAL DOWNLOADED OR OTHERWISE OBTAINED THROUGH THE USE OF THE SDK IS AT YOUR OWN DISCRETION AND RISK AND YOU ARE SOLELY RESPONSIBLE FOR ANY DAMAGE TO YOUR COMPUTER SYSTEM OR OTHER DEVICE OR LOSS OF DATA THAT RESULTS FROM SUCH USE. 10.3 GOOGLE FURTHER EXPRESSLY DISCLAIMS ALL WARRANTIES AND CONDITIONS OF ANY KIND, WHETHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO THE IMPLIED WARRANTIES AND CONDITIONS OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.

11. LIMITATION OF LIABILITY

11.1 YOU EXPRESSLY UNDERSTAND AND AGREE THAT GOOGLE, ITS SUBSIDIARIES AND AFFILIATES, AND ITS LICENSORS SHALL NOT BE LIABLE TO YOU UNDER ANY THEORY OF LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, CONSEQUENTIAL OR EXEMPLARY DAMAGES THAT MAY BE INCURRED BY YOU, INCLUDING ANY LOSS OF DATA, WHETHER OR NOT GOOGLE OR ITS REPRESENTATIVES HAVE BEEN ADVISED OF OR SHOULD HAVE BEEN AWARE OF THE POSSIBILITY OF ANY SUCH LOSSES ARISING.

12. Indemnification

12.1 To the maximum extent permitted by law, you agree to defend, indemnify and hold harmless Google, its affiliates and their respective directors, officers, employees and agents from and against any and all claims, actions, suits or proceedings, as well as any and all losses, liabilities, damages, costs and expenses (including reasonable attorneys fees) arising out of or accruing from (a) your use of the SDK, (b) any application you develop on the SDK that infringes any copyright, trademark, trade secret, trade dress, patent or other intellectual property right of any person or defames any person or violates their rights of publicity or privacy, and (c) any non-compliance by you with the License Agreement.

13. Changes to the License Agreement

13.1 Google may make changes to the License Agreement as it distributes new versions of the SDK. When these changes are made, Google will make a new version of the License Agreement available on the website where the SDK is made available.

14. General Legal Terms

14.1 The License Agreement constitutes the whole legal agreement between you and Google and governs your use of the SDK (excluding any services which Google may provide to you under a separate written agreement), and completely replaces any prior agreements between you and Google in relation to the SDK. 14.2 You agree that if Google does not exercise or enforce any legal right or remedy which is contained in the License Agreement (or which Google has the benefit of under any applicable law), this will not be taken to be a formal waiver of Google's rights and that those rights or remedies will still be available to Google. 14.3 If any court of law, having the jurisdiction to decide on this matter, rules that any provision of the License Agreement is invalid, then that provision will be removed from the License Agreement without affecting the rest of the License Agreement. The remaining provisions of the License Agreement will continue to be valid and enforceable. 14.4 You acknowledge and agree that each member of the group of companies of which Google is the parent shall be third party beneficiaries to the License Agreement and that such other companies shall be entitled to directly enforce, and rely upon, any provision of the License Agreement that confers a benefit on (or rights in favor of) them. Other than this, no other person or company shall be third party beneficiaries to the License Agreement. 14.5 EXPORT RESTRICTIONS. THE SDK IS SUBJECT TO UNITED STATES EXPORT LAWS AND REGULATIONS. YOU MUST COMPLY WITH ALL DOMESTIC AND INTERNATIONAL EXPORT LAWS AND REGULATIONS THAT APPLY TO THE SDK. THESE LAWS INCLUDE RESTRICTIONS ON DESTINATIONS, END USERS AND END USE. 14.6 The rights granted in the License Agreement may not be assigned or transferred by either you or Google without the prior written approval of the other party. Neither you nor Google shall be permitted to delegate their responsibilities or obligations under the License Agreement without the prior written approval of the other party. 14.7 The License Agreement, and your relationship with Google under the License Agreement, shall be governed by the laws of the State of California without regard to its conflict of laws provisions. You and Google agree to submit to the exclusive jurisdiction of the courts located within the county of Santa Clara, California to resolve any legal matter arising from the License Agreement. Notwithstanding this, you agree that Google shall still be allowed to apply for injunctive remedies (or an equivalent type of urgent legal relief) in any jurisdiction. December 9, 2016

Download Android Studio for Mac

Download Android Studio for Mac

android-studio-ide-173.4720617-mac.dmg

Download Android Studio

Before downloading, you must agree to the following terms and conditions.

Terms and Conditions

This is the Android Software Development Kit License Agreement

1. Introduction

1.1 The Android Software Development Kit (referred to in the License Agreement as the "SDK" and specifically including the Android system files, packaged APIs, and Google APIs add-ons) is licensed to you subject to the terms of the License Agreement. The License Agreement forms a legally binding contract between you and Google in relation to your use of the SDK. 1.2 "Android" means the Android software stack for devices, as made available under the Android Open Source Project, which is located at the following URL: http://source.android.com/, as updated from time to time. 1.3 A "compatible implementation" means any Android device that (i) complies with the Android Compatibility Definition document, which can be found at the Android compatibility website (http://source.android.com/compatibility) and which may be updated from time to time; and (ii) successfully passes the Android Compatibility Test Suite (CTS). 1.4 "Google" means Google LLC, a Delaware corporation with principal place of business at 1600 Amphitheatre Parkway, Mountain View, CA 94043, United States.

2. Accepting this License Agreement

2.1 In order to use the SDK, you must first agree to the License Agreement. You may not use the SDK if you do not accept the License Agreement. 2.2 By clicking to accept, you hereby agree to the terms of the License Agreement. 2.3 You may not use the SDK and may not accept the License Agreement if you are a person barred from receiving the SDK under the laws of the United States or other countries, including the country in which you are resident or from which you use the SDK. 2.4 If you are agreeing to be bound by the License Agreement on behalf of your employer or other entity, you represent and warrant that you have full legal authority to bind your employer or such entity to the License Agreement. If you do not have the requisite authority, you may not accept the License Agreement or use the SDK on behalf of your employer or other entity.

3. SDK License from Google

3.1 Subject to the terms of the License Agreement, Google grants you a limited, worldwide, royalty-free, non-assignable, non-exclusive, and non-sublicensable license to use the SDK solely to develop applications for compatible implementations of Android. 3.2 You may not use this SDK to develop applications for other platforms (including non-compatible implementations of Android) or to develop another SDK. You are of course free to develop applications for other platforms, including non-compatible implementations of Android, provided that this SDK is not used for that purpose. 3.3 You agree that Google or third parties own all legal right, title and interest in and to the SDK, including any Intellectual Property Rights that subsist in the SDK. "Intellectual Property Rights" means any and all rights under patent law, copyright law, trade secret law, trademark law, and any and all other proprietary rights. Google reserves all rights not expressly granted to you. 3.4 You may not use the SDK for any purpose not expressly permitted by the License Agreement. Except to the extent required by applicable third party licenses, you may not copy (except for backup purposes), modify, adapt, redistribute, decompile, reverse engineer, disassemble, or create derivative works of the SDK or any part of the SDK. 3.5 Use, reproduction and distribution of components of the SDK licensed under an open source software license are governed solely by the terms of that open source software license and not the License Agreement. 3.6 You agree that the form and nature of the SDK that Google provides may change without prior notice to you and that future versions of the SDK may be incompatible with applications developed on previous versions of the SDK. You agree that Google may stop (permanently or temporarily) providing the SDK (or any features within the SDK) to you or to users generally at Google's sole discretion, without prior notice to you. 3.7 Nothing in the License Agreement gives you a right to use any of Google's trade names, trademarks, service marks, logos, domain names, or other distinctive brand features. 3.8 You agree that you will not remove, obscure, or alter any proprietary rights notices (including copyright and trademark notices) that may be affixed to or contained within the SDK.

4. Use of the SDK by You

4.1 Google agrees that it obtains no right, title or interest from you (or your licensors) under the License Agreement in or to any software applications that you develop using the SDK, including any intellectual property rights that subsist in those applications. 4.2 You agree to use the SDK and write applications only for purposes that are permitted by (a) the License Agreement and (b) any applicable law, regulation or generally accepted practices or guidelines in the relevant jurisdictions (including any laws regarding the export of data or software to and from the United States or other relevant countries). 4.3 You agree that if you use the SDK to develop applications for general public users, you will protect the privacy and legal rights of those users. If the users provide you with user names, passwords, or other login information or personal information, you must make the users aware that the information will be available to your application, and you must provide legally adequate privacy notice and protection for those users. If your application stores personal or sensitive information provided by users, it must do so securely. If the user provides your application with Google Account information, your application may only use that information to access the user's Google Account when, and for the limited purposes for which, the user has given you permission to do so. 4.4 You agree that you will not engage in any activity with the SDK, including the development or distribution of an application, that interferes with, disrupts, damages, or accesses in an unauthorized manner the servers, networks, or other properties or services of any third party including, but not limited to, Google or any mobile communications carrier. 4.5 You agree that you are solely responsible for (and that Google has no responsibility to you or to any third party for) any data, content, or resources that you create, transmit or display through Android and/or applications for Android, and for the consequences of your actions (including any loss or damage which Google may suffer) by doing so. 4.6 You agree that you are solely responsible for (and that Google has no responsibility to you or to any third party for) any breach of your obligations under the License Agreement, any applicable third party contract or Terms of Service, or any applicable law or regulation, and for the consequences (including any loss or damage which Google or any third party may suffer) of any such breach.

5. Your Developer Credentials

5.1 You agree that you are responsible for maintaining the confidentiality of any developer credentials that may be issued to you by Google or which you may choose yourself and that you will be solely responsible for all applications that are developed under your developer credentials.

6. Privacy and Information

6.1 In order to continually innovate and improve the SDK, Google may collect certain usage statistics from the software including but not limited to a unique identifier, associated IP address, version number of the software, and information on which tools and/or services in the SDK are being used and how they are being used. Before any of this information is collected, the SDK will notify you and seek your consent. If you withhold consent, the information will not be collected. 6.2 The data collected is examined in the aggregate to improve the SDK and is maintained in accordance with Google's Privacy Policy.

7. Third Party Applications

7.1 If you use the SDK to run applications developed by a third party or that access data, content or resources provided by a third party, you agree that Google is not responsible for those applications, data, content, or resources. You understand that all data, content or resources which you may access through such third party applications are the sole responsibility of the person from which they originated and that Google is not liable for any loss or damage that you may experience as a result of the use or access of any of those third party applications, data, content, or resources. 7.2 You should be aware the data, content, and resources presented to you through such a third party application may be protected by intellectual property rights which are owned by the providers (or by other persons or companies on their behalf). You may not modify, rent, lease, loan, sell, distribute or create derivative works based on these data, content, or resources (either in whole or in part) unless you have been specifically given permission to do so by the relevant owners. 7.3 You acknowledge that your use of such third party applications, data, content, or resources may be subject to separate terms between you and the relevant third party. In that case, the License Agreement does not affect your legal relationship with these third parties.

8. Using Android APIs

8.1 Google Data APIs 8.1.1 If you use any API to retrieve data from Google, you acknowledge that the data may be protected by intellectual property rights which are owned by Google or those parties that provide the data (or by other persons or companies on their behalf). Your use of any such API may be subject to additional Terms of Service. You may not modify, rent, lease, loan, sell, distribute or create derivative works based on this data (either in whole or in part) unless allowed by the relevant Terms of Service. 8.1.2 If you use any API to retrieve a user's data from Google, you acknowledge and agree that you shall retrieve data only with the user's explicit consent and only when, and for the limited purposes for which, the user has given you permission to do so.

9. Terminating this License Agreement

9.1 The License Agreement will continue to apply until terminated by either you or Google as set out below. 9.2 If you want to terminate the License Agreement, you may do so by ceasing your use of the SDK and any relevant developer credentials. 9.3 Google may at any time, terminate the License Agreement with you if: (A) you have breached any provision of the License Agreement; or (B) Google is required to do so by law; or (C) the partner with whom Google offered certain parts of SDK (such as APIs) to you has terminated its relationship with Google or ceased to offer certain parts of the SDK to you; or (D) Google decides to no longer provide the SDK or certain parts of the SDK to users in the country in which you are resident or from which you use the service, or the provision of the SDK or certain SDK services to you by Google is, in Google's sole discretion, no longer commercially viable. 9.4 When the License Agreement comes to an end, all of the legal rights, obligations and liabilities that you and Google have benefited from, been subject to (or which have accrued over time whilst the License Agreement has been in force) or which are expressed to continue indefinitely, shall be unaffected by this cessation, and the provisions of paragraph 14.7 shall continue to apply to such rights, obligations and liabilities indefinitely.

10. DISCLAIMER OF WARRANTIES

10.1 YOU EXPRESSLY UNDERSTAND AND AGREE THAT YOUR USE OF THE SDK IS AT YOUR SOLE RISK AND THAT THE SDK IS PROVIDED "AS IS" AND "AS AVAILABLE" WITHOUT WARRANTY OF ANY KIND FROM GOOGLE. 10.2 YOUR USE OF THE SDK AND ANY MATERIAL DOWNLOADED OR OTHERWISE OBTAINED THROUGH THE USE OF THE SDK IS AT YOUR OWN DISCRETION AND RISK AND YOU ARE SOLELY RESPONSIBLE FOR ANY DAMAGE TO YOUR COMPUTER SYSTEM OR OTHER DEVICE OR LOSS OF DATA THAT RESULTS FROM SUCH USE. 10.3 GOOGLE FURTHER EXPRESSLY DISCLAIMS ALL WARRANTIES AND CONDITIONS OF ANY KIND, WHETHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO THE IMPLIED WARRANTIES AND CONDITIONS OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.

11. LIMITATION OF LIABILITY

11.1 YOU EXPRESSLY UNDERSTAND AND AGREE THAT GOOGLE, ITS SUBSIDIARIES AND AFFILIATES, AND ITS LICENSORS SHALL NOT BE LIABLE TO YOU UNDER ANY THEORY OF LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, CONSEQUENTIAL OR EXEMPLARY DAMAGES THAT MAY BE INCURRED BY YOU, INCLUDING ANY LOSS OF DATA, WHETHER OR NOT GOOGLE OR ITS REPRESENTATIVES HAVE BEEN ADVISED OF OR SHOULD HAVE BEEN AWARE OF THE POSSIBILITY OF ANY SUCH LOSSES ARISING.

12. Indemnification

12.1 To the maximum extent permitted by law, you agree to defend, indemnify and hold harmless Google, its affiliates and their respective directors, officers, employees and agents from and against any and all claims, actions, suits or proceedings, as well as any and all losses, liabilities, damages, costs and expenses (including reasonable attorneys fees) arising out of or accruing from (a) your use of the SDK, (b) any application you develop on the SDK that infringes any copyright, trademark, trade secret, trade dress, patent or other intellectual property right of any person or defames any person or violates their rights of publicity or privacy, and (c) any non-compliance by you with the License Agreement.

13. Changes to the License Agreement

13.1 Google may make changes to the License Agreement as it distributes new versions of the SDK. When these changes are made, Google will make a new version of the License Agreement available on the website where the SDK is made available.

14. General Legal Terms

14.1 The License Agreement constitutes the whole legal agreement between you and Google and governs your use of the SDK (excluding any services which Google may provide to you under a separate written agreement), and completely replaces any prior agreements between you and Google in relation to the SDK. 14.2 You agree that if Google does not exercise or enforce any legal right or remedy which is contained in the License Agreement (or which Google has the benefit of under any applicable law), this will not be taken to be a formal waiver of Google's rights and that those rights or remedies will still be available to Google. 14.3 If any court of law, having the jurisdiction to decide on this matter, rules that any provision of the License Agreement is invalid, then that provision will be removed from the License Agreement without affecting the rest of the License Agreement. The remaining provisions of the License Agreement will continue to be valid and enforceable. 14.4 You acknowledge and agree that each member of the group of companies of which Google is the parent shall be third party beneficiaries to the License Agreement and that such other companies shall be entitled to directly enforce, and rely upon, any provision of the License Agreement that confers a benefit on (or rights in favor of) them. Other than this, no other person or company shall be third party beneficiaries to the License Agreement. 14.5 EXPORT RESTRICTIONS. THE SDK IS SUBJECT TO UNITED STATES EXPORT LAWS AND REGULATIONS. YOU MUST COMPLY WITH ALL DOMESTIC AND INTERNATIONAL EXPORT LAWS AND REGULATIONS THAT APPLY TO THE SDK. THESE LAWS INCLUDE RESTRICTIONS ON DESTINATIONS, END USERS AND END USE. 14.6 The rights granted in the License Agreement may not be assigned or transferred by either you or Google without the prior written approval of the other party. Neither you nor Google shall be permitted to delegate their responsibilities or obligations under the License Agreement without the prior written approval of the other party. 14.7 The License Agreement, and your relationship with Google under the License Agreement, shall be governed by the laws of the State of California without regard to its conflict of laws provisions. You and Google agree to submit to the exclusive jurisdiction of the courts located within the county of Santa Clara, California to resolve any legal matter arising from the License Agreement. Notwithstanding this, you agree that Google shall still be allowed to apply for injunctive remedies (or an equivalent type of urgent legal relief) in any jurisdiction. December 9, 2016

Download Android Studio for Windows

Download Android Studio for Windows

android-studio-ide-173.4720617-windows.zip

Download Android Studio

Before downloading, you must agree to the following terms and conditions.

Terms and Conditions

This is the Android Software Development Kit License Agreement

1. Introduction

1.1 The Android Software Development Kit (referred to in the License Agreement as the "SDK" and specifically including the Android system files, packaged APIs, and Google APIs add-ons) is licensed to you subject to the terms of the License Agreement. The License Agreement forms a legally binding contract between you and Google in relation to your use of the SDK. 1.2 "Android" means the Android software stack for devices, as made available under the Android Open Source Project, which is located at the following URL: http://source.android.com/, as updated from time to time. 1.3 A "compatible implementation" means any Android device that (i) complies with the Android Compatibility Definition document, which can be found at the Android compatibility website (http://source.android.com/compatibility) and which may be updated from time to time; and (ii) successfully passes the Android Compatibility Test Suite (CTS). 1.4 "Google" means Google LLC, a Delaware corporation with principal place of business at 1600 Amphitheatre Parkway, Mountain View, CA 94043, United States.

2. Accepting this License Agreement

2.1 In order to use the SDK, you must first agree to the License Agreement. You may not use the SDK if you do not accept the License Agreement. 2.2 By clicking to accept, you hereby agree to the terms of the License Agreement. 2.3 You may not use the SDK and may not accept the License Agreement if you are a person barred from receiving the SDK under the laws of the United States or other countries, including the country in which you are resident or from which you use the SDK. 2.4 If you are agreeing to be bound by the License Agreement on behalf of your employer or other entity, you represent and warrant that you have full legal authority to bind your employer or such entity to the License Agreement. If you do not have the requisite authority, you may not accept the License Agreement or use the SDK on behalf of your employer or other entity.

3. SDK License from Google

3.1 Subject to the terms of the License Agreement, Google grants you a limited, worldwide, royalty-free, non-assignable, non-exclusive, and non-sublicensable license to use the SDK solely to develop applications for compatible implementations of Android. 3.2 You may not use this SDK to develop applications for other platforms (including non-compatible implementations of Android) or to develop another SDK. You are of course free to develop applications for other platforms, including non-compatible implementations of Android, provided that this SDK is not used for that purpose. 3.3 You agree that Google or third parties own all legal right, title and interest in and to the SDK, including any Intellectual Property Rights that subsist in the SDK. "Intellectual Property Rights" means any and all rights under patent law, copyright law, trade secret law, trademark law, and any and all other proprietary rights. Google reserves all rights not expressly granted to you. 3.4 You may not use the SDK for any purpose not expressly permitted by the License Agreement. Except to the extent required by applicable third party licenses, you may not copy (except for backup purposes), modify, adapt, redistribute, decompile, reverse engineer, disassemble, or create derivative works of the SDK or any part of the SDK. 3.5 Use, reproduction and distribution of components of the SDK licensed under an open source software license are governed solely by the terms of that open source software license and not the License Agreement. 3.6 You agree that the form and nature of the SDK that Google provides may change without prior notice to you and that future versions of the SDK may be incompatible with applications developed on previous versions of the SDK. You agree that Google may stop (permanently or temporarily) providing the SDK (or any features within the SDK) to you or to users generally at Google's sole discretion, without prior notice to you. 3.7 Nothing in the License Agreement gives you a right to use any of Google's trade names, trademarks, service marks, logos, domain names, or other distinctive brand features. 3.8 You agree that you will not remove, obscure, or alter any proprietary rights notices (including copyright and trademark notices) that may be affixed to or contained within the SDK.

4. Use of the SDK by You

4.1 Google agrees that it obtains no right, title or interest from you (or your licensors) under the License Agreement in or to any software applications that you develop using the SDK, including any intellectual property rights that subsist in those applications. 4.2 You agree to use the SDK and write applications only for purposes that are permitted by (a) the License Agreement and (b) any applicable law, regulation or generally accepted practices or guidelines in the relevant jurisdictions (including any laws regarding the export of data or software to and from the United States or other relevant countries). 4.3 You agree that if you use the SDK to develop applications for general public users, you will protect the privacy and legal rights of those users. If the users provide you with user names, passwords, or other login information or personal information, you must make the users aware that the information will be available to your application, and you must provide legally adequate privacy notice and protection for those users. If your application stores personal or sensitive information provided by users, it must do so securely. If the user provides your application with Google Account information, your application may only use that information to access the user's Google Account when, and for the limited purposes for which, the user has given you permission to do so. 4.4 You agree that you will not engage in any activity with the SDK, including the development or distribution of an application, that interferes with, disrupts, damages, or accesses in an unauthorized manner the servers, networks, or other properties or services of any third party including, but not limited to, Google or any mobile communications carrier. 4.5 You agree that you are solely responsible for (and that Google has no responsibility to you or to any third party for) any data, content, or resources that you create, transmit or display through Android and/or applications for Android, and for the consequences of your actions (including any loss or damage which Google may suffer) by doing so. 4.6 You agree that you are solely responsible for (and that Google has no responsibility to you or to any third party for) any breach of your obligations under the License Agreement, any applicable third party contract or Terms of Service, or any applicable law or regulation, and for the consequences (including any loss or damage which Google or any third party may suffer) of any such breach.

5. Your Developer Credentials

5.1 You agree that you are responsible for maintaining the confidentiality of any developer credentials that may be issued to you by Google or which you may choose yourself and that you will be solely responsible for all applications that are developed under your developer credentials.

6. Privacy and Information

6.1 In order to continually innovate and improve the SDK, Google may collect certain usage statistics from the software including but not limited to a unique identifier, associated IP address, version number of the software, and information on which tools and/or services in the SDK are being used and how they are being used. Before any of this information is collected, the SDK will notify you and seek your consent. If you withhold consent, the information will not be collected. 6.2 The data collected is examined in the aggregate to improve the SDK and is maintained in accordance with Google's Privacy Policy.

7. Third Party Applications

7.1 If you use the SDK to run applications developed by a third party or that access data, content or resources provided by a third party, you agree that Google is not responsible for those applications, data, content, or resources. You understand that all data, content or resources which you may access through such third party applications are the sole responsibility of the person from which they originated and that Google is not liable for any loss or damage that you may experience as a result of the use or access of any of those third party applications, data, content, or resources. 7.2 You should be aware the data, content, and resources presented to you through such a third party application may be protected by intellectual property rights which are owned by the providers (or by other persons or companies on their behalf). You may not modify, rent, lease, loan, sell, distribute or create derivative works based on these data, content, or resources (either in whole or in part) unless you have been specifically given permission to do so by the relevant owners. 7.3 You acknowledge that your use of such third party applications, data, content, or resources may be subject to separate terms between you and the relevant third party. In that case, the License Agreement does not affect your legal relationship with these third parties.

8. Using Android APIs

8.1 Google Data APIs 8.1.1 If you use any API to retrieve data from Google, you acknowledge that the data may be protected by intellectual property rights which are owned by Google or those parties that provide the data (or by other persons or companies on their behalf). Your use of any such API may be subject to additional Terms of Service. You may not modify, rent, lease, loan, sell, distribute or create derivative works based on this data (either in whole or in part) unless allowed by the relevant Terms of Service. 8.1.2 If you use any API to retrieve a user's data from Google, you acknowledge and agree that you shall retrieve data only with the user's explicit consent and only when, and for the limited purposes for which, the user has given you permission to do so.

9. Terminating this License Agreement

9.1 The License Agreement will continue to apply until terminated by either you or Google as set out below. 9.2 If you want to terminate the License Agreement, you may do so by ceasing your use of the SDK and any relevant developer credentials. 9.3 Google may at any time, terminate the License Agreement with you if: (A) you have breached any provision of the License Agreement; or (B) Google is required to do so by law; or (C) the partner with whom Google offered certain parts of SDK (such as APIs) to you has terminated its relationship with Google or ceased to offer certain parts of the SDK to you; or (D) Google decides to no longer provide the SDK or certain parts of the SDK to users in the country in which you are resident or from which you use the service, or the provision of the SDK or certain SDK services to you by Google is, in Google's sole discretion, no longer commercially viable. 9.4 When the License Agreement comes to an end, all of the legal rights, obligations and liabilities that you and Google have benefited from, been subject to (or which have accrued over time whilst the License Agreement has been in force) or which are expressed to continue indefinitely, shall be unaffected by this cessation, and the provisions of paragraph 14.7 shall continue to apply to such rights, obligations and liabilities indefinitely.

10. DISCLAIMER OF WARRANTIES

10.1 YOU EXPRESSLY UNDERSTAND AND AGREE THAT YOUR USE OF THE SDK IS AT YOUR SOLE RISK AND THAT THE SDK IS PROVIDED "AS IS" AND "AS AVAILABLE" WITHOUT WARRANTY OF ANY KIND FROM GOOGLE. 10.2 YOUR USE OF THE SDK AND ANY MATERIAL DOWNLOADED OR OTHERWISE OBTAINED THROUGH THE USE OF THE SDK IS AT YOUR OWN DISCRETION AND RISK AND YOU ARE SOLELY RESPONSIBLE FOR ANY DAMAGE TO YOUR COMPUTER SYSTEM OR OTHER DEVICE OR LOSS OF DATA THAT RESULTS FROM SUCH USE. 10.3 GOOGLE FURTHER EXPRESSLY DISCLAIMS ALL WARRANTIES AND CONDITIONS OF ANY KIND, WHETHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO THE IMPLIED WARRANTIES AND CONDITIONS OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.

11. LIMITATION OF LIABILITY

11.1 YOU EXPRESSLY UNDERSTAND AND AGREE THAT GOOGLE, ITS SUBSIDIARIES AND AFFILIATES, AND ITS LICENSORS SHALL NOT BE LIABLE TO YOU UNDER ANY THEORY OF LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, CONSEQUENTIAL OR EXEMPLARY DAMAGES THAT MAY BE INCURRED BY YOU, INCLUDING ANY LOSS OF DATA, WHETHER OR NOT GOOGLE OR ITS REPRESENTATIVES HAVE BEEN ADVISED OF OR SHOULD HAVE BEEN AWARE OF THE POSSIBILITY OF ANY SUCH LOSSES ARISING.

12. Indemnification

12.1 To the maximum extent permitted by law, you agree to defend, indemnify and hold harmless Google, its affiliates and their respective directors, officers, employees and agents from and against any and all claims, actions, suits or proceedings, as well as any and all losses, liabilities, damages, costs and expenses (including reasonable attorneys fees) arising out of or accruing from (a) your use of the SDK, (b) any application you develop on the SDK that infringes any copyright, trademark, trade secret, trade dress, patent or other intellectual property right of any person or defames any person or violates their rights of publicity or privacy, and (c) any non-compliance by you with the License Agreement.

13. Changes to the License Agreement

13.1 Google may make changes to the License Agreement as it distributes new versions of the SDK. When these changes are made, Google will make a new version of the License Agreement available on the website where the SDK is made available.

14. General Legal Terms

14.1 The License Agreement constitutes the whole legal agreement between you and Google and governs your use of the SDK (excluding any services which Google may provide to you under a separate written agreement), and completely replaces any prior agreements between you and Google in relation to the SDK. 14.2 You agree that if Google does not exercise or enforce any legal right or remedy which is contained in the License Agreement (or which Google has the benefit of under any applicable law), this will not be taken to be a formal waiver of Google's rights and that those rights or remedies will still be available to Google. 14.3 If any court of law, having the jurisdiction to decide on this matter, rules that any provision of the License Agreement is invalid, then that provision will be removed from the License Agreement without affecting the rest of the License Agreement. The remaining provisions of the License Agreement will continue to be valid and enforceable. 14.4 You acknowledge and agree that each member of the group of companies of which Google is the parent shall be third party beneficiaries to the License Agreement and that such other companies shall be entitled to directly enforce, and rely upon, any provision of the License Agreement that confers a benefit on (or rights in favor of) them. Other than this, no other person or company shall be third party beneficiaries to the License Agreement. 14.5 EXPORT RESTRICTIONS. THE SDK IS SUBJECT TO UNITED STATES EXPORT LAWS AND REGULATIONS. YOU MUST COMPLY WITH ALL DOMESTIC AND INTERNATIONAL EXPORT LAWS AND REGULATIONS THAT APPLY TO THE SDK. THESE LAWS INCLUDE RESTRICTIONS ON DESTINATIONS, END USERS AND END USE. 14.6 The rights granted in the License Agreement may not be assigned or transferred by either you or Google without the prior written approval of the other party. Neither you nor Google shall be permitted to delegate their responsibilities or obligations under the License Agreement without the prior written approval of the other party. 14.7 The License Agreement, and your relationship with Google under the License Agreement, shall be governed by the laws of the State of California without regard to its conflict of laws provisions. You and Google agree to submit to the exclusive jurisdiction of the courts located within the county of Santa Clara, California to resolve any legal matter arising from the License Agreement. Notwithstanding this, you agree that Google shall still be allowed to apply for injunctive remedies (or an equivalent type of urgent legal relief) in any jurisdiction. December 9, 2016

Download Android Studio for Windows 32-bit

Download Android Studio for Windows 32-bit

android-studio-ide-173.4720617-windows32.zip

Download Android Studio

Before downloading, you must agree to the following terms and conditions.

Terms and Conditions

This is the Android Software Development Kit License Agreement

1. Introduction

1.1 The Android Software Development Kit (referred to in the License Agreement as the "SDK" and specifically including the Android system files, packaged APIs, and Google APIs add-ons) is licensed to you subject to the terms of the License Agreement. The License Agreement forms a legally binding contract between you and Google in relation to your use of the SDK. 1.2 "Android" means the Android software stack for devices, as made available under the Android Open Source Project, which is located at the following URL: http://source.android.com/, as updated from time to time. 1.3 A "compatible implementation" means any Android device that (i) complies with the Android Compatibility Definition document, which can be found at the Android compatibility website (http://source.android.com/compatibility) and which may be updated from time to time; and (ii) successfully passes the Android Compatibility Test Suite (CTS). 1.4 "Google" means Google LLC, a Delaware corporation with principal place of business at 1600 Amphitheatre Parkway, Mountain View, CA 94043, United States.

2. Accepting this License Agreement

2.1 In order to use the SDK, you must first agree to the License Agreement. You may not use the SDK if you do not accept the License Agreement. 2.2 By clicking to accept, you hereby agree to the terms of the License Agreement. 2.3 You may not use the SDK and may not accept the License Agreement if you are a person barred from receiving the SDK under the laws of the United States or other countries, including the country in which you are resident or from which you use the SDK. 2.4 If you are agreeing to be bound by the License Agreement on behalf of your employer or other entity, you represent and warrant that you have full legal authority to bind your employer or such entity to the License Agreement. If you do not have the requisite authority, you may not accept the License Agreement or use the SDK on behalf of your employer or other entity.

3. SDK License from Google

3.1 Subject to the terms of the License Agreement, Google grants you a limited, worldwide, royalty-free, non-assignable, non-exclusive, and non-sublicensable license to use the SDK solely to develop applications for compatible implementations of Android. 3.2 You may not use this SDK to develop applications for other platforms (including non-compatible implementations of Android) or to develop another SDK. You are of course free to develop applications for other platforms, including non-compatible implementations of Android, provided that this SDK is not used for that purpose. 3.3 You agree that Google or third parties own all legal right, title and interest in and to the SDK, including any Intellectual Property Rights that subsist in the SDK. "Intellectual Property Rights" means any and all rights under patent law, copyright law, trade secret law, trademark law, and any and all other proprietary rights. Google reserves all rights not expressly granted to you. 3.4 You may not use the SDK for any purpose not expressly permitted by the License Agreement. Except to the extent required by applicable third party licenses, you may not copy (except for backup purposes), modify, adapt, redistribute, decompile, reverse engineer, disassemble, or create derivative works of the SDK or any part of the SDK. 3.5 Use, reproduction and distribution of components of the SDK licensed under an open source software license are governed solely by the terms of that open source software license and not the License Agreement. 3.6 You agree that the form and nature of the SDK that Google provides may change without prior notice to you and that future versions of the SDK may be incompatible with applications developed on previous versions of the SDK. You agree that Google may stop (permanently or temporarily) providing the SDK (or any features within the SDK) to you or to users generally at Google's sole discretion, without prior notice to you. 3.7 Nothing in the License Agreement gives you a right to use any of Google's trade names, trademarks, service marks, logos, domain names, or other distinctive brand features. 3.8 You agree that you will not remove, obscure, or alter any proprietary rights notices (including copyright and trademark notices) that may be affixed to or contained within the SDK.

4. Use of the SDK by You

4.1 Google agrees that it obtains no right, title or interest from you (or your licensors) under the License Agreement in or to any software applications that you develop using the SDK, including any intellectual property rights that subsist in those applications. 4.2 You agree to use the SDK and write applications only for purposes that are permitted by (a) the License Agreement and (b) any applicable law, regulation or generally accepted practices or guidelines in the relevant jurisdictions (including any laws regarding the export of data or software to and from the United States or other relevant countries). 4.3 You agree that if you use the SDK to develop applications for general public users, you will protect the privacy and legal rights of those users. If the users provide you with user names, passwords, or other login information or personal information, you must make the users aware that the information will be available to your application, and you must provide legally adequate privacy notice and protection for those users. If your application stores personal or sensitive information provided by users, it must do so securely. If the user provides your application with Google Account information, your application may only use that information to access the user's Google Account when, and for the limited purposes for which, the user has given you permission to do so. 4.4 You agree that you will not engage in any activity with the SDK, including the development or distribution of an application, that interferes with, disrupts, damages, or accesses in an unauthorized manner the servers, networks, or other properties or services of any third party including, but not limited to, Google or any mobile communications carrier. 4.5 You agree that you are solely responsible for (and that Google has no responsibility to you or to any third party for) any data, content, or resources that you create, transmit or display through Android and/or applications for Android, and for the consequences of your actions (including any loss or damage which Google may suffer) by doing so. 4.6 You agree that you are solely responsible for (and that Google has no responsibility to you or to any third party for) any breach of your obligations under the License Agreement, any applicable third party contract or Terms of Service, or any applicable law or regulation, and for the consequences (including any loss or damage which Google or any third party may suffer) of any such breach.

5. Your Developer Credentials

5.1 You agree that you are responsible for maintaining the confidentiality of any developer credentials that may be issued to you by Google or which you may choose yourself and that you will be solely responsible for all applications that are developed under your developer credentials.

6. Privacy and Information

6.1 In order to continually innovate and improve the SDK, Google may collect certain usage statistics from the software including but not limited to a unique identifier, associated IP address, version number of the software, and information on which tools and/or services in the SDK are being used and how they are being used. Before any of this information is collected, the SDK will notify you and seek your consent. If you withhold consent, the information will not be collected. 6.2 The data collected is examined in the aggregate to improve the SDK and is maintained in accordance with Google's Privacy Policy.

7. Third Party Applications

7.1 If you use the SDK to run applications developed by a third party or that access data, content or resources provided by a third party, you agree that Google is not responsible for those applications, data, content, or resources. You understand that all data, content or resources which you may access through such third party applications are the sole responsibility of the person from which they originated and that Google is not liable for any loss or damage that you may experience as a result of the use or access of any of those third party applications, data, content, or resources. 7.2 You should be aware the data, content, and resources presented to you through such a third party application may be protected by intellectual property rights which are owned by the providers (or by other persons or companies on their behalf). You may not modify, rent, lease, loan, sell, distribute or create derivative works based on these data, content, or resources (either in whole or in part) unless you have been specifically given permission to do so by the relevant owners. 7.3 You acknowledge that your use of such third party applications, data, content, or resources may be subject to separate terms between you and the relevant third party. In that case, the License Agreement does not affect your legal relationship with these third parties.

8. Using Android APIs

8.1 Google Data APIs 8.1.1 If you use any API to retrieve data from Google, you acknowledge that the data may be protected by intellectual property rights which are owned by Google or those parties that provide the data (or by other persons or companies on their behalf). Your use of any such API may be subject to additional Terms of Service. You may not modify, rent, lease, loan, sell, distribute or create derivative works based on this data (either in whole or in part) unless allowed by the relevant Terms of Service. 8.1.2 If you use any API to retrieve a user's data from Google, you acknowledge and agree that you shall retrieve data only with the user's explicit consent and only when, and for the limited purposes for which, the user has given you permission to do so.

9. Terminating this License Agreement

9.1 The License Agreement will continue to apply until terminated by either you or Google as set out below. 9.2 If you want to terminate the License Agreement, you may do so by ceasing your use of the SDK and any relevant developer credentials. 9.3 Google may at any time, terminate the License Agreement with you if: (A) you have breached any provision of the License Agreement; or (B) Google is required to do so by law; or (C) the partner with whom Google offered certain parts of SDK (such as APIs) to you has terminated its relationship with Google or ceased to offer certain parts of the SDK to you; or (D) Google decides to no longer provide the SDK or certain parts of the SDK to users in the country in which you are resident or from which you use the service, or the provision of the SDK or certain SDK services to you by Google is, in Google's sole discretion, no longer commercially viable. 9.4 When the License Agreement comes to an end, all of the legal rights, obligations and liabilities that you and Google have benefited from, been subject to (or which have accrued over time whilst the License Agreement has been in force) or which are expressed to continue indefinitely, shall be unaffected by this cessation, and the provisions of paragraph 14.7 shall continue to apply to such rights, obligations and liabilities indefinitely.

10. DISCLAIMER OF WARRANTIES

10.1 YOU EXPRESSLY UNDERSTAND AND AGREE THAT YOUR USE OF THE SDK IS AT YOUR SOLE RISK AND THAT THE SDK IS PROVIDED "AS IS" AND "AS AVAILABLE" WITHOUT WARRANTY OF ANY KIND FROM GOOGLE. 10.2 YOUR USE OF THE SDK AND ANY MATERIAL DOWNLOADED OR OTHERWISE OBTAINED THROUGH THE USE OF THE SDK IS AT YOUR OWN DISCRETION AND RISK AND YOU ARE SOLELY RESPONSIBLE FOR ANY DAMAGE TO YOUR COMPUTER SYSTEM OR OTHER DEVICE OR LOSS OF DATA THAT RESULTS FROM SUCH USE. 10.3 GOOGLE FURTHER EXPRESSLY DISCLAIMS ALL WARRANTIES AND CONDITIONS OF ANY KIND, WHETHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO THE IMPLIED WARRANTIES AND CONDITIONS OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.

11. LIMITATION OF LIABILITY

11.1 YOU EXPRESSLY UNDERSTAND AND AGREE THAT GOOGLE, ITS SUBSIDIARIES AND AFFILIATES, AND ITS LICENSORS SHALL NOT BE LIABLE TO YOU UNDER ANY THEORY OF LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, CONSEQUENTIAL OR EXEMPLARY DAMAGES THAT MAY BE INCURRED BY YOU, INCLUDING ANY LOSS OF DATA, WHETHER OR NOT GOOGLE OR ITS REPRESENTATIVES HAVE BEEN ADVISED OF OR SHOULD HAVE BEEN AWARE OF THE POSSIBILITY OF ANY SUCH LOSSES ARISING.

12. Indemnification

12.1 To the maximum extent permitted by law, you agree to defend, indemnify and hold harmless Google, its affiliates and their respective directors, officers, employees and agents from and against any and all claims, actions, suits or proceedings, as well as any and all losses, liabilities, damages, costs and expenses (including reasonable attorneys fees) arising out of or accruing from (a) your use of the SDK, (b) any application you develop on the SDK that infringes any copyright, trademark, trade secret, trade dress, patent or other intellectual property right of any person or defames any person or violates their rights of publicity or privacy, and (c) any non-compliance by you with the License Agreement.

13. Changes to the License Agreement

13.1 Google may make changes to the License Agreement as it distributes new versions of the SDK. When these changes are made, Google will make a new version of the License Agreement available on the website where the SDK is made available.

14. General Legal Terms

14.1 The License Agreement constitutes the whole legal agreement between you and Google and governs your use of the SDK (excluding any services which Google may provide to you under a separate written agreement), and completely replaces any prior agreements between you and Google in relation to the SDK. 14.2 You agree that if Google does not exercise or enforce any legal right or remedy which is contained in the License Agreement (or which Google has the benefit of under any applicable law), this will not be taken to be a formal waiver of Google's rights and that those rights or remedies will still be available to Google. 14.3 If any court of law, having the jurisdiction to decide on this matter, rules that any provision of the License Agreement is invalid, then that provision will be removed from the License Agreement without affecting the rest of the License Agreement. The remaining provisions of the License Agreement will continue to be valid and enforceable. 14.4 You acknowledge and agree that each member of the group of companies of which Google is the parent shall be third party beneficiaries to the License Agreement and that such other companies shall be entitled to directly enforce, and rely upon, any provision of the License Agreement that confers a benefit on (or rights in favor of) them. Other than this, no other person or company shall be third party beneficiaries to the License Agreement. 14.5 EXPORT RESTRICTIONS. THE SDK IS SUBJECT TO UNITED STATES EXPORT LAWS AND REGULATIONS. YOU MUST COMPLY WITH ALL DOMESTIC AND INTERNATIONAL EXPORT LAWS AND REGULATIONS THAT APPLY TO THE SDK. THESE LAWS INCLUDE RESTRICTIONS ON DESTINATIONS, END USERS AND END USE. 14.6 The rights granted in the License Agreement may not be assigned or transferred by either you or Google without the prior written approval of the other party. Neither you nor Google shall be permitted to delegate their responsibilities or obligations under the License Agreement without the prior written approval of the other party. 14.7 The License Agreement, and your relationship with Google under the License Agreement, shall be governed by the laws of the State of California without regard to its conflict of laws provisions. You and Google agree to submit to the exclusive jurisdiction of the courts located within the county of Santa Clara, California to resolve any legal matter arising from the License Agreement. Notwithstanding this, you agree that Google shall still be allowed to apply for injunctive remedies (or an equivalent type of urgent legal relief) in any jurisdiction. December 9, 2016

Download Android Studio for Windows

Download Android Studio for Windows

android-studio-bundle-162.4069837-windows.exe

Download Android Studio

Before downloading, you must agree to the following terms and conditions.

Terms and Conditions

This is the Android Software Development Kit License Agreement

1. Introduction

1.1 The Android Software Development Kit (referred to in the License Agreement as the "SDK" and specifically including the Android system files, packaged APIs, and Google APIs add-ons) is licensed to you subject to the terms of the License Agreement. The License Agreement forms a legally binding contract between you and Google in relation to your use of the SDK. 1.2 "Android" means the Android software stack for devices, as made available under the Android Open Source Project, which is located at the following URL: http://source.android.com/, as updated from time to time. 1.3 A "compatible implementation" means any Android device that (i) complies with the Android Compatibility Definition document, which can be found at the Android compatibility website (http://source.android.com/compatibility) and which may be updated from time to time; and (ii) successfully passes the Android Compatibility Test Suite (CTS). 1.4 "Google" means Google LLC, a Delaware corporation with principal place of business at 1600 Amphitheatre Parkway, Mountain View, CA 94043, United States.

2. Accepting this License Agreement

2.1 In order to use the SDK, you must first agree to the License Agreement. You may not use the SDK if you do not accept the License Agreement. 2.2 By clicking to accept, you hereby agree to the terms of the License Agreement. 2.3 You may not use the SDK and may not accept the License Agreement if you are a person barred from receiving the SDK under the laws of the United States or other countries, including the country in which you are resident or from which you use the SDK. 2.4 If you are agreeing to be bound by the License Agreement on behalf of your employer or other entity, you represent and warrant that you have full legal authority to bind your employer or such entity to the License Agreement. If you do not have the requisite authority, you may not accept the License Agreement or use the SDK on behalf of your employer or other entity.

3. SDK License from Google

3.1 Subject to the terms of the License Agreement, Google grants you a limited, worldwide, royalty-free, non-assignable, non-exclusive, and non-sublicensable license to use the SDK solely to develop applications for compatible implementations of Android. 3.2 You may not use this SDK to develop applications for other platforms (including non-compatible implementations of Android) or to develop another SDK. You are of course free to develop applications for other platforms, including non-compatible implementations of Android, provided that this SDK is not used for that purpose. 3.3 You agree that Google or third parties own all legal right, title and interest in and to the SDK, including any Intellectual Property Rights that subsist in the SDK. "Intellectual Property Rights" means any and all rights under patent law, copyright law, trade secret law, trademark law, and any and all other proprietary rights. Google reserves all rights not expressly granted to you. 3.4 You may not use the SDK for any purpose not expressly permitted by the License Agreement. Except to the extent required by applicable third party licenses, you may not copy (except for backup purposes), modify, adapt, redistribute, decompile, reverse engineer, disassemble, or create derivative works of the SDK or any part of the SDK. 3.5 Use, reproduction and distribution of components of the SDK licensed under an open source software license are governed solely by the terms of that open source software license and not the License Agreement. 3.6 You agree that the form and nature of the SDK that Google provides may change without prior notice to you and that future versions of the SDK may be incompatible with applications developed on previous versions of the SDK. You agree that Google may stop (permanently or temporarily) providing the SDK (or any features within the SDK) to you or to users generally at Google's sole discretion, without prior notice to you. 3.7 Nothing in the License Agreement gives you a right to use any of Google's trade names, trademarks, service marks, logos, domain names, or other distinctive brand features. 3.8 You agree that you will not remove, obscure, or alter any proprietary rights notices (including copyright and trademark notices) that may be affixed to or contained within the SDK.

4. Use of the SDK by You

4.1 Google agrees that it obtains no right, title or interest from you (or your licensors) under the License Agreement in or to any software applications that you develop using the SDK, including any intellectual property rights that subsist in those applications. 4.2 You agree to use the SDK and write applications only for purposes that are permitted by (a) the License Agreement and (b) any applicable law, regulation or generally accepted practices or guidelines in the relevant jurisdictions (including any laws regarding the export of data or software to and from the United States or other relevant countries). 4.3 You agree that if you use the SDK to develop applications for general public users, you will protect the privacy and legal rights of those users. If the users provide you with user names, passwords, or other login information or personal information, you must make the users aware that the information will be available to your application, and you must provide legally adequate privacy notice and protection for those users. If your application stores personal or sensitive information provided by users, it must do so securely. If the user provides your application with Google Account information, your application may only use that information to access the user's Google Account when, and for the limited purposes for which, the user has given you permission to do so. 4.4 You agree that you will not engage in any activity with the SDK, including the development or distribution of an application, that interferes with, disrupts, damages, or accesses in an unauthorized manner the servers, networks, or other properties or services of any third party including, but not limited to, Google or any mobile communications carrier. 4.5 You agree that you are solely responsible for (and that Google has no responsibility to you or to any third party for) any data, content, or resources that you create, transmit or display through Android and/or applications for Android, and for the consequences of your actions (including any loss or damage which Google may suffer) by doing so. 4.6 You agree that you are solely responsible for (and that Google has no responsibility to you or to any third party for) any breach of your obligations under the License Agreement, any applicable third party contract or Terms of Service, or any applicable law or regulation, and for the consequences (including any loss or damage which Google or any third party may suffer) of any such breach.

5. Your Developer Credentials

5.1 You agree that you are responsible for maintaining the confidentiality of any developer credentials that may be issued to you by Google or which you may choose yourself and that you will be solely responsible for all applications that are developed under your developer credentials.

6. Privacy and Information

6.1 In order to continually innovate and improve the SDK, Google may collect certain usage statistics from the software including but not limited to a unique identifier, associated IP address, version number of the software, and information on which tools and/or services in the SDK are being used and how they are being used. Before any of this information is collected, the SDK will notify you and seek your consent. If you withhold consent, the information will not be collected. 6.2 The data collected is examined in the aggregate to improve the SDK and is maintained in accordance with Google's Privacy Policy.

7. Third Party Applications

7.1 If you use the SDK to run applications developed by a third party or that access data, content or resources provided by a third party, you agree that Google is not responsible for those applications, data, content, or resources. You understand that all data, content or resources which you may access through such third party applications are the sole responsibility of the person from which they originated and that Google is not liable for any loss or damage that you may experience as a result of the use or access of any of those third party applications, data, content, or resources. 7.2 You should be aware the data, content, and resources presented to you through such a third party application may be protected by intellectual property rights which are owned by the providers (or by other persons or companies on their behalf). You may not modify, rent, lease, loan, sell, distribute or create derivative works based on these data, content, or resources (either in whole or in part) unless you have been specifically given permission to do so by the relevant owners. 7.3 You acknowledge that your use of such third party applications, data, content, or resources may be subject to separate terms between you and the relevant third party. In that case, the License Agreement does not affect your legal relationship with these third parties.

8. Using Android APIs

8.1 Google Data APIs 8.1.1 If you use any API to retrieve data from Google, you acknowledge that the data may be protected by intellectual property rights which are owned by Google or those parties that provide the data (or by other persons or companies on their behalf). Your use of any such API may be subject to additional Terms of Service. You may not modify, rent, lease, loan, sell, distribute or create derivative works based on this data (either in whole or in part) unless allowed by the relevant Terms of Service. 8.1.2 If you use any API to retrieve a user's data from Google, you acknowledge and agree that you shall retrieve data only with the user's explicit consent and only when, and for the limited purposes for which, the user has given you permission to do so.

9. Terminating this License Agreement

9.1 The License Agreement will continue to apply until terminated by either you or Google as set out below. 9.2 If you want to terminate the License Agreement, you may do so by ceasing your use of the SDK and any relevant developer credentials. 9.3 Google may at any time, terminate the License Agreement with you if: (A) you have breached any provision of the License Agreement; or (B) Google is required to do so by law; or (C) the partner with whom Google offered certain parts of SDK (such as APIs) to you has terminated its relationship with Google or ceased to offer certain parts of the SDK to you; or (D) Google decides to no longer provide the SDK or certain parts of the SDK to users in the country in which you are resident or from which you use the service, or the provision of the SDK or certain SDK services to you by Google is, in Google's sole discretion, no longer commercially viable. 9.4 When the License Agreement comes to an end, all of the legal rights, obligations and liabilities that you and Google have benefited from, been subject to (or which have accrued over time whilst the License Agreement has been in force) or which are expressed to continue indefinitely, shall be unaffected by this cessation, and the provisions of paragraph 14.7 shall continue to apply to such rights, obligations and liabilities indefinitely.

10. DISCLAIMER OF WARRANTIES

10.1 YOU EXPRESSLY UNDERSTAND AND AGREE THAT YOUR USE OF THE SDK IS AT YOUR SOLE RISK AND THAT THE SDK IS PROVIDED "AS IS" AND "AS AVAILABLE" WITHOUT WARRANTY OF ANY KIND FROM GOOGLE. 10.2 YOUR USE OF THE SDK AND ANY MATERIAL DOWNLOADED OR OTHERWISE OBTAINED THROUGH THE USE OF THE SDK IS AT YOUR OWN DISCRETION AND RISK AND YOU ARE SOLELY RESPONSIBLE FOR ANY DAMAGE TO YOUR COMPUTER SYSTEM OR OTHER DEVICE OR LOSS OF DATA THAT RESULTS FROM SUCH USE. 10.3 GOOGLE FURTHER EXPRESSLY DISCLAIMS ALL WARRANTIES AND CONDITIONS OF ANY KIND, WHETHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO THE IMPLIED WARRANTIES AND CONDITIONS OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.

11. LIMITATION OF LIABILITY

11.1 YOU EXPRESSLY UNDERSTAND AND AGREE THAT GOOGLE, ITS SUBSIDIARIES AND AFFILIATES, AND ITS LICENSORS SHALL NOT BE LIABLE TO YOU UNDER ANY THEORY OF LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, CONSEQUENTIAL OR EXEMPLARY DAMAGES THAT MAY BE INCURRED BY YOU, INCLUDING ANY LOSS OF DATA, WHETHER OR NOT GOOGLE OR ITS REPRESENTATIVES HAVE BEEN ADVISED OF OR SHOULD HAVE BEEN AWARE OF THE POSSIBILITY OF ANY SUCH LOSSES ARISING.

12. Indemnification

12.1 To the maximum extent permitted by law, you agree to defend, indemnify and hold harmless Google, its affiliates and their respective directors, officers, employees and agents from and against any and all claims, actions, suits or proceedings, as well as any and all losses, liabilities, damages, costs and expenses (including reasonable attorneys fees) arising out of or accruing from (a) your use of the SDK, (b) any application you develop on the SDK that infringes any copyright, trademark, trade secret, trade dress, patent or other intellectual property right of any person or defames any person or violates their rights of publicity or privacy, and (c) any non-compliance by you with the License Agreement.

13. Changes to the License Agreement

13.1 Google may make changes to the License Agreement as it distributes new versions of the SDK. When these changes are made, Google will make a new version of the License Agreement available on the website where the SDK is made available.

14. General Legal Terms

14.1 The License Agreement constitutes the whole legal agreement between you and Google and governs your use of the SDK (excluding any services which Google may provide to you under a separate written agreement), and completely replaces any prior agreements between you and Google in relation to the SDK. 14.2 You agree that if Google does not exercise or enforce any legal right or remedy which is contained in the License Agreement (or which Google has the benefit of under any applicable law), this will not be taken to be a formal waiver of Google's rights and that those rights or remedies will still be available to Google. 14.3 If any court of law, having the jurisdiction to decide on this matter, rules that any provision of the License Agreement is invalid, then that provision will be removed from the License Agreement without affecting the rest of the License Agreement. The remaining provisions of the License Agreement will continue to be valid and enforceable. 14.4 You acknowledge and agree that each member of the group of companies of which Google is the parent shall be third party beneficiaries to the License Agreement and that such other companies shall be entitled to directly enforce, and rely upon, any provision of the License Agreement that confers a benefit on (or rights in favor of) them. Other than this, no other person or company shall be third party beneficiaries to the License Agreement. 14.5 EXPORT RESTRICTIONS. THE SDK IS SUBJECT TO UNITED STATES EXPORT LAWS AND REGULATIONS. YOU MUST COMPLY WITH ALL DOMESTIC AND INTERNATIONAL EXPORT LAWS AND REGULATIONS THAT APPLY TO THE SDK. THESE LAWS INCLUDE RESTRICTIONS ON DESTINATIONS, END USERS AND END USE. 14.6 The rights granted in the License Agreement may not be assigned or transferred by either you or Google without the prior written approval of the other party. Neither you nor Google shall be permitted to delegate their responsibilities or obligations under the License Agreement without the prior written approval of the other party. 14.7 The License Agreement, and your relationship with Google under the License Agreement, shall be governed by the laws of the State of California without regard to its conflict of laws provisions. You and Google agree to submit to the exclusive jurisdiction of the courts located within the county of Santa Clara, California to resolve any legal matter arising from the License Agreement. Notwithstanding this, you agree that Google shall still be allowed to apply for injunctive remedies (or an equivalent type of urgent legal relief) in any jurisdiction. December 9, 2016

Download Android Studio for Windows

Download Android Studio for Windows

android-studio-ide-173.4720617-windows.exe

Download Android Command Line Tools

Before downloading, you must agree to the following terms and conditions.

Terms and Conditions

This is the Android Software Development Kit License Agreement

1. Introduction

1.1 The Android Software Development Kit (referred to in the License Agreement as the "SDK" and specifically including the Android system files, packaged APIs, and Google APIs add-ons) is licensed to you subject to the terms of the License Agreement. The License Agreement forms a legally binding contract between you and Google in relation to your use of the SDK. 1.2 "Android" means the Android software stack for devices, as made available under the Android Open Source Project, which is located at the following URL: http://source.android.com/, as updated from time to time. 1.3 A "compatible implementation" means any Android device that (i) complies with the Android Compatibility Definition document, which can be found at the Android compatibility website (http://source.android.com/compatibility) and which may be updated from time to time; and (ii) successfully passes the Android Compatibility Test Suite (CTS). 1.4 "Google" means Google LLC, a Delaware corporation with principal place of business at 1600 Amphitheatre Parkway, Mountain View, CA 94043, United States.

2. Accepting this License Agreement

2.1 In order to use the SDK, you must first agree to the License Agreement. You may not use the SDK if you do not accept the License Agreement. 2.2 By clicking to accept, you hereby agree to the terms of the License Agreement. 2.3 You may not use the SDK and may not accept the License Agreement if you are a person barred from receiving the SDK under the laws of the United States or other countries, including the country in which you are resident or from which you use the SDK. 2.4 If you are agreeing to be bound by the License Agreement on behalf of your employer or other entity, you represent and warrant that you have full legal authority to bind your employer or such entity to the License Agreement. If you do not have the requisite authority, you may not accept the License Agreement or use the SDK on behalf of your employer or other entity.

3. SDK License from Google

3.1 Subject to the terms of the License Agreement, Google grants you a limited, worldwide, royalty-free, non-assignable, non-exclusive, and non-sublicensable license to use the SDK solely to develop applications for compatible implementations of Android. 3.2 You may not use this SDK to develop applications for other platforms (including non-compatible implementations of Android) or to develop another SDK. You are of course free to develop applications for other platforms, including non-compatible implementations of Android, provided that this SDK is not used for that purpose. 3.3 You agree that Google or third parties own all legal right, title and interest in and to the SDK, including any Intellectual Property Rights that subsist in the SDK. "Intellectual Property Rights" means any and all rights under patent law, copyright law, trade secret law, trademark law, and any and all other proprietary rights. Google reserves all rights not expressly granted to you. 3.4 You may not use the SDK for any purpose not expressly permitted by the License Agreement. Except to the extent required by applicable third party licenses, you may not copy (except for backup purposes), modify, adapt, redistribute, decompile, reverse engineer, disassemble, or create derivative works of the SDK or any part of the SDK. 3.5 Use, reproduction and distribution of components of the SDK licensed under an open source software license are governed solely by the terms of that open source software license and not the License Agreement. 3.6 You agree that the form and nature of the SDK that Google provides may change without prior notice to you and that future versions of the SDK may be incompatible with applications developed on previous versions of the SDK. You agree that Google may stop (permanently or temporarily) providing the SDK (or any features within the SDK) to you or to users generally at Google's sole discretion, without prior notice to you. 3.7 Nothing in the License Agreement gives you a right to use any of Google's trade names, trademarks, service marks, logos, domain names, or other distinctive brand features. 3.8 You agree that you will not remove, obscure, or alter any proprietary rights notices (including copyright and trademark notices) that may be affixed to or contained within the SDK.

4. Use of the SDK by You

4.1 Google agrees that it obtains no right, title or interest from you (or your licensors) under the License Agreement in or to any software applications that you develop using the SDK, including any intellectual property rights that subsist in those applications. 4.2 You agree to use the SDK and write applications only for purposes that are permitted by (a) the License Agreement and (b) any applicable law, regulation or generally accepted practices or guidelines in the relevant jurisdictions (including any laws regarding the export of data or software to and from the United States or other relevant countries). 4.3 You agree that if you use the SDK to develop applications for general public users, you will protect the privacy and legal rights of those users. If the users provide you with user names, passwords, or other login information or personal information, you must make the users aware that the information will be available to your application, and you must provide legally adequate privacy notice and protection for those users. If your application stores personal or sensitive information provided by users, it must do so securely. If the user provides your application with Google Account information, your application may only use that information to access the user's Google Account when, and for the limited purposes for which, the user has given you permission to do so. 4.4 You agree that you will not engage in any activity with the SDK, including the development or distribution of an application, that interferes with, disrupts, damages, or accesses in an unauthorized manner the servers, networks, or other properties or services of any third party including, but not limited to, Google or any mobile communications carrier. 4.5 You agree that you are solely responsible for (and that Google has no responsibility to you or to any third party for) any data, content, or resources that you create, transmit or display through Android and/or applications for Android, and for the consequences of your actions (including any loss or damage which Google may suffer) by doing so. 4.6 You agree that you are solely responsible for (and that Google has no responsibility to you or to any third party for) any breach of your obligations under the License Agreement, any applicable third party contract or Terms of Service, or any applicable law or regulation, and for the consequences (including any loss or damage which Google or any third party may suffer) of any such breach.

5. Your Developer Credentials

5.1 You agree that you are responsible for maintaining the confidentiality of any developer credentials that may be issued to you by Google or which you may choose yourself and that you will be solely responsible for all applications that are developed under your developer credentials.

6. Privacy and Information

6.1 In order to continually innovate and improve the SDK, Google may collect certain usage statistics from the software including but not limited to a unique identifier, associated IP address, version number of the software, and information on which tools and/or services in the SDK are being used and how they are being used. Before any of this information is collected, the SDK will notify you and seek your consent. If you withhold consent, the information will not be collected. 6.2 The data collected is examined in the aggregate to improve the SDK and is maintained in accordance with Google's Privacy Policy.

7. Third Party Applications

7.1 If you use the SDK to run applications developed by a third party or that access data, content or resources provided by a third party, you agree that Google is not responsible for those applications, data, content, or resources. You understand that all data, content or resources which you may access through such third party applications are the sole responsibility of the person from which they originated and that Google is not liable for any loss or damage that you may experience as a result of the use or access of any of those third party applications, data, content, or resources. 7.2 You should be aware the data, content, and resources presented to you through such a third party application may be protected by intellectual property rights which are owned by the providers (or by other persons or companies on their behalf). You may not modify, rent, lease, loan, sell, distribute or create derivative works based on these data, content, or resources (either in whole or in part) unless you have been specifically given permission to do so by the relevant owners. 7.3 You acknowledge that your use of such third party applications, data, content, or resources may be subject to separate terms between you and the relevant third party. In that case, the License Agreement does not affect your legal relationship with these third parties.

8. Using Android APIs

8.1 Google Data APIs 8.1.1 If you use any API to retrieve data from Google, you acknowledge that the data may be protected by intellectual property rights which are owned by Google or those parties that provide the data (or by other persons or companies on their behalf). Your use of any such API may be subject to additional Terms of Service. You may not modify, rent, lease, loan, sell, distribute or create derivative works based on this data (either in whole or in part) unless allowed by the relevant Terms of Service. 8.1.2 If you use any API to retrieve a user's data from Google, you acknowledge and agree that you shall retrieve data only with the user's explicit consent and only when, and for the limited purposes for which, the user has given you permission to do so.

9. Terminating this License Agreement

9.1 The License Agreement will continue to apply until terminated by either you or Google as set out below. 9.2 If you want to terminate the License Agreement, you may do so by ceasing your use of the SDK and any relevant developer credentials. 9.3 Google may at any time, terminate the License Agreement with you if: (A) you have breached any provision of the License Agreement; or (B) Google is required to do so by law; or (C) the partner with whom Google offered certain parts of SDK (such as APIs) to you has terminated its relationship with Google or ceased to offer certain parts of the SDK to you; or (D) Google decides to no longer provide the SDK or certain parts of the SDK to users in the country in which you are resident or from which you use the service, or the provision of the SDK or certain SDK services to you by Google is, in Google's sole discretion, no longer commercially viable. 9.4 When the License Agreement comes to an end, all of the legal rights, obligations and liabilities that you and Google have benefited from, been subject to (or which have accrued over time whilst the License Agreement has been in force) or which are expressed to continue indefinitely, shall be unaffected by this cessation, and the provisions of paragraph 14.7 shall continue to apply to such rights, obligations and liabilities indefinitely.

10. DISCLAIMER OF WARRANTIES

10.1 YOU EXPRESSLY UNDERSTAND AND AGREE THAT YOUR USE OF THE SDK IS AT YOUR SOLE RISK AND THAT THE SDK IS PROVIDED "AS IS" AND "AS AVAILABLE" WITHOUT WARRANTY OF ANY KIND FROM GOOGLE. 10.2 YOUR USE OF THE SDK AND ANY MATERIAL DOWNLOADED OR OTHERWISE OBTAINED THROUGH THE USE OF THE SDK IS AT YOUR OWN DISCRETION AND RISK AND YOU ARE SOLELY RESPONSIBLE FOR ANY DAMAGE TO YOUR COMPUTER SYSTEM OR OTHER DEVICE OR LOSS OF DATA THAT RESULTS FROM SUCH USE. 10.3 GOOGLE FURTHER EXPRESSLY DISCLAIMS ALL WARRANTIES AND CONDITIONS OF ANY KIND, WHETHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO THE IMPLIED WARRANTIES AND CONDITIONS OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.

11. LIMITATION OF LIABILITY

11.1 YOU EXPRESSLY UNDERSTAND AND AGREE THAT GOOGLE, ITS SUBSIDIARIES AND AFFILIATES, AND ITS LICENSORS SHALL NOT BE LIABLE TO YOU UNDER ANY THEORY OF LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, CONSEQUENTIAL OR EXEMPLARY DAMAGES THAT MAY BE INCURRED BY YOU, INCLUDING ANY LOSS OF DATA, WHETHER OR NOT GOOGLE OR ITS REPRESENTATIVES HAVE BEEN ADVISED OF OR SHOULD HAVE BEEN AWARE OF THE POSSIBILITY OF ANY SUCH LOSSES ARISING.

12. Indemnification

12.1 To the maximum extent permitted by law, you agree to defend, indemnify and hold harmless Google, its affiliates and their respective directors, officers, employees and agents from and against any and all claims, actions, suits or proceedings, as well as any and all losses, liabilities, damages, costs and expenses (including reasonable attorneys fees) arising out of or accruing from (a) your use of the SDK, (b) any application you develop on the SDK that infringes any copyright, trademark, trade secret, trade dress, patent or other intellectual property right of any person or defames any person or violates their rights of publicity or privacy, and (c) any non-compliance by you with the License Agreement.

13. Changes to the License Agreement

13.1 Google may make changes to the License Agreement as it distributes new versions of the SDK. When these changes are made, Google will make a new version of the License Agreement available on the website where the SDK is made available.

14. General Legal Terms

14.1 The License Agreement constitutes the whole legal agreement between you and Google and governs your use of the SDK (excluding any services which Google may provide to you under a separate written agreement), and completely replaces any prior agreements between you and Google in relation to the SDK. 14.2 You agree that if Google does not exercise or enforce any legal right or remedy which is contained in the License Agreement (or which Google has the benefit of under any applicable law), this will not be taken to be a formal waiver of Google's rights and that those rights or remedies will still be available to Google. 14.3 If any court of law, having the jurisdiction to decide on this matter, rules that any provision of the License Agreement is invalid, then that provision will be removed from the License Agreement without affecting the rest of the License Agreement. The remaining provisions of the License Agreement will continue to be valid and enforceable. 14.4 You acknowledge and agree that each member of the group of companies of which Google is the parent shall be third party beneficiaries to the License Agreement and that such other companies shall be entitled to directly enforce, and rely upon, any provision of the License Agreement that confers a benefit on (or rights in favor of) them. Other than this, no other person or company shall be third party beneficiaries to the License Agreement. 14.5 EXPORT RESTRICTIONS. THE SDK IS SUBJECT TO UNITED STATES EXPORT LAWS AND REGULATIONS. YOU MUST COMPLY WITH ALL DOMESTIC AND INTERNATIONAL EXPORT LAWS AND REGULATIONS THAT APPLY TO THE SDK. THESE LAWS INCLUDE RESTRICTIONS ON DESTINATIONS, END USERS AND END USE. 14.6 The rights granted in the License Agreement may not be assigned or transferred by either you or Google without the prior written approval of the other party. Neither you nor Google shall be permitted to delegate their responsibilities or obligations under the License Agreement without the prior written approval of the other party. 14.7 The License Agreement, and your relationship with Google under the License Agreement, shall be governed by the laws of the State of California without regard to its conflict of laws provisions. You and Google agree to submit to the exclusive jurisdiction of the courts located within the county of Santa Clara, California to resolve any legal matter arising from the License Agreement. Notwithstanding this, you agree that Google shall still be allowed to apply for injunctive remedies (or an equivalent type of urgent legal relief) in any jurisdiction. December 9, 2016

Download Android Command Line Tools for Linux

Download Android Command Line Tools for Linux

sdk-tools-linux-3859397.zip

Download Android Command Line Tools

Before downloading, you must agree to the following terms and conditions.

Terms and Conditions

This is the Android Software Development Kit License Agreement

1. Introduction

1.1 The Android Software Development Kit (referred to in the License Agreement as the "SDK" and specifically including the Android system files, packaged APIs, and Google APIs add-ons) is licensed to you subject to the terms of the License Agreement. The License Agreement forms a legally binding contract between you and Google in relation to your use of the SDK. 1.2 "Android" means the Android software stack for devices, as made available under the Android Open Source Project, which is located at the following URL: http://source.android.com/, as updated from time to time. 1.3 A "compatible implementation" means any Android device that (i) complies with the Android Compatibility Definition document, which can be found at the Android compatibility website (http://source.android.com/compatibility) and which may be updated from time to time; and (ii) successfully passes the Android Compatibility Test Suite (CTS). 1.4 "Google" means Google LLC, a Delaware corporation with principal place of business at 1600 Amphitheatre Parkway, Mountain View, CA 94043, United States.

2. Accepting this License Agreement

2.1 In order to use the SDK, you must first agree to the License Agreement. You may not use the SDK if you do not accept the License Agreement. 2.2 By clicking to accept, you hereby agree to the terms of the License Agreement. 2.3 You may not use the SDK and may not accept the License Agreement if you are a person barred from receiving the SDK under the laws of the United States or other countries, including the country in which you are resident or from which you use the SDK. 2.4 If you are agreeing to be bound by the License Agreement on behalf of your employer or other entity, you represent and warrant that you have full legal authority to bind your employer or such entity to the License Agreement. If you do not have the requisite authority, you may not accept the License Agreement or use the SDK on behalf of your employer or other entity.

3. SDK License from Google

3.1 Subject to the terms of the License Agreement, Google grants you a limited, worldwide, royalty-free, non-assignable, non-exclusive, and non-sublicensable license to use the SDK solely to develop applications for compatible implementations of Android. 3.2 You may not use this SDK to develop applications for other platforms (including non-compatible implementations of Android) or to develop another SDK. You are of course free to develop applications for other platforms, including non-compatible implementations of Android, provided that this SDK is not used for that purpose. 3.3 You agree that Google or third parties own all legal right, title and interest in and to the SDK, including any Intellectual Property Rights that subsist in the SDK. "Intellectual Property Rights" means any and all rights under patent law, copyright law, trade secret law, trademark law, and any and all other proprietary rights. Google reserves all rights not expressly granted to you. 3.4 You may not use the SDK for any purpose not expressly permitted by the License Agreement. Except to the extent required by applicable third party licenses, you may not copy (except for backup purposes), modify, adapt, redistribute, decompile, reverse engineer, disassemble, or create derivative works of the SDK or any part of the SDK. 3.5 Use, reproduction and distribution of components of the SDK licensed under an open source software license are governed solely by the terms of that open source software license and not the License Agreement. 3.6 You agree that the form and nature of the SDK that Google provides may change without prior notice to you and that future versions of the SDK may be incompatible with applications developed on previous versions of the SDK. You agree that Google may stop (permanently or temporarily) providing the SDK (or any features within the SDK) to you or to users generally at Google's sole discretion, without prior notice to you. 3.7 Nothing in the License Agreement gives you a right to use any of Google's trade names, trademarks, service marks, logos, domain names, or other distinctive brand features. 3.8 You agree that you will not remove, obscure, or alter any proprietary rights notices (including copyright and trademark notices) that may be affixed to or contained within the SDK.

4. Use of the SDK by You

4.1 Google agrees that it obtains no right, title or interest from you (or your licensors) under the License Agreement in or to any software applications that you develop using the SDK, including any intellectual property rights that subsist in those applications. 4.2 You agree to use the SDK and write applications only for purposes that are permitted by (a) the License Agreement and (b) any applicable law, regulation or generally accepted practices or guidelines in the relevant jurisdictions (including any laws regarding the export of data or software to and from the United States or other relevant countries). 4.3 You agree that if you use the SDK to develop applications for general public users, you will protect the privacy and legal rights of those users. If the users provide you with user names, passwords, or other login information or personal information, you must make the users aware that the information will be available to your application, and you must provide legally adequate privacy notice and protection for those users. If your application stores personal or sensitive information provided by users, it must do so securely. If the user provides your application with Google Account information, your application may only use that information to access the user's Google Account when, and for the limited purposes for which, the user has given you permission to do so. 4.4 You agree that you will not engage in any activity with the SDK, including the development or distribution of an application, that interferes with, disrupts, damages, or accesses in an unauthorized manner the servers, networks, or other properties or services of any third party including, but not limited to, Google or any mobile communications carrier. 4.5 You agree that you are solely responsible for (and that Google has no responsibility to you or to any third party for) any data, content, or resources that you create, transmit or display through Android and/or applications for Android, and for the consequences of your actions (including any loss or damage which Google may suffer) by doing so. 4.6 You agree that you are solely responsible for (and that Google has no responsibility to you or to any third party for) any breach of your obligations under the License Agreement, any applicable third party contract or Terms of Service, or any applicable law or regulation, and for the consequences (including any loss or damage which Google or any third party may suffer) of any such breach.

5. Your Developer Credentials

5.1 You agree that you are responsible for maintaining the confidentiality of any developer credentials that may be issued to you by Google or which you may choose yourself and that you will be solely responsible for all applications that are developed under your developer credentials.

6. Privacy and Information

6.1 In order to continually innovate and improve the SDK, Google may collect certain usage statistics from the software including but not limited to a unique identifier, associated IP address, version number of the software, and information on which tools and/or services in the SDK are being used and how they are being used. Before any of this information is collected, the SDK will notify you and seek your consent. If you withhold consent, the information will not be collected. 6.2 The data collected is examined in the aggregate to improve the SDK and is maintained in accordance with Google's Privacy Policy.

7. Third Party Applications

7.1 If you use the SDK to run applications developed by a third party or that access data, content or resources provided by a third party, you agree that Google is not responsible for those applications, data, content, or resources. You understand that all data, content or resources which you may access through such third party applications are the sole responsibility of the person from which they originated and that Google is not liable for any loss or damage that you may experience as a result of the use or access of any of those third party applications, data, content, or resources. 7.2 You should be aware the data, content, and resources presented to you through such a third party application may be protected by intellectual property rights which are owned by the providers (or by other persons or companies on their behalf). You may not modify, rent, lease, loan, sell, distribute or create derivative works based on these data, content, or resources (either in whole or in part) unless you have been specifically given permission to do so by the relevant owners. 7.3 You acknowledge that your use of such third party applications, data, content, or resources may be subject to separate terms between you and the relevant third party. In that case, the License Agreement does not affect your legal relationship with these third parties.

8. Using Android APIs

8.1 Google Data APIs 8.1.1 If you use any API to retrieve data from Google, you acknowledge that the data may be protected by intellectual property rights which are owned by Google or those parties that provide the data (or by other persons or companies on their behalf). Your use of any such API may be subject to additional Terms of Service. You may not modify, rent, lease, loan, sell, distribute or create derivative works based on this data (either in whole or in part) unless allowed by the relevant Terms of Service. 8.1.2 If you use any API to retrieve a user's data from Google, you acknowledge and agree that you shall retrieve data only with the user's explicit consent and only when, and for the limited purposes for which, the user has given you permission to do so.

9. Terminating this License Agreement

9.1 The License Agreement will continue to apply until terminated by either you or Google as set out below. 9.2 If you want to terminate the License Agreement, you may do so by ceasing your use of the SDK and any relevant developer credentials. 9.3 Google may at any time, terminate the License Agreement with you if: (A) you have breached any provision of the License Agreement; or (B) Google is required to do so by law; or (C) the partner with whom Google offered certain parts of SDK (such as APIs) to you has terminated its relationship with Google or ceased to offer certain parts of the SDK to you; or (D) Google decides to no longer provide the SDK or certain parts of the SDK to users in the country in which you are resident or from which you use the service, or the provision of the SDK or certain SDK services to you by Google is, in Google's sole discretion, no longer commercially viable. 9.4 When the License Agreement comes to an end, all of the legal rights, obligations and liabilities that you and Google have benefited from, been subject to (or which have accrued over time whilst the License Agreement has been in force) or which are expressed to continue indefinitely, shall be unaffected by this cessation, and the provisions of paragraph 14.7 shall continue to apply to such rights, obligations and liabilities indefinitely.

10. DISCLAIMER OF WARRANTIES

10.1 YOU EXPRESSLY UNDERSTAND AND AGREE THAT YOUR USE OF THE SDK IS AT YOUR SOLE RISK AND THAT THE SDK IS PROVIDED "AS IS" AND "AS AVAILABLE" WITHOUT WARRANTY OF ANY KIND FROM GOOGLE. 10.2 YOUR USE OF THE SDK AND ANY MATERIAL DOWNLOADED OR OTHERWISE OBTAINED THROUGH THE USE OF THE SDK IS AT YOUR OWN DISCRETION AND RISK AND YOU ARE SOLELY RESPONSIBLE FOR ANY DAMAGE TO YOUR COMPUTER SYSTEM OR OTHER DEVICE OR LOSS OF DATA THAT RESULTS FROM SUCH USE. 10.3 GOOGLE FURTHER EXPRESSLY DISCLAIMS ALL WARRANTIES AND CONDITIONS OF ANY KIND, WHETHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO THE IMPLIED WARRANTIES AND CONDITIONS OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.

11. LIMITATION OF LIABILITY

11.1 YOU EXPRESSLY UNDERSTAND AND AGREE THAT GOOGLE, ITS SUBSIDIARIES AND AFFILIATES, AND ITS LICENSORS SHALL NOT BE LIABLE TO YOU UNDER ANY THEORY OF LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, CONSEQUENTIAL OR EXEMPLARY DAMAGES THAT MAY BE INCURRED BY YOU, INCLUDING ANY LOSS OF DATA, WHETHER OR NOT GOOGLE OR ITS REPRESENTATIVES HAVE BEEN ADVISED OF OR SHOULD HAVE BEEN AWARE OF THE POSSIBILITY OF ANY SUCH LOSSES ARISING.

12. Indemnification

12.1 To the maximum extent permitted by law, you agree to defend, indemnify and hold harmless Google, its affiliates and their respective directors, officers, employees and agents from and against any and all claims, actions, suits or proceedings, as well as any and all losses, liabilities, damages, costs and expenses (including reasonable attorneys fees) arising out of or accruing from (a) your use of the SDK, (b) any application you develop on the SDK that infringes any copyright, trademark, trade secret, trade dress, patent or other intellectual property right of any person or defames any person or violates their rights of publicity or privacy, and (c) any non-compliance by you with the License Agreement.

13. Changes to the License Agreement

13.1 Google may make changes to the License Agreement as it distributes new versions of the SDK. When these changes are made, Google will make a new version of the License Agreement available on the website where the SDK is made available.

14. General Legal Terms

14.1 The License Agreement constitutes the whole legal agreement between you and Google and governs your use of the SDK (excluding any services which Google may provide to you under a separate written agreement), and completely replaces any prior agreements between you and Google in relation to the SDK. 14.2 You agree that if Google does not exercise or enforce any legal right or remedy which is contained in the License Agreement (or which Google has the benefit of under any applicable law), this will not be taken to be a formal waiver of Google's rights and that those rights or remedies will still be available to Google. 14.3 If any court of law, having the jurisdiction to decide on this matter, rules that any provision of the License Agreement is invalid, then that provision will be removed from the License Agreement without affecting the rest of the License Agreement. The remaining provisions of the License Agreement will continue to be valid and enforceable. 14.4 You acknowledge and agree that each member of the group of companies of which Google is the parent shall be third party beneficiaries to the License Agreement and that such other companies shall be entitled to directly enforce, and rely upon, any provision of the License Agreement that confers a benefit on (or rights in favor of) them. Other than this, no other person or company shall be third party beneficiaries to the License Agreement. 14.5 EXPORT RESTRICTIONS. THE SDK IS SUBJECT TO UNITED STATES EXPORT LAWS AND REGULATIONS. YOU MUST COMPLY WITH ALL DOMESTIC AND INTERNATIONAL EXPORT LAWS AND REGULATIONS THAT APPLY TO THE SDK. THESE LAWS INCLUDE RESTRICTIONS ON DESTINATIONS, END USERS AND END USE. 14.6 The rights granted in the License Agreement may not be assigned or transferred by either you or Google without the prior written approval of the other party. Neither you nor Google shall be permitted to delegate their responsibilities or obligations under the License Agreement without the prior written approval of the other party. 14.7 The License Agreement, and your relationship with Google under the License Agreement, shall be governed by the laws of the State of California without regard to its conflict of laws provisions. You and Google agree to submit to the exclusive jurisdiction of the courts located within the county of Santa Clara, California to resolve any legal matter arising from the License Agreement. Notwithstanding this, you agree that Google shall still be allowed to apply for injunctive remedies (or an equivalent type of urgent legal relief) in any jurisdiction. December 9, 2016

Download Android Command Line Tools for Mac

Download Android Command Line Tools for Mac

sdk-tools-darwin-3859397.zip

Download Android Command Line Tools

Before downloading, you must agree to the following terms and conditions.

Terms and Conditions

This is the Android Software Development Kit License Agreement

1. Introduction

1.1 The Android Software Development Kit (referred to in the License Agreement as the "SDK" and specifically including the Android system files, packaged APIs, and Google APIs add-ons) is licensed to you subject to the terms of the License Agreement. The License Agreement forms a legally binding contract between you and Google in relation to your use of the SDK. 1.2 "Android" means the Android software stack for devices, as made available under the Android Open Source Project, which is located at the following URL: http://source.android.com/, as updated from time to time. 1.3 A "compatible implementation" means any Android device that (i) complies with the Android Compatibility Definition document, which can be found at the Android compatibility website (http://source.android.com/compatibility) and which may be updated from time to time; and (ii) successfully passes the Android Compatibility Test Suite (CTS). 1.4 "Google" means Google LLC, a Delaware corporation with principal place of business at 1600 Amphitheatre Parkway, Mountain View, CA 94043, United States.

2. Accepting this License Agreement

2.1 In order to use the SDK, you must first agree to the License Agreement. You may not use the SDK if you do not accept the License Agreement. 2.2 By clicking to accept, you hereby agree to the terms of the License Agreement. 2.3 You may not use the SDK and may not accept the License Agreement if you are a person barred from receiving the SDK under the laws of the United States or other countries, including the country in which you are resident or from which you use the SDK. 2.4 If you are agreeing to be bound by the License Agreement on behalf of your employer or other entity, you represent and warrant that you have full legal authority to bind your employer or such entity to the License Agreement. If you do not have the requisite authority, you may not accept the License Agreement or use the SDK on behalf of your employer or other entity.

3. SDK License from Google

3.1 Subject to the terms of the License Agreement, Google grants you a limited, worldwide, royalty-free, non-assignable, non-exclusive, and non-sublicensable license to use the SDK solely to develop applications for compatible implementations of Android. 3.2 You may not use this SDK to develop applications for other platforms (including non-compatible implementations of Android) or to develop another SDK. You are of course free to develop applications for other platforms, including non-compatible implementations of Android, provided that this SDK is not used for that purpose. 3.3 You agree that Google or third parties own all legal right, title and interest in and to the SDK, including any Intellectual Property Rights that subsist in the SDK. "Intellectual Property Rights" means any and all rights under patent law, copyright law, trade secret law, trademark law, and any and all other proprietary rights. Google reserves all rights not expressly granted to you. 3.4 You may not use the SDK for any purpose not expressly permitted by the License Agreement. Except to the extent required by applicable third party licenses, you may not copy (except for backup purposes), modify, adapt, redistribute, decompile, reverse engineer, disassemble, or create derivative works of the SDK or any part of the SDK. 3.5 Use, reproduction and distribution of components of the SDK licensed under an open source software license are governed solely by the terms of that open source software license and not the License Agreement. 3.6 You agree that the form and nature of the SDK that Google provides may change without prior notice to you and that future versions of the SDK may be incompatible with applications developed on previous versions of the SDK. You agree that Google may stop (permanently or temporarily) providing the SDK (or any features within the SDK) to you or to users generally at Google's sole discretion, without prior notice to you. 3.7 Nothing in the License Agreement gives you a right to use any of Google's trade names, trademarks, service marks, logos, domain names, or other distinctive brand features. 3.8 You agree that you will not remove, obscure, or alter any proprietary rights notices (including copyright and trademark notices) that may be affixed to or contained within the SDK.

4. Use of the SDK by You

4.1 Google agrees that it obtains no right, title or interest from you (or your licensors) under the License Agreement in or to any software applications that you develop using the SDK, including any intellectual property rights that subsist in those applications. 4.2 You agree to use the SDK and write applications only for purposes that are permitted by (a) the License Agreement and (b) any applicable law, regulation or generally accepted practices or guidelines in the relevant jurisdictions (including any laws regarding the export of data or software to and from the United States or other relevant countries). 4.3 You agree that if you use the SDK to develop applications for general public users, you will protect the privacy and legal rights of those users. If the users provide you with user names, passwords, or other login information or personal information, you must make the users aware that the information will be available to your application, and you must provide legally adequate privacy notice and protection for those users. If your application stores personal or sensitive information provided by users, it must do so securely. If the user provides your application with Google Account information, your application may only use that information to access the user's Google Account when, and for the limited purposes for which, the user has given you permission to do so. 4.4 You agree that you will not engage in any activity with the SDK, including the development or distribution of an application, that interferes with, disrupts, damages, or accesses in an unauthorized manner the servers, networks, or other properties or services of any third party including, but not limited to, Google or any mobile communications carrier. 4.5 You agree that you are solely responsible for (and that Google has no responsibility to you or to any third party for) any data, content, or resources that you create, transmit or display through Android and/or applications for Android, and for the consequences of your actions (including any loss or damage which Google may suffer) by doing so. 4.6 You agree that you are solely responsible for (and that Google has no responsibility to you or to any third party for) any breach of your obligations under the License Agreement, any applicable third party contract or Terms of Service, or any applicable law or regulation, and for the consequences (including any loss or damage which Google or any third party may suffer) of any such breach.

5. Your Developer Credentials

5.1 You agree that you are responsible for maintaining the confidentiality of any developer credentials that may be issued to you by Google or which you may choose yourself and that you will be solely responsible for all applications that are developed under your developer credentials.

6. Privacy and Information

6.1 In order to continually innovate and improve the SDK, Google may collect certain usage statistics from the software including but not limited to a unique identifier, associated IP address, version number of the software, and information on which tools and/or services in the SDK are being used and how they are being used. Before any of this information is collected, the SDK will notify you and seek your consent. If you withhold consent, the information will not be collected. 6.2 The data collected is examined in the aggregate to improve the SDK and is maintained in accordance with Google's Privacy Policy.

7. Third Party Applications

7.1 If you use the SDK to run applications developed by a third party or that access data, content or resources provided by a third party, you agree that Google is not responsible for those applications, data, content, or resources. You understand that all data, content or resources which you may access through such third party applications are the sole responsibility of the person from which they originated and that Google is not liable for any loss or damage that you may experience as a result of the use or access of any of those third party applications, data, content, or resources. 7.2 You should be aware the data, content, and resources presented to you through such a third party application may be protected by intellectual property rights which are owned by the providers (or by other persons or companies on their behalf). You may not modify, rent, lease, loan, sell, distribute or create derivative works based on these data, content, or resources (either in whole or in part) unless you have been specifically given permission to do so by the relevant owners. 7.3 You acknowledge that your use of such third party applications, data, content, or resources may be subject to separate terms between you and the relevant third party. In that case, the License Agreement does not affect your legal relationship with these third parties.

8. Using Android APIs

8.1 Google Data APIs 8.1.1 If you use any API to retrieve data from Google, you acknowledge that the data may be protected by intellectual property rights which are owned by Google or those parties that provide the data (or by other persons or companies on their behalf). Your use of any such API may be subject to additional Terms of Service. You may not modify, rent, lease, loan, sell, distribute or create derivative works based on this data (either in whole or in part) unless allowed by the relevant Terms of Service. 8.1.2 If you use any API to retrieve a user's data from Google, you acknowledge and agree that you shall retrieve data only with the user's explicit consent and only when, and for the limited purposes for which, the user has given you permission to do so.

9. Terminating this License Agreement

9.1 The License Agreement will continue to apply until terminated by either you or Google as set out below. 9.2 If you want to terminate the License Agreement, you may do so by ceasing your use of the SDK and any relevant developer credentials. 9.3 Google may at any time, terminate the License Agreement with you if: (A) you have breached any provision of the License Agreement; or (B) Google is required to do so by law; or (C) the partner with whom Google offered certain parts of SDK (such as APIs) to you has terminated its relationship with Google or ceased to offer certain parts of the SDK to you; or (D) Google decides to no longer provide the SDK or certain parts of the SDK to users in the country in which you are resident or from which you use the service, or the provision of the SDK or certain SDK services to you by Google is, in Google's sole discretion, no longer commercially viable. 9.4 When the License Agreement comes to an end, all of the legal rights, obligations and liabilities that you and Google have benefited from, been subject to (or which have accrued over time whilst the License Agreement has been in force) or which are expressed to continue indefinitely, shall be unaffected by this cessation, and the provisions of paragraph 14.7 shall continue to apply to such rights, obligations and liabilities indefinitely.

10. DISCLAIMER OF WARRANTIES

10.1 YOU EXPRESSLY UNDERSTAND AND AGREE THAT YOUR USE OF THE SDK IS AT YOUR SOLE RISK AND THAT THE SDK IS PROVIDED "AS IS" AND "AS AVAILABLE" WITHOUT WARRANTY OF ANY KIND FROM GOOGLE. 10.2 YOUR USE OF THE SDK AND ANY MATERIAL DOWNLOADED OR OTHERWISE OBTAINED THROUGH THE USE OF THE SDK IS AT YOUR OWN DISCRETION AND RISK AND YOU ARE SOLELY RESPONSIBLE FOR ANY DAMAGE TO YOUR COMPUTER SYSTEM OR OTHER DEVICE OR LOSS OF DATA THAT RESULTS FROM SUCH USE. 10.3 GOOGLE FURTHER EXPRESSLY DISCLAIMS ALL WARRANTIES AND CONDITIONS OF ANY KIND, WHETHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO THE IMPLIED WARRANTIES AND CONDITIONS OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.

11. LIMITATION OF LIABILITY

11.1 YOU EXPRESSLY UNDERSTAND AND AGREE THAT GOOGLE, ITS SUBSIDIARIES AND AFFILIATES, AND ITS LICENSORS SHALL NOT BE LIABLE TO YOU UNDER ANY THEORY OF LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, CONSEQUENTIAL OR EXEMPLARY DAMAGES THAT MAY BE INCURRED BY YOU, INCLUDING ANY LOSS OF DATA, WHETHER OR NOT GOOGLE OR ITS REPRESENTATIVES HAVE BEEN ADVISED OF OR SHOULD HAVE BEEN AWARE OF THE POSSIBILITY OF ANY SUCH LOSSES ARISING.

12. Indemnification

12.1 To the maximum extent permitted by law, you agree to defend, indemnify and hold harmless Google, its affiliates and their respective directors, officers, employees and agents from and against any and all claims, actions, suits or proceedings, as well as any and all losses, liabilities, damages, costs and expenses (including reasonable attorneys fees) arising out of or accruing from (a) your use of the SDK, (b) any application you develop on the SDK that infringes any copyright, trademark, trade secret, trade dress, patent or other intellectual property right of any person or defames any person or violates their rights of publicity or privacy, and (c) any non-compliance by you with the License Agreement.

13. Changes to the License Agreement

13.1 Google may make changes to the License Agreement as it distributes new versions of the SDK. When these changes are made, Google will make a new version of the License Agreement available on the website where the SDK is made available.

14. General Legal Terms

14.1 The License Agreement constitutes the whole legal agreement between you and Google and governs your use of the SDK (excluding any services which Google may provide to you under a separate written agreement), and completely replaces any prior agreements between you and Google in relation to the SDK. 14.2 You agree that if Google does not exercise or enforce any legal right or remedy which is contained in the License Agreement (or which Google has the benefit of under any applicable law), this will not be taken to be a formal waiver of Google's rights and that those rights or remedies will still be available to Google. 14.3 If any court of law, having the jurisdiction to decide on this matter, rules that any provision of the License Agreement is invalid, then that provision will be removed from the License Agreement without affecting the rest of the License Agreement. The remaining provisions of the License Agreement will continue to be valid and enforceable. 14.4 You acknowledge and agree that each member of the group of companies of which Google is the parent shall be third party beneficiaries to the License Agreement and that such other companies shall be entitled to directly enforce, and rely upon, any provision of the License Agreement that confers a benefit on (or rights in favor of) them. Other than this, no other person or company shall be third party beneficiaries to the License Agreement. 14.5 EXPORT RESTRICTIONS. THE SDK IS SUBJECT TO UNITED STATES EXPORT LAWS AND REGULATIONS. YOU MUST COMPLY WITH ALL DOMESTIC AND INTERNATIONAL EXPORT LAWS AND REGULATIONS THAT APPLY TO THE SDK. THESE LAWS INCLUDE RESTRICTIONS ON DESTINATIONS, END USERS AND END USE. 14.6 The rights granted in the License Agreement may not be assigned or transferred by either you or Google without the prior written approval of the other party. Neither you nor Google shall be permitted to delegate their responsibilities or obligations under the License Agreement without the prior written approval of the other party. 14.7 The License Agreement, and your relationship with Google under the License Agreement, shall be governed by the laws of the State of California without regard to its conflict of laws provisions. You and Google agree to submit to the exclusive jurisdiction of the courts located within the county of Santa Clara, California to resolve any legal matter arising from the License Agreement. Notwithstanding this, you agree that Google shall still be allowed to apply for injunctive remedies (or an equivalent type of urgent legal relief) in any jurisdiction. December 9, 2016

Download Android Command Line Tools for Windows

Download Android Command Line Tools for Windows

sdk-tools-windows-3859397.zip

ubuntu-make-18.09+disco1/tests/data/server-content/developer.android.com/studio/releases/0000755000000000000000000000000013352651520026362 5ustar ././@LongLink0000644000000000000000000000015100000000000007770 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/developer.android.com/studio/releases/platform-tools/ubuntu-make-18.09+disco1/tests/data/server-content/developer.android.com/studio/releases/platform-to0000755000000000000000000000000013352651520030547 5ustar ././@LongLink0000644000000000000000000000016300000000000007773 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/developer.android.com/studio/releases/platform-tools/index.htmlubuntu-make-18.09+disco1/tests/data/server-content/developer.android.com/studio/releases/platform-to0000644000000000000000000027076213352651520030567 0ustar SDK Platform Tools Release Notes  |  Android Developers

SDK Platform Tools Release Notes

Android SDK Platform-Tools is a component for the Android SDK. It includes tools that interface with the Android platform, such as adb, fastboot, and systrace. These tools are required for Android app development. They're also needed if you want to unlock your device bootloader and flash it with a new system image.

Although some new features in these tools are available only for recent versions of Android, the tools are backward compatible, so you need only one version of the SDK Platform-Tools.

Downloads

If you're an app developer, you should get the latest version from Android Studio's SDK Manager or from the sdkmanager command-line tool. This ensures the tools are saved to the right place with the rest of your Android SDK tools and easily updated.

But if you want these tools only, you can download the package with the following links:

Although these links do not change, they always point to the most recent version of the tools.

Revisions

27.0.1 (December 2017)

  • Android Device Bridge (adb): fixes an assertion failure on MacOS that occurred when connecting devices using USB 3.0.
  • Fastboot: On Windows, adds support for wiping devices that use F2FS (Flash-Friendly File System).

27.0.0 (December 2017)

  • Re-fixes the macOS 10.13 fastboot bug first fixed in 26.0.1, but re-introduced in 26.0.2.

26.0.2 (October 2017)

  • Add fastboot support for Pixel 2 devices.

26.0.1 (September 2017)

  • Fixed fastboot problems on macOS 10.13 High Sierra (bug 64292422).

26.0.0 (June 2017)

  • Updated with the release of Android O final SDK (API level 26).

25.0.5 (April 24, 2017)

  • Fixed adb sideload of large updates on Windows, manifesting as "std::bad_alloc" (bug 37139736).

  • Fixed adb problems with some Windows firewalls, manifesting as "cannot open transport registration socketpair" (bug 37139725).

  • Both adb --version and fastboot --version now include the install path.

  • Changed adb to not resolve localhost to work around misconfigured VPN.

  • Changed adb to no longer reset USB devices on Linux, which could affect other attached USB devices.

25.0.4 (March 16, 2017)

  • Added experimental libusb support to Linux and Mac adb

To use the libusb backend, set the environment variable ADB_LIBUSB=true before launching a new adb server. The new adb host-features command will tell you whether or not you're using libusb.

To restart adb with libusb and check that it worked, use adb kill-server; ADB_LIBUSB=1 adb start-server; adb host-features. The output should include "libusb".

In this release, the old non-libusb implementation remains the default.

  • fastboot doesn't hang 2016 MacBook Pros anymore (bug 231129)

  • Fixed Systrace command line capture on Mac

25.0.3 (December 16, 2016)

  • Fixed fastboot bug causing Android Things devices to fail to flash

25.0.2 (December 12, 2016)

  • Updated with the Android N MR1 Stable release (API 25)

25.0.1 (November 22, 2016)

  • Updated with the release of Android N MR1 Developer Preview 2 release (API 25)

25.0.0 (October 19, 2016)

  • Updated with the release of Android N MR1 Developer Preview 1 release (API 25)

24.0.4 (October 14, 2016)

  • Updated to address issues in ADB and Mac OS Sierra

Download Android SDK Platform-Tools

Before downloading, you must agree to the following terms and conditions.

Terms and Conditions

This is the Android Software Development Kit License Agreement

1. Introduction

1.1 The Android Software Development Kit (referred to in the License Agreement as the "SDK" and specifically including the Android system files, packaged APIs, and Google APIs add-ons) is licensed to you subject to the terms of the License Agreement. The License Agreement forms a legally binding contract between you and Google in relation to your use of the SDK. 1.2 "Android" means the Android software stack for devices, as made available under the Android Open Source Project, which is located at the following URL: http://source.android.com/, as updated from time to time. 1.3 A "compatible implementation" means any Android device that (i) complies with the Android Compatibility Definition document, which can be found at the Android compatibility website (http://source.android.com/compatibility) and which may be updated from time to time; and (ii) successfully passes the Android Compatibility Test Suite (CTS). 1.4 "Google" means Google LLC, a Delaware corporation with principal place of business at 1600 Amphitheatre Parkway, Mountain View, CA 94043, United States.

2. Accepting this License Agreement

2.1 In order to use the SDK, you must first agree to the License Agreement. You may not use the SDK if you do not accept the License Agreement. 2.2 By clicking to accept, you hereby agree to the terms of the License Agreement. 2.3 You may not use the SDK and may not accept the License Agreement if you are a person barred from receiving the SDK under the laws of the United States or other countries, including the country in which you are resident or from which you use the SDK. 2.4 If you are agreeing to be bound by the License Agreement on behalf of your employer or other entity, you represent and warrant that you have full legal authority to bind your employer or such entity to the License Agreement. If you do not have the requisite authority, you may not accept the License Agreement or use the SDK on behalf of your employer or other entity.

3. SDK License from Google

3.1 Subject to the terms of the License Agreement, Google grants you a limited, worldwide, royalty-free, non-assignable, non-exclusive, and non-sublicensable license to use the SDK solely to develop applications for compatible implementations of Android. 3.2 You may not use this SDK to develop applications for other platforms (including non-compatible implementations of Android) or to develop another SDK. You are of course free to develop applications for other platforms, including non-compatible implementations of Android, provided that this SDK is not used for that purpose. 3.3 You agree that Google or third parties own all legal right, title and interest in and to the SDK, including any Intellectual Property Rights that subsist in the SDK. "Intellectual Property Rights" means any and all rights under patent law, copyright law, trade secret law, trademark law, and any and all other proprietary rights. Google reserves all rights not expressly granted to you. 3.4 You may not use the SDK for any purpose not expressly permitted by the License Agreement. Except to the extent required by applicable third party licenses, you may not copy (except for backup purposes), modify, adapt, redistribute, decompile, reverse engineer, disassemble, or create derivative works of the SDK or any part of the SDK. 3.5 Use, reproduction and distribution of components of the SDK licensed under an open source software license are governed solely by the terms of that open source software license and not the License Agreement. 3.6 You agree that the form and nature of the SDK that Google provides may change without prior notice to you and that future versions of the SDK may be incompatible with applications developed on previous versions of the SDK. You agree that Google may stop (permanently or temporarily) providing the SDK (or any features within the SDK) to you or to users generally at Google's sole discretion, without prior notice to you. 3.7 Nothing in the License Agreement gives you a right to use any of Google's trade names, trademarks, service marks, logos, domain names, or other distinctive brand features. 3.8 You agree that you will not remove, obscure, or alter any proprietary rights notices (including copyright and trademark notices) that may be affixed to or contained within the SDK.

4. Use of the SDK by You

4.1 Google agrees that it obtains no right, title or interest from you (or your licensors) under the License Agreement in or to any software applications that you develop using the SDK, including any intellectual property rights that subsist in those applications. 4.2 You agree to use the SDK and write applications only for purposes that are permitted by (a) the License Agreement and (b) any applicable law, regulation or generally accepted practices or guidelines in the relevant jurisdictions (including any laws regarding the export of data or software to and from the United States or other relevant countries). 4.3 You agree that if you use the SDK to develop applications for general public users, you will protect the privacy and legal rights of those users. If the users provide you with user names, passwords, or other login information or personal information, you must make the users aware that the information will be available to your application, and you must provide legally adequate privacy notice and protection for those users. If your application stores personal or sensitive information provided by users, it must do so securely. If the user provides your application with Google Account information, your application may only use that information to access the user's Google Account when, and for the limited purposes for which, the user has given you permission to do so. 4.4 You agree that you will not engage in any activity with the SDK, including the development or distribution of an application, that interferes with, disrupts, damages, or accesses in an unauthorized manner the servers, networks, or other properties or services of any third party including, but not limited to, Google or any mobile communications carrier. 4.5 You agree that you are solely responsible for (and that Google has no responsibility to you or to any third party for) any data, content, or resources that you create, transmit or display through Android and/or applications for Android, and for the consequences of your actions (including any loss or damage which Google may suffer) by doing so. 4.6 You agree that you are solely responsible for (and that Google has no responsibility to you or to any third party for) any breach of your obligations under the License Agreement, any applicable third party contract or Terms of Service, or any applicable law or regulation, and for the consequences (including any loss or damage which Google or any third party may suffer) of any such breach.

5. Your Developer Credentials

5.1 You agree that you are responsible for maintaining the confidentiality of any developer credentials that may be issued to you by Google or which you may choose yourself and that you will be solely responsible for all applications that are developed under your developer credentials.

6. Privacy and Information

6.1 In order to continually innovate and improve the SDK, Google may collect certain usage statistics from the software including but not limited to a unique identifier, associated IP address, version number of the software, and information on which tools and/or services in the SDK are being used and how they are being used. Before any of this information is collected, the SDK will notify you and seek your consent. If you withhold consent, the information will not be collected. 6.2 The data collected is examined in the aggregate to improve the SDK and is maintained in accordance with Google's Privacy Policy.

7. Third Party Applications

7.1 If you use the SDK to run applications developed by a third party or that access data, content or resources provided by a third party, you agree that Google is not responsible for those applications, data, content, or resources. You understand that all data, content or resources which you may access through such third party applications are the sole responsibility of the person from which they originated and that Google is not liable for any loss or damage that you may experience as a result of the use or access of any of those third party applications, data, content, or resources. 7.2 You should be aware the data, content, and resources presented to you through such a third party application may be protected by intellectual property rights which are owned by the providers (or by other persons or companies on their behalf). You may not modify, rent, lease, loan, sell, distribute or create derivative works based on these data, content, or resources (either in whole or in part) unless you have been specifically given permission to do so by the relevant owners. 7.3 You acknowledge that your use of such third party applications, data, content, or resources may be subject to separate terms between you and the relevant third party. In that case, the License Agreement does not affect your legal relationship with these third parties.

8. Using Android APIs

8.1 Google Data APIs 8.1.1 If you use any API to retrieve data from Google, you acknowledge that the data may be protected by intellectual property rights which are owned by Google or those parties that provide the data (or by other persons or companies on their behalf). Your use of any such API may be subject to additional Terms of Service. You may not modify, rent, lease, loan, sell, distribute or create derivative works based on this data (either in whole or in part) unless allowed by the relevant Terms of Service. 8.1.2 If you use any API to retrieve a user's data from Google, you acknowledge and agree that you shall retrieve data only with the user's explicit consent and only when, and for the limited purposes for which, the user has given you permission to do so.

9. Terminating this License Agreement

9.1 The License Agreement will continue to apply until terminated by either you or Google as set out below. 9.2 If you want to terminate the License Agreement, you may do so by ceasing your use of the SDK and any relevant developer credentials. 9.3 Google may at any time, terminate the License Agreement with you if: (A) you have breached any provision of the License Agreement; or (B) Google is required to do so by law; or (C) the partner with whom Google offered certain parts of SDK (such as APIs) to you has terminated its relationship with Google or ceased to offer certain parts of the SDK to you; or (D) Google decides to no longer provide the SDK or certain parts of the SDK to users in the country in which you are resident or from which you use the service, or the provision of the SDK or certain SDK services to you by Google is, in Google's sole discretion, no longer commercially viable. 9.4 When the License Agreement comes to an end, all of the legal rights, obligations and liabilities that you and Google have benefited from, been subject to (or which have accrued over time whilst the License Agreement has been in force) or which are expressed to continue indefinitely, shall be unaffected by this cessation, and the provisions of paragraph 14.7 shall continue to apply to such rights, obligations and liabilities indefinitely.

10. DISCLAIMER OF WARRANTIES

10.1 YOU EXPRESSLY UNDERSTAND AND AGREE THAT YOUR USE OF THE SDK IS AT YOUR SOLE RISK AND THAT THE SDK IS PROVIDED "AS IS" AND "AS AVAILABLE" WITHOUT WARRANTY OF ANY KIND FROM GOOGLE. 10.2 YOUR USE OF THE SDK AND ANY MATERIAL DOWNLOADED OR OTHERWISE OBTAINED THROUGH THE USE OF THE SDK IS AT YOUR OWN DISCRETION AND RISK AND YOU ARE SOLELY RESPONSIBLE FOR ANY DAMAGE TO YOUR COMPUTER SYSTEM OR OTHER DEVICE OR LOSS OF DATA THAT RESULTS FROM SUCH USE. 10.3 GOOGLE FURTHER EXPRESSLY DISCLAIMS ALL WARRANTIES AND CONDITIONS OF ANY KIND, WHETHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO THE IMPLIED WARRANTIES AND CONDITIONS OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.

11. LIMITATION OF LIABILITY

11.1 YOU EXPRESSLY UNDERSTAND AND AGREE THAT GOOGLE, ITS SUBSIDIARIES AND AFFILIATES, AND ITS LICENSORS SHALL NOT BE LIABLE TO YOU UNDER ANY THEORY OF LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, CONSEQUENTIAL OR EXEMPLARY DAMAGES THAT MAY BE INCURRED BY YOU, INCLUDING ANY LOSS OF DATA, WHETHER OR NOT GOOGLE OR ITS REPRESENTATIVES HAVE BEEN ADVISED OF OR SHOULD HAVE BEEN AWARE OF THE POSSIBILITY OF ANY SUCH LOSSES ARISING.

12. Indemnification

12.1 To the maximum extent permitted by law, you agree to defend, indemnify and hold harmless Google, its affiliates and their respective directors, officers, employees and agents from and against any and all claims, actions, suits or proceedings, as well as any and all losses, liabilities, damages, costs and expenses (including reasonable attorneys fees) arising out of or accruing from (a) your use of the SDK, (b) any application you develop on the SDK that infringes any copyright, trademark, trade secret, trade dress, patent or other intellectual property right of any person or defames any person or violates their rights of publicity or privacy, and (c) any non-compliance by you with the License Agreement.

13. Changes to the License Agreement

13.1 Google may make changes to the License Agreement as it distributes new versions of the SDK. When these changes are made, Google will make a new version of the License Agreement available on the website where the SDK is made available.

14. General Legal Terms

14.1 The License Agreement constitutes the whole legal agreement between you and Google and governs your use of the SDK (excluding any services which Google may provide to you under a separate written agreement), and completely replaces any prior agreements between you and Google in relation to the SDK. 14.2 You agree that if Google does not exercise or enforce any legal right or remedy which is contained in the License Agreement (or which Google has the benefit of under any applicable law), this will not be taken to be a formal waiver of Google's rights and that those rights or remedies will still be available to Google. 14.3 If any court of law, having the jurisdiction to decide on this matter, rules that any provision of the License Agreement is invalid, then that provision will be removed from the License Agreement without affecting the rest of the License Agreement. The remaining provisions of the License Agreement will continue to be valid and enforceable. 14.4 You acknowledge and agree that each member of the group of companies of which Google is the parent shall be third party beneficiaries to the License Agreement and that such other companies shall be entitled to directly enforce, and rely upon, any provision of the License Agreement that confers a benefit on (or rights in favor of) them. Other than this, no other person or company shall be third party beneficiaries to the License Agreement. 14.5 EXPORT RESTRICTIONS. THE SDK IS SUBJECT TO UNITED STATES EXPORT LAWS AND REGULATIONS. YOU MUST COMPLY WITH ALL DOMESTIC AND INTERNATIONAL EXPORT LAWS AND REGULATIONS THAT APPLY TO THE SDK. THESE LAWS INCLUDE RESTRICTIONS ON DESTINATIONS, END USERS AND END USE. 14.6 The rights granted in the License Agreement may not be assigned or transferred by either you or Google without the prior written approval of the other party. Neither you nor Google shall be permitted to delegate their responsibilities or obligations under the License Agreement without the prior written approval of the other party. 14.7 The License Agreement, and your relationship with Google under the License Agreement, shall be governed by the laws of the State of California without regard to its conflict of laws provisions. You and Google agree to submit to the exclusive jurisdiction of the courts located within the county of Santa Clara, California to resolve any legal matter arising from the License Agreement. Notwithstanding this, you agree that Google shall still be allowed to apply for injunctive remedies (or an equivalent type of urgent legal relief) in any jurisdiction. December 9, 2016

Download Android SDK Platform-Tools for Windows

Download Android SDK Platform-Tools for Windows

platform-tools-latest-windows.zip

Download Android SDK Platform-Tools

Before downloading, you must agree to the following terms and conditions.

Terms and Conditions

This is the Android Software Development Kit License Agreement

1. Introduction

1.1 The Android Software Development Kit (referred to in the License Agreement as the "SDK" and specifically including the Android system files, packaged APIs, and Google APIs add-ons) is licensed to you subject to the terms of the License Agreement. The License Agreement forms a legally binding contract between you and Google in relation to your use of the SDK. 1.2 "Android" means the Android software stack for devices, as made available under the Android Open Source Project, which is located at the following URL: http://source.android.com/, as updated from time to time. 1.3 A "compatible implementation" means any Android device that (i) complies with the Android Compatibility Definition document, which can be found at the Android compatibility website (http://source.android.com/compatibility) and which may be updated from time to time; and (ii) successfully passes the Android Compatibility Test Suite (CTS). 1.4 "Google" means Google LLC, a Delaware corporation with principal place of business at 1600 Amphitheatre Parkway, Mountain View, CA 94043, United States.

2. Accepting this License Agreement

2.1 In order to use the SDK, you must first agree to the License Agreement. You may not use the SDK if you do not accept the License Agreement. 2.2 By clicking to accept, you hereby agree to the terms of the License Agreement. 2.3 You may not use the SDK and may not accept the License Agreement if you are a person barred from receiving the SDK under the laws of the United States or other countries, including the country in which you are resident or from which you use the SDK. 2.4 If you are agreeing to be bound by the License Agreement on behalf of your employer or other entity, you represent and warrant that you have full legal authority to bind your employer or such entity to the License Agreement. If you do not have the requisite authority, you may not accept the License Agreement or use the SDK on behalf of your employer or other entity.

3. SDK License from Google

3.1 Subject to the terms of the License Agreement, Google grants you a limited, worldwide, royalty-free, non-assignable, non-exclusive, and non-sublicensable license to use the SDK solely to develop applications for compatible implementations of Android. 3.2 You may not use this SDK to develop applications for other platforms (including non-compatible implementations of Android) or to develop another SDK. You are of course free to develop applications for other platforms, including non-compatible implementations of Android, provided that this SDK is not used for that purpose. 3.3 You agree that Google or third parties own all legal right, title and interest in and to the SDK, including any Intellectual Property Rights that subsist in the SDK. "Intellectual Property Rights" means any and all rights under patent law, copyright law, trade secret law, trademark law, and any and all other proprietary rights. Google reserves all rights not expressly granted to you. 3.4 You may not use the SDK for any purpose not expressly permitted by the License Agreement. Except to the extent required by applicable third party licenses, you may not copy (except for backup purposes), modify, adapt, redistribute, decompile, reverse engineer, disassemble, or create derivative works of the SDK or any part of the SDK. 3.5 Use, reproduction and distribution of components of the SDK licensed under an open source software license are governed solely by the terms of that open source software license and not the License Agreement. 3.6 You agree that the form and nature of the SDK that Google provides may change without prior notice to you and that future versions of the SDK may be incompatible with applications developed on previous versions of the SDK. You agree that Google may stop (permanently or temporarily) providing the SDK (or any features within the SDK) to you or to users generally at Google's sole discretion, without prior notice to you. 3.7 Nothing in the License Agreement gives you a right to use any of Google's trade names, trademarks, service marks, logos, domain names, or other distinctive brand features. 3.8 You agree that you will not remove, obscure, or alter any proprietary rights notices (including copyright and trademark notices) that may be affixed to or contained within the SDK.

4. Use of the SDK by You

4.1 Google agrees that it obtains no right, title or interest from you (or your licensors) under the License Agreement in or to any software applications that you develop using the SDK, including any intellectual property rights that subsist in those applications. 4.2 You agree to use the SDK and write applications only for purposes that are permitted by (a) the License Agreement and (b) any applicable law, regulation or generally accepted practices or guidelines in the relevant jurisdictions (including any laws regarding the export of data or software to and from the United States or other relevant countries). 4.3 You agree that if you use the SDK to develop applications for general public users, you will protect the privacy and legal rights of those users. If the users provide you with user names, passwords, or other login information or personal information, you must make the users aware that the information will be available to your application, and you must provide legally adequate privacy notice and protection for those users. If your application stores personal or sensitive information provided by users, it must do so securely. If the user provides your application with Google Account information, your application may only use that information to access the user's Google Account when, and for the limited purposes for which, the user has given you permission to do so. 4.4 You agree that you will not engage in any activity with the SDK, including the development or distribution of an application, that interferes with, disrupts, damages, or accesses in an unauthorized manner the servers, networks, or other properties or services of any third party including, but not limited to, Google or any mobile communications carrier. 4.5 You agree that you are solely responsible for (and that Google has no responsibility to you or to any third party for) any data, content, or resources that you create, transmit or display through Android and/or applications for Android, and for the consequences of your actions (including any loss or damage which Google may suffer) by doing so. 4.6 You agree that you are solely responsible for (and that Google has no responsibility to you or to any third party for) any breach of your obligations under the License Agreement, any applicable third party contract or Terms of Service, or any applicable law or regulation, and for the consequences (including any loss or damage which Google or any third party may suffer) of any such breach.

5. Your Developer Credentials

5.1 You agree that you are responsible for maintaining the confidentiality of any developer credentials that may be issued to you by Google or which you may choose yourself and that you will be solely responsible for all applications that are developed under your developer credentials.

6. Privacy and Information

6.1 In order to continually innovate and improve the SDK, Google may collect certain usage statistics from the software including but not limited to a unique identifier, associated IP address, version number of the software, and information on which tools and/or services in the SDK are being used and how they are being used. Before any of this information is collected, the SDK will notify you and seek your consent. If you withhold consent, the information will not be collected. 6.2 The data collected is examined in the aggregate to improve the SDK and is maintained in accordance with Google's Privacy Policy.

7. Third Party Applications

7.1 If you use the SDK to run applications developed by a third party or that access data, content or resources provided by a third party, you agree that Google is not responsible for those applications, data, content, or resources. You understand that all data, content or resources which you may access through such third party applications are the sole responsibility of the person from which they originated and that Google is not liable for any loss or damage that you may experience as a result of the use or access of any of those third party applications, data, content, or resources. 7.2 You should be aware the data, content, and resources presented to you through such a third party application may be protected by intellectual property rights which are owned by the providers (or by other persons or companies on their behalf). You may not modify, rent, lease, loan, sell, distribute or create derivative works based on these data, content, or resources (either in whole or in part) unless you have been specifically given permission to do so by the relevant owners. 7.3 You acknowledge that your use of such third party applications, data, content, or resources may be subject to separate terms between you and the relevant third party. In that case, the License Agreement does not affect your legal relationship with these third parties.

8. Using Android APIs

8.1 Google Data APIs 8.1.1 If you use any API to retrieve data from Google, you acknowledge that the data may be protected by intellectual property rights which are owned by Google or those parties that provide the data (or by other persons or companies on their behalf). Your use of any such API may be subject to additional Terms of Service. You may not modify, rent, lease, loan, sell, distribute or create derivative works based on this data (either in whole or in part) unless allowed by the relevant Terms of Service. 8.1.2 If you use any API to retrieve a user's data from Google, you acknowledge and agree that you shall retrieve data only with the user's explicit consent and only when, and for the limited purposes for which, the user has given you permission to do so.

9. Terminating this License Agreement

9.1 The License Agreement will continue to apply until terminated by either you or Google as set out below. 9.2 If you want to terminate the License Agreement, you may do so by ceasing your use of the SDK and any relevant developer credentials. 9.3 Google may at any time, terminate the License Agreement with you if: (A) you have breached any provision of the License Agreement; or (B) Google is required to do so by law; or (C) the partner with whom Google offered certain parts of SDK (such as APIs) to you has terminated its relationship with Google or ceased to offer certain parts of the SDK to you; or (D) Google decides to no longer provide the SDK or certain parts of the SDK to users in the country in which you are resident or from which you use the service, or the provision of the SDK or certain SDK services to you by Google is, in Google's sole discretion, no longer commercially viable. 9.4 When the License Agreement comes to an end, all of the legal rights, obligations and liabilities that you and Google have benefited from, been subject to (or which have accrued over time whilst the License Agreement has been in force) or which are expressed to continue indefinitely, shall be unaffected by this cessation, and the provisions of paragraph 14.7 shall continue to apply to such rights, obligations and liabilities indefinitely.

10. DISCLAIMER OF WARRANTIES

10.1 YOU EXPRESSLY UNDERSTAND AND AGREE THAT YOUR USE OF THE SDK IS AT YOUR SOLE RISK AND THAT THE SDK IS PROVIDED "AS IS" AND "AS AVAILABLE" WITHOUT WARRANTY OF ANY KIND FROM GOOGLE. 10.2 YOUR USE OF THE SDK AND ANY MATERIAL DOWNLOADED OR OTHERWISE OBTAINED THROUGH THE USE OF THE SDK IS AT YOUR OWN DISCRETION AND RISK AND YOU ARE SOLELY RESPONSIBLE FOR ANY DAMAGE TO YOUR COMPUTER SYSTEM OR OTHER DEVICE OR LOSS OF DATA THAT RESULTS FROM SUCH USE. 10.3 GOOGLE FURTHER EXPRESSLY DISCLAIMS ALL WARRANTIES AND CONDITIONS OF ANY KIND, WHETHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO THE IMPLIED WARRANTIES AND CONDITIONS OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.

11. LIMITATION OF LIABILITY

11.1 YOU EXPRESSLY UNDERSTAND AND AGREE THAT GOOGLE, ITS SUBSIDIARIES AND AFFILIATES, AND ITS LICENSORS SHALL NOT BE LIABLE TO YOU UNDER ANY THEORY OF LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, CONSEQUENTIAL OR EXEMPLARY DAMAGES THAT MAY BE INCURRED BY YOU, INCLUDING ANY LOSS OF DATA, WHETHER OR NOT GOOGLE OR ITS REPRESENTATIVES HAVE BEEN ADVISED OF OR SHOULD HAVE BEEN AWARE OF THE POSSIBILITY OF ANY SUCH LOSSES ARISING.

12. Indemnification

12.1 To the maximum extent permitted by law, you agree to defend, indemnify and hold harmless Google, its affiliates and their respective directors, officers, employees and agents from and against any and all claims, actions, suits or proceedings, as well as any and all losses, liabilities, damages, costs and expenses (including reasonable attorneys fees) arising out of or accruing from (a) your use of the SDK, (b) any application you develop on the SDK that infringes any copyright, trademark, trade secret, trade dress, patent or other intellectual property right of any person or defames any person or violates their rights of publicity or privacy, and (c) any non-compliance by you with the License Agreement.

13. Changes to the License Agreement

13.1 Google may make changes to the License Agreement as it distributes new versions of the SDK. When these changes are made, Google will make a new version of the License Agreement available on the website where the SDK is made available.

14. General Legal Terms

14.1 The License Agreement constitutes the whole legal agreement between you and Google and governs your use of the SDK (excluding any services which Google may provide to you under a separate written agreement), and completely replaces any prior agreements between you and Google in relation to the SDK. 14.2 You agree that if Google does not exercise or enforce any legal right or remedy which is contained in the License Agreement (or which Google has the benefit of under any applicable law), this will not be taken to be a formal waiver of Google's rights and that those rights or remedies will still be available to Google. 14.3 If any court of law, having the jurisdiction to decide on this matter, rules that any provision of the License Agreement is invalid, then that provision will be removed from the License Agreement without affecting the rest of the License Agreement. The remaining provisions of the License Agreement will continue to be valid and enforceable. 14.4 You acknowledge and agree that each member of the group of companies of which Google is the parent shall be third party beneficiaries to the License Agreement and that such other companies shall be entitled to directly enforce, and rely upon, any provision of the License Agreement that confers a benefit on (or rights in favor of) them. Other than this, no other person or company shall be third party beneficiaries to the License Agreement. 14.5 EXPORT RESTRICTIONS. THE SDK IS SUBJECT TO UNITED STATES EXPORT LAWS AND REGULATIONS. YOU MUST COMPLY WITH ALL DOMESTIC AND INTERNATIONAL EXPORT LAWS AND REGULATIONS THAT APPLY TO THE SDK. THESE LAWS INCLUDE RESTRICTIONS ON DESTINATIONS, END USERS AND END USE. 14.6 The rights granted in the License Agreement may not be assigned or transferred by either you or Google without the prior written approval of the other party. Neither you nor Google shall be permitted to delegate their responsibilities or obligations under the License Agreement without the prior written approval of the other party. 14.7 The License Agreement, and your relationship with Google under the License Agreement, shall be governed by the laws of the State of California without regard to its conflict of laws provisions. You and Google agree to submit to the exclusive jurisdiction of the courts located within the county of Santa Clara, California to resolve any legal matter arising from the License Agreement. Notwithstanding this, you agree that Google shall still be allowed to apply for injunctive remedies (or an equivalent type of urgent legal relief) in any jurisdiction. December 9, 2016

Download Android SDK Platform-Tools for Mac

Download Android SDK Platform-Tools for Mac

platform-tools-latest-darwin.zip

Download Android SDK Platform-Tools

Before downloading, you must agree to the following terms and conditions.

Terms and Conditions

This is the Android Software Development Kit License Agreement

1. Introduction

1.1 The Android Software Development Kit (referred to in the License Agreement as the "SDK" and specifically including the Android system files, packaged APIs, and Google APIs add-ons) is licensed to you subject to the terms of the License Agreement. The License Agreement forms a legally binding contract between you and Google in relation to your use of the SDK. 1.2 "Android" means the Android software stack for devices, as made available under the Android Open Source Project, which is located at the following URL: http://source.android.com/, as updated from time to time. 1.3 A "compatible implementation" means any Android device that (i) complies with the Android Compatibility Definition document, which can be found at the Android compatibility website (http://source.android.com/compatibility) and which may be updated from time to time; and (ii) successfully passes the Android Compatibility Test Suite (CTS). 1.4 "Google" means Google LLC, a Delaware corporation with principal place of business at 1600 Amphitheatre Parkway, Mountain View, CA 94043, United States.

2. Accepting this License Agreement

2.1 In order to use the SDK, you must first agree to the License Agreement. You may not use the SDK if you do not accept the License Agreement. 2.2 By clicking to accept, you hereby agree to the terms of the License Agreement. 2.3 You may not use the SDK and may not accept the License Agreement if you are a person barred from receiving the SDK under the laws of the United States or other countries, including the country in which you are resident or from which you use the SDK. 2.4 If you are agreeing to be bound by the License Agreement on behalf of your employer or other entity, you represent and warrant that you have full legal authority to bind your employer or such entity to the License Agreement. If you do not have the requisite authority, you may not accept the License Agreement or use the SDK on behalf of your employer or other entity.

3. SDK License from Google

3.1 Subject to the terms of the License Agreement, Google grants you a limited, worldwide, royalty-free, non-assignable, non-exclusive, and non-sublicensable license to use the SDK solely to develop applications for compatible implementations of Android. 3.2 You may not use this SDK to develop applications for other platforms (including non-compatible implementations of Android) or to develop another SDK. You are of course free to develop applications for other platforms, including non-compatible implementations of Android, provided that this SDK is not used for that purpose. 3.3 You agree that Google or third parties own all legal right, title and interest in and to the SDK, including any Intellectual Property Rights that subsist in the SDK. "Intellectual Property Rights" means any and all rights under patent law, copyright law, trade secret law, trademark law, and any and all other proprietary rights. Google reserves all rights not expressly granted to you. 3.4 You may not use the SDK for any purpose not expressly permitted by the License Agreement. Except to the extent required by applicable third party licenses, you may not copy (except for backup purposes), modify, adapt, redistribute, decompile, reverse engineer, disassemble, or create derivative works of the SDK or any part of the SDK. 3.5 Use, reproduction and distribution of components of the SDK licensed under an open source software license are governed solely by the terms of that open source software license and not the License Agreement. 3.6 You agree that the form and nature of the SDK that Google provides may change without prior notice to you and that future versions of the SDK may be incompatible with applications developed on previous versions of the SDK. You agree that Google may stop (permanently or temporarily) providing the SDK (or any features within the SDK) to you or to users generally at Google's sole discretion, without prior notice to you. 3.7 Nothing in the License Agreement gives you a right to use any of Google's trade names, trademarks, service marks, logos, domain names, or other distinctive brand features. 3.8 You agree that you will not remove, obscure, or alter any proprietary rights notices (including copyright and trademark notices) that may be affixed to or contained within the SDK.

4. Use of the SDK by You

4.1 Google agrees that it obtains no right, title or interest from you (or your licensors) under the License Agreement in or to any software applications that you develop using the SDK, including any intellectual property rights that subsist in those applications. 4.2 You agree to use the SDK and write applications only for purposes that are permitted by (a) the License Agreement and (b) any applicable law, regulation or generally accepted practices or guidelines in the relevant jurisdictions (including any laws regarding the export of data or software to and from the United States or other relevant countries). 4.3 You agree that if you use the SDK to develop applications for general public users, you will protect the privacy and legal rights of those users. If the users provide you with user names, passwords, or other login information or personal information, you must make the users aware that the information will be available to your application, and you must provide legally adequate privacy notice and protection for those users. If your application stores personal or sensitive information provided by users, it must do so securely. If the user provides your application with Google Account information, your application may only use that information to access the user's Google Account when, and for the limited purposes for which, the user has given you permission to do so. 4.4 You agree that you will not engage in any activity with the SDK, including the development or distribution of an application, that interferes with, disrupts, damages, or accesses in an unauthorized manner the servers, networks, or other properties or services of any third party including, but not limited to, Google or any mobile communications carrier. 4.5 You agree that you are solely responsible for (and that Google has no responsibility to you or to any third party for) any data, content, or resources that you create, transmit or display through Android and/or applications for Android, and for the consequences of your actions (including any loss or damage which Google may suffer) by doing so. 4.6 You agree that you are solely responsible for (and that Google has no responsibility to you or to any third party for) any breach of your obligations under the License Agreement, any applicable third party contract or Terms of Service, or any applicable law or regulation, and for the consequences (including any loss or damage which Google or any third party may suffer) of any such breach.

5. Your Developer Credentials

5.1 You agree that you are responsible for maintaining the confidentiality of any developer credentials that may be issued to you by Google or which you may choose yourself and that you will be solely responsible for all applications that are developed under your developer credentials.

6. Privacy and Information

6.1 In order to continually innovate and improve the SDK, Google may collect certain usage statistics from the software including but not limited to a unique identifier, associated IP address, version number of the software, and information on which tools and/or services in the SDK are being used and how they are being used. Before any of this information is collected, the SDK will notify you and seek your consent. If you withhold consent, the information will not be collected. 6.2 The data collected is examined in the aggregate to improve the SDK and is maintained in accordance with Google's Privacy Policy.

7. Third Party Applications

7.1 If you use the SDK to run applications developed by a third party or that access data, content or resources provided by a third party, you agree that Google is not responsible for those applications, data, content, or resources. You understand that all data, content or resources which you may access through such third party applications are the sole responsibility of the person from which they originated and that Google is not liable for any loss or damage that you may experience as a result of the use or access of any of those third party applications, data, content, or resources. 7.2 You should be aware the data, content, and resources presented to you through such a third party application may be protected by intellectual property rights which are owned by the providers (or by other persons or companies on their behalf). You may not modify, rent, lease, loan, sell, distribute or create derivative works based on these data, content, or resources (either in whole or in part) unless you have been specifically given permission to do so by the relevant owners. 7.3 You acknowledge that your use of such third party applications, data, content, or resources may be subject to separate terms between you and the relevant third party. In that case, the License Agreement does not affect your legal relationship with these third parties.

8. Using Android APIs

8.1 Google Data APIs 8.1.1 If you use any API to retrieve data from Google, you acknowledge that the data may be protected by intellectual property rights which are owned by Google or those parties that provide the data (or by other persons or companies on their behalf). Your use of any such API may be subject to additional Terms of Service. You may not modify, rent, lease, loan, sell, distribute or create derivative works based on this data (either in whole or in part) unless allowed by the relevant Terms of Service. 8.1.2 If you use any API to retrieve a user's data from Google, you acknowledge and agree that you shall retrieve data only with the user's explicit consent and only when, and for the limited purposes for which, the user has given you permission to do so.

9. Terminating this License Agreement

9.1 The License Agreement will continue to apply until terminated by either you or Google as set out below. 9.2 If you want to terminate the License Agreement, you may do so by ceasing your use of the SDK and any relevant developer credentials. 9.3 Google may at any time, terminate the License Agreement with you if: (A) you have breached any provision of the License Agreement; or (B) Google is required to do so by law; or (C) the partner with whom Google offered certain parts of SDK (such as APIs) to you has terminated its relationship with Google or ceased to offer certain parts of the SDK to you; or (D) Google decides to no longer provide the SDK or certain parts of the SDK to users in the country in which you are resident or from which you use the service, or the provision of the SDK or certain SDK services to you by Google is, in Google's sole discretion, no longer commercially viable. 9.4 When the License Agreement comes to an end, all of the legal rights, obligations and liabilities that you and Google have benefited from, been subject to (or which have accrued over time whilst the License Agreement has been in force) or which are expressed to continue indefinitely, shall be unaffected by this cessation, and the provisions of paragraph 14.7 shall continue to apply to such rights, obligations and liabilities indefinitely.

10. DISCLAIMER OF WARRANTIES

10.1 YOU EXPRESSLY UNDERSTAND AND AGREE THAT YOUR USE OF THE SDK IS AT YOUR SOLE RISK AND THAT THE SDK IS PROVIDED "AS IS" AND "AS AVAILABLE" WITHOUT WARRANTY OF ANY KIND FROM GOOGLE. 10.2 YOUR USE OF THE SDK AND ANY MATERIAL DOWNLOADED OR OTHERWISE OBTAINED THROUGH THE USE OF THE SDK IS AT YOUR OWN DISCRETION AND RISK AND YOU ARE SOLELY RESPONSIBLE FOR ANY DAMAGE TO YOUR COMPUTER SYSTEM OR OTHER DEVICE OR LOSS OF DATA THAT RESULTS FROM SUCH USE. 10.3 GOOGLE FURTHER EXPRESSLY DISCLAIMS ALL WARRANTIES AND CONDITIONS OF ANY KIND, WHETHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO THE IMPLIED WARRANTIES AND CONDITIONS OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.

11. LIMITATION OF LIABILITY

11.1 YOU EXPRESSLY UNDERSTAND AND AGREE THAT GOOGLE, ITS SUBSIDIARIES AND AFFILIATES, AND ITS LICENSORS SHALL NOT BE LIABLE TO YOU UNDER ANY THEORY OF LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, CONSEQUENTIAL OR EXEMPLARY DAMAGES THAT MAY BE INCURRED BY YOU, INCLUDING ANY LOSS OF DATA, WHETHER OR NOT GOOGLE OR ITS REPRESENTATIVES HAVE BEEN ADVISED OF OR SHOULD HAVE BEEN AWARE OF THE POSSIBILITY OF ANY SUCH LOSSES ARISING.

12. Indemnification

12.1 To the maximum extent permitted by law, you agree to defend, indemnify and hold harmless Google, its affiliates and their respective directors, officers, employees and agents from and against any and all claims, actions, suits or proceedings, as well as any and all losses, liabilities, damages, costs and expenses (including reasonable attorneys fees) arising out of or accruing from (a) your use of the SDK, (b) any application you develop on the SDK that infringes any copyright, trademark, trade secret, trade dress, patent or other intellectual property right of any person or defames any person or violates their rights of publicity or privacy, and (c) any non-compliance by you with the License Agreement.

13. Changes to the License Agreement

13.1 Google may make changes to the License Agreement as it distributes new versions of the SDK. When these changes are made, Google will make a new version of the License Agreement available on the website where the SDK is made available.

14. General Legal Terms

14.1 The License Agreement constitutes the whole legal agreement between you and Google and governs your use of the SDK (excluding any services which Google may provide to you under a separate written agreement), and completely replaces any prior agreements between you and Google in relation to the SDK. 14.2 You agree that if Google does not exercise or enforce any legal right or remedy which is contained in the License Agreement (or which Google has the benefit of under any applicable law), this will not be taken to be a formal waiver of Google's rights and that those rights or remedies will still be available to Google. 14.3 If any court of law, having the jurisdiction to decide on this matter, rules that any provision of the License Agreement is invalid, then that provision will be removed from the License Agreement without affecting the rest of the License Agreement. The remaining provisions of the License Agreement will continue to be valid and enforceable. 14.4 You acknowledge and agree that each member of the group of companies of which Google is the parent shall be third party beneficiaries to the License Agreement and that such other companies shall be entitled to directly enforce, and rely upon, any provision of the License Agreement that confers a benefit on (or rights in favor of) them. Other than this, no other person or company shall be third party beneficiaries to the License Agreement. 14.5 EXPORT RESTRICTIONS. THE SDK IS SUBJECT TO UNITED STATES EXPORT LAWS AND REGULATIONS. YOU MUST COMPLY WITH ALL DOMESTIC AND INTERNATIONAL EXPORT LAWS AND REGULATIONS THAT APPLY TO THE SDK. THESE LAWS INCLUDE RESTRICTIONS ON DESTINATIONS, END USERS AND END USE. 14.6 The rights granted in the License Agreement may not be assigned or transferred by either you or Google without the prior written approval of the other party. Neither you nor Google shall be permitted to delegate their responsibilities or obligations under the License Agreement without the prior written approval of the other party. 14.7 The License Agreement, and your relationship with Google under the License Agreement, shall be governed by the laws of the State of California without regard to its conflict of laws provisions. You and Google agree to submit to the exclusive jurisdiction of the courts located within the county of Santa Clara, California to resolve any legal matter arising from the License Agreement. Notwithstanding this, you agree that Google shall still be allowed to apply for injunctive remedies (or an equivalent type of urgent legal relief) in any jurisdiction. December 9, 2016

Download Android SDK Platform-Tools for Linux

Download Android SDK Platform-Tools for Linux

platform-tools-latest-linux.zip

ubuntu-make-18.09+disco1/tests/data/server-content/dl.google.com/0000755000000000000000000000000013352651520021516 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/dl.google.com/android/0000755000000000000000000000000013352651520023136 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/dl.google.com/android/repository/0000755000000000000000000000000013352651520025355 5ustar ././@LongLink0000644000000000000000000000016600000000000007776 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/dl.google.com/android/repository/android-ndk-fake-linux-x86_64.zipubuntu-make-18.09+disco1/tests/data/server-content/dl.google.com/android/repository/android-ndk-fake0000644000000000000000000000067413352651520030405 0ustar PK±]pHandroid-ndk-r10d-linux/PK ±]pHû android-ndk-r10d-linux/ndk-build#!/bin/sh PK ®]pHû android-ndk-r10d-linux/ndk-which#!/bin/sh PK?±]pH€ýAandroid-ndk-r10d-linux/PK? ±]pHû €ý5android-ndk-r10d-linux/ndk-buildPK? ®]pHû €ý}android-ndk-r10d-linux/ndk-whichPKáÅ././@LongLink0000644000000000000000000000016400000000000007774 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/dl.google.com/android/repository/platform-tools-latest-linux.zipubuntu-make-18.09+disco1/tests/data/server-content/dl.google.com/android/repository/platform-tools-l0000644000000000000000000000050213352651520030510 0ustar PKµƒeJplatform-tools/PK ŠkGû platform-tools/adb#!/bin/sh PK?µƒeJ$€ýAplatform-tools/ Oœí¼•Òkêû¼•Òè¾ÎøÓPK? ŠkGû $ €ý-platform-tools/adb bî$)ßÐOœí¼•Ò€¹ÇÎøÓPKÅg././@LongLink0000644000000000000000000000015100000000000007770 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/dl.google.com/android/repository/tools_mock-linux.zipubuntu-make-18.09+disco1/tests/data/server-content/dl.google.com/android/repository/tools_mock-linux0000644000000000000000000000133213352651520030605 0ustar PKµƒeJtools/PK ŠkGû tools/android#!/bin/sh PK¸k¿L tools/bin/PK ¸k¿Lû tools/bin/sdkmanager#!/bin/sh PK !J7Eû tools/ddms#!/bin/sh PK?µƒeJ$€ýAtools/ Oœí¼•Ò€Z“vÔøÓ€Z“vÔøÓPK? ŠkGû $ €ý$tools/android bî$)ßÐOœí¼•Ò€Z“vÔøÓPK?¸k¿L $€ýAYtools/bin/ €®ÒøÓ€X{ÔøÓ€Z“vÔøÓPK? ¸k¿Lû $ €ýtools/bin/sdkmanager €®ÒøÓqh­ÒøÓYµ€ÔøÓPK? !J7Eû $ €ý½tools/ddms €”Y^þÖÏOœí¼•Ò€Z“vÔøÓPKÕïubuntu-make-18.09+disco1/tests/data/server-content/dl.google.com/dl/0000755000000000000000000000000013352651520022115 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/dl.google.com/dl/android/0000755000000000000000000000000013352651520023535 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/dl.google.com/dl/android/studio/0000755000000000000000000000000013352651520025044 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/dl.google.com/dl/android/studio/ide-zips/0000755000000000000000000000000013352651520026570 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/dl.google.com/dl/android/studio/ide-zips/fake/0000755000000000000000000000000013352651520027476 5ustar ././@LongLink0000644000000000000000000000020300000000000007766 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/dl.google.com/dl/android/studio/ide-zips/fake/android-studio-ide-fake-linux.zipubuntu-make-18.09+disco1/tests/data/server-content/dl.google.com/dl/android/studio/ide-zips/fake/and0000644000000000000000000000256113352651520030167 0ustar PK%XüDandroid-studio/PK*„üDandroid-studio/bin/PK ‡ÐFðÅ$Âandroid-studio/bin/java-fake#!/bin/sh sleep 60 PK êˆÐFandroid-studio/bin/studio.pngPK tˆÐF yû--android-studio/bin/studio.sh#!/bin/sh $(dirname $0)/java-fake exit 143 PKJ7Eandroid-studio/sdk/PKJ7E"android-studio/sdk/platform-tools/PK J7Eû %android-studio/sdk/platform-tools/adb#!/bin/sh PK J7Eandroid-studio/sdk/tools/PK  J7Eû android-studio/sdk/tools/ddms#!/bin/sh PK?%XüD€ýAandroid-studio/PK?*„üD€ýA-android-studio/bin/PK? ‡ÐFðÅ$ €ý^android-studio/bin/java-fakePK? êˆÐF €´¬android-studio/bin/studio.pngPK? tˆÐF yû-- €ýçandroid-studio/bin/studio.shPK?J7E€ýANandroid-studio/sdk/PK?J7E"€ýAandroid-studio/sdk/platform-tools/PK? J7Eû % €ý¿android-studio/sdk/platform-tools/adbPK? J7E€ýA android-studio/sdk/tools/PK?  J7Eû  €ýCandroid-studio/sdk/tools/ddmsPK Óˆubuntu-make-18.09+disco1/tests/data/server-content/download.blender.org/0000755000000000000000000000000013352651520023076 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/download.blender.org/release/0000755000000000000000000000000013352651520024516 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/download.blender.org/release/BlenderMock/0000755000000000000000000000000013352651520026703 5ustar ././@LongLink0000644000000000000000000000020500000000000007770 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/download.blender.org/release/BlenderMock/blender-mock-linux-glibc219-i686.tar.bz2ubuntu-make-18.09+disco1/tests/data/server-content/download.blender.org/release/BlenderMock/blender-0000777000000000000000000000000013352651520037464 2blender-mock-linux-glibc219-x86_64.tar.bz2ustar ././@LongLink0000644000000000000000000000020700000000000007772 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/download.blender.org/release/BlenderMock/blender-mock-linux-glibc219-x86_64.tar.bz2ubuntu-make-18.09+disco1/tests/data/server-content/download.blender.org/release/BlenderMock/blender-0000644000000000000000000000043213352651520030315 0ustar BZh61AY&SY¨"¥¥6„Âhÿ  0@~åß@0È0ÐÈi“@1 4Ñ¡£¦’f¤@Je!3Iê Õ ž¦Ôú|È6…ƒvŠ=¢£«¿~9MÀØe Ae-ËrPnüFD -cePî?`:xéf|âdã4€‡;Îå´p_­kÀC°&¹í•U¶MÆMA“B¨ˆ¹4ÐI4æã#“Ö”N%xÈq«@È"C½"’¤U~!-Kdí@ÍèÔœ†9°[êžnaÄ ÀyfÏ[‡ Ý€vƒý¦Ö[ €ÐÖaâ¨æLŒ,îˆpí­úÇA‹·ˆâîH§ T´ ././@LongLink0000644000000000000000000000015400000000000007773 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/download.blender.org/release/BlenderMock/releasemock.md5ubuntu-make-18.09+disco1/tests/data/server-content/download.blender.org/release/BlenderMock/releasem0000644000000000000000000000023113352651520030417 0ustar 85d26440a8f99f92a34a265bec2fde7e blender-mock-linux-glibc219-x86_64.tar.bz2 85d26440a8f99f92a34a265bec2fde7e blender-mock-linux-glibc219-i686.tar.bz2 ubuntu-make-18.09+disco1/tests/data/server-content/download.jetbrains.com/0000755000000000000000000000000013352651520023433 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/download.jetbrains.com/cpp/0000755000000000000000000000000013352651520024215 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/download.jetbrains.com/cpp/clion-fake.tar.gz0000644000000000000000000002400013352651520027350 0ustar clion-42.1111/0000775000175000017500000000000012470610672013164 5ustar didrocksdidrocksclion-42.1111/bin/0000775000175000017500000000000012622560702013731 5ustar didrocksdidrocksclion-42.1111/bin/clion.sh0000755000175000017500000000043512622560645015402 0ustar didrocksdidrocks#!/bin/sh # # --------------------------------------------------------------------- # CLion fake startup script. # --------------------------------------------------------------------- # $(dirname $0)/java-fake returncode=$? [ $returncode -eq 143 ] && returnchode=0 exit $returnchode clion-42.1111/bin/clion.svg0000664000175000017500000000000012622560702015544 0ustar didrocksdidrocksclion-42.1111/bin/java-fake0000744000175000017500000000002412365411414015473 0ustar didrocksdidrocks#!/bin/sh sleep 60 ././@LongLink0000644000000000000000000000014700000000000007775 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/download.jetbrains.com/cpp/clion-fake.tar.gz.sha256ubuntu-make-18.09+disco1/tests/data/server-content/download.jetbrains.com/cpp/clion-fake.tar.gz.sha20000644000000000000000000000012413352651520030205 0ustar 4588dc2aab11ce09672cb5d7516af0b62cf0512d62dcaaebe55943626c444871 clion-fake.tar.gz ubuntu-make-18.09+disco1/tests/data/server-content/download.jetbrains.com/datagrip/0000755000000000000000000000000013352651520025226 5ustar ././@LongLink0000644000000000000000000000015000000000000007767 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/download.jetbrains.com/datagrip/datagrip-fake.tar.gzubuntu-make-18.09+disco1/tests/data/server-content/download.jetbrains.com/datagrip/datagrip-fake.tar0000644000000000000000000002571113352651520030443 0ustar ‹AöZí›PTͶ¨÷0 CÎ(™”(0¤!ÃQ” HÎ9ÏC’4$I‚J’$A¢’‘(HAPÉYrøøÏùÏy÷ݺ÷ÜzUçž[¯ž_ÕLïݵV¯µ{õê½»ª[Ùc©æáˆæ€  ÿÀápq11Ø_JÄ_K¸°è_Ë? ‰Ã…DÄEà¢pØåBX€‰ý·xóïðòÄXz\ºâ€r±·õøÏå.ÅììþA;>ÇßËÿGPþ?ãoåèöÏÿñ¹Œ¿¨(\øwüÿüûø{9ºØ`|1ÿL—ýýñƒ #Ä„…DÄpáËø‹‰" þÏtâ?ãÿ÷ø+ò ‰ŠIJŠ ˆÿO;ó›9ÿÁüïdémÉogélûϲñ_ÎÿÂÍQ!¸˜Øó?BHLøwþÿ+à¸ö—˜{:{ºØÚ¢a8ŒøÚ©ßüËøòßæ²Êþ²JífÿO±ñßÿÂb¢ÂâÿæýÿÇ÷?B\Häwþÿ+ˆÖÖT##fü#åÉn©+ß»,±ü .ÿ;ä,û. ŒŠæ>Êãcéa (Ø ¬la·\-ímïÙZÚø¹÷ÚʘÓQ×cp÷Ž”5ÊUÀò_Wô_lÈÈû¢-­m10+[{G7Yöíw­ì0GYv}±»ð»h%[Gõ‡¶÷jêZ?t¶–´a——ƒÉøJ]6àj‹±„ùºº¸yJùʲÿ¥]©Ëë?ªÙaÁ8˲ÿÕ)ƒ»Ú0%”‡-LLÁo GˆÃÄ%.—â¢â7a—ë 1A¸ˆ œ_XDJ.%* ûöKk6vR÷”Uÿ´uy'Ëî€Á ¥}|||DPö‚—ŸI’‚paAaaþK ~O?7Œ¥/¿›'ÇßZP¶õ´¾LŒ#Ê öǽ¥Ê #ËÎþ·GpEß½û÷†Ý<ÿì¨Ë.ôµD ^æ  ««àߤ=1÷líþ±´§®ÚVðž­'ÊËÃú2vÿÆÔ?VýCðÒ)e”µ—«­æ–²,ûe€£”ª°²èe2*‹( ©ˆ)¨***)^þI*^.Ô”ÿ¦{Ëí2-ܬmÿ¦ëø¿uÅþ¡®”’‡­%å¡‹B¹ü-zÚ( ÊÓ…†))ý%Z0n}G7”'ÏÝû§·¶ŽÞ¶6ª(WØ_úGÊñ?ðA!¦¤ˆP“QþÃIqEIa‰Ë™!!¡aÿS׿?xö?uÿ©®à¥3‚ÿ.Ø«ºA\þ}è^Þü}ðÛº]ŽxË¡íLýðòÛŠ+ò–²‚®ïøF 4ƒîËØ¹¿ÛØGæÞ+%Ê*gù„z#áÉV¢òŠ.?†GéÂÒ tö wtáŒÒQT?Ex y¹M!¶†H¤ArËL³«ÝÀE†Èæ§É4ÿåéæwevOX·¦îž4 k2„ =ØÍ6à\ÁGÚÿ¢;¦PìyûãeJŠO-)¦|$‚tFÂÀ™m²}{b8häô¤¾u¬ã|«·°ñ)ÍÈ8[z÷>n'±8þôëyàw5÷;F¢6JûÛ‚­¶ò¿LUVCs¹‘¼mOi™///7š°W[@Ý—©ÇBÜ]Ë×o\Zîç:ÛjŽ! þ^œc#’ØÒŽÐšP”q; }¡ ‰8t¦Âó bnHSú¹ô5Ô•q0Ѿö.Znå€à@m¬©#™„¥Zyp®Rë3>q5ö1_Âãºk·xÔMÞˆV»HWÜý0Ý€RuÉ9j)]=ï© J¿¸ÒÙíî½#Ü–ïØ³WuûÈR¯’Ú˜K4bé°ñ"6øµßaÅù'–9¿a@#W<†¨™€ÚZîÃR[E-®Suò÷Ô3[… Ù˜D+×!žmOüì÷\—@Ò«m°¸.ú” ÿàìòW?}Y¢[*õæH—¾´R}¦ÍF¨Ÿ¸‹î.â´³L=†M¡bª%ƒ)ä@‘`‚Š“¨-D°€i·‘|Ü£3kr¹x‹]/Àã¹Æ¯ÛÉÈØ—|§µà3ýf?£OêÙéÉ“¸Q)ÞzBüJeº& ¹®P' § {¢Q¤ïf/¿ºá–Ö긻ù¢—à—è pT|”®T² €ñöÔŽ¦l‰À|àO#tƒNÙ¼6ôºþlª ««Ã¤Q‹UïÀ[û :W ôûóo‘O´ät}C&ÝY'òÁX'¹CÓf>hú¥Íƒ_DdV*Çw\ÒÍÎÆ/\gê5P{8F€–@9‰±èÄç,*@t£ôXé.<™¼•¼G_FÅ!þ“Å’tËK×IÄ¡8QR‹š:˜;£5àpµ@dmz=Œ¢µ›êË-CéEÄ“‰X¼ 96ÕxépÇ"T@™-œ {šIM.+‰ùѾœ2½‡4õO‹ôc{9Eœ!ØÝby~üiƒ£¬2sÄC%±6W–[¹¥=&Rgâ£óÌ%2—±þˆòàc“X ê!Ö¼Q²ÜÅŒª Àc J‹Íûzl&ö%Aõ8 ÆÀân~Äi@×A-‚b“à¤ÇJQ%Up?'—ÃÁWÄrjf@.×Ûôs×ÏΓšr}p"ãïcÑϧ›þ‡OLm5ä’\Ú,êNbOìÏŽ¿MßÊh¾kY’í~ c>±ý¸T¤¶Ë'd ®ª]Á|¦^†òkZïN~°=Á_áçF‘³Dy7¶¿ ÁLAéÑò>S ,†˜x:¤XRçÙ¦Ä>g·’r*¥ö`ÍxþëÓÀtŸ>OvÝ!9PFzWØe…á£Hk|<%[Á#af'¿Üű˜ùLùVɤ¥kJ›@#„Ýú±Ž÷j—sÄ„ $Ì¿5ɽÅö…¤I ³×yrª ˜ë;SF„ß<| 4!Ár¹Ô[l?ɨy¯ÀŠü <¡Öü¨cŠù–À÷™æë–ùL”v¯ÆX\ÖÏ ÆúõëŽ.Sò[Ýì³´mÞ2oÙòªrß–÷x› hÉi`¶(ÜÅÎ jYºgØY>ȶþâÞâzþóú\ŠŒ;#[gª”üU–yÿwš‘˜§Ìøíò¦kÙâÍù«Ïq“9}lò‘„RÉ%~èur½…ö‡¤¦4I-9 sL«óâÊrC÷Ä}Jg Wã<‚({r´=@5±uµ»êÉÊ¢ã'gŸ7™tÄF'Lù”‚ʸ?{W[LEï÷“Œ’Ú߉õ€ûé+®ÁÒ ­X†*gß=/ <Êï)Pþb–¨».G:GïµÌØOâEx}H’Kd©Ý1¼þ Z ˆ:XÞý1P2OŽ•ØË•xAóX×6E…•µîõ¯†§tåQþñŸf„V¿7úaó›V@@´Ì¯`ì7›«N`ÀÚ<êp^E ·ƒ …Ckâ¹q6@ÂÂàÂýyÿ{iÔWÜYœˆ)JÃ^¨g%²óŸuÌnÛËÈ:ßI ì0ÚÜ»õüü'I]^ o»ÓÓÏ<Ç͆-lú5/ÎýJèÓNô¯ÙÞ¢ XÎÆ6žTf…¦pÞšÅg§ p~Ç÷¸):õE,–zÃÞ« ‘“áÆ1Ô\²¬4Ýn)'àSœ­UifÇ·sÖ¸! lš‘2óÔûÈ*µ,ôDfk]¿Á«XÂ+C8ð@{ÕƒPó~[_•µ°Ps§‡ªGãEM¨­s@ƒRÍinÊp¾˜ ìÁqÿ³^õ£Å1Ìs‹˜¬•±§jI«¯¾ÄLô@ëËžsÂÆÈꇃµ-"NŸÐçYÍò¤ïuÜKÚ{Ôã£ò¤ôç£{#UC÷D—ïÊ?òî±Xðý‡í{—±„UÖ0¶ZžÑ7—l”g¿²OduíÑãÒœÉ O'¯x"-. °øÞNÿ šL)‘µâ¼ä=TsvѼ²=!Æê­UÝN3 ÉǃnâIÅúûù)rº)€¤” ŒÖ(w+«úï K¼ï~¹NsÝë¶Ä­h÷ôû·Þß"°íÔkµÅb¤Ø¨ñ 7fYÅ‹·¤Œac=ÑÊñ¡Z”mOŸ¥‰_/é^ÌaUj:B¯žiÎ0(@,/2Iš”¿Ó[’ü*Å?¢7DHÉFrk`R‹$.Í@ù)|mJŒ0r^1¢WKݬ ™PÀJ«mp}¶¿zl]Xz“lh&Ïâ :XœléÐbÎ|¡@ .˜(®(Ù²W—º'œ×“w BC wÇ1žôµ‹¿–›$&ˆz<'Ëó:4-U {õyGoiþò]õM úëÛ‰ê\¸˜È÷ò.Ü7o†å©uÜâÊÄ/((À•ê öô÷CB|7ûûûq##øPrflL ñÑÒ ”EÇ#2Êhe£«f…c&~!ra Ùß³ˆiå…»½\ÙùW„Ÿv‘E(¢Wp׎¶Þm[ô%óW<üé$ᱨ® žtïnGŸÓ‹9ÑÒÔÞï´¯AÍ´ /U;n¤˜àÍ¡é“L‰Ë[Ï¥6fZg<û^ЦëV²¤Æ5’áUÉ·} lK€‹OÌ~æJQ $+»×Ï,lCh‚n‡t†éY,tÅU8 ±<újRîüí úìç·Ž†å¬_ÂývmêwÞ“Ìõ‹Ï„/gù“çë*ZB˜=àD×ÃG—N#êq4àê vÒš›)÷û•_2J]ºí»Óµl…hß»—¸“îö3œFkŸˆpÛû°}ØQí8<[ÙÍ6Ýì_8J0} JÔÓ!X Ÿ<Å3«­ÝCÈ›`,­Í‘4rö$øÌy7ýÙg÷gkË™$S^}Gg§ç‡­‡¬ 8täY( Âðê_Û ^E…v¦Liß¼q¶ž¢Þ±»Hcal3>¨þì`bn·Oð0ÿWG$E¤ÿvsJZòÓwÞíæÇß]Û´nîúnÛ}ÍF‚;+l¤VœÉ HÌÜ(k¦¡Q¬>½|{_ög[s2ß›z¼µõõ¹×uÓS…99«ï,ÈîÍóää+ 7ž=ÞÞU UYŠÄõ`U‰ÎŽÆJ¿ª¬¤Új\¸Â“¿%ÇAìt»®SoˆK¤q¬0ÇG^|oëgDŠpÙAÇ<“>3ñµ5þ‡[p«NBziï›ÙäYäÕ/IÅÕºM­ÜŸÂ—}¸–Í’B ¶±ï­mbGúòžÈfz3šxö‹Á1+Ú_R8âWË «,fZ]í¶~Ødñ{³uJ†Æ”MNïü Øý°Ø IUSšÙê`Qƈ’Þ£•¼'`­l9j:Ç·„}³¬|¶œé“µ^):Ù´Y;1ûk9Û~f*+„Øs¼ýå~;‰`SÛy–|°\™yët‘cÕÊ néeÄ–œ[›Òñô;öŒÀÎZÃöÔ»«nM?T j]ÒÖê}¿Ú`ÑhƜī.|þ”!™tûišDviµ0Û®¥› Õ4÷«Ãì^—¼Ç»’Î’½PžB6B»DФAH:Izœ'ßUSÌÓïôN'ƒ ¤ßÎÌ®< üÆ"í_lë‡ ‚Hv›±Ûü¤÷<$¡Y}› þ‰+Çå©UV“ù¹mÄ1CÄ>~}[´«ðG½YÑÎTt­ºùt·O­Ž f¨ª‹$Êú™aÉ#‚4N®µš?WÃ½Ž˜™R>ñfXmhxž¸E¼òpÌ’gÙÔ*4BÎê˜3*/¦¯f™¿?qàn\H~¸6¶²ºD¤÷ÚèC¢ [ 6hÀ²ãQCÖB¬`‹º¯+ã¹¼Àhòô†tóeÎ;zÏ€èÈÈ_ÌFÞ=Lþ4êâsIîÏ “Ä›ÕCƒcUöZßÎjQ3Y;ã***pÿƒgÛ› Oä5ÝdŸŠKèÞê'­k–l,á4`@aMHo°Êgœ¨NÁ½Æ]O Ò]Ös´2¶áiÎ&Á'‡N2ÀŠhwŸ"—„CV?E¦w¸vš3;ÒfÍG3Å‘;`Ø— ,çP }v¢ùdžÏEÛÜÚm5¶œ»™H@ö¶5Ò!÷Z»{`õ]3N`.OçŽã µÐÄ™ŸóN>hã/Pèr™"»uDfdü\=÷p£²»1ë gÜþu±ÓÂýè)c&²k¬*ÒS¶'<ë¯ÏöÉXÑØSM CéÅÝ2ÖQß¿ï’tdaŸÕÕ”?Ã${yµ•”~üÆ?3{åšÍÇò´o ²õ¥é¬ÆÊ”.dÑ—t 6<$:N¥$=¹Ñšõ¢ÐvøÕ]ôÁ˜½ô–´û¼²ï|4—Go±®žÞÛV͈ä+RÀ¬ƒÊ@õ—Äó+ wƯŒ…ú&Ìš¶Û‡ @Õ¥©ÞÍ’>æA¿nä^ Ê_Lþl¬öÙ™tó²ê^ßó­;u*>ä‚")}X§ X=›3]ë F u~9Í{ 2rpú–Uî³Îþê;Eð˜”UFÂú½!`KѲrG×c%( ó:‹¯p?ùÓKDTž½iî\¢pcRgAŒƒÕ Vt·³ '+£wÏÆÆÆ>‘ÚPãge )¾ÃúA×Ýi!}òÁ»ß›3{ +Th<¾Ê›Sy_ÜÇÈ j¶}'ô/ ÔhácT:9t,$¯™¡Ý§lºœ1]Ôk_vôl·^q@Û¾ÎgK>r‹°#q,‡m.v|¢–…6 :!ôÑkœ°š_€ÚŠA›r˜PfÇ¡»$§©ÂX ¡¹«Oô)dü>¹#–´¤²jG¥‘úêÊðµpŒ\è÷áDîS5#Ëß¿`X¥îùNԺƷû“KÍw¿¶On'Ÿl["¼iÞ’!™(JœVv@<¦“µÏò³û|ªð*›0ø‚é›Xa”*^ß%+€i“ 4¼Oâ:¸gf:¼V.°)¹|þ¤—í ­¶2Cc'~lÕ|º2z]Es¡½Xuh<½z½Éo::Òß1s~ ž*d­úþlÅÁRêö+â„©ÿ…Ì•IÏY®=-9—`¾ÉW~|P(~¡cÖâé¦×ÃFtDí +"éA_çêÒ+Ûo„âÅlLgúL¯2–NLmf9U¼ -cÙÝýúšÜ;Pñ6Bu²I?Ý´ørzx›&ì]Öæ1‘ ×¼ÎG¬^3ˆ¸ù¦&ÈÆQ&¯…’[.Áoš¶ãëˆ[’å7>?£h˜ƒÙ¨áuÞÚâzªJ’{Ó©ÔŒŽ6óKÍ+aVŽÇøZÖûUðßÀìNtŽ-ØŒ u` î(ÝS-ûÝÚ•qm@ò%sO´‚Þè$”<ô€ÑìLéµYUÙêN‘ÖÀV/ó 1 Æi‰—ýŠZ°u_°Äªâ*Kúc×¶÷†jQ_y$Z_™í™ƒ€¼ª´% b-x¾}þƒÊ¤Ó›rB\g¡Û #Œ!À[¢ ¼øÓ` N:Ä>²ÿ‹œ×ÿ’†=û†ÊCáYƒ|€7Úlè©Ø³ùdÀ߈£T,‰|(Å`îüëFêsŽÅÅý&äWé Qÿ$4Œ–•J !Õ”‚4Î5ßùƒÅG0CjõPô™¸Ú´ïZÚ2*@üJœ¨3§t~ÁÉs=!À^©³´¦hɽ~bÎ÷-WÌôȲßýIèfGËWyY9®ÑÀ\åûm¹¤:lRsô¢%xJòØ+ê¬GÄ)€—or.WMNV‡©ÖXø›‰Ö–Ý1ˆ ÿéð.~hJÛ\fèk¼6/q9?§›$dQG¹”4tœGEQѳ\ÝõÏWÇ·ûÖMø$îô R*±’<=?ù^xÕìÄÉ:ð.×%×QêÔç´mÃÁÙMU¯uØ1ë lg5›A)lx"ßPÁÐJ0j åÒª—y¨n.è9ö©5xïçÇÛ/ºÖPW›¾=Wl–ÿØwbØ©UMhN]<{À! œl._®:ì5{q×Ò¸½îuÄzvOöIúð“{OóÙ C°è/wŸdÜ´U¸u'ªDñoA°áp7áJº¤±°]&°ƒk»E­w»¤=üãî¸}jž?D¦ àÐûÛ|bvÄ_‚”vB?o_žågoÔ¨çï²}㉠³@õ¢µqnàeäŠÄãÚ bËEè<·“/„H1p 2\+Mi#ÀóÖ£·[_–ÿø”Ä.Ëc¯Â13Söz!ƹÃäíþ]Ä{<›¨3uĵŽÊxÏŽ¤r§…ª5VüйC€ÃæcsC¯¹i¥â”ƒÅöO=yBϯøac{KYÞ‡Å4ï²½uÜ.~¼{^˜F j†c.~‚“à ¬P¯Z^°ÿvp¦"² lLìXÀI\‰Š2:O< ¨›K¸¹>TUNMh7L#¢¤L×¢Zë·®=7\áIfºÆ«zååº@1xÈ­Þ!ïFåe¾ÄÈÍ©îƒsâ[ê‹ûíÃä9/¤B¼Ë%Ût9eÚ%âŽfƒêE1ƒ"ØZ‡*˜ÁÊÍ[±Ó}…3«àyöÈÛ;w~ò#mŸâU *`À-»´4dèÈ¿›\ÅÈ}LêÒüd¦¥,vˆHt»á†ë@5^!Ãc³ì³ÃeQ–Ú:ºÂFI€Žxóã»6Ö·&dh!e"•t‘Z¥Ò!Ôx³µ|‚ð•‹_àWC9®r$K”è¶3Â?ÕlÁYxî”(¾ùºÝE:Fñ€Æi‰•zf™‹Í8ß]» Œ<À(?¤Í‚‰ƒ¤Wl°`æ1¶«‰“š‡ÌRzñ0®ºæ(á@Si¥pòâçGË7xuå:_Z!Ú{ók±bDÎ}Ø ÕV=hæ­ój¬†^ ÛÈ ÕÀÀzm3Ñü;¿èWÁ#vÕ«ªj1zuýùS«D€TÅaý:Ë=ù}¢Ç¢ç…¥M÷±Î ¢Å'€#ŒiYÛžœd¼I½F!îÆƒõ½¾¥’4”h¹¨s>ºÜ75ý¶ŸëjJ®9 ÅsJãw€h;!½û{ ¼o\ïfutçJO†~QŒ»ÇÑá‡æ]Ô?X´³ _H”4z*é¥ñèq‹¿˜,ESÞðÒÆ8;¾¼°)_ë(PÄ¢¸æÆÈAhòÊèå¸VÐ`n©õtõý½EB•‰ Í/¬¦Ãqu¡ªéaÑ¢”ìär :ŠPȲë#¦oq!„ñŠU­ V´øÇÎn’0˜i…²íÕfLñP¨·à†JE(6È ‰‹`‹ çåóqËñf%˜]^áa&||ÍL 8cûµ*tŸv·óŠ4ÅÖ–¹Â ô…ñ×Ë`‰Ì/¼|㌵¼îøš+Rtë}t¥q1tIoÚçÑì$ÜTP<#VÙe ûA½á#^?%™rMÓ;^Ý!Î0~ºÅÓ1Q˽Þã™P^_¥“Ú¢blf¥ŽÁàÂÕQ»ÛŽnïØ™i`‡…÷Ç]Š)½/#ÄÔ OÏ+ˆSM»GqF¯ÚýÝÙ{}×ÚÆ§®¢)ÊÊ£¢w¥÷=ùÙj¡zäg¬[~¬¢„q”Ä%0Ê›xË«¬¤ÄPÓzfÂ;›\ø6ÂØ¡‚GS/wérÞ”|.µ½ùîØ”Ú° ÀÎ7>:CŸÙŸ¨>l Ñò‰IHã¦N¸ÜÖÂ`b€-RÜ=ñ2à>䟸 nðõJ'ë.fU‘²š Öˆ× ÙIsôüé`¥=äF‚@î¡öÁ$%JÜï¯Òs¨óµÜ0°ßÂD%¨£)åÀÈŽüÏÅ>m!Ÿš:èæ[J€ªïßiõƈ­Ç}j¬Ä2òg g(OyJÚ…$ß”IDÚ¦Z]q+rŽð¤ß–4îõ¾ÅºEú÷ ›ÍB*}í7éÂúÕñ·¶£I½pd/øêPeÐuü~r zìÝ“^•¤~fA.Ï •– ìÞm1õ3wb9p5_( 1%ªîê2EÑ6n¡+Ç®ó„ó.'(a0æâÂ8öDvMÚ9ûº¦2ºa­6mÑVüÅ‹PÉêým¥~ý×7Ó“öò»7¯OÆ“¶™Ô47Êd'®E¸Çà'è)Ä>3§×³+‰Qéª'‰âtùÆèäHýU ¸•5¹µ5ný]ñâB÷ãí$¯5Üü£—‚—Ö±ùïˬzY±§V F<øf8›‚,òdð" ³”À}'$¢» ò”Ï x¹qEihR"œô †]|(ÕWJ{(ÅÞüT ê0ˆÜŽŸ=òþÃiP3/½{&r^Ÿh­Å½!´´øùÕÜ”FzŒG¬õ”'!ü-7“”R4E*Q…•¢hÏÜäª0º!^á²|\Ár'Žw‘áj qðÙ!ƆËóYk-XN(¼x›\“=àæˆ­Hh¿eªx&Lp¢±à"ZE¼ƒ¨‰:û¤Ê‚ÚÕÈ'Û¦ŸµÍ©·ÒäÓ.^ÉËi…:h©¦YSj›$~V$jVîoÌÔRv×Êv¼BÝ–{,•qt~“= à–8ÀÍå¸Î˜ÿÜ‹\–Ù³|—Œj]SD…0ø©ÞqŠ3^]}š”‹P¹Ìl•U¬eukê~à˜üW×’Í÷º½V™E½? }ŒV) “ĤŸ,>ㆄ y„ªÀAjWÔm¨™Ï ö…Iö¡ÒÑž®Ãô:¦6ÁÊSíïŸvõ+±Ÿ­ÛÊ M®å´iò`¯·!Y 8x$Ò>Üek2'aC2— ²í°I?4a›‰ú<ürê6ÓÉí-ÓªXw7=ªÝh¿Ñ´!ï¿D?†¶—r½yD¡Ä4?ô’3£¾ìåQÂö Ç;=/ÌI65pB%·Á®I¤’æÝ®,ª·ýð–À$½ÑM&¹Úú#¹Éuã§Rã•/‡ƒüјAžÐI !rüÆ=îŠP…Í M‚Ðô ÊÓ§G'Mò,6CÌoíó#{»»Æ)ôwÈÓ”|H&ø$2äÞ¾HFÛÜD‹»)‹IÝ· ;­Ÿ¯ýjVË4ú,ܤå¾)Ôðá%«¤Êm9˸›ÁlÔÓHdÝŒÔÛT5dNd~ãJ‰ñ¯­ T[£ Ói7Ö±ÔÙ?H™„í¸w¸=>­Ì›iÕœ%_«ñm«½Ý>ë5ëtù‘ºŽ™»†u&æÚ5gͯÀMX+¡¬5¦’À6€pk¼` u±F‚Päâ³²çx\\‹dÙƒjŽ^¾ønw™Á -çÑ@“¿>óæ³ý\¦§~öx‹jØWµÏ|G80„w‡Ÿ­[ÉñöVÝÅeü&,A8Í G/nU¾ G(ŠRS×¼ÍÉ…Ÿ¸wh2 óùîî|WÑÿ)­Ût¾Ovvá³iûÁø ¥9QëÂ[÷ä" Ô¦³#"ó]¸öµùüuý͹Ž)bñaчÖjZÀÛøg£±,ô Š=éÜ.*-!™æo›§ùMR+ÈÌÛi­Û¯¨|®–ÿ:Ts¡f‰'E ߆·TÔª$­> N<#C›ƒ¼lU½¥¢©üFÑ"ôh7´ÿÛÓáŸcã¿<ÿ!*ü÷ópaÄû¿Å„ÅïÿþWðoÎ\ç¶qôp³tµ…]‡óüóOýæ7¿ùÍo~ó›ßüæ7¿ùÍo~ó›ßüæ7¿ùWó¿¨G…P././@LongLink0000644000000000000000000000015700000000000007776 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/download.jetbrains.com/datagrip/datagrip-fake.tar.gz.sha256ubuntu-make-18.09+disco1/tests/data/server-content/download.jetbrains.com/datagrip/datagrip-fake.tar0000644000000000000000000000012713352651520030435 0ustar c22f1abed6888f96bab5742f55d15e1e9cf043f0c0b430befe0a35259b36ed63 datagrip-fake.tar.gz ubuntu-make-18.09+disco1/tests/data/server-content/download.jetbrains.com/go/0000755000000000000000000000000013352651520024040 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/download.jetbrains.com/go/goland-mock.tar.gz0000644000000000000000000002235413352651520027370 0ustar ‹C¿ÞZízeP\Û¶îjhœ@7NHBãNp—ÆÝ=@p·Ipš  8ÁÝÝ!$ AÜ%Á%·îË>uëœW·î=ïýØ÷Üzïí¯j­1k¬YkŒ5¾9Öœ?>%u+w[.^~Qn^^^¾‡Àxxx„…a·–WX経—O@˜Gˆ—GH˜ÆÃ+ÀÇÇÀÿ;’ùðñò¶ò¼MÅÁÊÕÉÕÎ㿜÷¿{þïßñwû ”þÿÖNîúø?âŸÿ–z^ž?øâû‹ÿþ3þ­žYqÙ[¹ØýI1þà_@àŸðÏ'pÛÿüB‚¼¼¼·ü ò 0ž?)þ?Åÿçü3Ðýr/G||/W;»'0!üÿéœþ¿ÿYÿ;x¸Þú¸Ÿ¸;ü91nûAè¿î¾ÛÝž÷ý_Pøvûçâý£ÿ…ù…þêÿ"µ5•îàßý£çï¨(ËëÞZÄ.öíý“”Õà­¡öV0öÖó°÷~nåiÈØzXÛÁTܬìtí¬lýžØI}ƒŠ¼Œ¾ïì®9^ Aﻜ4¯ý„ù ɰڇñ §?é¤L“';'ƒ´æ”‚¬{;µ”s€&'› Lud°È«&¶õd8ØëñÈ™ $¸&t& íKÍiÂ^Þ¤$õ ^ Kk‚¢æ?wx9 Ž‚Ðè ~L<:Øaf;±:!zX8_@Y`Ì$Z@$Ë­?€¯Š*ð ¿¾Î|ÿL^!œß)ç!lOƒ’êëÉI<šæU™.âUøÂÞTšÃƒêêžæÊH˜f«ÝÆV}HZºða¯°<ò0n±µQáxóÓGMñf³”¸ÐxÔÛqiCK%Ý¥QÈòè7ïzØZßFÇêƒÊ²Qêo„’1’ÒäÔY÷³à ùe…cé¥B.¾é³¼Db¥…§ÙŒG¤L5d-¨4@ZꨤEûž¨–êì Gxѽs7Ãf±6re«PÀ"òÕz+ðwreï´*¶~4\ìóùºöÅÓ7Å‹ÌOŒ‘˜ç(yÔøõ9M6¸Ía”SûVÝ¡?°Ô¸KÛOºDïwJ¶ì½³ëJ<±ˆN}šøÜJf_˜¾™v)raß¹v?ýMýâ ‚~rŠÎé"İoáŸöã˜ÚµNÆ]ÙÆuÕ«Ï,—ºÊ# 3p?Uá¸kõºØ :™Có2Í]«ý ¨¥æõþÝÁ‡áCÇêî{6ž^ó¦ý÷Öàð~E×}@÷Wwö'8·I«íœ®ÛtWôyM¶áYÃÎrî:n9z(Z·Je!Üˉ¯:˜^âÿBäãöH,WïÑæ´3,”qbéî˜-&­ùà }OÈM%êl®Ëq^áêû ÿXVP\HíËsÉ`ç…®ì×J»õÝ—CŒDÃqžÝO=ùj‹¾êr©f^½r¥Þ¨ `×\¾üPÏ;0ø6úR-2³«M®Ñ¦\{Kç˜$R»,~»XåŸÑ9/oj|SÞ ¸®pŸ 'ËÐï`_–5fDp\ìwÜM#ë=Þ€d(ÔÞw1ØõXÓdŸŠ"b£(—sZÒ$LÀ˜PóyçX³WÁêqš‰C¡YXûÏiCªví.=1Ýò™okÃn¥ïkï]@yžÆŠ61÷9®} ¿Vº'f÷M{7*F¢?7_Køq ÛÉÕÜcü€Øœçɺ‰“‡óg]ß°¼Ï¹¹¼XÓª÷‘Ënë–±âzô’•ré´_Q‘Ê2„ñÞ¹–LEkÑ6QA4c/Œ€þgyÎy¯~I™ Kz}h×(†ãŽQ ÕK«ê ¸»¿’ðžñÍüáÒè[§#¾šQë9Ðòíœ,œ¹æ¥Úk;ð¹må4Òç9a4®lá³±0]¾u'$"ÜÜεÁti2zã öà‰d½Z ß¾$$ÑÆçˆ;.©šO9²®&VèÅ.\>"uÚ×¶F~ôcÀ)vœ%zÖ*£q·yúR«\DQöÚwáYöÅ­C*‚0èà%:vZ9E&¬"©á!A *i×1Ÿi¿ÙcC2”¥ûT–™W~lS¾‘^>TK>¦”ì» !NŒ»÷'ùàŒ †ilχ¡ÕõmsÕ?wS,”¿ €Å裿Þ'ô›?õ9…Eæ^ EÓ´Òé¡o¨l/™Ú4Æ7Þ¶'¥,¹q_Ù%òëÞ9Á+ˆºº³"ÅL€u‡PI›ÇJŒ£!è½eNtÇã(¼Z õwçsQ¬Ë£p—ùÍf‡4j§kc¶5Ê Îc½‚™v‹„'Ó^åø5ü6ê- Ä:~“– À_ë§<áǘ˜ˆ,Æ`QfS®ô´½Ø‰QCJõG•xðËö€©ç®úÐ{9Á‡™Ù§¦Üêrn cA§¼MÈ`üéïq¨Üg ÙŸ†1Õ7g.3^ÜkºÛ÷²H•q•r‘ Û5Ú~l2|P—ð‘ÒÔ:,û{$HpýîX£±h„Ó&tiâ”v4‰ >©AUÓŒJ?>ï‹m¨zÂ}ý*®"ø‹ Ÿ¸ù¾ãÂùðÆœQwþ3Éé]ÖmzºÛª¯>Õ—åÜú}ÇXÄÑôò«‚`KÕKÌóÙ¹š¢-KÂ4Oì3îªlR«ñC¦èKÓ³ƒŠ/¸f ΜÂ(ùìO¢‰ðÇk¾tˆ‡ ý{+öØ—&Ã)Hx”Á¹Ü奪à UoÒ0}úTñ.´=ůÉ÷N”å(‹6Ckß;ü˜œK¡Ñ³íðŒ)î÷ôƒ#]#¶‰só*ƒ7þVÊg·€g\Ó±- Mk[àŽå>°ÃäÔ‹j¹Âoi\Êh­SãÙ)^ü¡Ê„dN­¿ˆrq·˜ÉÑžðz½G$%Ikè}v"”)è¾7ícδ–¹Íuy?Ú¯€|ê}™N_Êz™:S؈J3‰¥‡r¹q…¨$k¦yõsmªA+;®Ï¹ñ—Ī®t© /£¤ b_‰†Bc‰Ä£®ãÖ8f ¦RÂ)>;`«Ëá v/6;TIB‰Üá‚ †sçIjÜ8ó3&’…ò¼>gßB'²•"@u ïüùÛ®uìËÜ3ƒ²L qµûÅKJ‡ÆÆ4bÇ=)_¦ÄtÛ%Çä°ùöØsÅñåWUm&d^9-Ý|ø8+ìoÈoêuåÃzseÄÍGEjà d©¥fJµÓrIϰº|@¸৒J²A&|ÝqYǺEàn"œƒ¡ËdTŒf×ûéÌ¥(?Æ5ÏK]Ò7Çã¼àìJ¢nÓÿÐÀïEõŠ…zéÀR3;Õ ˆºÒ¿¬¥sáüS¤ »έ¶Kêý›¤¸}ñu¿£Òl›¡ƒï±.šZÚ$šSdÛÖ *b€ó0ÁïtüIŸÝËé-ÀØðÍ*OÄ>bâØ:Ïyÿ]d»íÓu>RXžDäæ9 æˆÇ‘½±TnM—£¦w9Ìч X/WÜ„Oà›H~”9eUð7<Â%t£>ŠxLÝÝðƒsh9³Jq4)ÃΤ‡ãò2xý 8G‰ã†VP„þ¤²ÖfpÖqøhiO͹€ ‡hßã3žoºLº¤ƒËae·Õƒq©Þæ'‘÷aØ?ø}à=“yójc¨ Šì±Eübr§åbÙø_æ ª\’õ%ÔA|Ôi÷]‚Mo\6Øý {¨Ä/fŒôé•g Žë¶’r%ãzn™ Ö¬ïÈQ:d‰^É …#€¾6¥V†]=K^™ö·–/FÅ]½,F!—M `B+é^K3DŠ›·åN2µmϰijo3¯å5ÌOI¢ãó&iåOžYÖk¨_ôµ|‰5òó1¥:Êr!ª':’èsžÉSðH‡ó÷€€ûÃòÑã™ìÚ^bŽ¿RáÝv¶Š.˜mW–òÙÝXRÇÝíBÙ.‹NxƒvVPÅ»3{߉ßócŒjî[Û¯}‰DfÃ<™GºšŸñö`ô„Y&ÝÇR†ROÕÄ‹w_»*aiºFôò!N{Õö>;ç 33 rb±E-cH>¸ç±Ý˱x¥èH}P¨Ç~t²×£­bYBðZß ­¶«ŠÈ¾P=òÊžð%QIoе4[$Q³Q…Üxv¹¸Q^d¬DX.›vÛþk^’qÁ8áWÙxnvíô¬[uÃ3ó ïÏ/ 3E‡2„?=T£ ô¨1 Ã<fO.’²›,üµ¼íêÕ¾zT‹zª'¨û“%jަBRY5æU¹ù+Ü4_[~v(œÖná)6œ2€~ J£ÿ8Ü8 àr’2sIñ ªß„8_’Ⱦº]ʺ¡s¶W !¡÷vòò¹?VìazñS—âSYÞ˜½Ïbp³+G…b¬('Ô&æä21>¹‚>†Æâf@wt©'µôùÈKƒç ÓvÑt¢¥&,AP"’8ûµïb[áPŠ\ŽÔÂæØ¥‡H]ymjyá¨Ú»ŽEëʦ¶Ü‘m^|ˉJÐûR^–wÆ´ËqŸ½Áƒ2rZ›cYîçK¼x„Ðq}syåñJ£=RÇ3C~]­ÇÊà“R>Ðo°OÑ·i’8´{Lœï¦þÓõˆÒü3½À“‡A±òÉÁ¾E^\Vi~»ØÀØ4û§¤n]>B Ë/ü©P r­¼&yÎE{ܼI™s’ß+ö;ðž%!~rÞ×D/•áÔ®’88‹8ƒ¶ÓÜS úÅ8’2 :NÌÍYo¦Æ}åDº©=XUcJ¢r5 ëø“Þ+”ÓGä3-«8á>J¹?»æ¤KtjÌe¿Á‘2Û~f«  ÀBD€=¿¿Ã2â®5^®ƒ'ã„}Ñ"+mY+€µùÚ¢”Dz›s…éãçÞ½¬·mw:àÝ-ÊÑ}BR¸)–ÔÉ?~R¨Lqå$¹,2L¦^–óyUjíït¦{á¹Ü²1ª9V`~n‘ Óz´&öük¥ ‚`ƒkœ—á+è;N2| «1¼|™[›‹ìæ*©ÄB—Àþ®™uäg¹&§MÊîJ¼ñš+Ôf% .µhºžØ¦¦ÂŒàáÏHâãWUìQ¡L°"D™ÀºíìŸ×XS¨•#-p! ´ŸwŽ{àÊØÏL:г‘±f7–x9¶yÙ$ÛÊí.«z9Á: î^™Ë€ao¤¯P÷3˜ŒÞlªé~º¬tÿÇû5 ÷Ê {,¥áó£bCf »òÕ««Ì«@$ýçf9e ÿÛƒKV»ÝÒ Ñõ<]Û¦|VÜè: œB³ƒï3' Ê"áÔ窮âaó‘2\~ÒŽ>t¨þœ$á~}ãâÕv–rÚÄ’2ñê‘f³üoÒòÖÍ,z|Ä0n¦8ÝV²$ÍzÈFzø—¸ äøåI)þ>e'ª×~«ûT¬ô“ûóåJ, dQ,Û+š \Ú_³ÌhÙä›Ð“)1Œ×ðãéêA[Aêä;P,!l2P˜Ã¨Xˆó·öáá«—`½W •µ8š-&Eèñƒi=-úPCÉ7±:vëóIQ>P+,˜ï¡.g,ÖõwѼFü”XÐ%)æ¹ iw¼/š‘á}À˜–Ì2nÉPVf£Û’ÚQçQbøú䨭íMŒb©“|Cúu¯9*ôD™b óÜ……8˜äMåŒÃíé1ŠÒxtÖƒÔëj¥V,ò£Ñ6{Éò‰6Üw8"(oûc·ôI•ÕU&žÊ\ç¼ú7ù Á#ÅøË5’nfO„HåšÃÊ@!.µAÇyŸy²Ñ­ù ™^çî|übJ6¤‰µ¸°æû‰ÔÑúædAf÷Hn2ÍækzcÝOZW&.ºÛ’wÔP– Ò Ów!}rý5cÈÐä7Y²wŒxTÆ¡ý—®§¡­Ùå BGÞ–Í8o. *0Ä1™Åø¦a{HPÂ#Œé{õ™9.—ƒy\GÕæuÕ3‰ñÝíR=$“E$Ì¯Ý ˆ îùb‘“ýX|rUÅr`Ö+£‘éðj©áĦÿ•a¤üGo¼»i]AÔÝ)Nš\P)~Âè©6U2ผg ï7 %ž¿},U^Ÿ¶Žr`Óåpü%£!¾÷ã<@“ºlĂћC{âæs¤,Ù4XÊ:± ƒ¾‘)nØ>|0#v¶a™ËR{rF«ä\ðˆ¾øÜ¬h–¹ÍëÀj_%å]eeEµ‰ùÅÑŽ_sµ#‹ç»ÿ'/“ ýÕ‚šì)ÞåÜJ¤¥ó+§ TÊ»ç„d`IC¬³z=ýL~ˆ¶â][›Ná|Àv5Sˆö;~Ë(yv [Q^-BË#°ëb…92 éÝXû!ÃDfù»Uad¿$‚¹¬S÷ÈGð2_¯aÔ º¡’îBS¹`Z‰’W±Xo®–Æð¬"ê|dñ!I,œ™ëWæ‡Zó»¼¢.@ùȸ€þSÙÒØÑLc=0kæÍï´Ô4ûA'T!¶ÞŽæžiŽ_ÅϘëô_Á,?1¡/©|,KÄqµwv!ê±-‡o™OJ²ŸÀ(àñfDÒDþå°îe³ ãFúp^ž˜¯bg%-öO…ÄE´ÔHlfh¦\½UX=!¸•­ãŽÏ—½,E\I¿gÏuì½æ¸³pVèq›&1bBKTψi²Êü£Òø$ðb¤ú§Ž.ŸÈAÙÛés_IP‘çG ñ½çÊLšw¹SÅy<[S­7)>°‚Q{{J%‹8—­…6¹V/X›„ˆ¿å‚·W$±Ñ%åõÎ?Cç¯nHÿÔöô Ð_v~¦ÆäbáÖ†S+÷ö'TfÛ &ÊÒ)~+w\J'®g}%?ÖÃÙœç$©f•Ì·Ç:|ç†EE—äxïÍ×­á )v|䛂3'¯É–×½.ÝÚÞ>Bzâ “H©vˆŒyñâ+—2¯­Ý‹HÀD¥ýk’øò`°/¸óúäÙØq‘$U „¾^,õE³p0xT¹@c«Ç}ŸÇ˱»õðØŠ[Vçj`Pãrýü)½åVƒ¼ü¬q>û¥€…ãM«"™s–­Ê•ø¨xÝð·.ãÆ{¾…¬)oµŒÀU£‡‚‹&"Û…=<®¹L–Õ@s¤å,Õ÷Ôlfßâ@·…¿ã™ºê“á#v%Æ<7=ÛoîOª«xaiˆ ã”™ƒÀÓ5wØ“Ö@Õ­šÇÎè'/|?[Ù‹…>ÍD€mãúâ·höiÎn²×iîD`8¦¥oGÁø|=Ée/âÍãy]Íhë”e–ÕG³¯6D2­ðî-æê>[êë»êª¦$jL‡àZ[FˆwóÝOD`kÕÎcø·vû Õ,4¸ âé9#ØéUõV¢Ýy-Š~xÈúUtÌ™(½ gÛÆe™¸T@{u µE2•¢¼gÂ#¤m%ô™¸zå|:Õ*Q„FÛæ\EÍ}Á¢yžT²ü3]íØJ²Ü FÆèý·¹B»UoƧÆÇr㨖¤9uÔ–“}]ÅÐ!ÏFIqƒ;ÊüòüŸÖ "Ç1ãõJyÆnNK÷ 빓ŸÐ¼Ã1lf÷$ì0¬/ö½×{üPj÷ù["#t-'æØCXoz“ 'À=–ÚÁ€bçéy2øÕåuúK†üÚ QqÂk>ªŒæå5á= bÉ2•ÃVÍhÝ`ö²²ÜÁïjÓÖ"Ññ¯ïÞ?—/Lå˱øµBÙaâ猟öY¾Ô¹â[+ñ‘"·ÃÒ–gl_:¨tªs·DÈj±YŸL(MÐëðÉV"¾\’CDt|#@0]S‘ù½L 𞓲‹ƒƒÎŠv&‘½¸ATsÿYëHXøäÁ ßm|îÔ4o“JªÝâ€'h«;¾éxÞОÜÁ“%rNÞµËÝOkÞÔª–©v.ô6ëD°&ðÈP€ÃF̂臹€Àœ·8=¶ö5ÇÔ^HŒúï Be0aÚfÓ²ap†»teVëä]í7ú2ž¢7"›U“ìiá&BÅ=Ú¿ñpí<$н]Áöó&÷¯^Ëz¼NÙ…ø?Ý (fÊ{'‡ÝÝÈb‘1¢¥c²ŽŽe­N¡Ÿ¬9E­ Ú ßÄ¡œ¬ãùbÒ®e‡ÀµÃX¨ë4£î/1Û,$†âŸò ?Æ} ³5Ú9„Ê€'0™È!R‡‚Ž]/± |ˆXþLWþZ¹*ièëÐÕÿÛ¯ŠaDKoM’ÇøVm›â%Þf}Qs&]œ‹ŸªLÒ$wðq(H ®PŠ~ÜwØþŽš0 |ÙÿzB²>ön ”URP6ùeO=b&"†\8ß´îù;ñÇâÉ€Îgäc‰ùH:CªC:±GïsöÍÞ­½ [%ù‚™*q|/ìM«W?ˆÙJfü,]9j ÆŸôƒ€úÑñåÞ¼fgÇ&uàNFˆ.æÌw³´–Ä’æùÌwŠº‡;KÇ+»g |­: @®ðâAò&œ •Ï£Yã•駿p8w½cÔ/ÓÔÍ ½·òa«1Ââ°Ý:çË¿´ˆsZ -rÇ3åw¦k'q­S~Ňn,SâÈ\Ý¡å½I¤††1”ùã)Ïo'$ÑÉ5ÂnœpA¡<¯Ê1½Ï«µíœdp€W ×6¥oÀéáÄ“/øk´Þ~ô1xùi¦+[—Í8:¬½ËY )äO»Ÿ˜¹ðx×Åá·bóÚ6€7¾÷ר 6Ð{ %ƒ¦È>=÷úBÍäšãÊ‘ïjÙ‘ñ ×éžÚ²7~½V³c2úk¦¾8:Ö JóC ’aBäÇþŠã¨ï£DYÓ–c%:v–É©@¨ôqŒW&”#EAZUN“jS±0HÎ:¥IyRº\¸õ*G0:³ìPv÷#a8J+”²¼úóÐÂMÂÌæ‹PDt{ß XÍtxll,Ì“ç$âo k;aLÌ×Ð"Q|)>yºR=I: AøKÇ:Ì@2ºóuU¸ÇþeôLÈák:ÆOª† Ÿ PˆƒÏS>u€ñ; ?ïbê¯ôtY#÷d– âSJ…#ðôý๭¬´eòƒÓC4¦ŒËÜF(¸pâl ®!±8”ñ58—ä£[À3W{,Þ›ŸFf ï?2²Å)_rÓ¿|cT¡T- Øžík•#î9ab¿µ¬ózj[³“ÊHvv¶ÌLD,ó°#Âoàbæ‡ÄS´ ¥^[B¶’!’Ç[í¾ÆF¶D¡þá“—=˜À6›uý’¹;+”ј ¹-×鎗§iÒ)±^y ¿G­òç®Yº][„ÀÖÒõ‘GÓÃÍ?IÏR6+ìi¿óe¬"ª% W ½£ð¦d¶GÖž£‘  L`Ï‚*]Hb’+!XÚúÜ-@ß±T¯1 fàr’CÉTôõ^ ÝBïöþYFð×`³+§Pí qûjß9ÒØ<4^Ð7Úk¹¶KHÛ³’úا%[+WKg{F?H59gf*ßâØ7^BwOœ ²a¤…‰…‡ì2ëò,¦¶Å)¯dÔÓôßO†ýøŠ®G¤ÛZëo'Cá½ÖäÝñN±Uƒ¡ª+—Ûô zSÑÇPQ܈’ÎÜý—Ò•%›Ã∕%C‡Ç¢X‹"v\r¥÷1Üè^£ªõìéq¾˜ðSÊua(Ý´«þ˜ˆñoúÓáèX:ä\À[¬W[ WA@[ ¬ \6—vl4ÐæFÓõ)?kHXÖŸ/}–Dânwœ/uâò?gó(|613U,ÝüX\ShÔðKµ¸ ]KµÆF1Ârë©ý·B)þ'÷åG-bÃA6º©$Ò9›×›U‚+Û‰êŧ=a¯Ë=X$sÈzÉk*¯‚Ãf>è“VU_é»Áª–¥þˆùu¢xèpò›"’SÑgÚ³´<æ^P ¢Fð‰Íu˜F' Uó\òçb‹×Û—üűŽgk&-1uÝ9¬š Ïgäí6$ÀUôN~Jçu†ÊÄ€¶´©W£ÜÓï3× -•ñœ“³\ ï¦{S$öÏ ÇžÄjJá&6•mUU¹vgXß L»TMý3û>rJ(Ž4göì­8ŽÂ–¬àùù…ëþû@µdyéÏ1Ùrà‡»Á´ùBáPUöÍu–­ØÜ¤FR¶EŒQ×|~s©±c‘_#$EÛò^Ôn+Qò™î†\Åç$Ãi“Ų¿ïþ —ÎQÍ1‘Çp"èÆ¸Z¡3Ó\Á>n r)nB‹l Ǿ6¾£fö)¢:PõEè´Êä«—–„LȇÆà€VŸ£"ë3ÊT”;+©ml>…Õʦ=Æé[•gç¿¶J›Àm&ˆ­XÉŠ=r\_U:d›5M}mðÙ›ë`E îµ%~=ñtŽ#7›œ±¼NêÙÔÏ)©«óOI‡S=ÕÍÔk"ß;Þ²te³‡FÙR 1š$Ì„…È¥ ¸NCQAsÑ-B̪Õë6-VܺËÓÜv]‹)5ŒRaÄk‘M¶¨ ˜¼M t:žSzñ¡«G6¬ÌÕ­Îz$ã¬H2K¥ÛÀ“€!¢ï‡ê´:ΰ˖"tõ‰1%|“`Ó7ð{ÛbŸ°à§¢ V±2ÌíœÏd2Çe²Ä'ŒÓf>—'ÄŸƒ-ì„‹bÅõ/gyí=[ÆÙ+Jbhêé’15Ï')±ùí¯ýjï¸^–Ïoü‚cÐw#År`œGûhIìB ½÷¨ð÷1¢¶¢èðäΙž‹þ½;gb è@νìCÃó¸ñBÀ`—W9Ø>?"Ç6 ³g\©ưë—l C`v&ÛË»ùð›~‚®œ€Xäò2»èÌÌŸ×Oã¾€šÂy‘lWyï«L•ŽRe×ÎJ’ sÑÇ’B{jv+îŒ)Ï*e#É“J•Å£Ó·7·ûopº!cÂ7cMz=È}ݰãéuy£D2ÏÖÓ`êôÙP–ª6’ «À¡o½cÖoDņlˆž÷~?à’_¢ júYO=3OQ¤ £:Úšd JÆã-UÅVÖ®ÚÜEC˜ßÕãÐø_9_–µ¸­‚¯Ô¶áaÞ:°pLÀÙ^Ï÷Ëš)⃦a¸¿dŽ ;M?JržÚÉèR\úùQ¥V` SÓˆd]Š"ÐmÖ¤…ª_¨Ø3âìr Z¥Ö¥z¿§Bì|ÙUmÐÜñ\y~ŽëhzãSÀi³NRǰõpRXí©.–ÓnuØ»mM¿4Tª¤0:G¡±ÏŽñÝB8Rž¶­lØzb{³.½øðªÃ¹R««àÞÉÕuq¸Þc„”§Íàþ@÷¨’ä1² "z³ÛQ!ìºG|ø¸oß\½^*)¸ ë ÇaŒ-ä-52d€› ›Ò3¾5WI e¼ÉœàŸ3WôwN8'Ÿ÷ªK}©R!~…<¿¼ÛFˆ÷) Æö„μ0±%£b=üFäoätuÇÿ²‘'I\ëòCéß· šîO¥³‰—Y¹Àô¯_*†ï”Sº%.}´‘›ÔãšN Q½0—§â#ÄÔ®%d´¯¬Bß·gà‹^SÀŒM©Í¹äÎ $Éù”? äͤì&ä‹‚¢Cï‘ëÍZ³äH2Ý1æv‚Hå¢4ç–»IlÿL oÝLk^ËA°vn—ìHSn:†zt+/“{,›ë—q WiÁÀÖÙUn‡Ž|HµÄGTþ¦ùCñq;:ü/!Ghô…4Кg×]¨6ûC£¢ )_-k‰üŸ“âüàŸè¿¼ÿ¤è?ÿ‰þW@àoúo!~Û¿ðßôŸÂ¼é¿þø‡þ“ŸÆõgàö=FvÖzÞžn°?Tİ?*ìíóæeãéôÄ›ûÏ‹ƒÏÈjëäénåfcäaû‡pßÓÎÛÇÓÝÆÃÖN’Q߯øŒËî)ŒW€fcf†ý»ßñ™<øv¾NÞŸû‡ï/-ì_ø áÿYüãªô¯6././@LongLink0000644000000000000000000000014700000000000007775 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/download.jetbrains.com/go/goland-mock.tar.gz.sha256ubuntu-make-18.09+disco1/tests/data/server-content/download.jetbrains.com/go/goland-mock.tar.gz.sha20000644000000000000000000000012613352651520030215 0ustar 572b4e43c072af3fa1942a58fa7a0f39347353087282aafe82a561200a7df210 goland-mock.tar.gz ubuntu-make-18.09+disco1/tests/data/server-content/download.jetbrains.com/idea/0000755000000000000000000000000013352651520024335 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/download.jetbrains.com/idea/idea-fake.tar.gz0000644000000000000000000024232013352651520027275 0ustar ‹ìj‡Tì½évÛX–.X/žâ4+«-您Á–aGD5-Ñ6#5)…÷û®*%„I€€’YÃÃô³ô“ä›ôžÎ€l†#«®¹reX$pÆ}öÙã·“Im÷·÷ž~ßy~ð}gçôì¢Øë”ŸÊ¿ÛÐgww÷ù³g ÿ Ÿêww÷^¼P{ûÏžíì<®v÷žîìÿÚÝÔîú,‹2Êa(_ÚNurÿE>×I¡ŠlZÞFy¬’t<[NâB³I¬¦y6Wý´Œg³ägÕ?êuÕa6Ÿ/Ó¤\©Þ$)“, ³Å*O®®KµuØV?Çåë%óåœ8³*p-¶>&³l´*ã¢Íð:[Î&Èðo`0¬TF ¥cb×Ⱥ/®c5‹ò+ ?j ½„¯ŠYv‹ \>]Xûm–Ä{d¢®Aá„ß²›8jÕ}ϳ|Ä¿.“<Æ-„§ó—fZëz‰Óh¤ÞQxo5Üos;A‡EL› ½¬x„*]ÎG8(¦†4Ž'Ðzüè¶ÃÙÀn¢d†ÁÀ®`çá;š`’Ó¢mŒh»çѧNÂ{§EÜ¡1@7?îìînpó/œ³²Ì³Z Rêa£WcPÕh9…«ú¥úÇ ÞSý@¶,Ë’‰&ÍJ½Ÿåu”òÞ“ä‘â6„¼þ2j#Áœáñ­“”UÜÇ~ »6aé`’´è8–X7°š ·LSäD@éc EXD2ôÜ&@ÿ)ž[–âð‘cÝ•BµÐT¤âOIÙ¢ƒØ*¯ó8š¨Ér¾h©i•0–b£k˜f=§Ñ¬ˆ7IÅÏ,™ÁdÀ½aÆc`ËrËÎa²J£y2î˜Ö7>“Ê­e¸œ¨ñäÈ´Ó°gÙ-nï9SÀ!r- ýÞ'TÖñD@AàOÊt1C6¦sæ~üW:[áÓÓåŒxßÉðüM<Ãa!4ˆœ}–WWÔó°ÏÚ¥t‘ Ý mš˜³*0ŠÆ¯òl „ç9qÕh¶*è‚@²CB=:S§gêòôðìä¤wz¡.Þõ‡ðçqo8TÎ.Ÿ zê¨÷úòíÛþé[ZƒþŰwü¦£†ÉU LfŒW:^6 6¤|½€Âóq ,ë6Ëå:Z,`52àKù-pÕÍÝØDëöÀ2¤M2mÔÇe–·@\YÈ"I‰"M‹e®l±\tnc2êjBz©Z×qt³’c”,ç-Ü€>ß…×Ü ïODM. üâM¢ÊD3TÊær`ä4ª»ÒD° -dù©m¤Ì Uºz«”lºUýR“5=³˜Ü.Dt‰„© µéŠæQ‘ªº9¡«¶^?Ò"mò\xl¦ÑrVÂÊ—Év4K"âÍp>Xî UÒ‰;$ å(fÑvân¶†qY£ÅôH€ú.Pr”#¥ý¶kۃ͚Â%Þ‚ùX£øº’kµ0ìW+Ø(4Î}Ël7Zø%  E:ÚìRÃh:²½^ y:,$nœ±Ñ1ĉûä8‡õ™áÕ‡bR,áÖ½š%åͳD|é#¾‡f 2 /Èg¸Î 7AC2ʤXÌ ¹h-Jà¹c7G£Å2í ™vWéd’G·?–ùr“KDâóÝ+$¼pw’’'ñU3&ŠÓÍï1óÉÓÉÆ)ã=¨#ßNHñx…¨b ‚ðLŽçÏGy¾±¹à…-’äyœóRm|J›ÚÉ_e/­\̳éÖ9ŽÓßsKK-’XŠ ¨ö,Å O£ VZÎb”¡6ÏÓ>‰Æêl¨~ݨˆ:Ýß)™^u—?^lökm¾I‘ï²$4Ë"!õk–QQ²ÎŽ* ]ÆdˆHÕžÖ9¢M—Ç8š—h*†÷Ž’«ÞÄß7+L¡ú{3.:8RTI¿þ8úq÷Ùw›T~iIxÞ×Y†bò"Ž?xéᣇƒv~|²×Ù}·Ü8CáâÇ'ýáÙöwß|¿½÷DýãOÁÿÇÑÙáŇsòt=ûí¥gUQÃËމjÑoI9iý?4= ]¦ÅKúåÇ–Dþä]FhÝÉò«z`ZQêbt(c§Ñ<þ±uxv:<;îm¿ïN[l´ý±ïè×y ‡ìnèʻԴµˆòh. •èÖ)[|ýز» ˜[kGžÍ™ïº>Σtöô˜ž’*}À0dåaÓÝÿý/òÿ¥þáùBm«xºÛyº;ÆÍÕÿ“šþwxòÈ/d"X3š›(O¢Î1Z^xù¼¡Ç›‡EO$v4´˜¦[î‰G¯>lèú½ +ë£7ãŸååõÙ¹ãáèSóß±ÝããÿÊ[qÏ,úÝã3Kk ^k¯'0ž$ºJ³¢LÆ£$‚¡W§ù{îqÿôÍÙgìÚ›þqoýv ؤ¹“•ùà#CPzÍxöNFf8•g_GèäèCk–êööŸÆfÍ3‚•ÿç£þàO;:à૰ʘ¨ÍÒœ”‹þéåÙåðŸï^þûÖ}Íê ŠŸ¤ËlYxkä¾É#2ï’¢ö_d1ó,ÓÕ£.‡½z¸èRÇЬü|6^_û´fýÓ‹Þ`py~Ñ?;mÃö¾‡U1váÕ#ZܳSš*,ÐÙà6Šk@kª÷ïzð=ìði@+ÕÅÅŠ^¸Aß°€ÎÕiïíqÿmïô°‡¿ža+ïûÃ^¶ª?¤°Fê6xß…>/iʸE0*þ§C°!m¤ê¿QÝ£_ú8ly¶~Ø2¡%;|ðrw¾¥gþ÷ý¬—ÿ¢´Ü€ì‡Ÿûô¿½çûUùo÷ÅÞ7ùïk|ºdSRÝ´T{ç=-«¡œGyŸ‰¿{òZ\$Õ ,ZDäó#ê)¢ôŒ¿}ÜÏç¿Ø„{õ¿Ïëçÿù·óÿ5>êO^b&¹sL§ã€eP (]ÃY¥‰Òd±”£<ÍA$Ç„¼@Õtº]Òé@(ôA–zCçê"žA3sè¯Q½SÐïÔ—+xÕð€Öô¬Ç)yd¹þE«¨ýG*{¿Ë8ÏÚÙˆÒ§žvT“ÞÇ9‚šœ®éz)µ@Ë4AuŸ&H =FTž6¨6¨ZT_¬ ï©ÏTƒ»4Bõ0¸W%T÷«„ÁãuBU× ƒ/U •V ƒi…jCjaPÑ Õgê…Á:ÅPiÅð¾½¾}¾ô³^þ‹1»¡ˆwûÿþÁ‹§5ûÿ‹oø_çÓã]Vç˦ì‹ö·­n@þÙEkgOuÏNΑ KøvÐ=ñnºËS¸×ˆY#<æÒ;<9¿|}Ü?nvØέ¶ZÝ·ƒqâV»CŠØì -]"EŽWßô·˜©¤{¼˜{á½ÃþyZ{2ıöÎ/ºÄe¦3¸®A¦;ê½éŸö±Ía`Œ„‘KZ øEiñ2¢¶ˆ;Ä^“4„ "æÕ’¬{a¬>ÈôaÆnGÆê¦÷u’Å…\´ÌúéWYJcRâ¨n 4ÌŠ3‰“b>̦ÎÂòýÕQ½êµ‹/¼Y’YÂÙ—vÉ0«Yžå¸T¥ž„ÛºT š²:ñ~ºsœ¹ƒ£º%ñŠáLUŸâ|œ:qWÞ" ½'´Oî– ï±3΃[‚V2‚Ùâ<á"±3&Pߨ™ØG|³x¢ù@G½A9áS4_Ìbþb>!oU=I¡‘Ø8™ÍŠÎx¢K3|O~Å„P‡y>)&©i¦+Ýå(†}tm²¢F˜´ëôWX\HŠtTjòÿ˜f·³xrEù©×rˆé4ÓØíU(  ²zd,÷„eÙ·nvaN‰ÿ¾¬ñ´ÚÍ?]öÙn"@×;Ú<9¹zýzb³Un-÷ Žyˆé™ËE#Â`ïM.º½‘V[rí¦|e4œ²¨÷FÊL ×AÅ,$Èa„ÂR:öŠ”D_sÄÅMâê(à„|ÂåïøÄºœ7ñôûÃOÊ_txo»§=t›»³9œjP®JÍpÈ­’”)‰ ]Ei±Ì°¯Hqsׂd„ä¿),oÃæ'Ñ<ÅÎ1ç÷ã7ú_GÁv§˜`,Ë(Z'굦)¾NÑ3\4L§À!Øá¾auïÔ,€ çšãôn'úÊP]$¾8J¤Kæ,ìónT3±&¯äÆ…+²LÅ…`΄‹ËHCªK?´Ï)ùš4ÍBÓl‰û#òúèÜõ<Ž@¢ÖæQš"6%iUµ†o¤ºJ€CYéY2îRnõDØlRÇ;Á{Tk*#®DXV¤2¨9¨äÅÍA™kÎfÄp µÃkAE´,ºì—õYîZΛ´›˜~…[X G,4.†ô‘¤~ÃAyÓЈp¨ZÔÿˆm^Àë·®AzÒm¤wÇlæŠo­Â5˜k‰%Ýu½Ãš8Ï:ŠPê‡ä¸pÌ[;G†AÇMóq\?׌€kɈú;Ê» gÆoE‰Ù‘Š |#ðB&EÏš¶°ª£Þ¼8Í%ŽB*ö—i4Æ~"¹aÆvÌKk&3÷xE'õØT©ÜP‘Û˜8ê˜' ãË 0™·_ÂZ´,9†­CG_V çòY"³ OÑfL<D¢ñÌIŸ3ذn–Új9»ëZbÚFlÃÃ&h1SÜ2f>“xž"uÅä¯ îË3xù-GWXk…™1ðëù·0rañÐðÖ8#ñ/›Ö1=ˆoç,oäË8T³è¶X&"›òhfñ^c¾õ\ÙÙ“ õ`p!× Y+ˆñ'6%EÄEñŠÆ"G‹çµpÖ¦•+›F¤£C÷b |z½wcYÙËF³ä*2žxöK7b:ôÔ>-È€Ok+ ú(™òËÞÄa5ÉÕ$“»Bˆuû¯ðPIH kåK—:ÃålÅ#Ze^·†èó&ª¬6͆¯F¼1H¦¿£DÊfpàPh'ƒGÔkûfþAÇ¡àËWKƒ†‚Ô ]Oi|SdGÚ£µ‹­DæJPY¡OWÎÌÐÒ …b%iÁS{|1§ÛËÕàÎ&Îå›_qЉ‡1°Sê­i}:»)rRóÊãÛh#*<¨6}’銚âàH°zma×ÌØpP½¨7B[âJßÚ£Ð<¢ºGR]G]Z™DÎQxaÜÒM @¡š[ê9\¦ÎëÝù=pR"Ni+—y©5Ú‘@+ô¾ˆX<5¬¶ ñ°XÎÊ;çE’ ¾ÌC“×ú:l!a@ú=\ª;ÔQ"ÇÔ°w1ïÐãï;½BÏmæzí(*Á¤"¼îûÃP½ï_¼ÃP7l„â8ŽØe†æhtØý¥zª^ŸbÂUœ` Ý$ct±•P¢ÖwqÑ¿8î…0ñÓíþé›´#“©°À›÷ůˆMÈš6ÌV–"g¬" T[>ORm8Nì7Oв‚¡¥iLÏufæUb‡‰(Ú­@Üú¢ÈÆ  ¹ŽÄòC¢“˜šDtå*qÐ!Ý2³dž”Ö-&˜‹Z\Èx1*íÝ:6ðžJƤàÍ®ÅRor’°•ITF¡n‹.2< « /SQ0øXglTÊóåBß²Ìôy7xÞ±±D/æ3hûT(и€d8´È =â ¥wÝ_zô›éñ‹‘îCj |Œ+ºÐaDíðóƒ…6+ôP¡»=ñgìù‡¥µ†#‹°!öY± fýõ(Là1 (zMj^tŒ¾7èAê[TVÒ[Zèq™Æ¨Çc73Ñ#~2::†{2Àй¢F„®M+Bé,?‚f%Ô¦|±Ö]D—‹Ná:¹€u4í¬ÄþM·H-(3Q%ìDy„#ìSPÒåô#ÏBôNžµku¥=EÕ†xip<ÎÊthi> wiR’ØØvK~=õB¬ãN='¸/sàÛ,U‘il‰Lÿ&ÙH”‰6‹½ÌC+>Ñç·ØÆ‘ºŽû¤"¿s80-ªÑ˜Ñ%'”¶‘ ÅÛã˜y~[E;dÉ©ö€pgm‡gŠÜ¿¿Â0ï ß(\Ff€ü“ZtÖOJZaì3FD7ôÕxT{á „—.XÚž£îÁì=5$ª#s5iÖÌ{…°hz©;ì…JMT,^ÀÝ“lÂfÓ9L|ŠöF{)ðFˆ‘f©½†HŠ1{3ïÐõ­ÝyLµ¾–¢.Ü¥ë¡=?C*.\kÏ"ÇÓHL¡£Þe·¨v‡Þà\í¯q„ZO©ynà€Û!»: ;,Þ]AŽÑnðü”s4~¡ ¡IáĵӦ/VþŒÉÏÄLå‡ÄÑåŽ. BXœq̬Èc¦ÆR3×@MŠÊ>Œb‰ºçØ ?‚œ4¬“Ùæ†eL$ú¿°N/’ŸÑí_¡Ä·–®p9 V‡£/Û „ËÆergô_ò¡R¤H阩æ:ª „¦µªzdh.:hî "E›ãìF‚ÕÚ_û"ÙôŠ"¹Jå2©»ì`‘´M³>nÜA…Œ”Ž¢‰BòÜ¡ÎZêƒ`"hgØÆ+ 2†a-4—° ¸Þú=®|ÄÓÐäêl‹ç-nó¬f·Ñ £¬¼›Â­X;,>]â!ç00 ­áB?Ú© ¿‰îž%ž¦,tU˜›r‡KÒhÍ5Þ¶[î`é©”îœ8¢à¸‚NŠÜ\Q›ÎÝ"”ºz¬Bâ‰ÒÌñ'»Îz¦»&“‘8ÈÝÙ6G"ilj3Ðù9¹t6M\”ÙbϪÞl›Íã[ëéî°÷/Îÿ“ tQ“å®0 #µæ@”ôÉ œÂâÈòƪݼ(î»—)©PCöÁ—]PÍaÊÄ6ØrI ì‡LÎbŽkÿlžÜ’¬3øß–(ÜÑ.V,¶1ਬ”q²åúøï«<»uä¯/Š1¾'ÿoÿÅ~µþóÁÁ³oõŸ¿ÊÇOÞCæþ÷Oñoä!ÞßÝ}¦Ö`²l”ÅÏÙ ¾”%ØHÎÞ—¥ìm*coC {É×[“®Ç¤r/H ã3³ó”—™‡ =&9oÓX-ÁFróôkÁ—§æaf^°‰Ì<'1/ج=,x\^ÞÝiyÁÃÓò’•lÈÐlÈÐÆ +Áç`µè”¼Çòÿ;îЊ7pÏý¿·û¢zÿ?ß?øvÿ•O-yÿ»íýݽ=õ6Ë®fèIwT˜¸g«êpˆüª_DóÚïìª-|@§Š´Ú¯T€5/t$в ª ³–Dþzß=á\Ã>H xy¡G:m ¤D§P»ÛÛ[N^t¦ÉCÛÆ¡ÁeJyM¬*Æ.x¶arÍ£8O7—uЇÖÌ4¥xÙa%~Ž ÝÃUÇ[ð8Ï›ÜÆ:Ä.’K5Œc¯{üf®ÌYú=zzX¯¢RNæÞdÉ" ÷RÅÒe÷ã[æï“ÏzþåÖ®ãÙÂÜùY}ÜÍÿŸî=;¨â¿¼Ø¶ûÿ-éñîâäXgê¶¶wvÞ?=ÜÙ9º8âžeìôN[?ý€dÿG“Ÿ‚ÿñè]ñÛmäŸ7 «¢Ü6¶ÙÒuá~l•ñ§r_}…§ ú—?&E&ÅE U ¸þé‡þoð?tÓŒdή?µœ‡°og’«çÀÈÕÖ0›aÔš.¢|Ünýä7ѽöê¾?É–Wˆ­®Ðæ^}úpÐë‚€ê<¾‚ÊÞÞw¯öžî´º[{„÷·ÕWžî~¿{¯ì!.Ìs‡.øa”MVĈlÅéöåšûa¡¢Yr•þØ‚G5~Àª¬T’ïÇÖ³ÖOÃeªNô¬Q™Цñ~þaŸúIý0Ê«/¼&­38DÅW߯2%ïý°³À®‚5äpg»'1:Ôðòüü˜~ë:¹›ßÞ:<;>½¡ÿKïøƒró½AôÞ\Ãׯ{ nô‚³óÞ) ÆØ·ÑÕ@›é£Æsø”jÿŠúZÓs÷\ˆŸyÄ —ß5hÄjx:ÀÎ0i|8¬¡‡3œöA‘úÀÊÐ!¾7p2ÍËÍä_cÐÍ^Zlñ³-Ô.пÁ.sÐ(×LW¶6ÓmNw°'ç°ƒÞÅåà”õˆSÒoÌà=-hiœš#PêP0XÜ Ô…!vëM¿?”…öªKÁó#¤™Ö¦ùŸöf×°î*ÐôöÃè§=˜¬¡›3Ô€˜G?ýU!¡KjJŽQàeOš¼ ÎÈ’ZEÚ¡ ”T‡&§³U Â"æ÷ÎQº¢Èb-ÂÕÓöµ+Âg*»(&{7Ñ ‡Z ¢J›­6šÑ *—½'ºÚ¢5ÞPu6ìÌK´ ›„¿©I–FKŽ_õq :¬F1š<¢dâ¯ë>¬ë Çê*ŠŽ¿â²*=.vè¥S^çŒÀñðuÔ¥¿€´;t—‡r9m“k^ª©c”ý%¡ü²Jb{²)@ýWq“è‘ùú|Y^g90²‰6p— –ç‚!knv“UQô‹õ Šw°þÏ¡A¨v|€‘Â0®Yl´3QXöîë䜕ƒÃ5AÂ%ŒO)Ï®“QÂÞ Sâj=ìN Õýâ‹CI)ù ÝEè®»‚¥Šó@zD'Û<42‚º{È™ÿè:Œ'a`ÒB%‹bö‘ˆÄ"ËÑ´øtHé=e¾”hKž;Œ^&5LüGér‰±0jHQ¼öù¯YvEñjô@ M“8À*±‘'é?”ˆžvŒ™J_:ÜIæFÞÜfÚÊê l8hV1ÆÅ|¿ÛVô…ŠISBB0Do‰9b¨?£›™ ¬;Ó’§à’p!¤˜J¡ÉìÁ%‰éÔ9ôqª­dÀºµ—ÒË1ž/ÆØ&2J[0E&eùÇ90ÔëdÁ˧)Ÿ35çÔ°WL™¸ÊH v`X#¨·¨·Lǹ²Ì;‡µžp¼,ä“‚\ÕylS5got£!%=< ô¶”!e,‚Y4ŽÍÒë„§lºÔÖrʱOød˜Ãæmü3³¡höŸùèåé1É ú†ƒ]ƒj`"^Ö –b«Î3Ü Üæ§8 P¾j´$“ÔU±5h0‡Á½öbø¾S[Aw u¦P½_Qœ‡òµ>tžEk9¼û®wŒ–\²"÷Þ¢|ôOé÷üu= ÛÞDBºW9X~— ü ˆó®ÿš!HUÇÝ÷¡gâ~߇e^ZPÿb(„gÒtˆ'E^ð½Ë^(&cŠmÔVd|ÐX¶-H¹gÕvíàdy¾D(¡_zÚÚ]èùêmwpDô"ÆÛF{³6‹Eø #Z»l"û0ÎóT{Xdj€pÃþÛqð€0Ë¿b`Eš)®ŒLGYàeÍ»³œgSbàf:ç¥+‘ÆW Ï Kk‡7’Ù/æ#Í16O%ˆ ÈMÝÃé°êÀ²ê¿’¯Ò0!åš«hàœ„ƒ3Á9¡ØÇ&†¡pèœx­à†‘Hn~Ÿ‚Ÿc·‚†&¡ÚZ¸‚ÉßVV&N¸ÞD®u l _5‚ƒ*1|)a1j¸ª³•†‰© 6Úp'FpNœ°Œ%20[ê„K¾ð>“ºÄ¸6Ž00q„wÄÚ¢lr©»0$ùäæ”Ñ¯º·¼/0f†PKñ•Í´ÈfâÉ¢e<¾NQT¤øô`ÏFêX`â]ÑpŠIv…:°mä=,O²\“Qˆ‰(HÔÅ·b™v-¸aßND&ZÇ¥ Í„ép@hÄ%Ä·Q’µ«‚îg½4E‰b—(SÄ£ámýO;“H£¦ÆúÍ¡)²œú¸ûÛô]篰åaG½%óñœÓby†ÐÄ€4¹+ûÓÀF1ÑñØÚÚ³ÜÏl§°œJã ’SFaõûEŽ¡~šÿ`K(\Žœ/¶ÌaŠsàA¥Îª¶ØˆS ÊòÔGO |ÕPK!wa8¼â¿) =¨BK=ûN¾¨ýýû»{J§‹ËûÛÏÔòÂ# ë+l$8’œ¸­£³£6/f‘H,š17Mwö ]üvo¿³¿·Oí‘: /ûïú»ü=ò[ã8Žn…Ûu9e‘0àÝ|*—;Û˜B'në“3hŽB¿5Êž>,nI{Lc8¼GÖ Æ×Yо“k`5ÜÒß–yRL’±ÙR¿V Ã.*+¨dÉÖª¼« áÏ&º²½›A6F„q³ÿÀ8±œn8°%„öH›Ô鬒Õ6Íeæ’]Vê3!™”®Îr?Á6Äá÷ö¨¬Ë]öe|•ß}•QF. èÁë€)oÑò@¶–ã½f¼J5SéÉÎ_ƒ~ ß!Þ\<‘¼(ŽÜà`ô2F–¥q¶D’buýL£\¦$TP2\Π·„½Åá>$HÜð%cpÒé,h@‹yhãã™<þu™•1 .„·c92ÇLš0otfmœ= î^5Yæ:… ûoºbƒÓÌ‹”jˆ}Ögn”ÈИuXÒÇæÑp,îBÞXøI B´´S1Põ¶šÅ?¶@¿JÒíQV–Ùü¥ÚÏ_ÕŒ×üç8›eù­¿g7Ië§Ÿ»¿tA8côÖÅI»ùA·µ}Ó1~¹_¾Tß/ÊWhDç†@¢–±ßÙ5vnþOÝJîÚ±µ=2 «o"Ôä¡sà@TE ×~e íˆà¶Zžq‹ŒZ­v„)Éx&ÝË.ŠøU³?ðì’l;h™_zõ0Z€Ô<#àvA.ajJv;6A‹õÁI¦‚H 4» "RÅ8OF&;i®ÍO~ý †SÐAt’Jáæüò°«àñ Än¨—º[¤.‰®ÛÖÎÁžCÖ5òDk¶i-èkãó¥$£a¥èŒ²&ÍF½E.ÅRà`pª’“6¤…:= „¬ä€g äfûÕʈlN2EuO1¯VíñU4ê1>Ôà ;X‘Æ4?[9!£æ+\7\$w§X¢Ž%r™šôæ€Ðg¢¿áËlô¤Ešð.è Þ2¦TœSÎÅ.P„ˆàB¬¹\ÂEAÉѶÈäC/-€»ÓH·4Öh‡K˜ÇÓÕ~GSLÙ C»|y;IšŽôê‹Õ3°yj¦²¢§Ö¶ìFãÙ «ÉwƒMdÜ”Ü\¡b‡‚‚?ƒJÝM#•V2ª<4½“hŠüÕWÆ! 8ðº&\22&lJ­Uv†_0`.ª¦±1€t$pÑS­ ªñ!wº²wzðYwºÃ-ƒ;¸%Þ¾áYñë bq:ÔŒ¼«² Õ¨”“^‹Z ¶ZÕnµ+H•Ärq>®R}q­±¥Usm«ÖÃçë³dTíæåáÑèÚὬ;¨°n'3ׇ³ïŠlì2p­T'«¹í/x 3Wë˜9™í‚uÝp_ ì½öx’Z±ŒÒß›ÏÇMlÍÔÆRû¬>p¾±úǰúÑnÿ¬C²u@¼M­³8Vž>ÔÂ,ŒlœkÙœ8úÅž­ÖÏçýVès"ŽÄq©Îò5Åÿ0(!íª=غ7§”—[`n¨"r®1mðLA±iÒ6‡F7þƒzF,˜Ä(­ IcIŒOÐ=ï#_aƒ#²V™°]p*5," ÅÓˆ¸ ñº„Ò ³ÂØ‹ =Ú*|Çb|”Öå<5Îên Rc©ßd5À‡óÌÃqJ < 60ʳh2c“ØNvè[‹ëê¸h e~§À£2bç–|Ç#H^k2k_SÝDòXFBævHº Üæ] gÙ@ÙÝF•V(2äÿ~j…A«X¦-j®s„ŠGòHÃÜv:l‹[ÆÀI»Ô³^Íæã‡[O0€‰d€ÎÑ9ðe=Š7¸­¥–AéƒpUóû½vzéM’gäÔ Ä~@ŸúJÙ"šâ¾ëʶQ8¹"¸BXÜ©;¿M>îà5ð‰âÞÛ†"}¬«iKïÔ¡øÝ”bÔU CàZµ„Ï;êBÇCñ™=ή2Ë×}È÷’+E ÖM÷X†F[©2¼< ƒáÙ1†%„ m´ðÿýS8CˆÄÕX¼óãîiïÂFfæ~xÌûÛÆdÚ1!^ü‰1^.êè('qÓ ›PSu‚Ï·Ú!ÙÎV ~X#$àÓf Í‚¼ç è”s‚ù½l4Å,²âÃ;v"r—!—àPÀ$¥o,œ¯eÎ<€e›QœÆÓ¤|=¼@Ó#å8£%¸ãG{b\¤Üj^&4m»²% xSŽ˜ ý”:Ò“Ó*vh?ˆNEŠÆ2$³Ÿ%Åñ”! cšå PøÐê<ŠJÓz^$ĦìºðMëÌ!)„ÄQ ëèà ¾w¾ÚßuÜ`oßgeÖã -¾ãî øpã3é9®Ù@‚Râ+½‹N»ÿ–¤ìw"gž•7H>×hF(–ŒÇ5­°`3{^F@ÞñÇšÇñ¶ú±u×]:‰fñ:þ Yéñ¬¡³c¤íôcPåšÓÔ³½ƒ]u | ±>“|Œ–¼!í«C¸Ï¢Ðu5°{ð¬ã»€8S"ùiëøMÿï÷ž|÷ôÙŒdôþS¡v¾¼J¸Ñf°G61(ƒ@¢ÛLÝpšèP=°ØãóŠnc#k°=Wv›ŽÀxÏ*¼MÇq-ÂÇ#o±¡ÇÞ6‚|`3Áùh.¿-­|Ô‡©Ë;÷å°ºØÎ? •/Áü€÷w>7!ÿ®ûÿÓè+àìí¾xº[«ÿ¼ÿ ÿëë|° œŽ# ºã³s“çë>›ºÍ‡GGÇm ô±×ÙãzÊ-”htoÅ#|ßTr–BÊ0> ¸¼½ˆº³lÓø´¶­TŽ$;*NœûÜévßïVƒ’¸¥_êOžqÝž™ãæÐD¯¥ë‘ø ¶¸Œx°9ÿ-ªÀtOed3þ§4~d7Y¤2x„‰\3ZƨíwÌߎÛM“f·œèÎxo×Úä ¸ö\¥ÔF#‰j½[NsÇÛ=Φv~Ï`~½Oñ˜}?~E^ÖÚ Éá6qÓ5s˜f Ù¾ ¯i;¬Ûúz’›&yQJ¡Œú*4VÎ2(ºûçÐý1¨ÃðÀ{ÐIMQ`ʨÓÁº\¡¸¨O!Ð* Æ«O$ÚNªè—¾å¥6œ‹½cÖ!hD³O~gžt·ã:ºñJQš†¡A>¹h㋬  6+È-ØZ)žÎ¥ÙŒ-5µÐð.¡çfÒɬéy%E0“ÔNã{˜†G™îÖ;Ú‹!?]æeQö¥´ÞeÞ”+cQq0Ç]y_6‹YcÂ_×9j‚ÃŒ¹å;"aäÅ7 FF{Ó|%c|ÍcDðY;NiRÊ|‹º‘¬íàQr‡M]$Ìç[§ùšÂs÷ïÞ.lfmˆÜP“L_Ø`+Çà)uÚfT„lN“;Ï÷Þf\ñ-LɼðJ¨;¥Ï @>ÍnÑ’Î+‚´*ņÄ”’e³×BÔ1¯³ E“!ˆ¨c×yY˜ >Â¥w{Š•.?íÞ+{x1: W½S0„õü»ÖÏd̽Žm̲„al1|­ÏäârRxÙeç{x ~È–-µOá¿°ž™^ñ 3×¼ÂÔZº.¼.?…>½ð.‹ÑTú$@oöÉ•ÏC3µáœšÕSV îQaR\ˆ{³ WãiÉ¢ë4ÒL¶ÂNµÙÝœ”‰³`òNuÙ-N•‹{²¹XúDH´”ZêüeÂ%*çQY;0mODzóÑÊ$Yy§ÜHHî9%ŽcÝSxR2ÑÕœ7&¤Ð"[$Åba,—Õ¢à7ÏS¦­_D[ ²P»\‘BÅ–äÄZEÊǸ¾©,ÓH/“ÇÎ7ĈX rM!9BEÌijÐzƒ.UVBNˆ@fò2IE‰8¤$BŒëàb£U”slatwâBf¶žæ×I·Æq®U ð@ç;{vž86ÖžÕIË:¶0*êT˳ÝË¢zñ”’w‰Óë垟 [“¶:ÍJ¤Ã>L˜“EÐO³†‚ä²/ÕÖ{ô­\€ÇÄ·Ø¢t¬QµöÛ⣴.´ÂÖ«äD"¢áoM“IÒ¨¨5/ãšB7“]æ3>éjª, Œ«¥{ÿæ¹_¥°ß¦Øžo`“ñzÙØfv(`Fu"WGQ‘ï=Re” ÚçïÎ<à ÷¼Ã:âÎ]&i*ïd‚5aχ©¢×`ññ×ÎT/µo·¦M;Ëü¹Ê›~~›f~òÀ™5îê+fÅû\à Ùz<òú°UK:ûwß îh|wøS^o<ì^Øô½À‘ÕúnðØVTÈ=1±EÊ¿zè=a¨¯VÁ&54{çuñB©Ü[±©Vã Fж™Ïrã¼¢1=}wh²ò± ²ˆpìas€}%ñÈõ ŸÙÒ\š*ž¢>Ðõöš,ˆÝ´ahV*°ü»F­iÂTª¦r¶F³‚ *‘ijeòólA&”·Ê/ÔR%¦Â™î“›8uYØ"Å.°˜}‰‚댻Àcµ‘¨,×ÃWʵ™ëjG&õ^îÂ:µT—8"÷À5—¡†¡c™ ¥©‰Ú”ªõ줶<«Ç’#"8±å\aàÈ ÉlÅ.º-tûpŒ@¼¸Š- ‚Öè­¸¨±9CqŸÍrèkcl#vû0³0½i’ûm Î%°Ý,÷Ô :ôµ6”×Ë#Œà=øAãÑKáåZU¦@[y›Œ·£U£`ÿ}BsÊ)'úÇü"í€Y7L„ ~:Z„Ì¢ÆØ„¤Ýwýî¦d/6É’ I3N¨•*CQ ßB¼ZP‘Ô8Ot¿"š2l“\Ã+Ñ›\Þl}° ÿ x¤ D¦*X6’ż}5aI)c,¡‚s‘„SÄŽGgâ¢ê\Êí(tà·Î³òâ¾®%³³ ä‰&8¬ˆ9Ú­_g'ùÒàÅc— 5ÆI8 +4è`!6j’¤q!X‹‡æ„,¥Ô`Î&0Ÿ«U—Ã)0©aB'ðfëZ!ÃBôŒÄ£¥•¯Â%Õut!¯`¼9DÄ“/] ÄÂQÆ÷äÍÐÜ÷sÖ€¬ë¸¶|Ð鼡σ'–ÁZŸ ˶™VÍ3¡µt+yr¤LÐŽÁ$HÖµ¤8Üvœâ츘Ÿ2S:Nˆ¦kÓAE*V+KD¨Úª¨ˆ .Æ;÷žËŸK×±Ivšk2ÊRè¤/è¸j~ ø"…ƒ—NM&SøÃŸ£-çÃÞTÏ£yœFî)¯ë8ÎÕÅ0…iUµë(@Ðü©RWG¯Û3Ô§°Ìf•åÑxW‹àê“\H©Z¯¨³î¨”/#^ DéUü­Î¢¡²/ÉÔ‚Á#«ØÚÚ¬†}9HÏ:OÉPÐP8¸:§;Ë×–t—–—z¥ë.©k*AkûãV#+ºÇ_K©Ó îÖߥ“å:͹o3!!l>ÒÖeêˆïÍ&n«Îwy÷;ÒÓ€ï84] 4Y3Wç\¹iøD­;Ëzf½®–JŠÌ‘j yÐÚÒʦ@¯Lì xªµax¶JüïS pÞš¯|àVòÐ GÞá $Ö4øZªœ_² "[Ä|¦‘ÐÍÿ’| p}#Þ™;QlIÔD.Æ+ùs&zQÓ71m|+ ›!®ËB|Õõ»^ŽÑïouRº²ƒÛ˜‰ zˆ0{ƒ"m3ºö%ýÒ¸EGÜüËÓ#x‹Böu)EcWëŸUÊŸ}ðËõú -!úm‚ô½È|ÝŠÅÝP|bÞ8ä7Xgz=ê½é^ÀlÔþq/Äxý‡âªÃÿ:Rå¢úÿ(˜®à›ÿÓe×dœ÷ÐèI÷ô°§#½›Æ†óÂB.5„ùsÂBíA\ôžŒAÉ%ò–ìœ"ü±ªÌ†æS¦"—c?‡þrYP|œBØÝô6Œ}xyÒ“Ñ /ôÞœö°Ì¶¨Gt9¶‘z1- kŒ0dìKÒÓ].*L…ò=ÉÄÎ`f3üxÑ:V{(\:™+*—È%-ÈG°…fW™L·t^«¬‘± A½ëˮܾQ—Çᦵ¥ÌK>å”Ô-rî’ßf1~ùe¸U3Aó£€k5=|OÛCôÓàí5°>g´ì!£ÁQ1`9ƒW ªÂ9Er'‹41’,¾â Ya¶ÎïN܆ d®s­`À•ˆôîûIQ™˜Èð ‘ëÞo\‰¶‚ÍVn¬R©ìàHAL©ž[9kƒ#{³èjÎÀÖÅEm%k%HÖü+l›9‹¤£ìÜ­iìwö›‰8äXˆçr²\|wAíé93¤ò Ã;ïB ñ§E’›ÃCëÀ}è.¸fŒÅìêCî>+…eH‚_'yt+ö¢Râ"ˆ ïà5’¡¦øê~h§û2M‘!§p,¢ƒÐ¤+mGòpéµcYÀÓǰ=,wDº9­~M&ì¤H»|Ü}¯ty¦!¿n zÊ( ÐQx$UMAËãã³÷Ò(ì$Á´ãòy3ôË,5RÒ/Žm÷Éiè¤ûÁ_T¡‚໎”Ab?¥¤G¬V ZÅ`èºçëv}”ÄZ¸Y š$e<[ìTŽX0P:XŸmŠX‡£ó¦3èH)Ž­34ìî}ÿýA›ëð±¡9©Ûp-£¥¶Öõ_Ù^þQíÀ]°ÿbûÅîÞ³­¨½µ×féÎæýL š‘cZ'gSQ®(2ŒzJqê2ÖÇ¡8‹¢+4?ùy™Æz±)W+Àô ±K®¨Éé5ë,öýC˜¤5'¤“±šW«k#á 3Jž *.p—ÄKÊá`X]Ó‚sר^ü¦ öˆþßDKI”m¥ ‚°cg2A $¸œœŽ­Ïª¾WÉJßwÔ (´½cDÕ:»tÙ‘rM ˆI†T#ÌIŽ¥èK¥L…$s®/žâ”»__:…¨Ê¾kDP°²|®ÃšD¼’Ã4ÆL¨ˆëië–ÓjEE7mV3XCF$-¯zŒÅ¼£P ‘ÉC7‚ñ­ñÎrµ(g o©ƒ/Û•Shuܱ=)Lµƒílº30‹'ðbVÂôа4¨è~a«Ú2˜üÄeŽh§v&÷žDÂùoÑÒ…Ö/<Ë(Ô…ã Mu+öj¬—£)8 ˜%fž¢¥D¾#?‘…Ð0Ó®EPlöNT,;:ñA2$ŠúJê ºLм\­¢Q« 1wNIÁÂe™Ì’3‹ä¦<Ö½Ï^]:ÎMÇÍkžˆgJAtd»¸Ä¤*%è8ýÐó@É ä#ÿ«˜5“Â"Yg¹¥Ý ^>‹…Tœ”ì€[ýú’1á°Û怀×Aõür0¼ìžRáÒ!›Õ÷Ö¦þX˜‹àâZÒ^k9°ÃðÄ׌qÒq ø/‹I稥ëy{û÷aîo¤ÂÚ!3yùö!˜ƒÄ.±Ú±¦l*ž©/ˆõ3ÆÎ7'Ü¢wÝBôa÷geß=….úÛÓKõ6Ni˜ç”Jcfºõöü¸m¬¥ˆ/&òá¼ëà¶áËï¾é'õIÞÜ×o ë‰Ü„'x𽺈QRçX‘ñ“©§OwA©…ë<éªÝý½½½í=«¹vƒ ‡a.È BÓ€‰ /VÕhxv}Θ‚ª%>‘¾¹Ž…‹ë[Lžâ *ZpÛŽ/–±kL)ì­zÆÌ—Ǧ<8‘±AD¦2"˜W5Ao_Æ ¸œ!MÁË áG_ë¤ßB µwì‹{®1úw‘•%¾¿'‚QÖCÞÞÖò m)Õ‹ž¥X",rW"K^ˆð·fdt±³–VGƒ5$â–]?ŽµÏ‚QÏÑSPÄ‚æL…0øŒüï¼g,$1ס#ëºò¦6–ûH8.õq2ÊQä]·äÀ'ãhÒish8"QÐÅÎC¡u_˜je–åý–d¶è#áÀ¸‹âO|Ù£«C쇎-€5`$´Ý<ª¢FtînV«˜:tá{B¼á±¼ ¡º,t%…)/åkếÆÌ.Ý•„Tx˜|xéÂj]þ‡ÇK^$?I鼊Ïztˆ1•ñĨm•1p¼zÑ_Ù¨Flá˜M»âÏ\½1½Âø‡‹L—8à­ã‹œ¶$•Ìð{¥kÎŒE^De Ò•”¤­ºËÆÑ¨øÈ?e¸'yl.4~J—eó{Á 3‚­ÞçêÝþ‰°lYÖ³q?Ýud(~XB¦t öAü)BvÞÙ˜ÄÅÉr[¬*hIó%N¿DX£‹ó*1tMp6rÇ£ëÑi5lÚR2¼±¢ƒ*s(‹§jˆïò‰E!ù*sM\ùލbŤÂîYÙ8ºq}ˆð}›a$É¢àô5“˜PYo`ÈûL Î Äj®׃aÔ ºØX“›-¬ÄHíd^u ÔÝY‹ƒ»@"0óË'…žˆÖ#a:Lè:¨‡Z­u¬¯Z’À(ÁÏ*FÌ@ÓÌ)é­¹ƒÇ@L`šËwmò,Ö!˜ÇØI<yyN+4HØá%„PjHF+»¡cIÈ‚9œã«ÔA^!ï±ÄòÂ:À5N)r%'sAdœ“1çä“éŒ"S¯-}ÿ S¾#šÌ9¡y^’n ²RÝ2¦ xä5h¹·@x¤ j]‰„übŒæâ!p´•c„_ôN<ôÉÙ UBqe\K³¯˜g’lµ,‹„Î1܆кÐIÄúh¾Lkë.L67Õç- #4|Ñ&w8¯è‘©9aKŠAes-j-•©-L…X ÅnpAÍ#¶ÎZn1¨õïER1–/Qf^p½­ÔÜ#¦+ÌxéÖ¦ _}¨Ši!ÅÆ ÁQáÉÇIiÅ8˵©˜%.Ì"/³e¡c]le§˜N¦Q!y^ý{È„çÈ$4j´“„õJ}ŒãžÜ-¤é I¹‚L™˜j„ž”ޱyå\G7Ï,hµ;?]Ï]ÿ5Óh½²öOy6Êæúy…|­]¯ ÒT­K쑉ˆ¥«—P·ˆ|ÙB˜ ÎÙÈ:Ž0…·è'­VkÙ—á²ôˆDP[1ÖËbÅH« ä¢Ye…¥•×Kºé8ÖpýéÐpku*%ž^:È]6ì]!¶4£ÄÔ©’bàçq\:pnä,73ƒÄDm+É[ 4[;˜N $-ÏiUaŠäzzCË—‰C¢Ó@ -èô¶f<±‡Q–°“ >ª h§nZõMØr¢D+%ø=¬mÌP(Ó`.ñ,gpN5¦§·ß)Ù‘ŠÎÊ:YJ=D8qM¿xÑéÓHH.Âk·µÌmZ_ç)‘d=D6¢TOµ®"PGö}ࢎÇ+‡ÄH?"z3^ššÕš:]NCº`@ù„!ño#ÒáаÁOæCl+M³%0.ÑbKó=€¡‰j½Ž‚x,¨h„Z¬2$ $Ž{!·­),^t”Ýj:ž¼lvÆ;r/ >O!X¤ˆfê&‰o×°9<8Y Zy©ŸKÀÅϦÚü§—M˜&KÓl4¯1«íþê†ÌÖßµæ–x³c•†:mÔ‹JFœãñr(ñÖdÝÍ“z¨±È…Qè06ZTðè ‘fÖ5a}QÊNmñA®8Ôcs G+9PALàž,ê4Õ9¬ìM\˜ A7åV¤,¹’«”u¦‰öI3|:'õ’¨„áwÝQ¯—åºçPçN«bs )ÁWÜ}3‹¬¤Hãw܆ÖÔ²t=s Åk¬~‰ÄlÊêq­B㘇ͥ-%.‰ç³yÂd®Ò´òø*Ê'\ vŠ/©[¼iÙHu/†Žq¾¼– ­¥ª¬])ejíp$i¾!Ç8ä$¸–˺9<÷JÁ&]“Üo»båDOckÂ79S›ÛQh4„—¦•¡¢q×`ÎN-eĨ¥0â+\%ë uTLJ4n:ÊUq‰!£±®'š6¹Ö™‹ÿ»(³\JqzóÃ~F¹æwÎèìåEZFÃåõônY»:êØñzòbaÕ~›@oÙ?§íÐqcŽx“T¨=FÛ’j-kä ‰ä¬6‚YƒÔ£çžj}9õrMÐ8ËÙ°K7ÝŽAÛxC3C´ „Á hÀ%zø,hW«C× Sˆ6jª>! . MÌ1¨ÅÀK2ƒÅjG9ùF¬&à q…"C‹”f®­ÈÏìNÒýl¥)‡×Ê¥ÍnXYêÚ⺠Kþ>xËÎ2Û²ÜãuôÃ(NÌ­r"àLtø¦¢©y¶ü5³‘ƒŒZnQ?ú“\ ¬µOÉR—:!5#„Öî½!¹’ÒýÒ"TG†žª "¤@dbr¬ÔZæu)į0h™„E2_˜¤"åƒ"o.ÛB}e 1J†ˆÆx ;^6ŽúòªP1r¶hеaÁ÷ÐÇU˜Äj kÍ–œ8áày›R´5«?ò<3UÄ)’‚Îe„ƒKf¦¹0¡w/êÊÎÈÈalŒ4C n-†µé¸Ç‚Üfx̨tű(Úîb$S÷µ-[aQZ†%r hµ-ÙÏ£ß$Šê¯j‹'ˆ#þˆ!‚÷K˜>ø˜«’\ÕP™/ú¨Ñ&!H ý¥+-wGrAMt.ìiíæwZGqÉ¡ýÄB홓¦3S×ÑÀLÑUÔå8\‚Tó ÞÀr9gÏk F|Zr&Á’ãØ..›DD¢E] öuSkpœ/bB½hBÅzã,Cax5œÉ(£_-¼k艾X`ñJœ6ðR´†´±±kÆëVïýŽÎ¡]ôÙ0ý‘ÆOK³ l®Ú4*sõâ¢(LÃRÙ€Dk¡ÝÖ´µÈw"ÑŒcKÇ$n&Ú"‰®`³T§ËÙÌ EäTuPU‘eE(´š |GBÉš¹§ÅFžA,&UÝóŽŠqmý® ¦,ªîãu´fåà_°¹#ô/\t½úl¨Š¢Ž)Á—‡#rö4U è[bZ/{³íýxcC0Ü}$¦Uo{ËŒqÌB“”i4ÕºÌxÄvø•%¬h)¤=4ˆáûþ.iýžù–n|@åäÕŠ–ácÆ5Ë¿pÈEÍgîûËõ¸üн5NFŸ+9À{Óe.6l'p#Ký™O¬²˜y•uÜ$ö$­ž!?`•Ãî9vÑV\ /¦Ä¹þT®r´… ÈØD3cì¶Iöf©ÄÑ-›+\)mÀGc‹Úbî<‘p<ýnQ,ã‚snÜ’ž¼ŠDH8[^Í Hz$ƒ˜ 7¶¸­of ”ÃPK‘ßM5Ó9»äákƒ"Zÿ.Y¨$„ˆ,PŽU=Y»Àà ­"™/gp@cvÖ°Á*\!ìĺŰ‘$k8¯éðꮪ\sîÄ‘®ªñ=Qù–ê_S´Uz8ðî¹väÝ &s’”›Q@Kfü[âãX—¡.‰G0 'G—Ô‰–DR€QéÕe„´-F$÷n£ÇFÄçxQSmñÃg™­âuñŒI:±&IY©%|?'Æ=r*Í“|¼œÄ®™¹¢™åݱۼÅÉöDú«Cv¬— ñyTªˆ‚ÜnÑ}Ù÷ÌeRߦÉ^;³¢¢¿øÌ;á5¼ñ¯£é5çe;­•€?›°~ò•ß¹ó*pvε“M.#œôU.-–ו V‹YÈ­m4AÒG>ÂWû‚ã"4õëz!ÀêOhÂq†É6Äå ã)°P—Öj!éŽè8ÈɈ!rµ‘œ‹È GRT èVΉt _-/ƼôJìŸË…q¶R@ÒÎ$Kyý'pñL(4óš“诉dPþ“àRƒØmÁ[6¬HÉŽª LP.AæÂcIöYÿиT*8XõboE'Td»V»ªøB-Êo¦¤RqvU-;3ZáVœ "q ”è'1o&ÁEk¢#òGø°«’K! Ú\ àAŽHjVá£á. ¿ódÂ&¤Øë«_\“óÚ›¢kb3˜ ›©ØÐ7ïU/vž 6„ºÍ3’0ôB0ÛXNö”ÆFddD?1gpxsÊD©:#Œ]Cl„âe“ºã‹R*ѳ6‚ûQ`†ñºHîhÃ!NÌkBãÂÅž SGhE’'&ÙC|ßè:è…clY²½1þƒ@ IuaÂÙ5ÉŸÈ®=tE,‘ð0`žOã:=/ ÿÑšâÀÒ `“ ¶EÈ¡ˆG¢[h…~¹‰Œp*‘[{hEéÐÕS„™¸·\_^Wud»uÄP›ºqAð¬î] -~8ý *¢ §³õmT<_¥æX|P ú È3fº^,»øÛ¼“[£ ¬mHg+ö/{Ž»UšY4œß\‘.w»g¢•ÞÖ=öŠÒ²yŒÇ«à;ÀØ 0Ì© xoù˜¢K2Úht×ÛL]eX­ž$ƒ˜R„âX(©P#’¼oµ}úJçÃøi&,cÌ3#b`ž G`¤\æ•+f$3L„;=3@j°é{õºG…ÏWbpövÐ=Q>íÈÀÜ! B` ¢¡¦9-Q ªÓ@X8G¤´ ,îþúC¢£ÖÞ¿ëZ 5¼èâóýSõ~Ð'Ø ¿tý»³ã£Þ€‚aw4‰Ñh‚Þœ4~àf€ŠÖ3ž ?ë‚Bû°oüÞô/¨ý:ŒÀ/@t¶±èþ^ÁÿcÀ¿&ì>„ y0vB¹" ¶ bèãL½ºìšˆ€`SÞ¡áBº{Ž ,Ûço|è£2lÊûwgáA1Ï4i@:(Ú§XOK˜Ý×g¸* .a¢h‹µƒ]¿íöˆEÓP³Ÿ¦ {‰- Ê~]2"dÿTÓÇCºƒup~ê´g€kŽº]E#†ÿ¾îáÓƒ¢ÑQê^àXYô5¼„ƒÖ?åMÁùÒAîŽÌY"ò4p7>Aψ„M¡9ÂO Û|Þ=åØêlÝt~é†s"Ç)?ØÁ;Uê’–ÉS*N!HN9á)ËMV*MöRNjˆØ…£ãä}‰¸/×á—¡·…­Iz×r o¢GãCh" ûò5ÕS¡C34R…Ïïùš3)-)äY+äH7”«”BÖ¾Z–‘¸¬ÜcâcµTȦÅÚwMqÈ8\óò\?K¡tä&Â_ÄMÂÕž%yÒøâx¦›x%n'ªËÇ"˜cKMQÅ5ÙFHhsñ1ÂÒÈuß9=Õt‹Œ®€£Q É⯱£ñÞ†âPó4æ·µ;ß™ý“‚Ñw¹á(éqdOD 1ÖTÑI#¦oHt²h¼ý|e²ú¼]dáÕIŽJÊæ˜É;ój1Èê¡2ß+'á€Ó£k0׈‰é‡·ë"o§qή A”¦k )eý´¬'6‰µ}3#Ñ·ó+“¡ þ;²ÀÎ( OÇF°«,ŒüþûuÇ÷-(gISŽ*êB²åhïvéÓ0xawm”ëM´+÷ uM ×Š©œ~nF:&Ü‘Úîd Y‹9'yö9i)ư¯ØÄëŸxI$2f­!½r»?q ©e׫ê]äe²ÁÐz\Ô¿y[(U'‘záÈžZ·.÷êlJ® ñFØîV ¤¢Ó»ÐáE~X¬HO^¹Ò¤þ4ŽL2yØVNÇËÞeÐäöð‘L ó8]lZ±½Ì—Ûb™°KÕ$­K…Ì•‚Û0¯–Á£‘­(–nqÊ+oÏÜ–3’¡qT§g‚ Ý$ÉUÊHnšºlJ˦jhi±† ê¨w±F‚+ÈñÊ©:ƒ´)²U6YaÕ>ÔRJEwÄ9vt,bªqæ½qˆû º§¸DʤüÔBIdž $ŽX¶ «Ÿq0ê]4þ¨k¢pèÆ’!¢/YÉUy2#È âýú‡sP¢œ~òÓê&h,â¹±ö¤wwÙÒàdvSƒ6Zä.ó‰Ð=šgèFöB¸޵D"«)31ËõD¾?JåvèX¶ "‹1‡yÁ­±Ô Ê“,T:ƒäáH öÅ ux êÙy÷â]KÔfLó¥ðíù±úTbüj?…­8‚™-ÃŽK–(¯aÁX Áµä< PªFVé—hlïtöŠ‘@&]{!.&Q“±õC9‚ެHKCp|û´¤=`TÈUj[ A’âA¼¹µgpQyÝræàÖv±K#Ã2ò‰·”-lb©Ä§G¡@­ 8â‘lyÞjJk€d8æÑ\þt ™¨ºBÇòQèˆÑ*¶ñJ_K±æ7Ú0ï—GÌ®q®#/39휒±˜ØyGd]Õà¢Öð* ]„Áãæ?È¥‰´½4ÌÈßç…3†•|>›aâÏt¼jÍÚÊ~kb·¹†…ôØ8Ïuë+·2ÚygÄN¼’ßÁ#º/’lÔ¿×ÁÚ´ í1S”»i--Ek(¬ïAo¸?Zƪó'® ¿Îá ´4•R0æmä+'€DâاFª«í^â ´Z[.¯\í—°§æ¦;†Nðwß>Ÿ÷A=x»ZÄ÷çßwöw„w~‹>Åé?kðòSùÙ}ìîî>öLááSýïîÓ݃=µ·ÿìü÷ààùsµ»÷üÙÞ³¿S»œçÚϕʗ¶SÜ‘ÏΟõ§þä¥)¯­ööö¿Sû°kÛ»ûÛ»jïå³ï_î>ûŸ 4^Gy¦þÒ¤ÕÌàÉ§Ûø8yKßÇ9‚Ïr¢@GuAÌÝ9KÅLðG-b_ò4u„.|ãD^‚*'ùB ^l|ȓƛì³ìŠ ä9¯ ¸$¡ýÏ•Q1ÒJÏuRš&–Ä sSH$«Á¡fª,àö(5v8Vùè4zsVBBßœ¿Ç@DP¢v\Ƙ2ó6Kÿíÿûgñ¿Á¹Õî“BÛ1%g dS9 ”( xW€UP;i¸¬ ¼„ÿb3 _Ø`+rki‡I«rx)Öß`)eX½ÉD8¾+pÒ J)¡ê'\0„ÓÒX,5%ø©`"1›u-¦Ž1KˆY’—ˆ“ÿ¯%üß)5L—yÊ®?«¯7ë¹€7u‰ÐÅ'a»šÝUþ)08Ò®/r¦“S)XD Ds‘D©ã4wè$$õše$ ÚY[î3¨š@äÆj4ÄK@‡Á²O¸ÖÁ.ðÓ³S©áIÒÃ:é‡ LAêóŽºèC²TèÔ 8X¢Y:èÂÿu+*T _åÚOúþÇ>¡¾úÏ´ˆq* èÉ dvD‚»$L…ÇrÔëC[(ä(wû:4‡úöù=?wÜÿ“l¾óÏ}÷ÿÁþÓUûÏþÁî·ûÿk|~>:;1fú­Ñ2̘ïÃwDߢ\LãXâd6K~VÀÊ»~ö>\_qÛæà"ô» ¬çK§XÃ&?A°ógüÿšý*¼Q{2`íïìîíì}¯öv_î¼Ü{¡~»^RTQïÓ¢bÄÂðxc Yûêu—¥:G˜%Ëñ‚X„òÌ;z¿YKä†üoϬÐ[dÖ‚1íu¾‚]+¼Ç°ãدãw±lÙ¡8-AKÇ¡l *+iÚ9ø {µp¿Ñë)§±«…‡­Ås$l¢Y¯Øç£5¯ÖÚ¬†ÙS+õµ‹›˜à 9Âÿý,¿¢}{F5¤}[ZÃHt ¨ác=ŸUˆ‹8ÒfÆ„£zÂ{'ãZðbEÌK[ O@W•Ôà­ÅÜL M3ðЫnƒ-¶«ÎE h[Ÿ†ºp›¶ 7Ï'‘:ä5.°“å¶ ´#@ˆ)ƒHâ°h2G£*ë¿äZD-£‡£Çêl‡„¾šÈA~Ë_´­ë²\¼ÜÙ¹½½íèÛiwZÈß ø¢‰ÓI4C¤ŠÖ&…qý rfW§èR©šºJ¨äÑ=Çe½uõ_þ…T‡'OªVS/¦?x áôŽøþàsüÑrx¦Ó5Ú퀨Z‡yþ òzðEVÔÀF®¦5ðèsì¨oHUŸeH j–Ô5ºÒ–Ô Á”ªiJ l©ê‘¶Ô jL½ð˜¦$ÛÒŒw)E'ùÙ½šgŽÁºƒ©O £ôö©q¥¸Ç›à_¢Âä„Îðõ1…·W¨‰9?ŒðÃ<¢OöQ?ˆeŸâ+†ƒ¯*±§ÌïÜA™+³xhb ?ËþóN|³:ÿÞŸ;ô¿« Äиøg’R¿D¼Ïÿ¿÷⩯ÿíï>Ý?ø¦ÿ}úƒ²êëá‘/O\å-žóyQyéÇ}¼mdkÞÝç¨Óø_¢aÔ1ˆÿVŒ¯;ÍZVðå:– 6: #²/T°ŒF^ò¬4äÑ*Ö¦Y‘" ÒÏ °sk XK>õ@lG{øÒ@‚/Š#m(˜€ò`ƒ/Ž& ™/ØPÖkðEñ8ø`#jj!V¾(¦À•„ƒÏ*¨HÂÁçD8’pðaôÕ÷íówwÊË4)¿Büçþ‹ÝýªÿÿÿùU>?cÙnõ´ó]gϸðjŸæpgRŽBÍ)€tñ^cÖ¿Šc ê&8ÌæsÍš‰ÝÎ;¬»‡‡g'çÀòù9 æN¾ÄÄ{bkœ¢®Ù —>¿|}Ü?´e¤[„€€7F«Ý •Ò}0èAƒG—âáøÞ*ùøxYñ5ƒh ‡ýó>´ödˆCí_Xˆ„é d ªuÔ{Ó?•’r˜iäX¤DÚKø>jka q”´!‘’àNðÐû‹Hab…'â5á’öw5v"æƒQ­SN9G(mÄÚ*ÝŽ_I[âMZ»[k#HàwmÜ­>ñ*à\%FŠ’FD]÷޶–”ÍD*5²¨‚nà$'9C½E¹ë­ž˜&‹'HÙyžk‘¥Oª h÷ [Ž"¨ËÒÚ³O ±u¼QÚðm²×-e˜¼T[¸Ð¸˜ºhˆÎâY‡5ÇI°À0‰­VûÁ$Ä' ܦÖèÓËV"›=·¢Ør¦®‹2–G$åÉXÊÚñz¨hxŠZǺ4Ò¹ ¯qs²Rò8yÔ\õ~UÙXµÂ±KiBIrŒihrú¥ôdÍb‰wöéÓËé ʨ¶9dÕÚc8èJDü¹²ëþ1˜=aÿÙüusb©É†u–ä@l®…”sξSDiæñ–‚xÖ~G½EmY©CæOC?äÉ/ ã4O<Ä]|7R “ ¢/VØÔ ÌgBšM;1ôÑF’ÝØ¨Î˜†'!n¢I 3¼<Ö”r¾‘:ÕRº.¶wuÛLÉc%ë”f~~­Ž$tŒ"†g»Àï8Ž2ä?n•+°L;µ£'x*!‡èa”]h«J🈙³ÑÛP—úz\ч,›€døÃç :¯ä”“r©¹•ºÅ”b`Ø'™íN X}!Ñ÷„°o\®BXycTBMPÕݱ1N¥}u#ØŸÝ8i¯•Åïtº(t²¢Ü8Õ¡uÔ)¢Ëç“[1È©‚rM:$6"N0n;ÄV+ äÅ¥jô*„ê$] Ú`Qá“ELÕÕ%2.6º±1Ru™¤­Æi7Æ8c·#c<¬!LÛÒ.¥±Š%$O¥-1ÆÒ÷-4F!?Éט@Ÿ»=;ˆî’DT¦¶Å.¡¯óS#C-õ$ÜÖ u|{zÏ8Œl†0ZhÒV­Òþby ‚Ù”œ¶WxpÜ’99¾g±_˜~ża¼ÌÝBŸwˆ`T3ó&¼j§FPõ¢«Sr-£Îx}Ä[OŽe,]óè“¢a"јšfºÒ]Žð-¾'˜´ëôW¡…ê*êLþ&‡sMyöÓi2¦±Û«P K0TŽŒ±AÛWÉ#7윬$­ËO;YÕºÞè„̵+Z­íã”×ÂQ¯6=»¿ÖŽJº˜ˆõ™Üî\‹”²¨wGz‹¨eO­çÔ­ÊJô…`%%qu¡Æbà ; ­ä…ÀÛ7ðÕ~RÎø®Ã«Û=ð¡ÛÜm̹pT©y’2Å!q$GgŒíWŠ”8w1ç÷!kaùáêDRâN™ÞCùjÄzˆN°/¯£h TQJ7ÅW*ì!‚ ‘À| 3 šÒÒõ¥“J—¹ë׺ }pÍkÂMµ¥Ké,öó~T¸3ñ&°äÆEµÀ“w, '&‡†T¸4ùÍœbŠ"ÅùįAǸÄè¯4EP[Ò° Š÷ÃêéºÅཆßwFLávØÑ jϪ.HWy§I!yeŒ•Ô»Aº5¯¼ºSݺ¢{*´5U„‡'E@-y#dfg4+pVÁã§Ñû‰ä²qªÏÕñÝêhNê² Ó«\V‘Û˜Žé3Eµ‹r€¼-£KíQ‹¬æóFf¾â}a‹‘xãÙ˜>g°aÝVµÕrv׵δ ‡G®à´®iL•HGež"qaÖÚð¡á¾<ƒ×’ßrt…eì˜)ã.‘ G^_pÍ6]ÿ(¾uLâÛ9K§Ä#ùZ±#•Sa•š™)Ýä Òž ¨ƒ ¹fȦNí'6.EÄ&E ‹Æ"T›‚·V{mZY1½¥±cy£ÚSwTO¹ocYós«ÈhéM—Z¨"&>gJrðÚb¥ )¥ÎD,ˆëš?RÑ . »â¡ÿSalå_á9JÕ‹Òµ‹‹¼ò%–@EŸþ«¾ Ûjýyݢ랬ªS§l_‘xo€G ¶ø¡”…θü_lEɵ}K¥d<NuZ=Då‹Ë’눀ÊrS‰¤BÔÅFõ HúJPsa@F· Š"0O–AŽd¸À ð” ŸE̼ÎêóçS®~ÅQWDŸ„˜NJ½5- ´Ñ[ÍKo N›ÛÈÄ©2]SS¼aV/.l›nƒ›®4"Ñ•V×~†æÕu:ï:êÒÊ&r»(ãÖâ”Zv©Gä°™:³wç÷ÀI‰4hkt‰~[8¢h…àË©†×$'"àÖó"i_æ¡Éë$8tOqQµVRTô‰žßV¡7©ö@¥ú*oÁPt©ý-P0>{ ~ÖÔÙƒö™ÃQ¦ žñ¥) ®$öñtø¶>æ5krÅØIÑBÚP±ÔÂ2ö²Ìãš9îË$cÐdôFS4œb Ñï„hei–:e ‘à¢GÌÞÌ;t½×Æ 1¦d¥¥è`w)Ðè1Éyر¢IIÇJI{wpk ³úKÇž¼úÙ¶CvkwX¼»¨‡&éRä7É ñ¹ž.Dâ•â[ƒëâÚøE²ÄÑÉ#¬?NàRKrÌ|Ý»™ÜB_Øê§0M¸ñV`Åjó ØôÅš®mnXÆ@&RX¿")%R¥Ï«©çðªÞ‡_¶(·¡@ß)ȇ©Ö±¿l®(jâî:N¯þëQyMˆ]­1~Šl Øó[÷wæ7±6×GDW2I:e&”Ëó%;«¤iÜ6dª¢=¬ à…C‰Î‚{®ö6Ïjv­0TÍ‹Pª­ /àX:]Æ£r1+‰îžeâT^ kFªq‡÷Ñ™h-® íÔq†KOPÇʃS'¿¹ ¸¢6º!(u'ô¸€Äc¥™ãŒw#˜ÈšLl]àζYÓE²Í@©â<¹uFU\”ÙbϪ¡6¡Ë÷pHAl=qÿRlð›™t0%E ¼½»Â –ÔÚOQ0Л<$û=ü£>Péq4¯Šû.FKC«Cv·Á—Ý9ÜSãˆ8›zuéóê‰áz~žÁ¸yv”FK<Y • '®ŒÃxhÄ’#RoFLax‡JÈ1¯àà¸Ì†R äí)‚Cáæidç›6®C>§Ø±=AyÈ YbQÚ™+TŽ.6ÌJµT*‘Jœb¹mo°"…CmMƒ¿.Xƒ mÔ¾\ˆ Å 2Q"'bÓL9;ÚD3Í(ï—нuå;ZûÖÔïhý›ônÞ^,~›Q1µr'ݨ˜(ǵ(rðý4æÑ¦PêÜ£4;Ä> ð—‰ß‹utRî—ƒÔ¼þ|×ĶbÍeµÔm h¯%Í hOXѦ†ÍÖˆÅmi37ežµ—Y˜™¥W`í–ægô‡URl7A6ˆn„ÐxµC5D–ÞKM3Gšf@{Q&Il›Äa”ĶJpþØðc[&Ò4±Û&1Œa@{šâ°Pâ˜(±ln¤Díç?e§ˆƒa;ÄMç”d˜&´‡ÓN‡é<6]H±VƦ­<¥‘ׯR»Z€Èò”ÿíêIñí¿oy0PÖåöïÿíŸá´ÿô=Àÿø—|¢ü¿ý“ÑeŽ÷–W{,Ÿ9Òôøsøø£üÀðïñ¹YE#ÙµÇþ1&3'od&Ó7 &º³ $ ÿÉyÀMüÁM, x‰ÿÿôëò¿±û¿Êçi`§èÌH—fèû»ÿáÎwð?÷;àÿýk>QõÿÒØÍÏ6 S‡³˜XÍiƹù[àêofC]ýF‹T¹iÞÝßRnZ¨rs‹\ÿz~ç{"lý‚z½—&Ö±i¡+{ÿw6U׈ï^Bz-v3-t3lÊl´Ôl´Øl´Èl´Àl´Ôlü´ÿ±OüûßÏ̾úßÞþOë]ÿoÀ€÷ÿ_ò±ßÿCm:ܪ¬ÐꀘՆs­ŠvhGoO(Åê­ªwaþ§!‚\H;mPâ±ý`uèXu« ¼ÚòU wÏIµåëÌ ð=I½¡õÏí¬Z,ðÄD:ÀZªö븅ÄË81‘žtª¥²ó.½Ö\€S»x)[C‹†!›BT)nù^­`qˆû1Ò8á«D×MÖã;l ’Ó˪‚ÅËäß)?J5« 8Z]TR³©3ðLôÄ`z¿Ê]öze„¹&JÄì욥¬—Q.±Å€1c$¤W^µžî¦P ÿI{“)‚§– Ej<ÁY·°‡øÁ 16¥5èŸà<í‘I§»lïèG.™Æï¨|ÚÈ,²‹}• mÚ¼D³œ0E.j4°»8ú‡›Ë✾\‘î¶½j@“2J°?‚ÈÕÀ»ßØ^Ã)F䈗é.¶^ho'C´‡ßiÂzkÄ ©·®ç*oXYƒƒ§ öe 9lÐ¥¥k½Àׄ𣠹ØÁ¶ ÷˜õí'«¦ þL ©ð$öaH›ýOÀã×ÙÉ]‚Y.Šé\járœpÊàŒÃ¦°ÿaO» ÃW»ˆ3à+Þnf?™7²Õòïÿ8’ á=‹fÌž¬§&Íž83ÂDJ©ÞHù…'Åö.,¡YFäŒh¼( SÊ|†Ê3¢p*vâ“„«,ÆPé·b°ì§¤´d:ÑIÄØÀ¦ÎCç“ !ÿ"F2Ê+ûhÙêz‚U«‚X‚HÛ‘”ž¬@æPê.f²Ö!C0‚ÃpÅôKÏc1Ñ¥úàÏyŒÂ&Ÿw&dò 6¤¾_äTOVïY‚;—ý.Ûòƒä)€Lq&KF6huƒÅ|Ñf–š»NJ¥ QÂ(çÒÏÅ•ι†4üH9gâ4ö35I &€_•æøÌq9ÅàŸƒ.9ÅàeãTMEz”.s$8ŒÀT\š«(šÈ'¤9â±Fi>È.ȦÇ]ûu?¢gÌÉ.å†[•;áÕ1¼ŽÜeX\:jTN¹\yÍ›à,ÊdT\šWB@ô(Ž/ÈÎ…eul,:ìg»#—CòsŠr'²Éœ7ú´§:•Sœ;:Ÿ½úN¹Ü|sLîè1fQnñ833‹}5§…x¤áE£2sóRŠ3G嘅9Eìkã¡x Vx`‹÷ºÅUÔ'5Ö+a·q[žíÉ"R»ò¬*¸å>”èú9 ,›‰š§®/W"ˆ¶ «¹a™„Êhf¹G¹‹ÜÌRNKMc‚"µÏ ~É.Ÿâ„…z;pD‹ AH}ÄÞ·Fz‘–îNOK7“A/Üf)Ü -\PÒBÀôÁ±º(.Fcž¶ÐhÞÝ'¢oLÌ)ÊGGtN~6¬~Q±)Y&HG÷ «M[ú÷€ôÔô”4SË_e˜Iýi†QôTXàbA;—Ð:±¾¹«1½[ÞNv×RÉelq$M‡…‡Âê(ªª`T¨ak¨Ü¯ÆÏ½1ö+A‘–’´ó"»j˜@=!^€?âP0j`ï¯Íæ3%«ÜSKFýòO ò#~ác?’v*s8}5Wäëϰ¨ÎôÜ>\‚çr2%Ð=Àô¡ª1-nÜý· ò¿øßÿSë-dqJêæ¹€ö‹ÿë—æŒÿ§¥ðÿÿ%Ÿ(ü__Èÿö«•g²¦Êã÷žE™%ÿ)` —cnI kíãbô ÙA-™ôgQì›ñ€ñ·KL¼Ÿa¶âψ‘šòcþZ¨ì2dN´æÏh)̟ј?£%0FKaþŒÂü-„ù3Zógü ÈAüû?äaÿõyüÍ4~ÿ§÷OëÛßÿa?¸ÿÿŠ#±Ùþá)0ÜÍØØó"ç9Ýê2Çzü¸í˜J‘÷K±ÓfYYŒÇR­].~=67üíÕt]ø”ÎÒ‹ @-\0[éÒäA^ÓÕ=9A"Vö WÇ)îÖVw6**¼©(bHÍRfÖ®¤nSææ éû÷³³_P»ÔÑ1¥ ý£U2µù=y;±¾ ”@C§Ÿ­HQ–ƒMGu‚ÙvÊ­ÏkΊ^M¥ÏǛѪÈyEi"U !h‰|ØirÔ-éÁƒ’ͼ%áÎ㪠kG°Žâú‡k(fÊ ¹àby+¢„)³Å¯êÈ'•¡ˆ¹[T‰LðVèO^*rTãñ{T=¬8•º4. O7 yù!&å‚ÝT’âM² #­Âp¿"ô–7‘äñ‹Ê&6H7ž2kk™=â­'äB²š…lƒ %:w¼#öðÑó–hDÇe±Í$,Ä ¬’U“Ye¥,-­„[,fOÁq—d¶°‹ÙÔ ÓæÊ¸/ŽW@¡eÖOoL†^\T¿£®:€µ_ü 5½æÑòXÈ©JG¨Ò9}ã¼ ‰ ð"/I¼òâ|"c­(_‡Ã`Ö.²ðyý³pâ˜û¬Îdñ4Xé)ÇK¥ݑrR£:³c*Õªë<®1WÜyä‘ÕÞ''ÐÁ=+ûÙÖ÷°¨Í.Z ÐÜà·ØßãuÞ¥Š0¹Y!'&3R¦Ÿ…Þ» {â!QÙ=îºw¨b•ƒT¢°‘ÛBWTƒ^o+ñ_yiÚmo&Ê1%ò¶TxVT}o0À„± V¡ *Aj®‚rÝ…mÂ)Ð'ÝR j¢ò°àü‡¯T"e—þöªOL"z}D˾ðËk"œÝ¹tœ—ãÉŸ å§4h+R×Ò'Ý¥‰Û.Ðfë xCå‘,þâ­AyÉÕÈI(ñÔÕd#Ø×Æ*ö#Älj½å‘@$¤€œz\\¨\*ä¬䊽AX%ælµÀã“}„úµ¶8ûUyl…I™|¬q¼¹¿Ë,Ë/y¨¡Óú{Ô!äõ} v&~é¿L¢‚<2ªð12¨ÄŒ"ü8Rƒ—W®¥R;ÅëœQ×x‰3zV\YCtÍJ)7E ¯OÕ ¼â^q÷é? @zX¹7À @Y_D3_ÎwÜ€¬û¤äÙ;Ç_Q‡ w~×!rŸ­¿´…x••?^dEœÆf”Z™¤ôkDߨ¤bcïQ†LmÕŽ4Ånì%ªÃqJáð6´8)÷º€¿VŠuÇÎ8ª¢ˆ«¶‰%XPd8óAæÔScÃ&Ñò¥;[ŽŽ®qEÈf6ó«±%™£º¶µi77XܳP£`ŠHBJZ½À *"¬«¾Ò:„OÔ@%šùŠQlñÎ2íä¸Qª4ØQ`¿“S'ĪYla±H`Ö^"Nnih“ÊSóh´cs¹öf +º„Þ¬™ðqæœöbùB{Iå[øíèâ»Û¥0.M™À-VÇM—Öpš¶þ8E*|”æFÒS´ã5^kyýe^Ä•ÃYm#‰¾ªí“V‘L5<ùúKš?Sá Jr³rÙá«ã|ëYŠ!ŠuPŠ€'%jf97¡üÓëU ©WùŽ5­²f·Ö j(h 8WSæUk&ö ÇœW*ãFô.˜Sº—žEV¦±—Ýôˆ>ª¹Öʯè»*Ôh†èÂܶÉôsmw@I¤”3peV©0ºý@Ð=Ë¡ëi^.nĘ¥JÇI‰ÏÎ(ÖÆÉʈ)y°ê ¿¢§Y[oS€¾4j1(+"WÐPìÝágKÖR¾yymx**àßA,Ñ«íH­Ñu>CM9 .š}ÆêcB{ʃµs,E¤F¨­¶# Ùb92 'X81 ñ ÖaBoR8‚Œ8÷ML¼¸EÌ)RVª­Tð+@·;YÔR`™d‡ÞeD1‚ÖjÓrchðʵ#dÄÁ¶ ‰èÞ¸Ô±)©±MÝ;'¶¯Ö¼yªñʘÑ-,µnª¨Æ÷‘Í-#-‡%`[~hìˆ \´U5?¨zìƒô`X4«°¢Þ°¨w¤H¤£Á©EjÎ,Í×u¥4}x£Ó‘#ËI*ïó1Íô¼gmÃĨ‹çæßÏ„áK2z#ñ?`”…±%Zñ®…"µÄQaQ ޶$²Î&îQÒKšD²²ÈA‹Ìª·Ê5‚WNHЪò)®ä´=x, ?$ &Ϙz´,ó‡*·Nª%x¡ú"€Ò4ðzYÁ9”~‹?œ˜Q¾iEÅNQfªH*Æ=¡Ä%e“ž8Néål€|)¤Ñ¡2¯5ÿ¬8MbÝømã  ™à6³,‹=5IæÁóC »æ#Å®"/Ê æR ÆÏ~Hu5 ‹šzÊÅÙÕ[ùtŒêdàs”ÄfÈ*ŒÍábŠ@§D ¹I]1hЩ®Ê«ÛΑ ,4µJ6n!nŠ·«Xöž^Ò´Ùb…âÊسâ4©©ÊdÃp…¸ŽY+…º^,[´F³´÷ºÙÏbJáKy^^´×NÂ@E¬¡ ö+*QÆúÈ,mÍÕ""YaÈÅÒ\~«ÊçeÚW¹E)ívÙ\¹Òó³ßýžDŠøô}Þ2Tè°sUàq ñÊ0 B}>Hz:‹Ú•‰%ãÜ#€KK,ºÉ'8$@B”¥EŸ1«ˆ‡@!Ÿ.äu—ÐàscýFÈ?ÅÌá—w5D†.ÎfDÊž-çõ{TÝG;PD@£1qÑ+¶¨t^T!‡æ;œeb%?x eŽˆ¨ÚŠ1yŸÈ%‡?6DK5‘óA/¶ D.ìCPÐŽ8Þ†t¦{*æx1HZÉá!YüR€xót¹ÍÌr¸`„ä…7gª‹Z;“ªAu·Wg°°Ñp›ÐBË«ò‚¢§ÓlGŸ+ÓÛxV² ½Y±,=¢–Ü ‚0÷Uãh‰rˆÑ´ú¼² ·VF–£|9TÛ™á³ð‘†¬L F•œ0œO­a5>D´ø}Z4DêÜ<,B‰Êôk¤ŽZ¥¨é¨(Š’èÊS¤m—Ê{öV’|†Oçç¦RÎM…UÉÌúð×Äp{‚5(‰„r-gQçH0¨¢eÜs i³˜›É¨®h¿qYW6Ô€0ËYÍ©Tæë´Ý¨©²/´!Ë ð1`pø÷ÌÂBöHîäÁ°„è-¨…jÍ_С{¦H¯“±$ö)iâ\Fa÷&µ:ÀNM™áaKbç¥%_éµ|!“]ì°“Ð/ƒ(%dl'N›ž(z&øm× 6JUnõi–´ÛLÊø{K¼€vFEãÇ'S4SCÕ‚ƒFöC`ÿÕµ­Åf1u«ÉózE£ž:Àäû¢/*zšûI…Çgiß°]†hy4»Pͬ—±­–Y ²ðkR<_LdCÇ5ÈàDQÙ7 üÝdÏ+ãñ|æDÜUºg´ÁòjˆXÓfPÁÄi ì3Ýœ&PþŽ(ët|œo’ Íf²o—5“à‰¹LM48ÀñÆÃ©ãj¼×oªÂÞjGIÇTV?ågÛüÄj#{Âb»ïrÊ3YSX—ñ+MÑÐãé²Z‰©»Ô¢N4Ј§7SýŠ7N[±eÙº 6¹ÌžðyüU¶áx)]'²{K”¾Š×ÿÏÝOìO#øÿÙ¾™V¸%*Àî/ÿ¯o¿t'ÿ_¿¾òÿþ’½‚Xzjê ³d<\㪤Y¸Â0Š'äµÇ@QÎzg†qŠŽ±z>…ƒ°ø¯%—SN¹´RNLÀ:: ê6цt³ ¡ 1%U!S;0Ò Þ¢èbÄ_lͳŒ ‚úæ†nËdªøFtÓ*g¿VËkçÃÄYåBÅÀ\6{X·BK‡£ ѽ‡ºÿwîû8ZöþW'_vÂ]®ñýQm@¶s@àŸFî8õ-Q¾ñû¿F¿þQö?{þÀýÿW|âÔÿ‹Ãæ23Òú¥Ù³¼Ár{ØÉ3²|ž Çefy|^vÄý^9¨_j¿ ò¶eÆ¡!¶8úÍ`‡Þ­ÂÌKöë+ªW’þ¤l g&’¨Å!9ãåsl.ešaä£Ã}°i¯R a¶9÷ã·9m©ÈÙBÒQ$¨GÆÃÁv§O) ‚žü‰£ÔqS(k,hòô` b4Êcç ÁÏÑ¡.øpÀYåέRt|"SOܦö_jæA‘â"stN~NQfžYX:2/7KAÚž6ufˆ4—9Ê* "5Ô«g G±OsQ)ûQà‹Yz‰½±å~L_µ0}·¢G°E¼Lú÷í›ê2GBaxz|¦i¦¦§¥¥1)—: Ùff)Ò zuž]Ì¡®mpbò1I0ì­áà|C†çÅ^¸V¢ƒE´8¬d‰¨p˜0 ·7Ä—+ˆq¼÷*œ)¡yÄÍÑ…yPo9L'ܬ <Š”C~J (¾„‹ÃoáBLvRÑ~:ðxûË-¿!~ëÔ”±×±ErO7œKh-PÃ_ ¬&B&”˜Ï¦ZÛd@‰i{<éÚ3‹ý²ÎC„ÏäUMЬ"(Zl¨#kBˆ²:pL£ßëãc2òÄë©:EØòWÐ˪"Lô°(†ØÈ˰#²×))‹ábŸaSHYí¦ÙP;Áe[8[—µ„vž¤„Ä5LH~]-ÙQY1Dhbl¨åZ)©Y^ø%O‰wX4& ¬ÔU€ Ô3ŽÁY‡rŸÿ‚ý)ÀÉaFªX@H[b‰³ “ªŒ <º LŽ2lgƒG–€'„M{Vĉ(³ØA ìè±Y¨’ȯÈìÄËìÝ0•R•å"Ôçñsó‰.XŸI g×al˃)Ú¶uwÁŸ`ΈnõÛ€Ü6$H]æ<0)k±‰*ˆÄ[ÚPÔÖ×7”'lÀ"ú¿Úš1ólÝ$<AG %×9JÒKu[꼡êä!¦¤Hæ™§¶bДÙ*WYaÄÿ"à4½aí«ð ?“¶£ ÈýX')—[ñ#‡9v˜[P”ìaÚØš)~oUØßR`ûŢ𯿊©´¶ˆë]Yp©ü–6³6ŠXl•½¡Ì[aÈ … lùè²ÃWq=„k‡fñ{V*h‰8fÈ2è9·Éï\ûë8[ž¢rž­aøxI:âªó‰Ž—è¥ § x”§x‰,0ÎTájjcŠ€¢ hBOëFä‘KU Â-øž–šåáU™øLáܲٯb›Æã6UÆ“}÷\$>ÄþS{Žo&ØŽlG¸Øh0Hß t -Ú/#ûËá«b,ŒóÌ5‘áe „âU×°'ìÆ…×±Ÿk ç‹L*nÁ¹fè ÈVå3&¾ÀÁ Íµ “¡j€ã°ð-Gê,ö„uŠ'™” Ê÷J*+Ö¶§©ð˜LéNašj-ø}ªƒ‘!¾N‡‚ÀE § º¾–:‹'ÛÒö×ï*J/…å§Šˆü4ìxmh]¯ °eZ– ¥óä"ìJ;ˆx|QÒˆãËD¨a&³"<”zi„µª %!8 `ÄÛØ|3}ƒ¾2l›Ë”?Hìe,¨y–/D«@\pe¸œ[žc„`i ÚïrÏ Ìæª\8‰‡m‹É¿tãöFŠˆˆ(†ååL'P‹­K9OYb³Æ´+ÁØPƒëɬ/'Šáù`{¥3H/f?¸tMÓ’Ly(‹†(ó¡zƒ24 ˆXCi14±íÆM÷Hôí…Mb=žªcXض}$­ÌªçFzë8êP®±”§sTºUÔ9¼TŽ0» ü¾ö" ‘vLtƯ,ÖÀ¥C­;…3¢á‘¬L«q(£e¼çlüñ ƒ¢ª ¿…]¨”6—ÃZ„c«Ô£(]W4c¨š¨î£ºi4AÝ×”¦gj½Pk6šP*×I¦xíG…£½ÃfÊ®ÿÁˆ÷Ê—5S¹ùx É2;ÒÐ ºÀ¦_(ÕÎ#·¾Õ?K€=Ñ!fö’éY »=dT¨§ `çLÛŒ¯) iG OÒF¦‡á½•Ô ¥ð/K‘¡äW‰6§qV€Å°ïù,…DÊ9Í•@ĸ_ÐÞñJøüyЋT¿B¯dÛšwÀn«Ž×‹—"ùœÏS¯Bظè…ýÚ6œ—Ûå¤Phû‚øöÄxFA™E‰ÜÞ°IEð8î~ÅYÓ;¤´éjNJæÜ­FÔn&µL‡¡qØõn; ÒÛ D( œ^U¼¬ ÈE ѽÑûT(PvG|‹ WÓý`ai"1j†áùÔ a¯ðmÍü-‡§^ÈJ:“Âú4˽ÁòHMaè¡h“u2ˆQŒrfyœîjNàì)BCgû±œ)1nA ènØ÷ɲ‡lhPW©¤3›Y˜-¶ )•žrPÑ!gÎß!`—Ë«½Ö‚Žº¢'_ÊxîÑÐ4=‚¶weR6д${/=hQ¨U”Û†J,€cgÊÀcó5PIöA_ž\º0 2Z¥ŽÃl„0…OOWEŠ®î£ÔŽ>N–¶wu<àšæJ‡"ë ›²èäÌy( T8×îyq;vZì|A¸è²¤g‹íÛèÅý©!Þ”™z/pB®,4fÀ™&šr#Õ]ùB$3ç°Õóø• ªOž×©7å÷ úNk¦‚¸UÕû_Xwc\†©+Â@­©·d.8¸ÝØ×të %qñqR-C¿ý‰KÓUͽ…BH ¿9&ÀÃÓð0ƒ?i¾¢]J`ó( §‡R×ü«‘³ÓÓârè‚5èhgÅ[òf£Ri|¨Ï†yʯÐc…‚RŽN£:L210aó ñ-Lo<&=£Œ„øY¬6ÐKä!ºØäóv#¤8ýº$f‰2që+¢(©ÿ°i'•þ9Øã#­;ÒªëTÈø bÊÍÊÜÈ©ŽÄÝL™*¬éŒTÝÖŽØùGBpSRN™G¤%ð¤Ž(¾6Rì!+TwN"3 \{¸ _0±1ô"÷™tÎÆO^9Ð=È9œ¨ç×%&»â‘¢7§0|"³騛‰rKqnA6.ŸOWj5xbœLȪð„=g2/zñœò`Žå÷ œM‰Õ÷BÒI4Ýh•D)8%¶7âëcî”ñ"RØD~‚]ä0u‘T-<(›±VIT©27/æ i€÷lôñ4òìs©™ÈSoÃL{íAzƒ¡ÑÆyê Aˆ¾< €óг|_*êÕ²Á6¾pÞ°Ì›!N£ÍÑGcìµ*Ðc ý`SÍæªÙÂpyžϧ`Ó4FÕPuÙH™—‰@Ñ)Ñ"c ¦ÓLÔû“èN†åtÊ(¯¹í‹Ã§© WG‘*s1ާ2Á2浄ù%­™TÒûf«¬o2„óPÿ‹ˆ°¶#>L=—Ò€¢èTYφdlÕø=ÉÅÇŸÇ7`>UH–ÁVò̱3]iŠí~:Ôp“Ç6À7 Çÿ¶²Í¨DhØLz¥ }H¨³qX Úq¬u‹a˜MYi°‹€<#Ž Xß³²fº(2ÇS##áÚÙêåPëV±è™0½”æeu%]ß/x@ ~Š'A¢%ð!kd\‰·õ òp€­l(Á×é '»Ñ\“K§4Õ…FG:Üdc þàúÉ¿Ø4yëÏãz¦)Êœ&tcè2bnnOÈUñ†]Nâ5kúýí4§¨‚¨„C ¦„+*T°¼A±·†öTt®Æ)!\¥CÌY–U ¢‡m)ymLS]eK0G+OYˆ»‘”@5í˜ÄØœl"'CWUr´=šV¶º!®~$ícNú¡ ½Ü®‡{É"¡Æ%}ÆB½&¹iÕó`Š!ƒ½—4®tµO¸C›¤coq!ñ‹ÃàG¸:‚:n õ7ZÍÓ=óbWÚ„â¹¢~V—Máe%Ì4ƒ3ÇØ)û0èú2öÁN Q„t NØÇ”BR˧KLg&(,_%·ïjG…DÓî…y¶lHµ¸Ú=á^C,Â=i² í¢bR`Oñ~”ÇìÙ{ú=Gú–O¤¯z 'ÔíJ¸´ÉW$]v@ŒùQÑ€(íØ¶ö”SN>¿±å4ˆ¤)YRe#m³˜E­\ÐßxÃèã1 ð?Ek…J$"ZôÃ¥_jœÓ+XE•äy„ Ûy•_Ã$›/B[¢=UÞN†a†fG>°æ™.L'J¾HÜuä…ºí–Ï—¢ ©:ïTúº†¾µÅ>Š,šú“^!P\ÂSÅd´/§Èm£ï2Ú_‘¦ªÈ?KND¶çH°z|ƒEŒ­±uórG M6Sbo™/Z¬©¶„GÙqT5‡&r‚€ýáAVÜgE6DÂ;Ž.d©Â±ÌïðšÑQƼÍxÁ@„¸L¸fYk Ä Q*”¾bH-ø¶ê874x¿k˜ÔD*ø0+- ÕQ©[X ‘“þiã„è‡ì~8uv¢êdb¶½€S„ÁÁ/ö/¿R6«Ëùr K»ÆU]ÜóÍGmpw«¸ñƹ ;Dh§“Wj|&d€CY÷°%•Ü…(*è¾ij’]a,‡Eüe>NÀ§:P S”°/º4lôÔ«qx)Rk<æÈy¬#¨6‡P¹“z`j†)äY/C}bˆÉV©Zxçù«ÐH5$¡SX`-t+&Ödë‘%0Éñ0Gì¿XfËHŠÌ0=UU0K¢Ya§â80<£!#ʱ˜$ÌãFâ3ç|‘ :¥PÃömã#=ZÉ–² 0´Þ‘áOÖÿ1ïâ¾J¯cRÌN‹¢Ýàz´%.ÆGËS¥éâõ è ¿ƒuBø„n‚Ø„¼9=>¤~j²j>~CÁW´gí},Ô§¡ÄþðK îâ·êÈýAxÐdâŠjÂkÑ+D¤©6åd+ÒhP¢qÑ5 ÊæN6ÍlΉŠê†dhQ?‡ŽñY$¾À_ιDÄc!ª2„7¸Z/!ízÁùÝ ^«¬VÄ¢š4Ï6—©Ïg¨²Š ›‹wŒ_Cü­ TÊ-JNb*Šº B÷ÎËK¿JÃn’ãNu èÚ±)ó[Í΃ï1¥ï,hØ#Þ  Î,Ì”ôdôy«ÂTX¿Nº$Ñr2â›9P=º“ÎëäÆ0vÊ9:‰RPIC¾<$p2j pè·R$Ó³­0^…†¸Ìw<Çë È<ƒË3Á7éAÂJÌèb¤ÖW¦Lne”Ð×§MìfÀҀɋæ&‚Àņ08†FCyÔ:¡üèYs<>âÑÓÀCnsÞ = µlŒý3ì Uz¹FSÚà^s*úì"Õ› —éV–r¤ÕÔZè¥×:$‹IÛ‰¢µ©ÁÙëç63í[]%ü.C³â…h“Š@Ÿ±¶óÒï¼ÏÊâunxõµ -‡~¢ˆ;ÄŽ@ /8fº€>c’Ä §?à|ÙâÐ:}áö›‡—†üŽx0AúÆòW…«“¥áhs±S‡ ì0è~=à4y8_kXG¬é§ h}9j×Úãd €h{ c.Žã(Ä%¡Zɸiã¸ûûS|ª , Ÿ:–»±àþ^çwß7â+íï62¡îM¼!K?8Nc Äeˆ™ …ñH¡¾¿‰Ü<Î{‚¶4©¨ýÙ%ÅE$ÒB*TƒÔ&¸SW:»)÷ áâ‚ù£²™#ç¨êŒá ŒÆ‘´1ÊdñYÚš˜dòœW¼åQÎhµ(´£=QHÒÛPeBdÐ@Fxˆ‚4upT±‰ 5†(™Ë"UU’²ÔæDW¡™ìàôBÓT©ŒÍ_Ì ÷ºà €»9¬²\ô‰>ì¶íŠ1F—ìw£ÅªPš„è’Q!ý ·1:ã¨F(*T¤ž¢¾ Œ%&}¤m5²¼í¸(ÙŸ˜<È‹!sAI|Çáõe*X«D†%(ÿG…$2…B¯Öb?j=~³1Õ>j˜ ¢-<Æ"€Yuà)‰hl¡Ø ޾ˆk`±Í‚dŒ¢EË?›²D¢[qaWŒ)ˆ° ØF”`ÀÕÅ'G3Ø´t-¡A´BY<¶ò$j»ã…%òj49#¶ØŠ6J&Ã#A‡D˜î96§L*x`C‡ÁoOæèT«Ú,ä*“”4<ˆäU쪶› $¹^è Ô&Nl!²|èÒÑ<àÔ…,”Ð^K÷ÆÈJ 5ÓhSÚ ç¢:t¨Æ†«–AT­Ãˆ£‘ͨïÁmíçÒƒpÕÁ§acö-ílM¼Éd&lˆÍaSá¾ãÀjIúÍa’äÚ×”oŽ’Í)a›ê-ó’øöV!Ø2ì_âêŒ:”o¥Œtá^à œÜãh)rd^Tkœ[ÂLRPÚ„Ñ $™æ kbÈÃmpxN…ã ,t ¸ÉŒn/ON¡#J•›@»µÌ˺$€‚E^ZÝ$`a$ÜZà¡S=+E õ÷¸„AH ÞdF0@cÅQòóS óš"‚M•uõÚuzŒ3f€ ³ýy' •¸ Šâ7ê™ a9/'%–¯‚wÝJ&^º AW%?²X«I˜W£U/•eB¯ø> œ;lÚ£3^Œ¹2‘âÐsüöQ…zÛ꜅«% ‰(áMµ݆ýTÙ‹´Y@6S.âr¼„ÝôZÄ‘§+ëQPWÒÒ ¢:Wƒe1¯r‘±ÊvZØœ©¨BeŽ4, ±zurSP¯he°1ñ7ÉQ•KT6…"PËppˆÒ\â¾€­”$¼ÑXg>‚üq¨¿ËL.‘ab)—u§¸$žÏÍ7'å–俯ö€‰£(wô˜sLA^vNÒuô)(2ð‹Tz<§Ø,,*˜˜›m“(ÿè(ú8…y4¨ÈcN.6”3¹°èB²¡ dîxÖáöÇÜü¬¼ÒldÉZÈ/(a­³±ÇJ pf þ¬­¤ä(gét¤±•N׊¦²h:Í k„ÍwQnñ8“€Ïë„ÒLÙ›\ÖÆøÌü,\'è…¶Ž0\sJA)D*ظó²m“•cfçŒÊÉ*ÉÈV—=É^S\:>Ç ù..Á ÊË3ós²Xá[Å9Es³pŠr 3s‹¨lfQ´ROWf7,Ûp9a ”æÿ {~B)OŒmdŽf› &“}Õë>)—½Êp:ß…_aP‹?…m£s|æbf™bÐö`¯•Ô-ö]Á¦TmÎÌ‘0#áÏØ-Ö6!,QvæøÌÑ9ÅÚ&ÀWs6—Y\˜“• ÿ`g[­uëž‘UÀÑ„RXEö Þˆ™É–Z€}HKf„½–/ö{7?–r9“Ô»£÷Ÿ™WPŒ›-;³$Óijÿ™Ãž6ŠròÙ|áqÊÌÊ*-bG ž€o°Þ—²Ã–›O‹snQ¶N×Xeg HvÎDs•|²%¨„T^;ŸéAy"0ÈQ®è”%î:ÊêQ¸ ‘DÏYŸy—ß§Då 6¦6¡¥¡ê‡œªò1' ñ†—Ú^–àÙ'Ú];¬Hà&!‘AƒslÒ°áÞpøP¢˜eÀoꢴ*¿‡ØH]ñHû!×K¶2[L¼$výk•¾e£&nAvý‡<•`{Î ¿]#†Ê#h—!îP”„òìõ5~U ‚x¸šÙc§gÀ¦° ÎfKà„°D˜XF¢ÔIÌíÔÚe˜ç@a¬jNƒÊ#i% Z߯CaQñû:RÅ'4TÑkdñY•PÚCÐdâöC®ŽáØ–½ÄP@À goõ§IóNïå¨Òµí¹!2Ç̶ÕHïÓÉ%±vœM¢qª:3 ‡Å!›ZÛ¨n7„«íØ€L§s§)%–û[™ö–dçµHŽVêݱgÂQm Ú­†4A¦(T@Ê%#XYBÅQ(ÔŒ!¨Ï³,Q>Z+[Oð+§¶À†OY0•² PÎjã6&F#l@^±¥†¾Ïcƒwšºž¶ªcrf‡€?ˆê¹\ilÇY ÄÕÔâ$ÎÚ$àdÁÆÕ Þƒ›«šîQè ¶:Ûw$~6]Äo]‹ìå^ 4Ð&äÀÀŽ{ ºh`&‰|K™Q/J YÁdXKŒÆ†À°ó‘Üìî˜îtå±QŒ4‰g«cõÀÄã΀éè7›¡!<-¾ÇžÀ S ŠóÑ„‚\*k/"–zÕ`‚£8Z@œŽ£‚²Þìh)`t°ŽøÎòÊBÉ¥E¡f›Ð@9ÆS>Ë âžJx5Èa›«¤‰®€¸ËLc·sÐëƒÂ5©pƒÐ\P5%äìÙNû«<¿þ»Þj[¢ú×þë¦HsÖÿJïßï@ý¯¿ânB¦’ !hö‚`ü*êtˆØe\¨PçÁ£É#´.º–Ùž'Ô©Kð 23EO˜PUÑ= Š NX´ÖæNa‘(dpb²‹|øŸÁo?y‹»L ;ëìì1¨öTÐÙ ˆ·ËaR†Å5{]ÇÆh½åóv6©bÉϹ·xü¦ˆH%ªy˜Uބ锕‘ Ÿ”…hpÔ‹U1t0Ò«ðä䘌b¸v„ÿ)Tí!½ARzý¼^Ê^ƒ\w¨4`Qg‘è:D9˜}$¬,0ö¹ß#[8;\ñ¼&÷v› Õh'G,^بkÃeìOUAÃ,¿ ?7T{KÎxfÛ]ÅcÀ݆of)ë}Q±É9Xíže¦â~€¬¼ÌÜñ.ie ӀǨwàeB›3ø[ÍLôW w« ¿¤ˆýž«¢ùUpE¹¤¹>ª¨`¼ËàF;ëð½|òzõk[îã¦=»Ù9™y¬­bðpè»ÿÛ‚ëÀ§E>ñï@àX¡ÿ|ýÏôþi}ûGÕÿLK;pÿÿŸ(—{Ô'³ÖS®,ÔÆžWU™}3ÖãÇ"é©©q¿ÄëûÖÕÕ¹=øw X%v`¨Ñ(Íu)Ⱥ¢v‰d—¢HsáS:é56æÖk“K'\¢ ~æ`àíQ7'"µ‘FAéÔ” .ÎõZê¹– (°ƒdôP(6Î~‚QS—v ÎOÈ€Õa–¸Fž]ÖÀÛ‰õ Á%€Zš\ê†ÐÈ7s°é¨NDüÈCÑ PÙ˜šCÍP(ÿ$Áýœ×ÊÅsbñv=ð[rÉ€k‘gØ™’ ‹›æ¬z¡cn6GaÐT žX£DÞŠà™Nò&ÓWuÀ$l•޳rg%Ïîã­ð”WŠ·Öxüî Ø1Un¦LT²Ä¶õ™¡4xp÷xYOpyBÕÞZ {+è)—CÓIýROJ6…ÿCÃÁ›ÈèÕ00Áò C¢EÖd™åg“€ù;¶Öµ~ª%Ÿˆ$"üþLLÖWÝãÇ9™ã­ˆ@[ASß¼Ž×Ä4rÖMà5£˜5Ä{‰°:‘àðŽæ ª¦²'ÑôÔb•:>-ªRš¶W›QÁ›¡G«¿Ò[ jF‡êzjÜÑ]G˜+üŽ-Gćç hó‰ø…ƒ¼‰þTʇ#Ä›f¨ XA×»%ùe‹ E5ºa="3‚™ÂUá­'nüd5 Ù +Jtîbï‰5|ô¼%šÑq‰ùNBJÅQI²júèü”9*³×ÄdWUIdÑCøW„œ 0¬Åf8?ID¢í4ñÆà–C<ŽKƒOº4E µ¢×™‘2UøZ踻°çœ—Ou/ªŠÞ,b•ƒœ›8þm¡+* •ñõ°ßË,6™•"¢SyiÚmo&Ê1%ò¶x!–!Þ&=æ.b‚÷á>î_P>"~"…S Oº¥&Š'ÎÈÃBÈW£W‘”]ú;&¥¼øà»§|ú/UôB%ë5Žp…”ÏR ŸZR%i+R×Ò'Ý¥‰Û.pàžÁï QI xc ÊK®FNB‰§®&…ª´UìG;1~'8 ™Ó´GjGKg[QÔˆ½±PK>2¤égÕ}„úµ¶8ûUyô $Gý¥ª,ŠŒJ±NëïQ‡E"’TÂÜ(‹R;~$ˆÒÝæhP«àµÊY+“.ŠížÀ˜ÆŒvÌt©Œ±cm‚l>]6€‘¬µÂlfÄöc¢ÏWHnªÀÆÃÓsðÇáÖÓ"\Ĺ(Au›Ëim!¡V͉–tJœ:RËÇ¥~É ¢|³ŽüޔŨ,G½1Æu޲…¨¯¶@…”Íóu’T")rᩨµžì¬ÁÊ‘ë.• :„v4ñ<À%`ù˜ø¥ÿ6>æMÂ2÷”‚PbFŒ q ¼¦„aÙ‚M[t éYmpeœu^Ÿ])7uZ‘Ú!âý^q÷é?)”Œ±dKâÞ…D½AçÄ€D²ò$^¨€”<{çø+ê0•ßu—eë/m!QÐE.J˜'E™(5B¶xa¸'© KêÖÁ@(”BÜ×¬Ž I)þLDøž: ¡I¦Ô7Ið :¯t‡TlLÀ™ªÈ}R픫őõ~õ ;‘ìU X¨LÂå'%FA¥Xwì Ý2ùW\µ2°…(øæ“³ë%¦!’Ép›E6ð’Êí–’Í)…lA"]5¢å9ËЈNØŠÍl¦+<Ž$sR¨­…ÕD‰1qqáIv0®é‰²â¶®úJë>QM‹†˜'ùÎèB$J•;JT‡o¬ ¿’õr$Sb•#±¿Y/=„ †yøKšð ïœöbùB=œh9¸øîÆÂaèM.M™À-VÇMàÓd¦£?N‘ g>Œ¢œçy×ò´ÖÕªlˆ‘D_ÕöI#"!¹þÜðƒ¥NÌ/(ÉÍÊId‡¯žósjõ ˜Ê­½G?]šˆqR¢fVÕºR“SÖ˜’IMGÅšVÎaféÓÏ…JÁÕ”yÕš‰=Ã1ç•ÊP Œpê©fDŸ<­”L5XtÓ#ú¨æZO¾ÓvU¨Ñ> Ñ…¹m“éçÚî€8‘”3ZçèöAWô,{„®§y¹¸mc–*'ÈOÁÅÂÌðª>)ÖF²•=åU ޹èiÖÖ•2¥¥“ÂãÒxõS=0Ûì×½žvÏGqm* !¿@Š©íH­Ñu>CM9 .š}@*éc ŠZA–¿""«¶# Ùb92(t¸j|Å:Lè­âÅ0k×¹ÿqD¬¸EÌ)RVª­œžœþUÑQ\qÉ‘¢wÉ*¨ä¬¦åÆÐà•k/FÈ(ªäE 2Fo\êØրئˆî“G ÛƒWkÞ<Õ¨h•í–Z7±&б”¶Œ‡%`[~hì( ÚªZú¯Û,%†-X4‘­ Òa¬î%$Ò¿ÑàÔ"5g–æÆŠëºRšþÊÒ¶9r$ÄÅ nši&ðCXÀRmŽ)êÌüûù0|IFo™£H]ˆã‚w-TEEèhK"Á˸O•4‰$„ÈÒC‹ŒX»äCÁ+'„Ȥ%®}íp}û3Q(£Œ°LD•;N=oT_DЖšF^/ÈD+·Lþc ÈEÃô°8­®e¦ê¼zª”O;àõ°¥–B!Ñ2‘//äxj£ü³N"=~ĸh¦¸Íl[­ÆI@-ìjYƒÈ_GXO¸Š” )¼`.µ`üì‡TW“D:€ÓDÕŸ÷¥mq©V_¦ŸÌ,Î-“ë@gñT-,oCkñDUÎ;¥FÂqäš›Ôç"§:M‡™E‰X€àæ–ä帡•¢C´\QH¯(\:o#:]ðÊ­òêØ©e*,² íÛE«Øéç,ìT½÷_Ï‘ò÷‡B‘b‹àâÚBÉ.Áx6Q¨ë¼8z 5Mî½nö³5²/åy=eÈé†Tt@Öäl`ìWÈ} @A4.T$+ Uþ4—ߪòy«€o Ù%£Ý.›+Wz~ö»ß“HQŸ¾Ï[F¼°Ð¹*ðGȸ…x%ðM…C}>HzÚ®pʈ%óyË/¬8.­§ÆSe÷á#Ã&‡(pçÆÔ¢Ïóæ¡I€HÞ¨Ðàscýwubæp‹Ë»¢ÆQÉå0›{Ù]X ¾˜š\Õ=IÆÄE¯p8@Ê9Bšˆæ;œźjk=U–KQWz¼>ÄÀCLÞ']¢2j,$f‹ËmóA/ž#J3ñVF9âx񪔩 º>”¤F“ À ¼y:ƒÜÀvÙÑl&ÉÔ• ™©.jíPLªÕÝ~\ÁÂFÃmSì™ðLGÎ_=Øî¨~ër°–<ºAE¦ î;«ÆÐåÔŠbè|IuÌi³4z™Þb ÷0C’ÊQ%' çÓÆ¨$µl@´ø}Z4DêÜ<,‚N\þkä§‘b”×$…ý(£(J¢+O‘¶ ¸O˜—¯Fù ž³ïÀÜTʹ©°*-?'ÄZ!Ñ®sO°%‘P®å,ªã U´L¤›@îDuEû˸²¡¤Ó y‚_«Óv£¦6ʾÐn,KþžYXÈÉ.Ê“5æ2y4!ìt}q÷¹Pã‘WH’÷iµ¸Šc*«Ÿ2J‰2µ/,S¯÷9å<)¬Ëø•¦hèñt-906µ­dþ±çnÆÓÀ›©~ ŧM¤_ÚC– T/gCóWE Dg$ûÈ>î-Qúz(z\îÿ±\·ŸèO#øÿ_°¶ü/Àÿ§§HÂÿ§§ÀÿÿŸÉãóŠ ³´ ¯"?6©Œg]“ìw|;€\tÏôùaÏe÷’ÏçkæfçdŠòtÝT|çSN¢0K9ØHù«?†#“!~ºÂ~Óš—“•Щ-•„Ðìôƒ˜Ïî'ñ ¹)-‘lÐÌ4ƒæ&43µ ’ Z"àÏ'üñ‚IhvÚ@š‘*м$æ¥451 y)ÍNhVÀOhèK€þ[îßR@ÿ–ø·¸ß>mÀú›è7[Êß\ Á÷[¸«å?Ùo °~‹Àô[  ß"Ðüå7ŽßR@ü–€à·øþÁî[so6ÏÝL$w³ö-€­oª¾ùúÿúä·€¾ óÍÍ7.ßl |ó!òÍÇ7ß|@|ó ðÍÁÿø{³±ïÍE½7ïÞ¤{šû£Üÿ8¶=ÝÝ,\ûB³÷u7ÉnþyüúŸC­7«n6ŽPÏpÿitz³1éÍB¢7 Þ,Ôy3±æÍ@˜7WÞ 4ys1äÍ@Ž7/ÞL”x³°áfsááÀ›o6ö»Ù¨ïfá½[ém6ãÝ2ï€v7Ômþi8wK¹µžýI÷o· r»%0Û-ƒÖnœv3AÚÍ€g7 ˜ÝR˜f±›Ãnv @¯[ tÝ|Äus±ÖÍGY7_ÝÈêÀT7MÝlu3ÔÍÃNÿIÔt @¦›d¿ÇK7&Ý|€tó¡ÑÍE7Ý, tK@ › ~n ùü߯Mýÿò‰ÿƒ…›å §ðŸSè€ÿà~øÿû¦§¥Ûñé <€ÿû+>%6 ¹¡|N™M¢;ÀÂ,áH>£a&\nþ°»Âç“?ôÏÀ™~!~ö’?Rï¢É¶ÿÚ=ÓÏÄ@´–"±[ÁO­WlÄ™ž Ñ BgɃt¶#SØ¡@Žó†Lvó›‚J$¢ƒÛîÝ&…Žì†ß”Qµ)ðã„¢yYtëŸpjª°¬Ý[ÏMñc+<Ø8ÅánG=DMk>]e¦*÷ˆaÊÔ ^þ†Šëï╵UGTÉwŒ°iã¾ÿ–ûb‡hñËžã_ ’’J^Ê–~[¸‚ (ŸLð7‘ Á7…é§P¼a*ãÖé±™jTp 5Ev³ßZÜ0® @Š dHÇÒ¡?¦½†°È$:ŸÙ:B«C Er‹cWY ryEãrK¤ ·*T“T•Ìè’M©$)¾füùJ’ªâBQŽ‘[Œår²c[Ȫ©À¾U¡Çê_¢À¡Võ0grë/–þ$s9ºê¡‘´ŸQ³yÍ*-B3—*ý,fV0Tl]PsI•'sЇ¢Ú!„¡Ô!¾˜5Áf£xü{diq.ÎKn>ÓxŠJ AÑI6ÇLb#g}„ª§°XÙFA>šôlÖ Š°BF삪F€³JôÇ ÔCAQ‰6F3?gt^îè,Ë©•“H–å$róy…°)Q… ៹ņØu²€bŠ#òé>+òßùD비âOɃ{9…)GÍ+þ”°ý/-M«ÿ4 ÝLMë—‘‘q@ÿû+>¶ ÃÈÍ/f‚2/+ÄÀE”ÆPl kÙÄXq‡™¹zÖH.FyÊÇC ¨wº¦‡ûR­§|^éöô»6G©‘¤|a)UfÄûž Ä—4ö"å8ò±P=LÅÊ‹ˆH§( ¡½Æ<ï pDž'DFóÙQù4çÆéšén³ Ö¢„G?zÐgRAuÐc|¹ÓÅIj¨µ$UŸéîBÀªæ¿`V&åžUWPñµ}Ýæ´¼š2ó¦ƒCŸŠÿ:‘B\˜Y2†é?s¼Á€3N0Ç$Oa( æÔ&ê‚}…P3RNÃ@R¤3l}‚„抙*vÊÚ÷EPm;q¼YmyjÍ÷,ö ˜:öœ*³Éâ“à—Ì‘¿FÏHÿŒ”2¦òÍ—LÞ-r“2™‡”Ø?ê!€Í´A¦a‚#5©u, P+ͺ•H)´.‰„ MTãûOœ‘ àò€_Ô>½!öF‹j*âš…,¬¿+Ýçöqç²ÉÉÍJËèC½¶õ}ÔB…'̶%&[E•ƨ/¡,WŒõˆÈ‚ø˜]¦,‹^¸ :¿f×ë#쉸ö4°‚ÐH$,GÕ»õ¢•^XgÂçeñcB‡ã®õ„«‡ÉAò!òçå!~ƒfÎù ú­ú†65âÜåÂ\Ùª/ãqÅÒ¨jÖ“¢wR2@5ß0Ëäâ ¬‰ßHm–5„-QO—ÉH6PöÉñÏ 4Ï,mû^ɦÊÒ“,±<5Ô·ÿ›ŸhýºjýU-óŽÆõ¿´éýú9ô¿¾ýÓøÿþ’Ï¥…ù£»=áøvÉ“]Äþw>ü‡öì¿k†{^eÿsT8grX”qLȬ”1Õ ‚EE–§¢aözkhBÂq¹Ìª­ÿ`ÛôŽ/Þüô¾½¾j|úbÏœ3.ºsÍÒíNxÝÔ'&N8ôIÿŠáÓî|bÓ»—u>kó3“~ý)wÚã{NßsÿeíN)šöÀ;S/\uï†{—¯éÿÚÛÖW|º}åö¹½Ÿ^<ä¨Úàµ]å žû÷3Gžüô/ýôûsûžüû‡¶mu™õãáÿx¯]NB÷q‡&¬-j;â‘î­ ]üÇôÅ—µ¢Ojç¾ÿÊÙ6`س»>fù‰_é¿ü›6|üüm_¯øfõsÃì{òï>öÉ kæ”÷žX×óç3‚·ïž:¼èÔ[וÒ¾tÏ9Ç=ÑðdqÕ9ÞŸ~Û^ÿîÑ}6¬¹ü× 7$Œx½KÁ-“Žøæ×õÛ‚¯¾]üÜÃ{VmÊZ¼²û+a×òÞ­žüíÃ.O®9óÜÈ´ü„îš»fçˆ Ã~¾é›µ§ÞpÛ ý__Üåú_®_õÅ¥‹VLhµçâao¾ýÎÁÏîÛ}ð¶ï#s7yîÿø½³÷}pÚ×=Nð\áæÏ¾›»mÙà_îÛðë)¯ÝÿÀ˜®9òécFO}µ õ÷Ïý«wÝm~>ú¸iôßñæI÷½±1eØìVÕ“ONÚ}è¼¶Ï^qæû¾Ó±`øOÇ<ÚS5õõ«¾~ÛNOXþeÿüv×§)ÞàöOž_|÷¤Û+T3fQ7óÈ+GžØó­Þ¸|ÃWNÉ{òµßßê³}ßÈäy¿pꃭf]Úné²>YW™]žöÙî OxöõöŽp·Võõ€Îmª°ïëw›[÷Àì¯7täI¿}Û”àÒç¾|}[è.k÷ÛŠ+>»M×m3çç¦ß5áúewOßzýE½«¼»»÷;t¯µdãÌã»vÎLêžÿë3+Û´IÝ6'kÊîºÂýåE‡|_½wCMU»íÏ ¼&”poîªgÖ‡v|ùê¤Û™Óšxß’gçu}aK‡¼[GÎp/™rÁ¡Ý+&Ÿâ¯ß³ Ó{Ÿíóì7^7¡pתùgÞíœG·'´«8ñ°VgO´i×I»~V÷ýAO ÿ:¡zÇœ¡ ÿ¾§÷¤wÞ)ɺàÍâY£¸ó·õ%oÌé6¿_qûÔ~;ûõ×¶¬\øÐÞzŽºcBñu Cž7îÔúsîhU<½¸ÍyYŸ;4¼fßooÌÞ7à´×ŽJ˜ùàÙ¿¿añùU^¿%ëèç~fnšX:þ™Eƒ&%,ïpðô§+þ}ùûý®¿~Ó;‡tôöªÃÏÝÞuªóž¿=m^ñ=%…gœñF~èß}Ÿ0p@UÂò.;?~&¼vì½?ÔÜ2½ö©'{¹Nî[ýÄM¹]æç]æßÚ)ïçŸ|—?å×d;fàEÓ»ž8öúüޝyó“Í]Îýá9¿œXø^ÇâY÷eÞ1± ‘í«×¦Üp§{ÄÉg\Q¿aQéôO&Ï|ì°ç/žñ^¿Uߘ=´óÀc>;qFnoß“Sk ·ôÚse§Ï^z¿ùùÔa!ÿ° .yìÝÍoî<¾ë5\öÊ«Ûf¤÷<¹K›K^¾®ÕØ\ðÕ€”»Þ=pú‰_,˜{ÑgƒjŸVòÃŽs>8øÙÍÆœª¯×^Õ)aòÒUÅ5'~ryö ÝÏ»§Ë¶^G¶½bT›ÃëØù¬é§¹²zØùfæ…×>x\ò‹/šqùkug÷m—pÚ=?~øì!¿dï¸æÈöÉc=ÝN<íªÝÅçÏœ55aÇðÞ9nÚžÇn]óñ¦W/ïØ½ó®süÍ] +2?{ìwn\÷x¨Û·ç>Rxî¥mßïYzVõŽû}4xÊ®†qýª55µËÙCÖxÝ­3»¶Í•tWFð–M‡ÝrñªWŸ¸ifŸoû?ùþ»ï†Í¼õ´~S‚®™Ã'›'„F<×gþ5ãÙ|×é­ÆíØrß°ƒ\'ÍiÿôC°µÍ /ÞžÜöö¯ž¼¸õ__¸ã˜œ«†Ý|ÂΛ÷föÛë3 êëoynåï·-xÿ²“[¾mÙ=/¯ï~ð+¿´ùñ˾Ÿ>(ᆗ×Lêxq«þ‡<´ïçN=nß2ëÕ‡<˜¾|ÑØ;Ö·]ôÝ•‡Ü°|áúå·-šÕçôÞ…ïÏîú~›’÷?r=üí¯WΙ?íìw«>îÞéŸqPA¿¶­Ç÷<~âÚç»?}a@í–n7Þ¶³aVÒaw:ööAç}xñø¯æî>å²Væú7¯z)'aÎ!מå:êiï÷ëô›ù³ÑvÄí…ÛÞ>©]Ÿª‡ÿùÔÍo%ßtìIkîíõù?¾uÙéW{f·]/gݱïê>½2:bïßWç®O¿Pù|eëµ…Wõ9²ðÞ…}ZwíÞ¯U·µ¯k³i«ïà'Gô^r¸ÿ¸ÄÓò—¸nû¶¾|~Þɳ*{žaý³Íކ­z?rÈ’Wfn¹«ì…‚®#†/M´aÃq ’Â7œ²lËO[ßèøb’yæ–Ò»òg¬š;?×Ûz“qÓümý¦¼|t§¤þ=ëOß9büQ OÏßtý²Ï¯YvÔ²›ºÍ[±j–ýëøŸ»Õ]øfvÒŽM³»™IïÝ“þՇǾޱ¤hWÞçÃÊç¯úõÞ¯¯¾qZÛ+žØýÅÏS¿ßÙ§õ¬{Ž_7yôÔk—”Ÿ7 Íg¬>ûì#²²÷™í·ÝÜÿÚOkzÏ{ú±®û¤ tl»ù˺»¤z*VN9¼!¡Õˆ-%©IÃŽÜtNÝõ®øèÕÉÿ|çú[޾ïÁ)ÝI~ºk‡Û=?ö<éŠÏ®ylF×Îïk=}뙾óÕøª÷}¹æ¡OÏõþòñ '|ÑiÀ;ôõ«Ïo=â©nËçgöÉŸñë±=~*KÛ»öÇó6Uÿ}^Çéɧ֟ÝjäqK>ì¹ôá«//ê–޺קù÷+uþ?í[Ðå¸=ßýrñ'„ú« ~òà¹7uÛyêûëß¿ žºòÑÅ#Ö~Õö²;¿¼»ø†Ž—Ï™ôúI 3zÞìN8>5á·ÕÇu=½Æ¼àÒ¯F¯xܘPtÂðÿ¹pÒžOüX÷Âaç?tÐÎÒŸnÿçß§Ýn⳺¥æ /Êï6ä·îýtã¡ ÿþ¸¨ÁŒŒ‡6=ð~Eñ´»[ŸöÔœWpþ‹·-¨ÿü…. ®ïps‡¿_ºËÛ®už£~¿¹jÙ5ŸÞ»yêòÁßÏ<ú×N­_è{¼oŸâûÞÚ5#ýð%˯¿ú­U_Ýûèï¿:²÷ŠÉÏý³wÿwªZµ¯ÍÒµü¸ï)Ç\Ò{{éì—úì~eì±Ï×ùôS‹WOÚsÔè¯_¹¯_Û¶½ÿ^óÝÜí_±~åá¯?÷Ò·¯.ûÛGNÊÙ—xäî¸þü» óF|ðÙÀ-«ž¹ó¾£7ÿûÛÙ[~=hù›vµî1pݧ®Û:tøf_·¿=þµ:¹Ã›½–ä'^ù|Ã*ªœ0yJÙC­=;ÌŽŽº½úŽÛ..ê¸ä­µ.4gdw}ñ¼ã/Ù¹!õ„ö7õŸ™ýë…mîôˆÙaøç%í‡ÕgÍ<ÌÕ³}û¹/Œ”P8øÅ±=>Z¶¨{Ï?túyT·oô?%õ¢Þ­OÊHy±uÂྩíûvèY|L[ó¢¿í,¼vBñcmÓº/{þ¬‘?]Zpü›/^Õ'¹~꥽fuÜùÉîoÌ­ß~ဓ\Ƕ_tûØ6û‚WNÊ8ú¨óªû,ï¹ïñÕËŸø"4þ…#®zxþ¢[F<ÿÓ7;=WœøI¨ä³;Nyzá­‡~³ò˯[ý8pÓÔù?µZwAÎûmæè;·{ý²ªe5³oÎpoÞøâùKOøa^Ñ®;ÎIÈhµþÍ…7·Ž3Î\ý{ýú_v|òè¶ÓÚ´zæÄ¼Ûóß8kìäã2¯×k~aä’7ÃÿµëöÝ•EýzXuyÃÔ{~ðÊA]·¿ºÃa£¾Þ®íùtüf¥Õ}ö°¥E·¼Zu¬§ÃeççvûlëÈá}{Œ-úpñ®÷•½sý›þ¡#/̽kv”?¹æÐc3Ï8²KëK¿ziñü¿M¾®õêÞ‡$¬HîµæùÅþ™ÙûÊn/ÿP³e~༃7ߺõ¥G-žðÁ†uí6\vSŸÛC]¹]/¯l}üÚî»Ö³òI×ó;V´;⢤Uã¾í5à¥ÕÝ>I¿sßÈ)G^sp›m?ÔŸÓé®o.?1/twußÝ/­óÞ’¹å±¹‰ó:œûÚÜOçN’]æù«ZÖùáÑoümÖ®ÉÃþuÈ’’ƒÆ·vvÚç¡Tÿ⥆v/)›ºëè•ñpåÑ]~®~êðÿõuf»û'üæºaù‘_­µ·×'Í[ðéŸ.\»îŒ>?¬:-ïæzæWþv×àÇžŸ‘Ýmõ×ÇwÎnI«ï®J™wI Ûµ OÏyðä ¶ ÜÔ÷È-c^;dpñÐMÝÚÔcÆÈÕ%O=¾îš%cŒcN»öüÄŸ{>2ð÷Ð)mv¶­ÿè¶sG³·Þ1~γÃV½øò­¥éëS—^ôVÊGÎIíÖ>©í‡·õOxgo«c^<<°}N»ùý¦Îëæó2Cæêê®È}b_ug³]Þ?O×Ïœ8?«Õáz}rå/ù¿dv~äMoiié¥?$|¹í¹oF;-û¢ï]/v-¼´Kâ¿> =üëÛÏlØpò¨ù—.Ü{OƲ#ÆlëÕé¥ïûßÜá÷Éoýp튱»ûD†Oó”ÜÑ»ô  ×þïC½ùáŠâ7²Ž.Û²ñî¼Å×|ô\ê»·¸½¬úÌ5[º¶šï°¿eÏØ»®uÛ—/í8âð]]¯úöG[Û®›qûõý]»}Bý΢¥w-X5SïKîz{Ø+“Û]þNjðØ¢ÓzvÈLZ7ìü_ò>Üýì¶=Ánµ¯¾rIÇÕ3®oÃäÓ»™o<{÷;õÝÇþ9æÁ;ßÛ»:ý÷Ë‹{Ì-MÛ0Åš*¿åú]mf¾ðÏ©iÇzZý8öï™­î>ÿ§Ï“z¶tËìÍG-<ê¨ :ôšrAÉEgŒëtìƒ]é¹ãñÏV~¾oÐa+–ûA¸ß°_Þ:¡¢á©Em[øŽíÛt­߫ꚛJç®|q˺oGµö¶™_½lû· >{aÞܵvéÉÓ®ß<²UBö®p—„{º·í˜:´Ïú„˦lyqÄ¡Wö˜ñBû;ŒÄ¹mG>Ô»óöÇw~ötøˆÏW~14”›±ãÅ}«Š¶úeðë[÷:ò‡}·×^²pѸ›úÞþÍȱí^½©Çå¿6û·A½÷½¿yËΗ¼^òU·Ï^°¢ÏñÛØ|Ê=']:øÇ[×NZÿË­ÿnãÄ#:.|ãê¬ß'_~Ä™¿¶{6?ÌÉi7ìŠSwõÒ½_µNx9aùïÇÏø%8í¸‡?º£Ç”£²Ûî|cã?Üý¯½Kv¯Ý»çž+|ÕþÄS_ü©Õésà }iÏžCÖœ¸üÒñù',¸ê¡¹õ·™:øìi‡ÝÔçlÏï‹u[» imç»g?>³BWïæí¿dÞ¹~Ƹ¿åu¸úÚ¯T[]Ëý-'åûé¿D~9øþY7}¼ú{jׯÍú£ž+?"qX^BדÎ}þù7Ž{ï÷߸ø’Ð¥ýÏt_¼aÞÏ{Š·>£ôœs†Ý²tXFƲ1_öÒ?>o8mòÜá­&®rí¬c¼º¦[ëg+µ¶œÙë£O玛õêÞÍ¥›ûMí¼ÖwÒá©Gßùð˜1¯ÝöËAû,øìŒÚÚ{öìI\VüäµÿZñÓ£¿õsïë ß >·õÆÃ¿ýèÆAy #¥7í}¤~åqzúæ±ÞŒåÕ˜p‰õó᧬>õŒ_ÛOúêÛíÏÌß4ûÆ‹žòÞ_Vß—[þqɾŸýíRïÆ»’ïú=1!ûùò¯Û·>·C‡^z«æºª²ÖËç_wúqÃOyæå­í=óÜ‹Œ¯tißk—>÷ÍA îºàã_ÜÓÏÜãÍ7¯úÛÌyfš<}ÁÙ‡<ÝqA»’g&¯ŸPòÊAc~ÙÓÍqןÿù³Õcï–”q7¦l¼éõʳ¾yôÃï'VÔ&/ÿ´¨xmîÛϹìì•pæ‰o÷<ëçõužXø…a_OÂê3v¶ÉÊY½òÎGîÚs]·üW?qðuÕû®_RÜ}ïËi÷ÏÞS7ð¢Õ÷½3ìæ]ǯÝuÔIéç½ôèr÷ŠuS ïóLŒl>ª÷-_7üÈu¿ûÜ™œ=öã†+Ãed$ÕGnèýØÃo^XUÔiú®J¿«œÔö¢'__<üœ½Ÿ¯—ôèÊ3n+´oÓ‹‡|pî²y—§¯h½âðyº_hw§Ë†œ÷v›{m³hó?Îêqü/w,(8ÝwkÚ «²Woý¡èî‚õéì^pñü•+‡}öÎ7½Þx%kõ‡˜Þ®cÂÏ»'½îêôë¼Ò{*ߘò߯Íxìý¤›>örç9'}wØÝꬓÓv}pÛ›ÚÜõöiÖQwœ´rÞ¿õªÎ#ÚžöÀ‰‡­xþðŸ1è9ïªU·?rµaö¼âЛO»ÿåA#n»ó÷ŒksÇNšÔ{æ¾ ž—*²ûÔyÕ›’Ú/êš09òÄ+]Üê½òÂwo¸`å¬Ê 7=à­®nû€ûܯ®ûô뻟þeî1£{k?iÓ¹7Î:ò˜3¶·zný¿ó~;ãÒã5¡×ˆƒ×|qlÂk»'y7 }wÉÖòÞß]úY—U[úŒäÃû*_[ôÿØ{¸¦ŽíqüE‚ŠŠ[6*¨lŠˆ;ÐPA­{Ý"B’D±¢Å‡´ÆˆÒÅÖ¶öik7[mm«Ö¥ ˆ‚¶µ¥Úgm]k]nÄ7ÄüÏ™™›Ü\HûÞ÷½ïû~¿_/ŸËÜsæÌÌ™™3gæÎœÓô}û–½ž˜àº Óßayûă'vÛ^²wo³iSʷ칺"'»åÁ¶\J·7r<¹»“JŽm¸œüáœÜÌOŸ:wóDTŸô_4gå×í&ßzþÖÂí7ÞLú|í?æ/ò?q¢ìû ÿh?Ü÷mŸÃ—~¤N²"b½ß½GÏð7n¸Ï«[uvæâÎ#Þ}ú”Wñ·aÏÈòŸ1m/kÑlñÏšéÒ“ßmÚsîÇ¥s¶wUfùwl~5aÐwÞJÓqk³¾¯Æ~س…ï±þó×O|ÿ‹<ÿ »¿/þ|KÝ3#F´2]š›tyã°ëã_9üíí _îØ.Û’M§o<÷ѾO?Ýýù³­_õ+i}õ¹cÞ«§\yé¼qÎîÍO]­oûÎ’oZÄO=Ù9»ÉÕäß^ïô|÷ÙÃ^ ‹ž±®4"³[{î;³Ç^+Ì+Ùt쓟Cìo;3èónAþ}Û6õßcìP}{ñÖ½³Ú¿Q¼+ìjõõÕ†v#³m1ÞºwjE×|ßç½ùû¿ŸÚýkŸK¡ƒ–νÿƒ1aQ=bß |qÄÈkCö½ë¾"cëó¶!Ù|¯I·CŸ±b„ìüwO¹Û?wíŠ —w-<öáÛáYš¼Ë¯¥E¹½3&pÓà–›–0"£_“NçÙê÷†è³ÚsÆÂG]»ŠHèi6öÝåûG·‘§»—¶óž1tãfã„c<îìO:¿eãñÑe#ßòù5íÃÉ‹žó¹w®jÆ‹ŸßP¸¼ÿ¦ÇOÝ}+÷šñ³õ­¹Ÿ>Ù7ôË.Wvý~ààH¾ðÉØÛkÚ½0awM‹Êñ=òÖ]þÊvN¦+)Û=åÄÍž_hÛ*RönaŽÛS—N}ëR¤UûNäú'÷¯_þfhæ±Ãc®TÖ~øûê ºÙ÷Sï¼äá«Æï^”å<ÎV¶awöãWÖÔüüá¨õO,X×-ðšeÿë£jüßÞ§ú¨Í¿]nû~„n|”vcu—WÝòÓŽOˆöåf^Ú?÷ƒÄ·?ýàðK“—|iØå¿/âx›ÂÕë7Ö,êr*õçoGŸú,÷û¥I;¿T„}sçÎúæÏÊfž{·gÏ{üÞ¯8­*6ˆÿä½9ûÖ^½ÏoTn8Ö>wþ˜¬©ëˆüqÇÖo6Ï|êç‡ÌåøºÞ]Í)«_þÞÒâ×âvWÌû+W=8Wpïò‹§ûÏ œÞôä’—^7ªø8ïÝÛ›ßóŽþð5·õšé›qÛKG\íTþù®òÒߊûµrÕBÛã{N·ÌÝqv¦­uÆ¢°¬]iGÛuZµ00iøû'žyðav¯Å}¹Ù6ãï]שûË8Õu¿.úžO÷ K¿{fÑèIµü†wî´;ñ z†W—¨w_Š:z8,a@ýy^¿Ð7ÛÃðꄯR›qéieþ[·ù¡&~zÛ'Ü(¹wfOUpZ¤¯íæÍE«½£Úþ#ÿ‡Ë‰UÏg.æÒÇú®oóá÷q“œÙ,‹¾zˆÛ•[8|K¶eñ©m/­îãßó¼m÷ê~ýåY§%_WþüÉöOï^;±íñÚþïm~°õÛ>^Šü䣯Åo©¾9Ô­ôbŽfòû‹‡ÎåbÇ¿é¾lG§FŽl:gÊžÀ\ëñౡí W÷·¬zÆ=øEå꾯ê:üRk¹”üë¥-C•/~ÿ¸öÅŸ-ˆß´%bö’ +O,ºyÿ ¢ÒjŒÖêêkw6?œ«Sl2îyvð:í'›ÞØ–7iÓ+Ý›Lòãåœ;Òïlþè/Ôïùv²éèç­÷MΛS>j]ú²+ë-ûüG$½ÿF¢ÿ¾Õ³Ï¬ž·xCè\Ïš¹>¡®_ß×¼ûœY^–3¬Ë3„ôYx4þ­MŸo¨Ï¶­>zÑ¢çK¾Ÿ_”u9æd“Ã)÷·Uœ]`2žŠœýý©¨‘/ÕžOØ”p­þ%Ïí»wï.ý¤ï¼øžÝÃÏ´ù[ÇŸÊ^ÿ0nšùɱ+wWý5¤›a•qhÞ̫ѓLêþuý¯ŸÔh&Ýw­âãngk÷·ÒwÓÔNió‡ßÿÊÓÓ3zÍdÃÚZAϵèYëþÂó§¿øäE÷7­ã¸;§f_ÙrïÆÉ¯^•%Ý·"Cµ½ì—‰Vß×7ÕÞ¾ÂàóÒ­ì/=û¨ýÕç6Únø"äÆ"ëY†’’ŸŸù¨¹eÜì=‹nœI}°n÷; vß½úôwon{žïðT—”ôm­º­‘uÿ2jBÅÙâ˾kÆio¦õm¼£\l¬«Ijâv5ïÙK›µCÇ>÷Ĥ/ßøÜ{åO‡¬þI–;Ú?jþ›iÕg–Tߨyprrq»”ãó×~üºÇWCjVûaBÝWƒëæ¬zkÎÈo53'ôz;¶g“6Kó݆oy9áü¢›†gžüÇ ·á³ù[·ÿÃúÓ3ÇÎè×´ÍZµû£5»GfM©ò{â¹{#{Nº2Ïì½áè/Ûžj¾¤ýÀM{ö4õ}"Š[òƒìÅO/ Y]qgêo÷&‡-]qéhѱTùƒÚuK~M?þÍŠož~3øÃ ½»p5_}VRÛ&êPuÉu·Ùï7y­%7óóÍ¿lý@–7uâæ¨·[iŠ×É=þî´•çæøŽoœpaÛŽíÃf/òŠJÞÿÖ¨y‡c†l¶û ç½”-·­=>íùã ßßýðØ¨©ïôíùáâ ¾¿öðÝgÝo~WŸ«Žâ-C¢j^Ll?¶üâ:7òð›Í^}ùÔèЩ»¦ö3] èñúß§¿µjø×{Ç߸l`Øòé÷£nÕí^þÁÐËǧìvvÉ™úN5§®ýí]®ôÝãïñÛËÊÎùhË›…{L“·_§žÊØ~—&Z¹«ä3å §—¬×éëú4ÔT³æzÇÜ둲Uåï–ܹÔrî°‚ޝy}IfÙß<ŒÚùÛ{?xñÚ'ÒÒïÞ±>õ<æAé±Õ?¯sÏ_²äà軵Ë/OYt`ï;©ß¼zkӱܮ7_SyþÁ¾ŸŒ]¶ÏürUAﵟT¼Xº"}äW'ƒ—å^š½ålܰN/YS_Ä¿6ðdÒËþG×Ï™z`Ñ„ôŸnÇìÑôûðƒ­ÃÎéýFà‘ëþ¶óç.ÖOê÷- 0¶8ýóÚ¿Ó¶ÜËùÁ–Qó%~2Õ¶û´oåß.¿9«ì³€U½ƒ;Í-5å'·Û½6yr¿ÊÖ]0~óÑžìm=¾™3¥|ó¥caŸ<^ö|ýü¡ µ9ç­œrnζ<ãko^ž3ÞM7ì¹Ñ1îÁ/Ü=0áù¯Ïþ4o¿á«Ç’ŽoæÆôª\d™>Æù[­ðéö•MJ8wîdôˆæîúswð#u|ܨØO‡ÍüÛÿŸÉÿ¯½þàü‡ýÜ¿[ÆŸœÿ ‹hxþ7,"ò¯óÿ+˜üœ)§ žb ï5rû†÷ƇÉ“rÇèsæKN?¸wß0ŠË~“•¢Áãf$:œD듚ÇL™!éY!&DgfeÃàÔ¤ ƒbç$ÍO ÉÔC¨‰æø1ó#Æ“’çFó.o0èCôÄúøQñq¹F}&þ²EH ôœ9ge&'&åÌ·@¯ÏCðxDe¬>5aì„1YéÉ Çó‰Ã÷ ƒl“‘£qä\œF3<+Ó8Ž,œ‘œòÿêù5×ã_|öß+ãOÇXƒñß;¼ß_ãÿ¿q9û~Âû><î{÷îû׸ÿ?÷j|üg¤Ïš•£Oš;[ŸbÈúwËø“óŸ}{÷î×`þûküÿW®çã†Ëd2;ìñár_ŠàTœœ äžàÚs2I'ôö@À#ñ@oDÈáödñn\…ø«ô>ÄÑãåp?}јÒ¯B|s¸;2\+¸}àn'¢ƒ"€KŽk7²ß–¥Á«5 ;üÓ-Ôðj*zn&zV²Ð_Bßî–ì9ÀEž[=hèÎ)HÈÛaª¡Œ ¦¥¿d‡}Hø“¦`Úçì0å’·Ã~$¬j+À”ûv¸÷ã‹À6 ÷èŒnÂíañãY¼Ÿ¨>- Õ~ߙſ/Éï7Qy~ÜM[kQ}[@} m$£ôBß­„» Ü¿JÒ_ƒð”ÞÎè{³ò60xƒ·08œÁ=9Ç¥‚û¸W{qÜg¬¾2I<§ÓÍž—•©#?YÒé8Z¶çth࢒s“ð1)fKN÷Ô|ÝXýl´5“ƒ¾õî)˜uÉYótéôst 5íóŸNô ,&;;1)=SgÌIŸ=r ††¡ªæÒ #õ9™úŒÞ‘£s´é³Óô9Ül½1;=…››ž‘Až0o‚©\*þŠ3s’çes©†ä¤LÀψhÿdPû!‘œN?*JÌ2hõ•™ÂHˆ£ëÒÇñlr¥KÝ åèÿe [rº #·;WÅd/C§toõ·®yzz3”ÊzûØS°N9ëIåê. [zÑp0 ³X¸Ž…Yx„…80ü‰…C>n L¾Ä†^9†0v¦zÑðÂÀÈ5 !;âaÀćZ aè=ÇÂ,4cÊ¡ƒ‚†Û O‚;1¥ö5† ðßAèø æ‹W|0°Æo‹ å—s¶/Q3Ú6²aO¨ÒðÑzÎf³Aºq<*Å¥å?@1Wå–‚G€/,5ºÙª ȧN/·tP—#Dò5·´ü= ÍßCT…)ÊRp‡&ho)À¦7ËÕüÀT7-(•› PoØŽZHhñ+dg¹²6 AóÜ\Y¡†äd‘E^ˆ>M—Š?^çBðÃ(€s’sHaIóÒ“¡€,#ùGs£)au‰¨×lÀég™fë’rðÌDSæö(Ü\˜/@é™ú^ßáƃÍmì.åcWÎn|×hÊð¨Ëñ®’QÞ”ÑàhB½âÎèP÷ãÝB´ÀñÝõ6Ò¡ÎÆ{€¨\7v᨞ÇgÔõxG³2dvíÃq‰p{³48gà}BRœ;&ŠèpŽÁ[Á`oŽåº %ï6¢vê1EDwȃÞ*Ð~z޼Wº9Óá5WD‡£ü„rŸeϘ.ÊðÖ4B·PD‡ï´?)e‰Ë-`tØ®dŸAÁqŠFèVˆèðøœ º—DtønÌ»(÷5VW¤#û ºwá.¢Ãü׋òÃ5ý6o޽©;èð~OD‡k‹RoÇ»˜n‹ˆçø*ïÆëñ%+Ÿ´ Ððn¼;9G›ã…tGE°W&¡ÛÚ„½U°Kà¡JBƒLÕÈ8:%¡‹òq–?!n2Ðõo$?\s¹‹è^‚E]m#ù 2e/ßläTV#9‡>ð–ä·ÑYQBéÞ—øÚÆBwFe” 0Í Ö]€éÃD¹Ó‡b;L7Oªì0Ù9#cŸÂ^$”î²ÃÞ$üoï!]µÃt·m›}© Kí0Ý û£='ñån_A p  ÛJàv¸½î ;:õ³œ»ió‘ÀÃ9GûºAûN”Ä'qŽö“Aûá&ú9;¬äsŽö“Aû¡žÂúÓuÝsû©­ïOö¬ü<åí€0]KËÇ=·S¢òàØ{+Ç¡Ðß2èï+~p E+ù7h™3<\‘9äAævÓöŒÌÑß27.UF×à$·&Üb™C>þ–Ÿ°Gø¾ÌyÏñ*‹öëeÎ{Žr6f…=ÇÖnÎù¹9ïöusÞsÈè…=ÇD {Žé’ôÙnÎ{Ž&F/ì9¾À`aÏñ5 {Ž›D:F÷^7ç=Ç*I<‡ë8\¿…$ÿï&ÉI¢½K\¹Œ¦ÔTÈT§‹?z¬.!~ÜxÜÒÔÅ:AOÅØâ=DÖ"""ûpÙô’”,Ý쌬YI:²ŽÔ%™r9²¾Ô¥˜æÍ[(7*Ö‘¿ «IŒ³CX˜ðìÈ5Ùžëÿü]ˆí§bucŸ¥IŒÁ" Yº´¤Ì” =é‘Q‘!³õF]v²Î˜fÊœ2+—ÓH=L“ =|ø¸¸ñºñhRÇv[££Û ÿ¡]ºI+Θî0Ó][1žmò:‘Š÷nÉ‚Ÿîò:hÂ%›Ô¢˜>ö-`Üö%{Æâ„¸³,.Œm.;•ßÈŽw#[Õ’-ô¿®ÿÒõ§ß‰e毌?þþÛ;¬oï>Òï¿á}ÿ²ÿø_¹ðû¯›Ó÷ß!d®ßÀæÂh†/nîHÍEÁ 4VIí­Çä¿ÍÇ9VûÂ;cû¾à«r µl¾›ìæœÎ¥‹f颽³ª‹Öx ïQ‡^ {…j=^c.Sð9Šñ/ …•cI:ü†íÉýó—ÀçXVž«vá¿B(ô¦ÁU4¾YŒ5Ó-sþ–»~óÕè_Ÿ¬Öú-Ų·‘»QX]㪋¯m›±|p…Þ‚ñ…ið Bø¾íýOÖɃs¼K ßîÅßνX(~/sg< ò±²T%SyD·õe| _¶–ƒwÿþr^LÜ?®žxvr‡]E7}¯»ásöøÁ÷ C^θý¬žÒ ËW5‚ïé¿ÝE>o¸À£¼ti¿Åýø_\à÷¸Àuß~(Áûp¬Ó§3ó’±u¯ŸÊ‰Ïk#~¦ÿÐÞ£ë[i¿´&øfßÔÿãç0û`rBˆø?þ<¬5 YÉýûëœ?Æë°JÉsuÉisuè3è_ø:aêÒ×þÜ4sîö?9 eNô{üα'åO¾·Ë9Å™Úá÷yxCgpö=¾ ““ɬ¿ý&ÀUJ {iÂuB„ï[áD…åçÅ9ë…/žŸüDx±~áÅù«Dxñ~[ />ï&‹õd”/þÖ-‹E]+‹õó^|öH‹§ð%ŸŸ-ÏÿÃQå¶¾M*ÎÖÕþ+;EÃÂŽs¶®ncoY«üÀ `lJk)o!Œ]dÝJà+c×X7ø<ÂØÄÖbÿŠ06­5ŸÀGFv­ÙþalJëLïG›Ê:†À»Æ&²FˆõÒZ<ºRKÏ*j ׄüÁk!ŽÓš/jÆ3ÍÒ V lôÑZ/€'~æRÔ1ÆCÅ%u€ò›1 A¿k˺k ªeÚþ' *e§Xl´R™Öì‘ñ›ÿ †E÷?‘s±Â#eS5Ó—§*;-#í> ¼!§ Ûy'åÔW[4øgˆ8l;‡íN¾•véÕR9RïÕ>¾ÌÛ£!HÑZä]±Íqu᥸7ËñïÖ“ó­ùtxØGTòoóu) žÌ…˜IQ³^Ð_–5(Ì&¯5WÒŒâëÝ*hì±Ç!–ÇZsáLÄìÅ€S.û;²Qäû+7ÏLÔZÖLfyÛì©{þLý¡øƒH\´& i,4?QùæÇx#…Zü ˜ê H¸š&$¹6L8æ19!±ÔUÉyŒ”qu)Ú>´ÅŒüÉÉ hÜqZzxBÜž|x)T¾=)ÈãIR+¾ûcRù*Zy 8c6ȉ/¡,:Aê»æ­¡2Ÿ±s¶ã‘]É÷#5<Å[xšê@ãfjn)gQí³“œ¨ð ”ZËêã/Ôç0f¾ôVdêa‡¤3y'Õ¤ƒb²ˆ²h |tÃpµƈÅ#L7q°L¨~Àœqøüû‡,díÝâET? —@"&3}$èDÙsc9Y®Ÿ¬½—×ä˜ï;À YKh|ýb^pk&èbŒw8äEæv!~nxšøëú_¾lìr —ø{ ^Â\%¬ç„9JXÇ sz Kx·ÞFvŠÙä-ÌÕ‡¡ Âþ§0wöbé…9Sø  ÏÖ Âš@8(È¥0Ç _J=ñ3,Ìù3Y(ÌéByø­C£·1Xh—ßa»/‰ÿo]Âû±ôªeödmÍÂn,ŒdápNda* ç³ð¾ÆBaG÷ØÿD„„GÐ#=ý‚(ü$QÉŠÈÌ2êɱºÙ ËkýÎJ$ÙK$ý³§%ti)9ÿ±³ÿþ…_¶ÄkaWûÂ%—Àø½B8_—0N…pƒ$B‡À]ËÎ?à%Œk!Œv‘^¸pÎmà%Œ{!¬c|< é…ñˆù»‹Ò zD{Ižtâ‚MÄ¿0n…°‡„7I8sœÿÀKÐ BÍ9ø—q ëŸÂòÒ zÈJÊ—Ö?S’^ÐkB(èAa/Fš>—sì½à%èq!”þ~A*?Iús^Îa©‹ôÂûåIzaRµ’U€Ÿ3È-“¤æ!ôýþ…ó"BûÕ6u5z©ü¼,Iïj¿ÐUù$é'û8‡Ó$ôRùù˜sœÁ˱Hai{IÓ.IÈÒþ“é…s%Bú(–>Ê·qz)¼—sÞpìïR¸X4þÅé¾*$å û UlóR*¿ Iø­$½°ŽàYúì?Iÿ“$½0Nös¦“¦®_9Çù¼„ý²™,ýŸµÿYV¾ô{†~¸/“„Òó4ÂõKÏ»H/†Ý¸†W•Ððl`â8À1Hõôü=ý4,dþ¯¬£pwëP# ð|NM£xwû¼åŒ—;}wà=ìóŒ3ÞÓ>8ã½ìó‚3^a×÷Îxo»wÆ7Ü?¥ø¦v½ëŒ÷±ëSg|ÃýVŠ÷µë?g¼Ò®×œñ~v}åŒon×GÎøv=ãŒoi×ÎxÿF׳xnHïÎøÖöqìŒocŸÎøNºOMñm਼7lOGxFJߤiØ=¾a;D|Ãvˆcå–JÊJèü b=‡áÓ$û±¹,ŸhÉGWü/cü«$üÐó“~ÜVI¿¯wÁÿ'¬Ü­¹*sQ.ÑËn7mÒ~üàöãu‚oÁ…IÊ}Èò‘Ê\Öø÷N²Æ¿÷„¸À“5þÝBë"ÿ©.ðY²Æ¿»ì5þÝ訋|.Ëÿ^òÀ½[ãßip÷°1úx­[ã߇]Ð'¹ÀÏwÁÏb·Æ¿ýGŽ45~xÉqЩ_ŸˆÞFèÒSrŠø£“MÿÚa&Ñ‘¤FOIÎ'‰M9Ž09}IrœÆé×à+Y#ŸÂØ!!ç£>øIz¾ qÿ¡ïf® a Î!²‘mÎg‘ÈéØä3šƒ2¢Áù*’–œw’œ”Z¡A3_âÈvÁÿQWãçR è†;5šõ?p………õëÛ×ÕùŸ¾aRû}ÂÂþ:ÿó߸¤öÜØéõè"¹k0ŒâÑþƒ7³ÿàÉÑßáEä ÜxÎo\ââò×ïã¿T®ÀÏl´dq2N´f‡´xWõƒõ}?gûŠ¡pÿ Wà}ƒzÈœìGøC¼?Äáï$x ߌñÆ/šiP6ޱNJâðLO(¯ÃWrÞ¸'¦Åÿ™ý <£#æ¯pu¢úáñ¹ÐŒ”à üp‚Ÿê{;~_€ñx>‡¶5;Å5<¿³7áÑÙqcò–Gìó°žÞò]Îį|0®/ËÛ*¿'§B8’ñÔqe‡Í#/=!IúšÈå‰Þopž­âœá ’øv’ø]’x^¿NßÀs$°Q’_¼(Ÿ—¤¯•À~ú"I¼Jÿ¬$ž“Äÿ.‰/ÄïÁ*Žž‡Ç¿.Iÿ¡$¾»&7IÒ¯”ÄO‘À8ˆs†wJà­ú~’øY¸DÇKàI~c$ðß%pgIúSRþ$p¨~Z¿ ÏKà -$ü½+‰ÿܪå j¦-Ù;U*ÀJò»5N/>¦?)°ô1ô°¨HÍ0Ò8X÷¤¤¤ç8ÎeÒC@ð”bÊæÈÊãILöB.ÌÈ u9ót ’ŒÉi\¶ þÃÔeÐg蓘_FFV2GJNá7’¬ 1΃õY¦‘KÕg¥r©k eBŸ“ Y³¹yúy@ |èsr2³t‚«bÂ.æe‚L°hò߀ôÈ;¬4Û^Ð<š;r…®n¹ù†…ÌËÁj¥>s¾½Vô<{:p’3r†^ŸÉ  ¹ä¤õ¤b9 I ùXKÃóg™Ré\üž-¨‚*‘…g˱3Ø¢w¬A¹ù©ìaù2d g²rôzé2¹á*—fOÜœþÜ%°øu>† öøz ,c6SäDu9ŸÏòàŽ°óX-Ùy­ŸeÎöS~“9ÛO©fòÿæ3ÏÖT–=úQ™÷€IƧJ® gþ0„‚ý1„ )CúâoI1„IM!¼›b¨à¸^»l†ð.! ¢( }`~Ç8‰ÆÐæk •ð‰!0š€asÐ+€!,*&cç4 [qÜL ÿ ÛÀC˜`30„a™!LnF Ûs\.†`~İ#Ì©>ÁqË0ìÄqË1TþÅ”V1†ðþ*†OrÜZ añ°î0bØãÞð;Ç}„a ÇmÆ”òV {pÜ6 {‚^ưÇ}a0Ç•bÂq0¥wC¬ï0 ‡yCXOü„axŸÇcãð|Çzw´ï:œãìÆ]<Èy0<RNú×ÖW)l]ðŸÀ]±gÅçÁ°‡éù,z {: E…ÃOÃ% ;†=Ÿ¦âìçÁPÒð( ;†’†cƒC‰HÃm-v %# Õ1;†’†ŸáØy0””4üm>9f늓†ÇL¬aFÉI›‰°ŠÀ(AiX!«Q’ÒpÛÞJ1tE‰JÃm/kM=Â(Yiù¤þF K[NêO`”´´bR£Ä¥­%õ'0J^ÚR£¦}DêO`”Ä´­¤þF‰LÛIêO`”Ì´RR£„¦"õ'0JjZ©?QbÓNú%7í©?Q‚ÓxR£$§Õú%:­ŽÔÿ1Â+Iÿ˰þ.&ýp_%ýp)×’þGx+בþGx7þG¸˜Àï‘þG8ŸÀ‘þG8›À›Iÿ#<“À[Iÿ#<†ÀÛHÿ#Mà¤ÿ#ðפÿV¸”ô?Â~>@úaŽÀ‡Hÿ#\ƒc¤ëw¤ÿIý \EúŸÔŸÀ?‘þ'õ'ð Òÿ¤þ‡_›aþ­àB͘ñcÓ¸O‘r‹\ñôÄ´èUð^¢ƒ¿“Z,þCKbxg5dÌÿ‚:Ïn·ËÉB î]bé) R®ÆH[Õáòâ"c7n'/Зչ™÷—]é$«ú±Î w“„G…„h¶HH|oë†ùƒÕ Ñ9SKfH*ªTá8ÙáÛÀÙ;~0@ñO|´²ó1À‡u!Ú[B£FÈÿ„q“&.½Š_Õ ¾Vc/º)W®†”–eêX€,Ùrs„mBãð«¥4ŠáB÷ÅÅ0\Ä¥RÜ0³‘T"q9€ƒçâmð<Z¾g,+ÚÎ@ìrEµq'ýú.öü èÇr"ù#wGøwðD)²°¼Ì\¹ŽýÎgø"|ìHŽÚüÀücÙýNeÖö2=Ì ê€þUÊĪaæñêæ2UF£TÕjHCZñ×­¤±…ø<(1555D8ï‹M3)o¼"VZ4^=Æüó.ì¾G·?±ÕÞÓ¶±ÄªÕÈÑ;våÈuV9Ó Bà,È®ƒ¤sH§ðuØb ýùõИ"¹q¹µ4€²Wù+ Qý ¥B)ÊÂãPÈ;½XËL‚é9ütãªD¦bþ)M49ÐÝÀã¸Ï˹…™–~ùCòL²áEËÔ8Ù I16úˆIŒ“i„Å‹rLÅÇÄÊÛp"3oÁ"x’Õ}Åß¿ &ˆ^BkÚL¦üÒ"‘ÄúÀH'9,ÒRø=”¿‡9Õ-=€ÓÈ ÝÔéåŽöÇù¥àjË4uXÿލù”+ñˆ µˆ¢û@Šh7£Ï®xš÷uj+}è¹|{kÎ÷GéP®úá'Žïi”We+ß–,yáµÜD‹W~ ðh"aÐmnwȈî‹ÒV ¨r„×ÇŽ±<]$&-K¿ˆ8‰á«á%¬yÞ‹Õ]k+UFêGl?5›e&‰†®W ø°æ¢üB߲ŠMU”zµ¥iøÚ+hñ(Š™Š5€é6iùòblkP§0Ñš¼¡œñŸA6…jù°'·l¤Ðr¡Vw?s Šõi\jy37 =î-IRɾrT#R™ï™ïVËAÇ­ˆƒqiì0¨‰éNÿ{&_hÙ »|Åœe+â`P¢\ÇR ]d¯•6"H­EHŸ ÇD?Óé’L±÷n5’æ<”ÑÿžQ„üü[¢¶yæ–C*‹i}z™°Ë΀8B1UX ¢ç}up[ÔáË`©QÝ?Õ…>H…X¦,M}pó&ÕÖ›"}0¨… °Ä}ÍÉ*j2>Ñœ¬L„Åf<Èó£BMMòa…®\v\N¥¨%-»®@õÌå…'Á‚úV4'õ¬ŽAÌç@óv”Ù})³îbÙxCzë9w4’Ixït›*\ @„C {ÊeÛûê3¬™ÚÊH"K"ФÐ$¾pHÅ8XXL 6Õ#§jÈ*v;[Ô¹³!q±·éô”c}ò(ÄgÔPü~0âÇ3ü0>ñƒ¾‡O¶ 1^‹ñ§n±ÕM“ˆ8MSX[oÏkâknмÎ>H¦²°–ÈR•…×É“›AYx<¹sÊÂ_ñ·H_`ÐTê[Žé4WIúCm~Ã'c+”T_-€%Ax­X_ì©ågÔÌåùóLÞæÓqÕžø»)óiKt†ÏŠdð<¬Àòs¡ÊB|™,~áùRyS.Ã]®ÊÁp%êIäà}Îy=GT%P\@ž+ÙÀ㻵 ³-¾&“õ)èÈ-Èbx,À>8[°Ÿ;ø{ŸÊÜ75dœGÄJbu—ŠÕ Ë É†{  k8téz_ԥʕ³±3¡Q,È>4̇î„9H6ҶлÀöHY¸…®GqÑÈ¿/6XoÂóÒ C‘O,æw»Î†l«Ç8ÕŸÔ$ùsÇšw9¬Cª£Äõ4Šê9W)ÐçoØ©å­fdlçYhŸãì7œ?ÈþÊ•­@Lªó l6ã¹°“¶ÇÊe]icØ‹ø]Ä€+âyI«I¦·…% Ç†9Ùú{qÄ>ˆ;iÝE*UƒºÉ’ùAþ¡$¿%£Âmößó ½ýS3¢%é xÎh¤™¦'j)÷³#øßÐDYeÞ^ˆèƒ%u¾OkñK3²X'Û§úI R#Ñ£:j’8R”£â•¤ ÍP{)w”èE—EÅÅã@›ûóǯÙl/Tá«ZnŠ ~ÜæÐFki¶LqV퀢dשˆM(I¿3DƒvtI¯h"~3,ê 1VÜûâý´„aÂ&×+ÌÒm޶[‹m]P ,ü޶7Ég*TЊ¿F缆o3Ø •Wé›0ЬaVµ;YyAVÕjq¬â+G¬õ.g>¯†y&‚¼¯.‰8:·ÍÑŽ¥w–é¹1 €/e BÁRIyi±E‘ö2pZ鮈ÂN’.ðŸ1::R¾qdƒ?…A…T Ö«–ej\åÊ`Ñ¥Œ«ƒîT®)ç‡`Å+òóúÁº_6ªßñ=+Ïñžõè ™3:ñÔ¢(¸ï³àÙ¸ïTpß¾VXߢ/*sÙÒßð»V˜mé}J3úB ¯¿g•…øùʲY½ŒjX¡„h܆˜%T¼€ª;åŽJ¨²ùføQ~ænF¶5· êÚ/è»{)—¯PnÜoèiöQóÍ«i¯ ËøzQSO€ÅÈNÜ^¬N@ÒKW%%5줸WÝYLÒt»hü#‰,Ü2€×gó‘ðZPNïk8n&{£ÒYü ™WFÁ6—£BÜGù" dÖÃù]ÕdŠ<H"‘ˆEŽÖowŒ'\o– GÖBÐ[ùyê0|ñW.»NE´lm V—È+¬–?ñ@Ý]hS. )+ ‘Wº(h¾˜ÂJ—¸…Z´TCWyþó·D¾ò7‘›Œù‹›†˜üóûpÆ4øbRä/nƧ¥lŠ:梫h¸ŒÔ.ƒ¨Lú>ȃ\GÑwúþ†ëµu¬cäl GvÆ|Ó¼Ÿ§òŠ‚úz媨ˆç\a‹ òãßê<¬[^Z¿‡îâï[é.…ÿ‚'wÉU~œrc™¡­0¼…Æ<iý´žZ\¯äã_ ø}»hüÃb¢„HS;óýÝd ŒçMÌ÷ž&"OuÂ"WÜÿP59IQíAÚϱž‡— Ú ´!^öf³ ÏÀkO>EY~œ”!’ÃM|7²4#:×ò æ«­d£&ÜÒ‰¿Ã ÊíÊeR9ÌÄþúP ʨf4‚è™Ï<ÉüÓ/üš}þÁ¶;ó´™P½- ›6!UŸë‰[&y?™k`=ò´e„¨ž ?Yíï#ÅX¢IîO#Yùâ0@!†½>Dlég'¬}ëi‹'eçsO:šÚ]bMÀÏNßQ—„7`{{÷T)%”‘i%ú&Œ‘u…1’‹z»wøáêiüW—…ÆÛrÉ1¹Š$â.¬Â[ýaýø¹ÌÚ îÞZå‰zÚ*Fg®.سâŽXj±ùHQ¢p­¶&@ù²Cø¢`)Œ…çÚùÊB<Q{ ZYˆ-…È£¥YÔŽ>žë%ˆI¡ƒ¢Ó-ðƒ‚ýÍß,Å=žhPIª²+O@à·ô7è­ñ›Âp‘A],:Ÿ¢¬DmD‰ì¹`³-Ý‹¼bUŒ* ¡.ÚŠ…ãÔW ­X¤•‘×c\'&¨;™‘8.š ãMË;ƒÈÜhlIÙe©lUyj¼_}G#uS¾Ì$ÌþL1˜1?àW<À¦/¨«W®\#"v3.`’»ãªz3æG{oð/ÉQí‹ZK iˆ¢?öKjª¹D_7z× ¢=œÛUwÞ®êöl?9 ßî˜h®â"äªØ¿L¹²$þÖHeö5RªÓ|PpÕ‡/´áõk6g£’ñp‘îˆöo–^í Ö6‹1¾Ã1FÞ×\`Ëíåûéë¤ËšípôöÀk‚fÍÒ΃6‹rÙ÷Øœîå~ýk”…É2²2´—|ž¶z*Z¦îàGީȲþ£ßñ £ˆ ½9_l¡Í#ËèO(aì>Á2ÙJß…üØúÕG`t0j5ÉP¿^Àõ]A½›Ñ» ¾™²ðG¶Mù¿7TÕ·EÂ< –)ûÈĈÓ[Q\s¢ßÏÓWtå2<æ_'z_î¨ß1#æ¹>æ>æEòÊ"ìÀ}˜‹[ ¯sÁÈ8¢Œ)‚[!#jq2 º«‹,¨¹iÌWD暥Pôˆ Ã|äßXŸ=·Ã>¬‹ëéW8ÇQ¿¸ù…Ÿø!ØÈ•06mÆ0x/S±ua¼7ö¬Z*1ë•#ȸ7×W“ý¤n療~ÀI¹ÓxÂõ/¤¹C^^ZÎÊ# 1”S¤N>P§0u.ò9M²dÓíÆsdaÛFvŠ3#, ÔE#eæÑðB¼Ö©4Qyá¥8£-ö´¼ð蟢a6³Fn‘Yb‹Áz|"0„âÑ È| ç¶é¯U,ia% o+þ«úkåÏË5f­|[¯ÛóCEáÑÜ&ýŸ–/ñ€üäÅ 8¶Ÿ9¶ 3Rû³D?X[žö ø›4q ÔÃÞªâ-áe–t·9µ—¯Åg×ç’Îm³ð–x¹r8iqºu¶ã q2CgÝ,<1~ù÷ýóü³æÏò²ÓÛåƒì‹3(dÝ ‹pg¬þF¯üAýB•¯–‘É‹¶Zqñ„IᶉãøœEï8ú.dƒÜ’¡+úÒßêLüøZTQVïÍÔ½h—Qð"€Š#p°½º *eýï™ÎÂ*mê ÝôòêfNödð›?9;”LJ¼ÝY|Xˆü¸qÁÁiúŒlë ÁÁ}FªQo0r¦Ì}rÖìÌôçô)*ê1v€ íÈós€ œÒ;,¼OX¿ð¾!á}úö rÄ`&Á˜‹j^VŠ>¨Òñã&ŒiÂáÏR i˜¦kJ—7nœfD\“ñizÕ YCØ¡ÀA¡³†ö R¥gB™Ézƒ*#}^ºQ•£G_¤)!ªAIª´}êà.iFcö€ÐÐä¬ÌÔ “HCæè³r’ %:) MI7dg$- ÓÄÆM §ôŒr9w’˜•£W¥èIé†A¡ICš8ñ–lÊÉÑgᑜ]dü¥TƬ,UFÖ‚ÿ‹“0ã?dД973kA¦jžÞ`Hš­‡ÎJáˆ3Ž˜Þr29ñÙáø)ÈÔ®)Ó¡[¨¸˜±qšñq\ŒV3jD7n¼fü8.6.!pcãÆÅoB.'+ËE“MQ‰@Q¡?7JÏœ­Âxij3¬ä‘¤É¶Y¢ôÌl”iÊÈÂÅMŽÏésÓÑ‹+Á=XÈ2UY©P«yY9 Ri™AI™$?Δ’dŠ7¨±‹tMé¥ÊÔ/€²5aÔ$ÍømþàªÉ“MœáPĘ2IÚªPgçH(/=s~RFzŠ£¶´çIE»w5tÇÞ7e¦ès`˜@T²³Ò3YL°Ê07=;˜mĈ¢ÐX¢l\éITĦLÊ„.UÍÒÓxÒÊ)Ãâù\U¨Þ˜Jì­à?äYEk2;zDe>‡¢8ÃBC*tÞ‚¤l.ÕdГ³2ærÉé€á†5z|üðø¸±º„Ñ#t qã8-¬³\ êF„†zÄÓ•=¥BÇ>ÌNÊDTPøìœ¤yªÔ¬ZìMè^›ì¬Ò·x–˜ RÒA @˜ª ÆS²Ñ£T AO6Bš4j2¦ãOÐ ª.P—œ.ªÔ¤d@¢`Ñ#Ì}‚€56t ç ¦¤ŒŒ…تؤ©Ð)0rT¡ó“rB<ó ‡&õ9³² ˜ô8ŒSFêÀùéIªÆšJ¥ÏœŸž“•‰–aT[:JT/èiƒ!žjÁ JÊ1#£·±½T¬‰{©ÈhŠÔ$SQ5,*>Á Wu7¹]©w…¤ÊÖç@ÏS²æéUDS§¤' ŒéÉ0p`¼ÁÀT-HÏÈÀªCgCu°ÑÉYjx†<@N Yú ýë¤ç…þåÌÎ;ÝIWÏCM†UÌ™Gº³ g£ T©T¬‚½!9'=lIbñ¸x`WCÕ ™úÜlà;æ"•qa6À½Ï¿*ý|ìŽgMz“^•“a*(m¡”ª)ƒ»¦¨æ%æb²‡AfÒ<ý`R€]X»’òa*Ëjp²æ·O”m0øGš‚±gõJ‘À††èJs°ÇQ⨠€ŽÌÉ1‘É]•dTU¡4 ’R 5Ø U XI;‚Ê6iþXm˜ ÐÞŽ¥ì…³w†ªA)&â*œˆ)!k4fºFjhª!”Õ4t^R.þö"‡VW¿}ÈìÎt©ª€Á^V¥ædÍC±q§bk ŸŽÚlh—ÎXk³Í„ð„ø›'';wy Y{¹|9ûm8žm)†tcˆQcÅp_Ÿ§”Mò\nh»=z«»à!èh¸} ¯$ÌDã«(tÓøú¼èãë÷‚\ãë_à1Ê7ÌMëë¯)÷õÓTøúh*}šƒ¾r<‡é!mcö6þºþºþºþºþºþºþºþüò[%WÔÑ.ÂoÔq õY®@¦òOå ´þƒ¿÷F‹¸†¿‘ö¸ƒÑ–鿥rî\O.”+p‹öÀx®â®ÌáGXð¿@ì\UÉɉ|üýµØŸpàr9kãü $¿Oåþ„Ѿ`é‹äp‚Ýð¨åXtúó ?/<{®+ZÃÝ îH¸‡Ã=îT¸çÃýܯÁýÜ;஀û8Ü—à®…ÛÓéáîw$ÜÃážw*Üóá~î×àþîpWÀ}îKp×Âí¹ÒÃÝ îH¸‡Ã=îT¸çÃýܯÁýÜ;஀û8Ü—à®…Ûú¯5ÜÝàŽ,rÔ ?OˆŒ†&¤g&åd©"Bú9|‡Qøm’5k6³9ªlLšýŸµ@ú/{k•Úź¤œœ¤…4…ðü¿d‰ÇÊ Ê0±÷ ã˜w?z ?«~’sØ%%vdÎö“³iá"ºå@‡kiu#thÏA°3Šcn³ŒúxöÑá=ŠsØűxo0ß2Îa—ýç vCqìNö cVZœÃ>(޹Q^Ô& P®àý¢ v@q¬–þˆQ\.^Ïqÿ®8Öýt¬‹ë‚\ ¢Cݨ :é|Dt+9‘WÐ]‡¼iÛKÛïE] ÐÕÝ‘á=?Fû²ˆm‚Dƒ2< r¦Ãk­ˆu¥<ÄÙ/‚Pîß9‡¼¨€NtEšKÈï±Óѯq9Ø&¢‹ºh +n„nGmb‰ÝŽ¡ûEý†£~nu» ºãœÃÎ#þ0ÎÏÝIÎaÏ’Ø+ê°U"Ðaõ/ˆòÃß`?j$?¼­":œ;ðòT#t·Dt§€îTtCÿ³xÕq"{“ø]èb‚¯bácÎÙ®$Òõà—0gJíG¶Ð@]GBŸ סáPVêUùöÇÊà ê$’QÖ .ÔGçðÇšf‡iÉËí0-a³¦­sÂÓшz´÷„9WðÇZj‡)ƒ8ž)L¸ÚajŒ Ç'…©±¸;L{*ºH€©uW¦ÆPUv˜'ÅqBa:Š¢í0uÞ¥øA€©¥5;L5¶Ÿ¦#×ßÓË#;Ìü±V 0µ¢~Ê3kž? pC¬â~ü« 壿SL‘Ïêïõǽ¾­"e¤FO‚üŠ•¤oË¥Šê‡öÑ ®ñú7DívwJøA{'ø›G H¿‰ cö=0´ÓšÿšÕ‰ÿ ó]®øÁx.°—ˆý"ŠøÃ8ôG<(}3™sùmÐÖ‡rÅn4¾3ÀƒDùõ8š’í¯àaÀ %ñöòð§iä̧ŠÂøêsïÊsYý’ ܺô+ñ¢ò%‚Ÿ—ðûÀø­”SÐxiÿ⨿ûJhïæÄŒ¸¿9 ýÇ2Gÿ¡ü}§¿¾w@æè?ŒGû‚<Ê@¯!ü)][£=ÆÇoøÖ” VŠ”±Gp)ôg‹Gÿ°5@?›Á‘úᬳÎ.¢íÓ­—ëæ*èIú5øC€Ï} W±ò¶”İß'~HâOHà ìæá û\ã¿)˯ƒ$¾?ÀhÊ ‰ÅÇc¼È¾Ñ ý ¼B¿p)ÈG–ßû’ø¯$ð·ø¬¾pì}Ö_m¹{’ø–žÎp7OÇ|ŠåKâ‡zÒùThÿá׿ýOgûO³ƒx%‹Ÿç)om¹…XÌ7=iüIy¯\µI®ÇÒ£oës oÓü±„~Ÿþà™@ÆèOJâ¯\ ñ*_+ŠG\/gúŽG¯§{Hß ßWÞ“+–ºQx˜—£~(¿£¼œóK“ä·H¿.7IàÝ^Žõúß.•Äÿ(/Jà: ÜrІñ2…ÕÇÙ¬ÈÖkŠ^8‘ 3ÎÓ%gdeê \#¨?³ Ù§OÿƉtŽ×p¼Zç,”‹A:ÇÛ;#GmÁ ßìÐh׬¤ä¹\FÖl]†~¾>ƒ£_a9úé[G>O’CäTEª?æ†Ì¢‡ô:Árƒ|F´ì9“thOK(45…#ÇTtÂ1šY~‘$4vsd ’2æêÐÓ6ýЍKÆ/”œðÁ ?«“j«:j«ËµY\§FHq²këˆaf]]ØÈ%¿’ &jÌ–¦ Qtd³£¡KmöAŸ~cÔ%CUzòÕ×É™uüøDCbÆ'Æ pŒÇ$h}¬WáX㵡olj NŒ!öÈt¬áië‹dΜ¢É5§|Р›ŸÔmCOߤ…ìé©q:ÚPÙhŸŽ¶œAo'wÈ£ÊÊæÒ ºì$<ߤ#FÞ˜6'Öˆù61†šw“z-wvZn·#'F2rNþÆ££¦åÄfÏ©`t:Q_Q) ƒ–ö Î5Ðç›qÌÀœs.ΖÅÖšcxú> Œê³RvãC0V'&ŸÛ4¦ÖóœÚŠúsª=ÐÐ>žs…ìc‰lFfãÀ®JœL+SÓ|N!u"/‘tb:³òÌF¢ÇŒ!:Ô;†’É” $ÖûÔ¡SDj¶.mcÚ–™BlØUâaVdxšØ´[/l˜@¤i ¥3õvÛ„Fc‘b•ÐlÁcÃ(ä²1ûÞÌÒ£dÄèDÊP€6Ô9d ‹Ñé@Ý :õ`£Z²lL@„©BbzÛ˜•á$ÒÑFÅN¢ÉÂì2Å8vÒʼn¬Á8wš æè|ðÿìõgö¿##þý2þØþw¿°~}¤ö¿#úöùËþ÷ãBûßnNö¿‡P{¢-£ -DŒs¤‰æ¢8oø/Ø÷ÑEsÑN¡à¯M…­[|Çw©(¶/åí ~²„P¼oììJ'Ú)”ÇpN¡°ƒ-|›ðE±~£f:…_³ý•ÝAM'Øèdé½V1ò*Iý„}øñ¬~ãY½„0–ÑÅŠèñBÛäøüÝ 7(Ú)ØB!Ú,oÄ5ËKàs,+ÏU»Hýÿ ­ƒ6Î##ìV΃aíA {÷HûÏØ:­ÈÙ¿ç௷›\köÌÆžßv>õþð·‘^°uNë¥âòe~œ`ïm7fç\¸šË˜]oÉ…Æ‹Ãì‚~œ z úµ.ð[]ä3À^åÿ“ |¶ ü9xo|¾é‚þ%ôï¸Às‘Ï&ø>.òùÍ}¸ üø@ø2øÅ.ø)rAÿŠ ü<ù,wAÿ™ä»¸p-pA_çà¢Ü®.ðS]ä£wAßÂýMø¦.ð#]äÙýøY.ðÓ]äßÎýjô2Wòï"Ÿ.è.ðÃ\äÓË=ú9Ä}Ȫ§gXÐçsþ„/²Gÿ—úÿ« Уÿ!©Ýùåú|‘;áäRÊí)p^voÄøÅpØw'þ6µK÷Æ’Ž ëÁÑT>qnB$ׂ<㯯B„áÆP¼ç|@%‹ÏŠðâsa"¼øÜE”/^wF‹ðâu—V„»&#‹êMáÅ.øfŠðMDø4^ìb.[„ŸóÈᛉðù"¼Ø'îr^)‹ðâE×Z¾¹¿A„ë¯Dxñ9±­"¼økðN¾•_*·á‰ðmDø*^ìö„/>¥pN„ûÂáEøö"|/öñ['Âwá¹§x±ü+DøN"¼Ÿ¯áDøÎ"¼J„û áÅçÂÂDxñ9«(¾«-Âwáµ"|w~Œ(ÂOáÅ>kfŠðâsFi"|O>[„ï%ÂçŠðÁ"|¾"Â/áÅ>gŠExñ^ÁZ>\„ß Â÷á?áûˆð[Exñ–‹¶àªBkñHŒVqZâÎuh (Ø/´m}‡A”­k,üÇߣۺ",öç0aTÌŸCo„‰5mêÏ¡¨ ™?‡.“£fÔŸC;„Qõ1-&Ö'¨?‡&#ÛÌŸƒÂÄõçð`(À¨Ú˜?‡[£Jcþ® ŒªŒùs80ª0æÏáW„Qu1GF•Åü9|ƒ0ª*æÏa?ÂÄ_õç°áæœÝŸÃ·àìþ>F¸%g÷çð.ÂþœÝŸÃ›·âìþ^F¸5g÷ç°á6œÝŸÃß&þ1¨?‡çnËÙý9ä ÜŽ³ûs˜ƒp{ÎîÏaÂ8»?‡)wäìþÆ"üg÷çðÂ8»?‡a«8»?‡wæìþz#Ü…³ûsèð“œÝŸC„՜ݟC;„»rv-îÆÙý94A¸;g÷çà†0ñÿAý9<pg÷çp áœÝŸÃ„{rvçîÅÙý9üŠp0g÷çpáÎîÏá„C9»?‡ý#ÔŸÃn„Ã9»?‡/îÍÙý9|ŒpÎîÏ!Þüã ­ù¼–8uˆ¯,-íÍi+ËÂHPÉùGs|ê×ÇÛΟaàNÐãºE[Pç«5_\à6zqÀ{gz FÙÎ1ûB;«Dôeuî@¯5ï×–]ª•UiÍÚëM~7MÔžþÄ·Ž#~ž •(QDa~€×šË÷ÊI N§`IÛûBÌÈv/sÒ‹ØCˆý ±ÌCCb;b.ïèñNLo¼á.Ñ1a±0.>Dw1Äø±]^½©Àœ‚`çf4Uxõ…7ƒü³-‰YÒ¢ê^è ¢{É£¾$.õè`v'YàËËTÒ<ÖÕ™¤ë—¥W¹{ð“:-ÚãZáñ çNÓm‘\­5/#Ý­eÞnn¼Û´ ßwûq^— ÏU€æ­´ã‘íòbsú4ð)áHå­Á6Òª>%)dbµv´1ÏPûÞA Å`]s—£¿Øð/Þüˆ¶Û烰¹Ï'˜oBsNòDó½óm4ÏÁt±ÂšªÓ &¦Û‰ý'ÝÆþwÛf…š {XáÎUŸÐZúþÖGÙ\æ¹…¼÷= •Ü Mz¨µ4ÛGH@¡Vw?½CH?´“^ƒ´‰èuÕçÖ›¤ÌK{‘H½õ—Û¢ùN´¾,¸ ýñäB>6€>ºÁ÷o.è°õ æ_ɪË:©:$µ¾œ†n@_Ê›P}Ùë&Õ—jÊKGÌzrs‡¾ÄNøQSç™dzºÁò£ž'ÚÓéÂæN>'>ª’²~ÑܾTI;V$¢i}tRL§²¾~tºX6NŽÂz0•Ò=¾þ]„¡=ç28&À4èGûñÛ~¤ oàÌ2ÝgÊ_Å×Ý$Ëç}ˆ8ˆÝÄ*ä̳ÃkT/ é‘›¹”!­ˆÜIÓg#â">¤"î`†Ä _ÉÐÔ±÷‘,Ÿ™¢!ÃsM×=`¦²°ˆjþ"tþÐ…<¡ó‡ò„Î|‰nX¬à«kP{ÞÀ94_ÉæÐ›è¢?®'Ki¯u#‹Ó|4›f‡ÌŠ¿&ˆ «¥#a;ðb pÇuÏ»!¬ŽúbËH0?Ôš;¨±ý˜‰§Ñ‹Äµê”’*šû¡‡ÌAÛ¾óë(κ ¢ÁÔWðð±rþ²‚.,W÷ÃÉùŠùH"§IøPë~.NP¿ ‰t(ôçX%òS¡A¥é`¾«µ¬–ÃC‚¹š–Þ1Çé-ÈmGà›b™ÖŒj¿DóåbÒôA3’¨Vnt é‹«Å X¹õ®qúÛ|6Þ|:Ö|‰´J5]¼«›Ó…É]BsyÍ›“†§(3hå´¤vÝèB‡rƒ¼XÑ!ÎW5cB¼Š0yq_ ¸ç§±AóWcÂ5ÍpÅx@¹2ÆÃá´Í~8\uÃaŒ=7 œL4?ZØ´àá#ea±MZ‚ó&¿ã†c\à/™ÌÓ$~ËuŒˆ£EzÑéä™PÐ'æëÕq8@Y´³”ý„Æ}¦ÜêHZK•¸–Ñ÷hN¾Ž*òè:”Ê+>¬Fè“ÓÝi;¨µP*ñ¡¾Çð}>Þ|¦ä&ŸÜû(Ò—ù >Ä<÷Sá'ýxh¥áÍÈÒ½$,ï®CšØû‚ ÚWb[af+Çœ&ú'IûKÎÒZ³†4Ãoð‘ͨô‡4#ã£Úß>8ØêRYÅ.¯5 ZÍþŸ0n ¯@Ç‚UÀmî(ªk– Ó ßR–äÔÙ:Òà¨Ó± Ð_yãÔ¢ØÝDɯEç!¿êù|SôC<~q]!P®²ËÚï`",x@‘„Ûˆ? ë;düVãû¿èº0ã}LìFN´Dÿ )«Ÿ Q;…(Àãú 9;é[MÃZ]2¶mñB2 H,ƒ5ÅíC^œÃó—2|ß tj·`By¶P¶¸ŠNªà‘:uX~‚LZÓíÛj̓ï‰Ý?•Åã]›Ï–^]KWÈ E³eùCó”q—£•kbÇÆUÓÙ×|_[ö›JKöb„‘¢ñj{‘‡*_¥¯{ 0³¯õ;’ý 6¶À¨|u^åG\Ük•ë”/cûv¹&HܧÈú€6ë@Áƒ¹CæC]ÑMD\صÁè4c“ÁxVJ³üš©·rG¹&¨2>ùl‰jìLäVÄüa«ÍVQ€N£ÜñóÙðZXzðø…½zŒ{h‰Øÿ·™«†ê^ÄM0ífìÌ^z݉¹¿ßf¾`½´–sz3ìoÛÛ–@ßkÌ?Ç›ïhÌï±x% ôïppñhxM¸Û[ЋüÀ9© ¾<›÷óYÛ‚P¦ƒbô@3ú¸Ñì%ƫ߂¶[f‹5W+—¹á,T$½Ö ËETÎb?­=®1Œm¶üTÉ¿k*–©1I¨Ö2HÍuÅ¡îÐ9‘­\c>›/9Äy}ž¿¸…Ü´0qKâßÁŸ3΃ÿÄ¿C+Θ럂ƒ-Q§¡¬¥ýµ–ìùƒ$=PMw÷ãÉ(¼î/\矆Á+{HÞowS»É¯C åë•«V‘¥-úÇp°[ˆúÝŠ¬‘ª Ë:ÚGÖõèîáÁeê˜ÄAàNêîáá Ú¾BûBã~yShÜjùÞxEˆW€"a!tÄÙCÛXó âГÇ/¼œe€»9P«Xx—ubÅ>> }µwªôýUc®Õ˜±5ž ¢»-1ÞŽÍ<üdišP”ÜòÝa ‘Ñxó `è¬,},ƒ?¥q„zxènéÉ»]&úì+s»¯Ï@|ãN0ÿoÆ×òý5Øú‹üøtêÕ!e–C ôE+/ªf½-Q°âœd£¤ðÒ4ˆúr8¡É¯‡©[k‰Q ™–7MÉ~bpÂÊõã›ÒÅ]  [üU˜¶ÿ Ó/\øQâ‚p‚êÇ…×%"¤) ï§Öë^¢—Ué~0¬×-ƒß뮂Y6g&·EŽovÙ1"–£KR|X5Ðlvá|­±¼Ø+û6V­€g5<? ?ɘŸô^£±|…YK…=ÿ‘Yé%^P.C;Ëëgù “Ã0±(OÝ!·ñõI³«DÇ™k4e<“¼ZÐ2‰æû¨ÿ`©Ó|€¦(N¦M®bš­ž¿…Žö sx™ziѸzuŠt?‘hÔßè>ù4U¡ E;U„;?ù"?E{p|Ób±Ä|(qxQF°Lkñx¯ÙÙMÀUÑWC«Fx³UÅáRðKÒ.¤Áˆ/†®±øJq‰ ÜðÃüxiˆ»FÜ0ü &v3.Š'k©›îÔëë’¹¢ú(”W傸“Çýí]}pTÕ›ÍÇãfTRˆt!  †$HÄ,„ðBWB•"V(d "býJ'a]™cÕ:–Ǫ0-R´¢aBÑFVÀˆƒ5Ö(ˆ¯çÜ{îÛ÷µŒŒ{ÿ9û~ïÜ{Ïý:÷Þ÷öÝ_¶Ú´:‡;¹™'Ù¬3€iB|ÁÉzdk—/<úê‹àÕ)èZ×'Kü¨øÔUÑT–æ VŸSÃɾ |®Ø >¾ôeGW^ôÀÇlÔ¬édæspD_=l³ñ Yº1·¶aþ~6t’E#°î´Ú”è3àyÃ7{àzƒV—:ïô°}ž‰ÿ…?o¹¿|¬`Nævb(ì«HâUO£ÍÆ—ñlb·ðJ¡Ó`Wï6`>ñ±''x “pH÷Pvª {r“¢™î¤Gž¬*ǟ仳C¬Ëì`ŒÈ8þî8ÉöjS×y9°¨ÍÆÁ>-½[£_|Ìc?ïOÏ2ó Fá¾é—`×éÕp?Z{ê5»áò5\¸6sƒƒÍNÑkO ïô¬ÙÍú &Ÿê&fE5LÔû†E‡ž«AylBy 'Ð4;0/ÑîÐù>º!ZíR÷Mcÿý@ÓÇT„Ë=¸àÈ·5¹˜lˆAµ5°˜ÄÍžN…×s .Ÿ‹u‰ë‹û´MD²]^Ð%zAqý ‹§ÓMúÍ·µ€óö<¸ßµÒ´ÎÃõVר€ V¢–† 9kŠùZåYä4ÔØ\óhJî´aø8h\kJ6ürð7*S`Àw á)ã!ŸÕnÆÐ€ÏT±kÑ#+î.F—ÛéVöœæÏŸR…w½ëøZ‰”à7ì_37Üޖ펊I«uM«/™û³«B1©¡å¾#ÁP¯Cm{x°W 6hŒ,æû`Ò_î‹âÓžî`èAŒ›3ÅÁQ§` BZ.:+BïçuÞgµƒ±>‚¸‚ì- i-ë(Ì*uRךOÕð|Ø#Â*Æ ×ø²ƒðË ×úòpýà‡â {¿ýGˆþ”àjHp5$¸\ W‚«­h| ¾†_C‚¯á{Â×€çõáŸW{ÞÓ4üÖªì¬AÖ´§ñ–xø,j ,1““e/¬Ç€\ ï2¼9ä؃­ÙÓ©i¯,‹jÚQs@ö€¬™ûĽ§!ÈØY>ˆg¤Á>{ ȲÏ4m/ȃŸkÚ׈wkZìG·ý ôAö€Äo“¿„x k@n¹äk w€<ò È3¨26Ú5=š†Ôˆ;@–ô}¥i˹äzOƒÜrȬ^HïƒìÙ2'Uâ­¨ó8†d¤¹šiÄñÏÇçjšñ÷Öú¼®Q¿î]Ásá)wgÏ̼f«žñ\ÜècŸàÚñ[çæ÷52p{¦º³§º½SÝySÝþ€»x†{«³!í±Ô¦”MÉ›ü«ü#0ò\,ý@Óf9¤x·†»>©!õ1= ÚƒO26Â"{ŒI?ÀôH˃ßÒ6CÀ³•nö 7âȲ] ýÃø¦› ‹ß‡ÀT9ÝÇ’797'a91_ô«)–å,sÏŽ+&«Ãˆç?©iÓÈî€;;àö60´k=æ êOjì×ø Òø½Ú±Ãß“kÚr½‰únwÄ‚ñ΀~ôû¼$Ëxwi¼ýh‡Ï@ŒšíÀö+|)à“-ÚÏØv"ÿåð» ­­ó·¬?ÌüFnöý Äùãø¾Å”´Û ÷öÒS2¬ð6¾C®Tt}lh_ÞopÜo„ûÆï¬0Odó¬|¡¢ôÙïð¬Ä] güîñÀ#€çJ8ú•#€‘pô3€çP~xÆ$þ~ ð(àÕÔOE?ÚD÷ÀýbðKA‹ûXŽ3p)Ü¿ûå@¶ôn’ìøÀ"áè÷:>·w>¾Vü^{Ñ?ƒÿ¬ û±öØœ„ö> ÷—Â}¤®Wf6BZ‚]´‰)$Ís»(<3±½;Á—“‰‰‰‰‰ B;û¶¤IнÏÖL®'ΖØ{#¿g)ˆsÄÄÞEì]Å™ Ùt?Gº\Z(ŸHâ鉳7¢iüZœ¹¡û⌌ãd 8Cœõ`<;ƒ~öÏ ötø‡xÞ!ö²â,‰Hz© ¯£ka·JRœå!òG. ”Ť¯Ñµ¨ÏnºníWª\É Î±“Ã!j×N’½$S=\^Gr$ÉB’å$ç’\Br-ÉF’“|ŽäN’­$‘ì$ÙK2µ?åOr$ÉB’å$ç’\Br-ÉF’“|ŽäN’­$‘ì$ÙK2uåOr$ÉB’å$ç’\Br-ÉF’“|ŽäN’­$‘ì$ÙK2U—"\MgU:ÉYÕUÂrfŒügbçXòëIß!]yÑ0ÄΉä×^I?Yº6ò¥a¨¥øµø$}9>>“6 ¶’^!ÙŸ$I#O់iB)U¬íùÛ’ é‰ù Žâ‹ù@®?QþõR|1¿D(¾˜Ï›“b<#36o¥Ã›Œg)J|û‡¤øŠ¡øFN8 In‘â‹sc=t¸Ó¯u|ž’â‹õÃ^zÃØOÒ—íߪ˜Ç_;Åo§ø¤“ó^Š;o•_‘:œœÿN)þ¹›KIòë óaµqý'¢Äxé˜}úù«Öúò5D øê0ˆõTöeÆ?¢øä x)¾÷2ãSbüvbçãòkq.®h__´C§”¿8î\eßù Ù%Åë9F¶a—Ô~rü)þ.:‡i×Ïøµ™™*ÞžóŠ?O‰_w€â/Ê3 ÷?M1óê‰ â–py.óí‰ÐKñ]—ðŸÆ¾k õ¿ ä/Ÿìd~>=þ=\VK&çßWÀÅ|jÆ“ôyÒŒ;õùÏŒ'ëóšOÑç+3žªÏCf<Ír}Ž|bÞ0ãýôùÀŒ§ë~ÞŒ_£ûo3ž¡ûe3~­îo͸[÷£f(6¾Mx¶>nÍxì|T3.ÏŠ‚“õ MÆ3ÎO'Ûû[äÉ+•êá+%<@¸¼¯¾Cá|yd§KÎ[(×g¥Ó.¥ó¤Ây åvÙeS®7(<\ƒ˜çÚÉžsd˜ïþAúÍ9¥z|  üzŽï#üŸ”N·tmáQ©¼øƒÙ3”§³€æMäE´²é·áú[ȉá×Ř¾ç6s¾£ ÷®õÃs.pp¾Ä6©¼·èúU&;+Né‹ú'ç_< Ù³ÖFÿQ²'’Ëí™FöüÎFÿ%ÒoÏõþ†ÇÏ›»mÒy×?Eé{¨~DyÏÛè#¥ž›LõìçéˆÿŠŒµÑ~Ç®_Aølý| ÞdƒoµÁwÚàm6ø'6øyÜÂû‰Üo‡¤Ð¸£zÏ_òR¬Ó)!}Ï`®?‹úO™þÜëñµØFÿþΗ‘ìl´Ñ*…óOŠuš˜þHvnõ›ËµÓ&wlð”N„æ)ñûSýolð©6< Äwé'ûC„ÛèmðE6øC6øüE²g6Õ›øoÕË©œ§Óÿë*“þ«¤/¯«[¯§tÄûŒ·lòí ýùñ¾¤‹ò•ýÛYÒÇóE1¸hÃüµMúýÓ¸þJJŸ¶ËÊPSÿ¿—ð<»iÞÿÙš@¸ŸôŶJÒ¬ó­L³îÿÕ6ú÷Ûà›lðgÉ/ùOÑ?ÿD¸g4ÇC´ h³Içhwòú?jc’ˆGÃ/`xü~í&ýY.êÔªÅÿ;/iQ~q‚—ôûÉK*3U"•±{!3("ñ„¦qˆ¨fA;ˆp<$ÏØ‚Õž?£Ä1(ê ‘Á¾ˆSe*EÔ7PqZQ¢š9y®&ZJ„dZQf‡51*Þ2Q£Æ1 ÆjÝÈŽ*Qj¢’LÞÈŒ³bQ§¶dm_´ݪÌÉÌ6S°Ê¼Ÿz{[@q”˜$Y…Å‘m"jæÅåz¶¢,e3C-3Abf䩨q°Ê„½¨-xXͤ©<}ŠÌ2IYýW̬&&V;ÖU™8”Y¹BĘÙv¹a®¨Ü¸¦‘iXeþZVÉ0ïÕ}°³ZÐìRwµ‚c<­ÜýñVŠQ¢Æ±ìÆ"Y³¢Æ‘ÃÆ"ı¢ÆèNc즓,«& ÂÓxBUÔŒcF0Ž•üÈ¥ÙQežcÞf—ɘ*±ÛÍŠ4•÷™G9n^¸,nSkþODÇ­^ÚwÔËHòYT„Ô˜ùEýFIabòú 'ú'2þÏ¢ü+ÍÿY{ÏŠ>õ.uÿ*åÿÌÆ|õÒôt_xüöÑëóÿ«ªµUc—T-[ì[µªz©÷žÂâÂôôK'˜WU°ÿ+V㗵ߑ è›ÿ×ï/˜Çÿ›_”àÿ½"!6þsÓs½c¿U€ˆæ/ÿLÚ^êFøÁ0ÿŽ{ÜÿGzúâ:ÜJz˦—~œ³pöm•3§O˜£Þ<Ü—·r]ͨáéé`Á©³ª•·Nøÿˆñ£‘W{‡ûŒwÅ47\ ÷K‡ÿ°|œõø×ÿw’Ç%çÿ 0þo,œX#¿ÆÿÄ ùE‰ùÿJÃüÏÖ“ÞBÿk$B"$B"ü@Ällj././@LongLink0000644000000000000000000000014700000000000007775 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/download.jetbrains.com/idea/idea-fake.tar.gz.sha256ubuntu-make-18.09+disco1/tests/data/server-content/download.jetbrains.com/idea/idea-fake.tar.gz.sha20000644000000000000000000000012313352651520030122 0ustar b63969a7ddd5ae56ec27b3cbc95fdda3a8a8f66fcf13130cd93639e37e42b0b1 idea-fake.tar.gz ././@LongLink0000644000000000000000000000015100000000000007770 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/download.jetbrains.com/idea/idea-ultimate-fake.tar.gzubuntu-make-18.09+disco1/tests/data/server-content/download.jetbrains.com/idea/idea-ultimate-fake.ta0000644000000000000000000031374713352651520030332 0ustar ‹ØÃTì½ëvÛÖ–.Xž¥S{DêCѺډç4-Q6ŠT‘”wu JˆI€%sWÕ“õ~–~üøßþíu˜†>üÓ2?ˆ×þÀ.|¡«µ¿Å“ùjÅWþ4œEq8…áçð&JV°Š8Ìüdæç×ðú,š‡;ØqÎÂÿå™ÌWÔk/ÉC–¤þ»(ž&·™¿ÊÂ4{îƒ `@‹àCèg+Í:Y}ÿYeØ-¼p¤S?›Ù5t¶6¯šþä9€'ÙxÕb§éyÿs÷1>¸8ñ$Y,B`¹4©dIKÍpXþ-²b˜Øh2YD ýe_«Å:‹pÈó)eÿüA3j>ÞЉBxM×ËùO\c&š'ÍNœ‡óyôcWŽûc¬ïâï¼n<ˆ{×ûý× ¨N7œÊå|uýÎk(£P‹X¤Çÿ~"üþˇd7O®~ïƒ!8‹eá?q¡ÎƒÑbµ .íg¸Û¢y2^ça¶ÃÇð:YͧÈüo`0ÀÍàÿPÆâ ±ndã£ëПé5‹žÃWÙ<¹EŠŽN£Øüm’~@™2õ¯£+3~r¦@­ê¸/ÂE’®AXüu¥!n!<†¸4³RçÐKc õ¦?€QÂá~kIf!m6ô²æúñj1ÆA15Äa8…Ö+æE’g#¸ ¢9v»‚‡ïh‚QJ‹öh@Û½>6#æ.Yga“ÆÝ¼<8ÞÛ{ÄÍYgdž&ó ÿ>lôzæ£?^Í@l?÷?„á’÷T=¬òå*g¢‰“\íg~ļ÷¤…DÀ†¸ !¯ŸÆ;H0}<`¢*Àþ‚"†+îc'†]›²¦02ZtK¨š'2 ¿mò·MZy~ú¨ÛQîfïàè·á„x!2 É€×-˜±®â ®¨œÀ1rXMPÎ@£[Å1r" ô Ð",â,Mþmôã¹eéªvø¨dþV–Ìr?üå[t·òë4 ¦þtµXnù³0Èa,Ù£®aœ4Õt^΂y>&'p<“h “÷†O€-gÈ-uÓu,¢IS·þè3)H-ÍÅà$ r? G¦†=Knq{/˜Nké·?¢áŽ'šè„‚`Ê”¯¡‹)² 3ûðã¿âùŸž­æÄûX&Ãó7ᇑ5 AäìÓp¼ºº¢ž‡¶,€(¥‹éý ÐĂ͂q0ùp•&+ ´0M‰«óuFÉ õ´ï÷ú#ÿ²wÒ??o÷FþèMgvÛáÿ¾ù͠ퟶ_]¾~Ý齦5茆íîYÓFW10™ Št6`BÄ,^Àøù°–up¹–KXøRz \õñ$6‘Ʀ=0 é1™6ÚfÈ2ó[ ‹D²H2¨Èêb+Y®–ÍÛxr® 鹿u7k9ö°AÑj±…ÐaYx€}w.& pØXàg ¨J¨ÍÑ@[$È‘Óø­æ €ÝB–›FòZ%Ñ[¤dÝ­ßÉYÓ0‹EÆíÒèAˆWH˜~7‰h™­§t•Öë%-Òcžë Í,XÍsXù<Ú æQ@¼Îë= ?j†MR†RT³h;q7·†ažÃ£ÙµIú¯Pr"¥ý¶kڃ͚ß‚ùX£úº±ÇZö«ŒmTšÀþ> ³y²DI„Þ>d ÈÈ€Žw©a4MY&Ž^-èA—Â<Õ_ú€ïá™ÈŽŒeú®3èMÐP€Œ2Ê–sh.˜Ëxî´ÄÇ£Ñl7Ñe{0Q:¦ÁíË<]=æ‘ú|÷ ‰/Ü´äix•ÂŒ‰b€Ã‡Úó[Ì|z8}tÊxæHÀÒ )EˆŸM@žËñüñô§§6Ø¢I^„)/Õ£Oé±vògÙËßb+—‹d6ƒuÃø·ÜÒ\©†¤‚a¦=k1ßȈ‚•³'hÍó´Ïƒ‰ßú??ªŠ6Ý_ܰ'ªË—£Ç=ÄÊš¯2ä[¬ Í“@HýšõÇeål³£ H˜±?„'€uÎfhF“ð˜óÉ ÝÆðÞit›øûã*ShþÞL²&ŽU²¯?Œ_ì}û˜Æ/- Ïû:IPM^†á‡ … ài”‚$LRÐhÉ%½W!g#7\Óz!ëPZGä"ù‚¶·áE~ð³ÕäÚiŠÔ›^MÁÄZ&19Ñ#h‰Œbmðñ •~®Õ$:ÒãT¬ö,p+¨ ¤ç£gR÷¶~dWV ¶%½º‰~™pºÌýÓþ€^kµÎÓ ]ûÀ@RñÉXV{bPãG /¿Zk…Ë]2ã1Bá­Ô ”îJUÇïÉN(È‘?fÍ»m3¥´=¶¦š¸Çù?¾Ñ Äõö\Ñk›0åcÀ R¤ ®ú?Âcd‚Ùº?MÓ"¥ý8hgò£Ü§“0P¸á2Ý‚¼ÙÞýùg~~ì§zqÞžï<ª:ù‘:h~×/w¹³G\¦á-jƒ0zXÏö÷›{@ °þ£qšâZ¯HµÇ™—”|X¨8®b&kVÂ<žþMÿ/Jè… 5fËå<’œ< ²Ìß&µô]8î&WÑdGûö›GG~¿,>6¡CÐÌñ˜/^¬kMÙá…’˜Vä9Œß}óÀÃB X² ’+íîÉÿ9:<:,äÿÔñÿ¯òùþÃ>cT“v^~Gôl“Š—ßt†ýÝo¿=þnwÿÿÿà}ÿϧý“Ñû ŠnýòÜñ¤øÃ÷ÃQûÜߢߚÓ|ºõƒç}_õ$tgÏé——[×y¾|þäÉ/hÛyÐ –ØÍÍ$½zBA*ºHƒ«UØð÷žíÁŸ'Ãár5öƒ˜±+Da:9¶OÐSžR’ã@~ò?„Ëܯ)êu¾Š#ÆI²Js†êa(é)' ŽÝ}ûô`Vå´ÙK›Ïýƒ§ÇþÞðìÖb{¬ç†jþÛÑõÅÓè&š¢Sùö:!œ‹Ÿå«içÐt0YÍ%}8f3ÌJÆ”áówüpºbÇ.¼‹Îä(_á_ ||;’ö7Lì†ïSx/À ^qEÀo`°˜‡ …¼QÕ}=+w…ÔŒÍcØ7Éuj´:Ô¦î&Œè t†ÀruRà±L”ÚÁÜ5Û¦$ö=_MŒhJ4%½;ê$´Vù5Ø{ƒ¶/³0µD4Sd2âË: ]Nóµ~âyùç—ûþ³e†76 ¨EOG"e’¹B´U®ër¢²I² y?0,.–ódM;‚«žeÑU,¼=u9™Gð—98ß[!Kš†70 ˆÂ ëGI*ü¦†‡mN¡MÃe[“I²2ÍßJá„¥kF7zöüÉ“€lþæczµ ñ)ë#¸xÈ7²Ò8,ÚÌhPC‹šùtÀ"âÂߴֹ鯃”òa€M‡”–Ç­~i2~°À|šìc´œ—ÚÍ@xã³aYBÃŒm^§&Ä‘Æ,s53=Ô„€†ò€ìð¤I¬™]œS*dºÀngV·?…k³ÍÀüþº Aî¬w ûAGQ¥Èƒ,€µ(O­DŽx|ýMmø²&¡΄ÀPËÌÛ k¬5†(­9Qô. SÁ9Q;°‡GMÿõ¬ÔÁÅžð¼ájŒyMŠmÂF-2*…0„°˜çBãBž˜é6¿f­ÎÕ8ô’♀ÙRé†Ìac*žÄxW#ÿ ›g38 ´Â$Šœù><ÑÊuÑÈFD>eA¸q^@\”嬌EäWA:¹fŽŠ<¶›Ã„I¶ƒªœ@ž3cÒ³ZëçéœrAˆƒ&š+TöRÏCò70g+,¨Ëâ%¨–C,É……,‰wÀ¨9Á6͈CÒº0A\a¥è83UÆR!Ó§þí é3ËŠn¸´Iòþrã2rvÇ†ÊØÁ¼i˜]¬ÎH Œd~ˆ —’:“Äl´*n_½K‚˜ÌƒhÁ…‘æQ ‰àxšÔ´¿ÉîjÙÆM”˜Í,˜7p~ž51"08•À…rðÅѳE…]ÀÜÉwhøªX}b½(ÁÇü‹|†»®Ï°L-\AÌŠeYã®j¦éªg2J²ìJGN¤UæïïÓûÕ욌ˆy–‡ªXpWå` ` Ú*ì¾Ï0œL¥ó§‰{\åVeZÐshUòA)¬ŽhNÒm°“ìÁZÓÊV<™®­± ©á@鈈Ý<$­¦ |×Z’³&õ Ãj’ƒ”i$ÏÅ ÿ¶s R¨×W2é}Ãoÿ|1@˜>†Ï/º6©Nº—ùóAo¡V·sÞµOA»iPÈJudÛ™Þœ¼?[¯:Ý6~Öõ°q lr¯srÙmÁX.ýa댺ìa ¬·Ûé  _‰¢¡jxÑ>¡b…Ò²ê\Á‰û¶‰‚¦u‚ÃDáuz‰-ùí·­îe ®Ñtú§"Ç*|›5-ö‘+-ͬ2áCòÕ0êKÙ_Ê*˜\SýöÊ3’©tIUÙ÷vüi°Î ÿœ’…Û(ß'èOô»­w ÓÛmÞµ‡ x‰O·,;AGnw»ø×igxÒmuÎ);ŽÒõleÞÍp+¡COÜi,4*­…¯j)¼n h›L¦!>ŽëI›8D+z‡>ÎZîå€Üµ²¿´RýÁȶoaE‡H˜#% ÓGXë¼õZÉ¢ÏØ«Ni¡ý|×¥×›‡kZØ;õ›³ðœÙÅWèS Ömâ¼ì¶b-µûƒ÷¼ªð§ŒZ;;kx„ú-yˆ’fjÖ—K~DS¬ÓêҮÚÁÒ¿O;0Ñœƒù¯—˜†‰?ÀKC ÜFÕóö=䢞ûý! lÐ. {OϨ_h_ç™úˆ|óƒ´Ú 7_aÖ)’fÓ—æ'Øa¿owz?^Þ7 =uÞ¶NäK‹DÎÛí/à%`cÃ+¯ûýS|è¯Oë6h·°Ü“Z>l«×~Ýí¼nà g’TëÉã‡E½ìuZ°QzJ4¢woZ£aˆe€±ʤEFC §mÅ>:=9E8RüÎÙ¹Ï$þѨß93ú¦…ô_¶N¡5Ø/ÏaGF€tsyòFmcC˜žK*(¯pÂ1´ ÄÒ1ý2¥n#-ÜW_áQ¬pŒ=!vNh9ƒÖõ¢D ,È ÿ𝠦 y¦ØeÎÔÑ‚²·¨ÖÉÚ˜ü·–äÄHÍr˜’$€ƒ7CWaˆ–âØq±i Hä8/°½¬ÄP Ö â”Œ ÿeŽXÂLí¹öBÙ‚nžœ™‘¤­ÑéI»˜Ù?™UÈÜeÈT°ÆõáDö¤2ŽKá>>mú €Á¾v Ž$L}Jo$~(çÏ:!xÔ‰®É½Z2ž¹ŽŒŽª,SÌ‘jè2Ü žWI­“`É1Gb’*bž5duH$sÆ"ðrêÝð§ø¸”ÅË/íD—_0Á-Ä ŽÃ‹™Ø¨ptm `CX«G¤4J†È‚qÀÖ2Ò•O€r Ä/€é8’‘°9øÀt +ŒéPÓ´*‘”³©8Ú‹èˆ+D÷H‚Kb%ZÙÙÚ¼ÞÉb€$õ7Râô%­u1bhœô½Ä8[©¤}C–šþ ì‚¿¾×äå– ø[/Cõg~Ì @a”ýÝœÓEh LÔ Å+êDxz¯ìO—³Éu8]ÍE*S¢Døíƒñw¶TäÁ¬ÂŒan–z¢¥Þü¸åß7Âg%ÏàÑ,É&ÑøhC@=ÝkrmrÌÉë½&‡²Êûj]ˆºåJŒ}È2—#7Þ¤ y&»b0¼Y²( õ'§´j0Ë%OÆvH¦w‹F chy¤“É §H/ ¢éæF›„EU7«l*$,J~»§b$f Á²üJtE/ pp^™è}-ÜYÖ•}!; ó¦¼.LQ†AŽÓdÅQo+}ß5Wp쿬€iM£‰¬$Ž4tÐQ“(r`$P œeFŒàÄnÂ8b B÷J¦e¹aCì%8•„á[)°|æ6Q¤ð‰"¬Š‡?®Ã9êŸTV´!^SÄ,LY#¨¢´„ÑÍVs*â?h ,ÅÈ y23tô=†F•†Ãœxd‚͵äŠ5ï,˜Ówxzr.åK6'3Š‘/Ä^œ…̱Tü¾nn"ÐqÄ4NÞe½ 0EÀPδY”+£M„ECp_pâ±Æo¢ 4;L®Ape¨Jô“‰âÀFÊ4ÙP·‘Q´ub)`AþÜóZÓ)¦G=ÿL|¬w||îÿ¯£ƒ=ÿàhßvpàíyí]ØñùsZäìÿtœÒˆÿ¾ÿ‚ÕgÒ$Y|I€{ðÿG{GüÿÁÞÞqÿÿ*Ÿ‡âÿ5!T8¨ ü&ê ˆ •„ŒÏS âb¢h†2ÅÂÊ›„ ËûË?õ5\²*$¡…œ“ å‡î"mqÜ¡›ÿ@ó+àò¿2ÿé™0ÿŠšhž6GR/´v‹‹{îŽý…Î)RKkYü:[0sÄõ1–WAP¬ÜsxÎÁ̱DôD»L…ø  þÓ_…éÿ} ýDÿcú·¯¬i ©º»™I‰3Ë‘ÈVâÃLÛäC¨S\ÁžÅ[ÜÑtyB®qåóñ‹­;a­1Á(®­QäÔˆE]Ä:Ä–›´«¤´;|Ü8}s#ÝäEDÞ\.XÀ·¹­º´Á°´A]Ù ®lðÊF$W;¦é-äž8#86½èQûìˆd Gg½KY¯›œE|ľ¿Ä «(]õË«|A¥\%SHÀ‰]’¯ cø7‘-Eƒ° üºû²ö¢ZŠ6¦‰vàÌð¸ÉLD»ÌØÙ½“bBð’‚H;ƒ ÔÈCö¦Üìòð0½¤°¸NGx©uºÓG2&¤ªÇ¸©²LD¸åLÖ;yå6\ÛïXÅ*9^äDç–Cpó;}þ/×­æP²ø(ms_éÞ¦ ™ÐÍO*hðÙó‹<û@‹´v›poäv±ÞaÀ(ÔdË:€ê÷…O•nêB ÿ…¸î@‰Ol.<€û`éƒ% N Fˆ'èˆ\vnè*"›ª˜ƒW¢Ø†¯€ùs°A8¤º ¬b˦Ú-u5…ºšB]M¡®¦PWS¨«)üÃWSøŽ‹)T­‹)ÔÅ~Ëb tK)mlÐîµß©üÉK)rƒ®CŒ=Â{hKÈòG£–ÊàUð¨Z¯Â\¯ûŒòj ˆŸÆJ}’q/£)À9?åk€¸hIÎ- C%ÏÐTÇ”¸†"„\0V ã_W”¶‘¸‡{þ6C³,›¬ž‚Òkå’¦õ«#D)‰ŠEèXajl lû§‘Ú Â$Uå‚VZÃJ«`¥{5¬´†•Ö°ÒVjÁJÏ:oÛþö1ŒfxªV˜kÞ|>È´Á³Â­ÆùÀ×ÀRõ FžÖÈÓyºyzÐ,Nk èÀ Ÿ„÷T™YËo¼||0¹¥ª\/ÉsøÃàDkœèŸ'zTãDkœh­q¢5N´Æ‰Ö8Ñ'ú»âDëÏŸósþ·¿ ã!%Z|øüïÁáñ~ÿ»ÿì°Æÿ~ÏCñ¿H>S‚Þ„ódIì³[F×××hà84pŒ÷åÅ*)mj+P*—»¯û¸ýöënÿÐWaß ¸µ²N™X}cüN28®ºJþa¨\•2ê\kaZ&ƒ×éöí™bpkŒkq­o­®¡5´³†vÖÐÎÐN­Ì„âëÅ+sïpÊÅË—U ‡éÎ ål‚|¶> òy¿.á^õ\¥Wˆ®‡·gQ[®í8£epžÛáfÚiö$ɦ)ec}]tb¬QŒ5Šñë£kc b¬AŒ5ˆ±1Ö ÆÄXƒkc b¬AŒ5ˆ±1Ö ÆÄXƒkc b¬AŒ5ˆ±1Ö ÆÄXƒkc b¬AŒ5ˆ±1Ö ÆÄXƒkc b|üÏ=ø¿ ¹(áK®ÿ¼ÿ÷ôðèÀÅÿí?ƒ-¯ñ_ãóPüŸ"„ðWþþÁÕˆ?l¥íM4Åìÿáûü3É‹ n’h(¼OŒóÕØvü ø ½t+4´ø¶ÈâZMЖzÌ碌U 't×bK£t\[ ¿-(Åï <ü2äà øP(ñ{Vcè&¿1†Î19ïÏmÀž}bŽÚJÖgŠ®ÀÉMœ\øY89Ý|Á™\£áj4\†«Ñp¿;nc´ëá7£t1·ø2”§××"&îËn=ü$М‚Õ8°<˜­™o"a$')¹nsëfÈ$-QXfAà=öØ €Š,eÍž{ä°³ :ä(Eºr•üŒd±VŽ‚¨P‘:É+õM”ÒÕ³U<åÖ0vâzºaañZö+Žˆá¡VnèR%"v¸…Jÿ6J‚u“䘕+2ÿnºª ט&¡h{AE°kª©Y¡*=?í¶í„%&îV6„ŠŽ•[ìž@©uœ„¤YÀ1[ŒW@·ä>u_»%"¥BÇ’kÐu–‚–\ÏÚLÓËRcðþ0¼ú&ÁGáýƒ‚ˆö÷E´_£ˆjÑWD=k⃠)Np˜è°=½Ä–üöÛV÷’ó².ÚƒNÿT<†Ë©fðµ0ÁB2 ‰½ëŠ JmR±¸#müíÃ=AÛhæ”4û™+5lý[&Œnkì„í­¶Êu¦Üp›³]DªôªãÆP/çs{âvƒšÉ¢óÀ)šÁI”írï6é¾a˜gö0E-´E£^1êS˜E©b¢µf…É= ”bhg7ÌÊ“-&Š˜­2»pz°“ËŒúâj" oa$æ áåèJ“ä,æ§œ9³Ê“ Œ“ÑV@Vm6ÿSi–UWiíÀÉZR\À‘™úÕ@JYPEC$]Õ¡õ"²¶"á´CZÌ?ÍJ~B*ÅÓÓ{xöß#{¨H ws9'ÖønUN²kÖ@ÜìÂÍð»‚Ø@}ÝÏÙ*éL\È&îJD(*ÝäT.š» Ù%-@kNÐ3®#zìN˜À9¸ÏÂi,ÿ.F…²\ *ôBÛ ˜œ˜0åÅen´ 0ÇvE‹AY#”РfçB¸ Ìa†ç`Bðöýæñ_vðOh6æ¾x ›Œc\$ý+¬`‚V)Nx4–ÉÛ ?¥ lSàÐB‚$¯=;¶? €i+ûn–f¨áv˜}2I£%ÛDOwÐʃ±š4è¿«Àô:Ü B¨êÒ’@•ŠK êÆq8Aƒ¸ú* ‹¢0ÑZla˱i눕M* å #mÌ ³ÒÞ6Žš3 rïÈ>7µ.k ¨:L„Ù•››uÝݤ㲻õαz•%³zËÎ&/Kl\ÙÍ];^§ª NáµÐŠÝne\FÔƒ{'ûõñ¶0­â¡‚Ž,Cg‹ð ¬¥±Ä¼ÈÀug³|…×aü ù]–:éÌ´gØ]Š«âÚöS_áL9rÎÈ| obIÕÛ#ç¢*ô‡ÙlÊò”JK ›FŠj¸Dª¤>ñ/êGu„§“öYê'é‡EÀ³½ÕõñÏgíê¤ÈPåxÊ7ôçsü³¡¼M  Å„¨Ø$SnøÔ]hK‰÷`›¶ ýÄ:ÿSçiïIO—.ü²ÚDùªô›³7\=Fyõ¨Ø›îØ/.ƒd,¿FQˆ©è¯C¨eN?H›¼ç¯%‡ÜdBQ+˜ìx%îoØr9{¬.´ÈZ5£w>°³Bp’÷¡ê]‚núýUŽ©r¬©¡K¿Àÿe²‘”‘¬Õé 1b@Ø¢`ž³0-{â•]M >23º‘ø%íÁ‘E”JzÄBÛ?Ÿ´/8©‹`ýAûuMÇ"_h8I@W°ú†ÆÕoÀÒ7þÜ`z{ã¾ PÏdEÒð_wÞ¶‡†c~Ö9‘”½Açõ›‘Þúv›p_oZoÛ¼ÐCÎúo?}6èŸûÃQkÔ~òãå 3<í6Œj”¾xí¹üîM›6ŽÑhçíÓ÷05"~X/ø¡ÝéÑ2ÐÃH/ðž@ÕõÂß‹ÿÿú@w°¿>Ì´ù‚Ô¯Âúkä¾€þ›°ü¥œ"àõøÒ'AéKkSÃéN=·Îû—˜êz'€ÞÉ"ÅÌÙ;8oóÙfFkð¡Noívûï¨XÝKÜÀ"FNÌÐ ”Æôªÿ¶m?‚|‡ƒúÞ>†B®aú5L¿†éo„é2LŸˆ"^¿­óWÌ"i ¿Úܨ `s–‹±¦µƒYØY]àAuª\ï4—O*`ÑþÀÿ£øÿ§þ×Àÿø_ÿkà ü¯ÿ5ð¿þ×Àÿ?äçü¿üñY°ý¹ÿ´w|x\Àÿ?Ý;<ªñÿ_ãóPü¿µ6XWøsWè%yøÜïÄ,ÌîÒnY10zNù®$²-,!©`ó ãð*É#ò¢‘àáDeÖp¹zÄÐo”AsLÜKŧ„É% ê2+cÀ¹«”’æ¬ê°»Aª<¼¶õéVwúR¤i˜qÞ"F7SÌI×&ó1Ê´×y±HbíëµáˆÒ½ÎHV4:Õ·ÍÁXäE5sÌ… ESñâ³µ=¶„Œ› Ã_Šá¶Jp¥ó"È\â95tê.Ý݃€+nUûLMžÝ<Ãåf°}³|mr ÷þ²ÃÊ–I‰ËÂ3×AÊcÖëø.>»AkPKW]ËRß,]¼YØÌÉ:$ÿà4\bêYœkJK¬›¦Åq»„)JEyØuÒp*çÚ&'ÇËŠÖ') ›$KE–`<ð˜´Ól²àê ¦ ƒª/˜þã^0½}eÍcˆþiû6wúÛ·ÒËA®ÿ¹¥B4úhÕB–'ýÏjãl«”ªDÐe»Î0c‚ú ç4œ2#5/–/ß.ZX6DjõJª!µ6ôBåëˆjµQ• ð³þU–‰ ŠØU0î(|!u@DÊU‹8¼™¼ ­¢ü@_åYxÎÁP°­ê–óB2†"8=1érÜCq‡uC”r¢_0³á`êr õ=ãÿèõeJg±²ÈŒaŒ{à -ž"E×B þz–#h)h d\®Ë•»ÉÉBqøš‹šV]ëäSë¤.uRß7^ß7n±ú¾ñú¾ñ¯Y*hŸKÔ¥‚êRA_÷ÂñºTP]*¨.ôç*ô]]*èºTVòøªµ‚”Ú©ËŠ|I ‡•Ÿ©ò÷>¬ðŒÝÞCÊÎTôTFŸ9*ÿ]E‡ŠMêRHu)¤ºÒ­Ò~U)¤¿Ër'ºÚIëì ì O66U>ùs>yœ¢'\àŽ"#Ÿ±W÷V±÷Nýælã×*.ò[©&—ªÊ"RPDœÃgÔo‡Ëf0á:DðÍ •GÎø° û=x»Óûñrð¾Qè©ó¶u"_Z$rÞnx/áë^yÝïŸâ£@}Z7=ÓžœÐòa[½öënçuN8“¤ZÏb™=%Ñ»7­Ñ°Ä2ø¤Ò'uÙ“?FÙ-D¸«R?V¨KÔ¥GêÒ#KÕ¥GêÒ#¿ké‘ãºôÈŸ¢ôÈÓºôH]z¤.=R—©KÔ¥GêÒ#u鑺ôÈæÏæú?e³x„ w×ÿØ;Ü;z¦ë<;8ÄúÏöëú_å#ùÄ3Úì&&-^«ÌÎ*n^狹'ä@ÉXKPs$“4Ó:ƒåtŒF²*ýWÃS¥^‘6ˆ5T5`ówáÿŽþIè¿ æ`¸x-ÄÒq„hìSxs`°Êaµâà—Œ¿±PéYC£²E4z6÷hp¢.„òÁu„Ò2ó9%™‰;ÉNr-šÉ(` =/V(Úâ“PœóSkfžÝ‘$À™Q¨lͬöbç. _u.ÀWï¡ýû캣6´ Ée™a®ÈÐ «ý'öбΈ¹?­Cˆ"¶81ßgJX‘Ç ßG‰!~QÂ9äv ߆!•“E’‡ê†Œê šwf\-¬<éüqâ™l_¯S@Ɖ¾zϾêþÅ{*ˆï¿éwOU<Ž¼Ýˆ}èÃvL±Õ{ï•£mVíÞÀ[u¢W¾q@âžø•°Ñ¡°Ó¦Èò†oT 3KÂKÈÆLÑÄ«tHJBG:ˆäÙ¡%ojÿ܆¹´0`Ãmš8ÓCbK®lÉÉå€ýD¨x5uFBÁ ­³ ¼Ð!¡KŒ#œ¶F-êXBQ/àß^ei¶÷Fl|*r~J‹ÛïÙÁ8·`¹ºš ÓóLèƒó4íÇ0’ƒ«0¿‰)¢$*TÄ¡ï]ë})jtV¬x¤¢=÷Çv<^n yï÷Sõç7úlÖÿÀNxœòo÷é îõ¿ý½§µþ÷5>‚wjA·ß|ÚÜ×®ÀÈÁÂáïŽþ•&I®@qóhŒÔ"*_±T•¯},Âæï=ãúcî8ÿÙcØ~ø¹×þ{ö´tþ÷ëóÿ5>žßž?;í&ë![¨2 3LuþÌ9¼ÎC6i‚8ZJ¬”hPÉíù%›nl:PJÐ¥ÎRr®Ž°ŽP²€þ*Í;ÿì;ÿË <ÏXxÀKvÖ§yžŸ/1´šžð‰ÆÞo2ñ-R;bôù‡M¿Êîs‘’×$^²J+ÆòKпϤ†>ÅôkÐDsÐSö`Eöå'ÚƒÞò1dzwY„þ§X„Þ½&¡¿Iè}ºMè—mBïKByè=šUè?’YèìBÿ3íB¿fmþÝ6ëád-³ð7÷ÿ?;,ûÿŸ>«õ¿¯ñió.ûœî£évýÐöÐÛ‰yTXø ²`¯­sGÒ©¬WU”Z1—öI·sÌæâòUï øâö–ÎâÂ2†’ŠÞðmhñô’oަËÅè°¶îesï!¼wÒ¹è@kß q¬í‹Q‹xbE=íýBÜ­¥B€8—’Ï=/Ø)†Sm Ö‰Q;κ̆«$U•Q)Õ¹õÆ¥>ÃÆÊê÷¹í`&P|e°ž\—[£’\S¥Ü¹O¼ðn1#ƒS-T#¢ÉmzG•ÉõåÃ\µÏže(€rMñÝ X ©=dØhß^mÿÝdö4j?¹o˜*‹yvS«ÈªÐxÍp^ɳp>“dBeN({z+>‹™r!‚5›Î¨°|1åHQ—Í Bi%Ï©Œ4•ò aÚ¸<`„¬æ¡Ø …t¸Rú/’f4dÕ®®EƒWp߯åÜ,N±à¢kiÈiÄÅUB±ÒfÓ¢óÄ©&Œ)Xœ"%¹¹F‹næ6ã©*¤˜A†UV2n ¶œj®H2…1gÚÙ"ÎÆá yöÒhŽÛf˜heÒ\V¬º«ÌJ!µ‰'˜ãöR{T>l1¦íâjâåŸvÅóÂŽ»»ƒ…‚Ó)­Òœ“-À.X:5¥¾ÙuÂWÝ߸ ·áÔ[çWɸ`·.!É×+[zh±âöº»¹šzåY@@óé-è ?MÖÁ<_ïtÕª¤i²;µÝ‰UôðTÔKÃDΠ`èþr¬­o$«amƒäŽuG…-ÓåÍN¬«²ÒËðkq$ Ë› YuÂëÉÕz¨¨ñø÷\e9HjæL8ÅCGù„ÁDtR¥>*H÷ÉSAbúÓ‚‡T”îû´}ȲqzPaøRæf¹4>ªVÞUa Ê¡ŽN„ibì°á,Ýâ ‘’Â9œМt‘¹ªþ¨À&²Ðç{S¥@Óvq#$û°jÒ”‡¦&n°V™*=.’¦84JL½Òé­x²üÌ©®LÄFÒô&;±Ñw”{¨’úæèиº.Ó«ª™g D\Evkf`ˆÅT­UÊe5rèÈô)³Ït¤½nj_§I˜‰ eÖ/©a¹äòrU×÷¡$¤ºYjíâ7U¹‚iš%›™E*—Q&a·îƒŒë¨A« î§…í-ˆKàǦðaøoÿÈT†¶¼å”·ñ+´½Â{Ì „óà– —ŒŠÌ*Bo˜¬ÒКØÃpŠ¥™ðáÇ`±D,~éÛ3ŽAdU¤¬ùyrk—+q*†ï诌Ó~“UL$˜p:/Ñ•êrÌÕ錯QVT+Ó2}è?Yè±r…’*tw$^*ÁÒ€YÙET–…bV™AmJøŠZS¾F@õx6[`ÙH«ØçWÝ÷@NGËqÏri €hß®® `›âß¶š`ŠÿØe­Š\c+d ü7éFbLì°ÚË<´#{~›}`œ©k…O ú;§Ó¢fV±,AÙÑ´D{l3Ïo;Ûi°æTz@¸sõ½DXv…÷ÆÔb ô©v=µh­VssŸ1#º¢¯JIPì…“$*kUI…"ÉÌU¤Yrw–KU›z¥;ìeÅw½;/«~?F踌Ƴ½‰x#Ä€ˆ“؈!.³ð ³×ónرUsgˆ”¥ ò¹lë¡??IèjkËÛ³ÄÂ:Ìšþ›ä6¤ëáìÁÙÖ_å•RŠÜÀ7CvËj˜añîêÉNoÀ8Gç:¨vJæ^pKN8gÆ¡º/µ‚ ¡þYÖcp“Dhs¢Ëïž'ÌŠfª=uRè×.þÁY÷æÎ,“AÎN¶ÉLsÃ<’˜V•cBý™Ë‹»%Ë-΂ŒéË Âeç²sâ{ƒ{ Õ›±.õÎ+Gs"{Š…Ap.*iî ˜ÚTg;¬ÔþÆ‚Õ!»”Êrl7î Œ”Ž¢ÎBr¡…*ÏnCºÐ Pl$"Xèl®·zo¯äi(rµ¶Å‰ïð¬æ·X4ì¦?JÂlŸ.‰s˜¤ÖLÉû¡‚ú á7¥ò%Ö…ë%§Ýq}GmÛ½á¾0Ys{˜5„¦U´ÐÜ:Eñ ¾MW]t€5ÊðL‘!èFÃa’O¤.Î!ömë™îª\F ·g[‰¤îÑmÐ%¼ }ãuó>~º_ç ÞCæþ÷Oñ/!>ØÛ;ò7Ôdy„¢,.fÏû¢,Þ£`ö¾ ²÷Xˆ½Gì= ^o\IåÞ"-8ŒÏDçù2úpÞc×jñ›§^󾚇È<ï1y0Ï{\˜÷i¸¼»ayÞÃayAåyähóÉÑÆ€ïsjµ(HÞ§òÿ;ä?XÅSàù¿¿÷¬(ÿŸ<«åÿWù”Àûßîìíïû¯“äjŽ‘ÔIÓ×Ű7ßíÜlíoã *²µóÂ÷ÖÉJgñ…Ûâÿ’¯wÃVÂ5Œá½´PyO¶¾@(‡ÁúŸpI6<þ)·dçIõEÙ^õMÙ]“EsïÙޣݑí©K²U÷Ÿs;¶W}=¶Úùû'ùlæÿ¿„þý§{ñ¿O÷-üïÑñ>Õ©í¿¯ó¡òw~\F×ó–hø?ñ -´7¾t£F^.b÷š2RˆK˜a¾ƒÈM«„ó‹7¸D*Í}kù$^wÂ1nLiGJ`+e·±½ÊM•¢ î¥1æFpüv^+û¬8.ÄiV¸CÞBm+0ŠÒèoÔŸ´Sõ†ºã”¼q*mAót=òiµ©éÒ V±å_x­—ð—f,àL¤R²M2˜\ø›bö!šËõ§¡¾æg±HbiI]±#Z´£¼Ûg"ÙôýÒzUõ†«=Ú’Vdq»ô*^¯ÚÔxûÖn°NLi´¦é')á¾âÀ@€(¼Å3ÕñšGPÛöÊ û”&M@^ÚºhZšE³|mî=ÞûË¿NUŽ­jh•›ó×A*—ñlSB>ݦ<#§ukœfËA»Úò·á]üfZ»Ä´&7ÑTòmú,“­IXÁ/Ú–© É3³Å~‘¥-©”}Ê9ò :‹àÅ•ì2àjƒïÌÑššå j¸¾i†PéŠñ,ºZIÑ~TW-öѧ8Fyèè‹¥ïŒC–<‹sûñ¦&u@ Œ‰ùgúNüÆÜø¼<>ãc J…i¢ Aeð£îÁGœ ÛÜ‹êéK° ÓØ?„÷ ÑÝÖ´ß%é‡S@x-˜øRš9ëàièÀK'ÓÚQ°L‹ #äb„¨žk¾àÂ4{Ó@…ˆ/ŽÈs”-:Y‚Ë–Ñg;ˆUj'…ˆ¬;¥ØÈY†ÐóG8LóävǬ©ã‚d[E À>ª×@f/-ñ¨k|á6%£?óªw*º1Ó@zà `³ò„:DŠT K£.D a…“ÔºE¶Ù>MÒ˜Å58ñö:áû‡Èa^±çe~¬øÔÌ9þ ¿¸|VêÊ¥eì¸à10ÁFOŠp*ØMc¦˜Ì7â´px#º\iÇŽ¥³`BB¢aÉH½¨¥Aå|o‰Ùu·XHÅŽÏ€>²Vz ±J=l̽èÀ®Ë¡ZJxmè-ø}ÓàÖ¡ P^ê6Wl;[Ms-1œ†'G:’ð[A­P»œ24ëia+*È•©{Ù¶Yyy˜´÷·ôœ¶¤-Sí‚Ø2VÁ `šÄxo ìÂXnT>dç"!O½è¡s1ßžan"ºqweQ¤y—ÝüÏŒÉÇû$8Ž—áELvôB©BÙ:ËÃEf³p¹+BøOHFʼý BmEëZö¢7,6âPµÚ” e“U¦`£ñKQ#ßÇ3¢ÉIÚ²æªèóM–Ñd•¬0>L7y¹× *•+Ää6×7]WR"2«­].é@¯¶ÊG¸ _;—·!­Ü«ò8xLà‹B§”Q2é¦*Î[pîþFÐ>„.£B(“/ÒyÂÖñcF„…ANŒWæèékGYeéŠ>W3›+ßSÍZD'\`.MTäg³(”¹ˆ“]¼¯ìªPæŽ(v7 ùØJÒüîú"%NgØùCªŒ˜²"bΔ9š“²\ê±BœKí|ÿÐÚ ®ñ'ØíPg³˜´±SÄÿë%„Õ@-O ˆìèB¹»hI㮪%ÄfÔÌL+ *_2@’Ó ÐcCy"i§ª””æ›w•)Š”ì³þv¶cÊ‘X¬x¥ÅÔ„”ß›†ÏJž;8éâ–jˆ¬£LJØm Iæî§'îªÓøé»ïŒ~M0w·\Ë ιsMmÓŽQÖµ&\`>#¦âb% ¥2)cTNŠ•¬ã:Ê•VUHµU¢öÁi½ððQ1 é«8†‰ÿß‘¹éð£;´<•Ä óŠÊȬ9f³@L«9Y¡„EZ‹0ÜœŠñ\ÉYÌi£™bªÃÝ+f]¬Ô¶ê«­Cü”&Z§ËŽ1v]õ9¶údÇQ¥ÑŽBû:iJðØXÊ–gð¹Õ=²8MÒØ&Ãò%áÛq{žX=snICéÍ– ¯òñŠ“³:Ö‚høœ,Ò±!Ôݰ¯‰5Ê‘hnŽ›ÖK2EiöXtäh\ñ>Ši¦r©œƒ!˜ °USÞï.Ö9 h”å¼à:{24}Y¶¾ÕóiÀ!щ‚€”êlù* ‡,²ðc8±X<1^ëªô« å¸RÑöXÀS`…ú‚v©þ¨ôhãºg&"¤.„§AãÛ*Œ©£–Fƒ^¯0½AŸ¾üɉ¢T“@ç™Ú[¨(Ř©:¡gFóÑh5ÚR©Â´VéÊ wL`‚²Úè@OmÉ?«N“Ú7‘"€WêYÓ?5™¹ðÔ;®/°Ö‡àÎÜ#u*3ô†ÉÙÏÌP· ÝLÔÙµ[ýtš¥*;I™!_–¢¤ŒÓR)6s‚LÖ_½©¾š ,<´R‘“O+mT O E R&@íЦbD¥jÆßO¥pºŠ]WÖ ¦n °­ec–iï[¼æ[-)¾ÔU‘D'XZH`‹Ü|Ř#XÚ–«EE²r¬+k¹ âðj]áUÜ; ín8®\íù¹—Þ·U‰¹i8Æ\+w…þ·P]æThçŽ =.@[AÕ–ay¨y¨<ªæQ5•óLôYêç5„RËõó‡FŸŒÝÕRe ¥¸–Õ5.º´š+Íc¤:v[ÅLÝDfwÆÄÕ¨fV±‡«$™"¾Éò~ð ù —u‚\A)&?ŸI1ó†T^¯Ì±jáèõH¥2Ò!*èEGœ´¡éÁô&¢ ©Ü%ïGÏuŸuíxñ»¦ß¢’i¸ ŠóbÏ-#¨­CÁ5ÐÜãZ ÞnSZ¨)ËIžN'ØN>WÐÛf!ñ“†u£ÔWšÄ’Ý Âý¨FU4ÊõyÔÑ[SáÌÆ& ÎC ;Ú››ŠæN¸Ç†;stY0ZO«a3?Êh‰çV4DëÜ!'®|]QŽ–4E1½²´Žø„ÑfŠfÌŸñÀóy—2ijm¸(¿wHU¸Îƒt1×u8í²Àæ8¯ÒÔDËTu Ö”0ÐìD­¨õ6^‹²a&´Æ0kª•ù[‹-µQ… ¸Ýã¼ÿŠ48ú½uqt~~Ž[HÞ.?VÊÑÆßh(·:–ŸÑ_hH…ëMPju§&]by%[Ò–ü, çÓ̇™þ£”!PæÖ¿ýû–f|ä™i·VĤ*,öÖXÒMû4‰¿ÑùÖUÿóŽOÖ:™©RApšq(˜ÛVl–j-¬ŸÔP2êyÀ'àÅyFåþéiñ“*.NÏ2Ý•^ŠÌ.R3u]Zµkk&±ÅÅ3|q GŽkäÁ[ ^J~ÁaáE:/+§â®Ú=cœA:¹Æˆ5ƒ &þÛ>ÿîÿ›Ây¢¬ÿN!&›øRT¶ñ@\€"÷OÀÐ+€Àf¾€<BÛzŒ€G Ô(&ðGÿÜ‘ÿ-¤¸/ÿÿéþa1ÿÿé~}ÿ×WùüH»ìÿ8¼ ñ¢2HSÛvö c%‹I@…¿1P¸Ã f´ÍÍMÑèB¦ ¡™|þ#Í›¿Rw»çnèÒRÌR Z‰-UTÇ”ŸÙôvÓ–!›?5X¢KÔ` e‡Õ`‰,ÁC¯Á5X¢KÔ`‰,aü·5X¢KÔ`‰,Qƒ%j°D –¨Á5X¢KÔ`‰,Qƒ%j°ïV –¨Á5X¢KÔ`‰,Qƒ%j°D –¨Á5X¢KÔ`‰,!½KÔ`‰,AŸ,Qƒ%þžÁ¿Kþ÷]ùÿ7Aþ¤»'§§Ý›ýæÞçbîÎÿ?Ú{ºÿ´”ÿX×ÿÿ*Ÿ“þùy¿çŸ¶ß¶»ý º„©˜îË1÷·‘v4£ÚÇS_ÊßoÂWÎýš”QDZ…›&"ñTÎu5 ×v«n}»%ý*bàÜöüQnjxÜ/sÿbLÙ﫼²¡ð†Ü#æ4Ïו!szØ&×øz‡•&lÎ}‹’4Ç23ºÑ{²šކF?Ä¿À(UÊ­ä[;›†‰ýwÜùÛÉNÕl9'¡dL¥6YT”ž+ôÌšöpd¡eï¡î͉°:ÿo¿y„—Ÿ¢ÃŒø¾ÙˆÒl#+غ¡W""'É4¤öŽÑþæ‹uOAïžãMžV³›Éj¥YN™YżËy´ŽG`¿ù´éwÑúHÙ”‘Ü8¶ó8Ù€;ÌÊSCÇQamx¡)5ü}…KMÝkãíqì8È"}{==Rä‚6àoÈÖx‡žµL3îexì7Ö¦è¤:XNgÕ”`½½cqdÚSf¾EÆk1ë;x03Žάr?_0·=¨<îløËÖãÁ²á@ÉüçâÁǃƒ;ÙÍBá>¦ðÉLŸ‚øšñ»ÅL„ÀÔHŠU~ñP!`e:«jöNYð)ÄQúǶß+F°c"Ó"N^Иw~½—#TùÒ81. %4þ°9€;¤¤+“0Ø71lú4ùSŒÎp]t­¸b@UIä%ê´H&PôF€B‡ã’"rü„ü| B‹¥_¨¥qXÍïW‚ VÁd¼W¡+˜0+`íDÕJ#ÑäPX®‡¯”3&©ž`£Dt̼ŠFŠK—ý£á×áÓŠUtpc¥)Q(ÑÊ 6f!J2®âàFç"FŒ0ÉÕ>‚á4KþþQ‰™Ü ‰{Ÿ5 6üékíð"¦ú0·+½©±Ê¦PÑ"ØdÖåÎKžNëP:¤Š[Èå¶AÒ/[ÍÐ°ÆÆEƒRÞÙJWi¹(È!Æ*ÔÚã´ð¦WA®óV|•C]±Š* ж˜•8—P¯ý®É·G¯v.’ÚP-CÅþ xG5,ãCltD‘uÚ”z FÄâGìEÊ@S©7’Ñp‘+ÜN¤¨ˆ3¹´ÚG@«}ÔÄ s˰’¢FHD²ø²¬óp$9x•ÐZ,=?àhq¢®dÆ©‘È &y¦²1TpÝ©à¦Â9!”…ñ¾æÆ,,f§IE –ɵÒéW:éŠÕ*ó¬°á8ÔÕy\¦U\ +ÉJe>L±4 sírÖÉ’RÄZ¶§…Ll)hx*1Û(GIšÌkÌÑ …r-&$}ÊG›PS•]Oª8žx›lå|­ 3¡¼e:ŽZXÌÔ²s´6¯IÉH"À„I²|ø”™ÐqB4]:@Ç-´„‘¨DÖ!*˜v±ƒJ9z@ÇqV<hV±G8 œšÅNõ`­ø“¼dà-¢»Ú ‡ Ô—^•¡S=N­ËäÆxЙ'ÅÅÐ àpábIŽŠWF\Í\ šá;Z—ç²°®h ,¦.n×CtÞ‡ Œj|Êiäåãmâ–Ê;BË_}òEuÇ¡(1‰?ôÕì©êºñl먉æäx' %gi;-ËçÓ"ÚUn»[š óy¨P,”~Ϲî”P$l•†Bߤ- ^º@³Õ|QèG¤’Üñ<ôŠrãèG°†zá­Å°†«Ø?°€šáNšÈëíx¹:Âðô3¥e ð:´²k.DN•¢ˆqÛg6öžèƒòè „ÿ6ý6ªvJ À¬t´vL.°OL³[A?¸™ê±xµ£Ð6«UÓKy&š‡dë“ì6N>›-©9]‹Æ¨Ó 4:ÓQ]P±o“s§æ®¦&Ê`~¬Y+ŒâU¨Ý„wI•¬çž vX¬.¥–™Ÿ6–„Œ–25•4¤°Úå#l·Z^íx†½¸ŽÆ\Á')3ñ/Lj½7„Ï,Aåhl˜«u¤¬õeýã,kß: •d‰¥¹þò TçØp¿ÂáhÙ*{ž²(þñ•’G«Z†à·Cr5ÃF6a+¤ºT„=Šœ!LÈMŇM#žSLd4f9Û³cÙ|¸NT†P:yOåEWñ å*Ë Ë–õ–çYY +×.ƺÝýr[A°Ó©5Ñ`[Paí Oº­Îy{€ùÂ’Kü~;é¿mÚ§þ°6‚¯Û~gè_ úo;§ðåeï^½ïTîd¿ç·à˜¥,IÊÅ å÷nFr~…FÚ?_ ÚÃ!4Úøó‹n§ ?vz'ÝËÓNïµi¥Û9ïŒZ\Ù×Êy½iàÿÚ~Õ€Ïí6özÚ>kŸŒ†6 a‚gƒÿ*`8 FÿkR7mèt†?álG}úö_/[+¤ÔÒ‹ö=oõN¨ïMcÃyùïû—MóëžÒÒ”Ä%oËø;ð¯Nžƒ%»€oØ€¿ÝëótzQ§ÕUÉ®¸§z¼OK}ÒïqÎk°c^ž·etÑڛ^ûv£5xïÛƒ·Ú‚Aû¢Õpzù`ЦòÊMÞþjúÁ®†£ÎèrÔF”ŠÜ£¡áBóªÚu£õ›ÕªV«u T0èü_ð5L¥ÍØþù¤}1²©Ñ HAÉíÁy§GTC_ì°É*¿UŒ¹Ð¾V4tÕ¬X˜ ädBÌ\°GSõVá[6{è j›Štª‡VªHÕ8%o•¸‚÷ü)jÀHƈ"!oÇb™µðãMÿ5Öšè€7tõ)àDù y¡TžÁ:™äcEd®™®šP;Tóôä-Ú6ñ„eÅÊ—8JKOòʦ!|•T¢é—Õôj!MF«ÊSÕÎ 7ôõÛE7HÕ÷¬ÑrÈŠkUe¾.#Œî±Ì¿ ìåh û^U¼ÊúÙÊ‘À(•xZ4ãJdÅ÷£¬0-QÐ+"ò›Þ¯\‡É®š¯í,«>™!hÅQ¹«ÚßИ bU¤Ùئ¼#Ì"ß #²)_˜àŽ‘µH*qÍN2QÄAó šzœŽðTŽ”‚D¡´ÔkÐDê‚îÔ¹,ŒsÐ…ÂË(Õ§†ÖûP]Àä"Ìšds4sÊÿȳük;ðë4 nÅ!C4JìÁ‘VeÀJ2Tô^Ü_ÅBðRš§÷e+Q¯]ÞÔÔƒ Ž­vèì’iJ“¿Qe ,æQØ`°Ø° BÅí YKM„˜ÎE Å{Ì£é|mgµYÐÖ™“ðÁ}2š×ÇŽÅ|JÑhCÀ…Fw\–g7K€©éZó@ ÕíH ø‘%H¯“Îàäò|8B¡Ï¸LýS·ýäÈÙþà=h.oÚ$‹Aüm­æ€Ü}Ýí¼nÃë; Ô-ï rIv¿ëàõÃ7­nE~£ZÜ7ª…}C©ôÒ'i]”³ú¹áåêa%á?ÃË“7¬%µAzÕ¦eè¶QÿÁ' ó!,Ï™4 ^g@ú ª)0FÒè@uͫۜڰý¯—¢œ¶Î[¯Û²*Np¨ÞÃ~»¨Å€ºJŒþ¢æ^÷û§ï:]èô]ð“?õ/.à\ãó‹Kìâ¬Õé^Hß;ouÏ.{r{„L÷W]­ê9ªÎ˜©ë!. ìCÏïX‹õ^¶ìM T·Wmüµ‡ºaûTi† j;LOz™¥å¦R’*©OZFÕ¯»õwÂüˆ rÚn† ÿàÍ!wz?^Hy¼ìŽêÎýsk´C‹ •fÛþyD˜)¤ˆÚònë®óöhÈo›1‚6Ûµúé O;'ŒD<íó8»Ýþ;i¶uHS&hèd#™UõymL;¸MVCç­÷îÒ ¢íyß6ýË&,ìk¤üÁP ºç`(¡×²[—Ë êrQ.9 X†ø‘¹àxýÑ·¿ž4Ïšƒ&ʪ½}»¾ýï¾;æŠûª$Ó]5[NzßÞÔ|uô­Ï}ø¿ƒ;Ø;Ø5WŸè¯ŽüíWq¨Ö 2o¹\I@µ¡±Ë ­eA1lrÚRµW*ªWrî "‡­€b‰IÏ)oª¤ƒ W”¢ÏY‹Rx)kX… ÎZÀbOéÿuº‹´‘Hu.wDýé¸ ˜¬ŽM¬¢¼U•`D©Óîv[½vÿ’‰×Rƒt`_—”‹j¤=âD¼*s±–±ÉŒt~ÒõøKŽ4pæ$Y©XVˆ¹“0 €”yW×Ôý;I*9Eôg©âºk•c‡¾«Õ‚ñ¦Û,ºå ˆÍÊç/«4ʦ;zÎ̤­ý“•QùŠÌhãʱ†ì¿¥¨àºaj*içÍŽ]ò‘VǹgÐT¾›Ìvqzí2Æ9YeeÓp.I“*Ûmºéµ…UÐ@¯UšÛ7[•ŸD’­o~ÑÊYÅæ _ C)lÅ:J“„ ÜßSІÍÏŠkÎÔòÊA›‹CÐøgaÈ¿‚ÆNZ #57½GtSœžDðO0%æb¶C°¦¦àý^i¬ª7ƒ9™ç¯“dšáqxý|-[¥˜iï¸2@^­äBöÍYuº”+Oí)d«10zcu-D­þSÚdÊè.sq†Tñpé£i—JÑq[N•MÊ )‡re½†9¡™a¾Xþ)˜bù+—"O5͌뎉픤úÎ'*-û§×Ä©öB5¦ñîµ4‡Ù{|¿ïÛ¸¹«Pãµ×$çèKW"§rÑÊoÑ*©vRl~••.éëYy¥V ƥБÔyjl0µª¶æä®òhýM¯.+B8 âÅ}«žˆcdc(³®ÄÜú<’0ŽáGŽoS¾xÓ²ìú„êf‘)n4ÙNQêÈ¥Dº9H´ŠBÚµn¤pÞÅå`xÙ= t¸!{ýïŒ[õS±ý¤â½Æ2,g’¤Àn v  ÏÞ)^thÈ%*gþ ذ°ßqØVèf¦¾óÛpõ3PNÀâ‡Ý%¢îsüŽJZ#V„Í7'λ3ŽÎ¢a.Åx€‚4ÀTÞÝ\+J£1ï4}Ïû=®K½»þè/K}èu¾˜Vw×ÿ8Ü?:6õ?žú{ûÏŽëú_ãóý?ŸöOFï/Úþ›ÑyøÉ+àþÖî“'ïOž<9ò‡@OÚ½­¾G2€ÿƒéÞÿø~Qc™ ]ä}7/·Ð±œfÛÜRpù—[˜…ù_}Aé„`q¼Œ²d÷Ûo¿Û݇VçÍþÂÿõþ‡j£‡/·ÀänZ£þÀj^ÚÇÚÐÚÜóÁôJæ(:ü!›ÉÎÖn!±ÞŸ‚E§}Ÿ>´[£ö©õøÁÞX«ûß¾Ø?<øhu¯ôÊ›Vïuñ•ýïöŽá•ã}ø^ùþ /œ÷ý8™®Iy¹Æ»—Chîû%hÑUür á¹a Ï,­ý Ú?Úú¡:Ñäû'øÔþ÷ã´øÂ+¼ uíQZ—b—-eãÈ{ß?Yb×?ÀŒOIlpñ4„j½´ÛZv3K…9ÉF¿µºž$üööI¿Ûå˜\÷½¿¥ÙÚñOZƒöÙe¾~ÕÝ¢íõ/Ú=ô¶`ß:¦uÞ>í`Üñä§ÖëvóWÿÕ{¿ê9ÏyŽã}Ô™òÏl˜ ´Ø9ç=ì¬u‚Q½ÒÚ8ƒA¿×9iÁpä¶;²À÷ôÒy4=–·zò¯0:H³—·øÙ-„î½1#‰•žz›G¦ÝBj:èϲºix°ç£.z¬F—ƒµyÙ»Ú±Aöí ü‹n‹ã­ 1¥B#\Ö÷kæqÞ9s§£¢…öŠKÁóÃç½­ÓöI·ÓkWÌ®bÝ}OÑÛ÷ãöa²šn(Æ Ä<þáW ]P‹˜üx.6‘3}ã]u× Û—…Ɉm‘9×ÿÄâ‹êj‚ jî ]‘¥iaõŠn¹Ü*LÓ$õ&Išª«iu–ÞW CÝž$„‹äøÈ–Ò§·v0øèQeZq•[òЈFÁ%ïì¢À§·ª¾¹¶ºG“ô&LÄÖE>—A4u×õÖ´xÐòØÃØü—ÕñÙÑmS)¹Š0D£FÙ¹0êQ6”‘œNVõêá ¤ê‹õ+«¤à†¹ºT4k('Ÿyèd“rjS2—ßIá Œ6â\T…”w›ïuЏG7 ¥c.†±€&yMg*¨Žž(,»Ç¥þ¬û`˜RÛNÜ-ä#â;0)G‹fé½vÉ>h åÞÑ›¼˜vƒu¯`©ÂÔӶدl®L>ÄÉí<œ^‰Ijï!6˾…Ó†7W%“ÔRV_¹/øé†2“UÚeȦ©GÕ'èeU^•+N¨™6?ø€N¥N7ÅO½ré<«d'–¡ÊcUC”ì§/k/aŠix$ùÕàç uH§a]àbW;oøóä*ÑxOeá‹ÄfÁmQ D÷Jd ¸ŸÎû1ÜIæ–IÙOÞÊéõ$€ ƒˆaOñƨïöv8Ôª³ª§b4:$÷¶†ÈTâ‰Ð’ƒ"£¼¸¥Ä’ùªYí%±Ib¶c‚’ж£™‡EÊt.(‚¼±9,ø:aoêãŸÀ˜¡E¼†Š%>øºv¾Ï·JŸSSà3Ië„ìt{š5nµ†^g¸Åtœú†yczȰßdTF$ ­ª²ÖÞ¨ Ìš”Ôlð(ÐÛÉR¡y¤&ª>Bjð”ÍVÂp‘s"äy˜ÄB{ã`Ìò¾˜^öºXbwg NÏsÅ\ƒ„µänY™[VýI¾½‰?-®O‹ú•Éܲ’¼8f(-ØÙbŪížS²ýþ¬-Ñë@Öëùž6Xn— üx*­ªÛz‡Ë‚acŒ%Ž| ]‚Jq2Œ¶±2ч鬧‚®à{— (r$ß;mZÎÄ­x¬„h='ÆÖ(à..1ÈŒ)h*öö¦ÿú€š‹ŠèW¯[ƒS¢ñÊp¨Û™>Ë Cú'FpáhyÐî¢kâ‘^Çù_8ÏžŠb²ÊdŧM€µçƒŽÇ!ÕÖéÛŽäÕ_2÷tÔèy°‡ØsY³©bW±{/qêa´@Ò|ƒzCøT‚ª°–âò%@O”y†UÿJkÍ„œÚª4pöðªBé¨BQÊ…º†E3L<Ë”;#O¬‰äw)ø)vk¥?Õ:B„üÜ ·¬,¬¹©ˆuT Lz+…|k‰¡7&,cž&¤¬ÊÝfŦY.€gÚÄ ;£bvÒʳhÆ ïäêy\‘«2ÊeoÅ%¦Y CšÇÉä<úMCw–÷"È >0.rZd¿5Ÿ»ºhN®é~x¥‡ °3»J°óõÆ;x9¬ò·{ ‘áºåIr¦¹ã¿G‰ÚÓþx¥¸)?³d=²_Q¥?r> ^†(~~Ïn”tí¢â·VÀaVçsžx6fÛä©Ñcm•]õO3¼%Šæëé’Í(‘åTÇÝݦo›¿þZŽ 0šà0±ÈÊÎ̳ÕÆ/¨*{xÜ“´ Ø,6*9a-~¿L£øO"©±õŶ>La <ˆ’û°ÓÈ76Î5w,;ÑsMC¥…ðµdUè8M{/øoòü{Ød:5!#ŒýŸ T”¿:ì¼ð¯)Ê¥$œwŠ%ûA©ß>íŸîðbf‘J§nÓ”cߪ 4pÐx†—ÝwÝ]þùµ®fÝ n…Û¡Wž“TÙ#Ïa —;ü‘°üéèê—Ë¢¨ö€{ëÍÄ=°mÀ L ~À;éjn.qÜûÄñˆå< {h¬ ‘¥B'B•÷q5ïÎè}^æ·¥„bO­nøæ-™¨èÎ-ÜŸ¥+ŠòÝ$‘sSÕæ»VTQà +ɉÅï(¬Ë> û<¼Jïe›$Ý3É*H¾Öãð ŠR7k¢ù«×É­ü“£˜pÉçYR‡XÌ4I¹Œ¤$azÎèe€p°ž£}¼âÖ=HÈZ±F* ù]€ÃNªb@é2&¿®’Å‘w’ÊwVyÀëoÿÜx¶`‘Ao†±_­µÊÆŠTaOIÝ/³Ó“3Jxøb!$yN5¥ûsp‰Èj %uÊJ‡Ê<íQʼn¬bU^«|h¤Û[i넇·é óøbº2Õu=èüÔä¡hÚeáÝqê™;ÈGñzzª{¦²¢§ÖÙʳÛ(f`l¸´ -Úµ¶+n^+P±EÁžCÁŸA¥žê¦’JÿöÞu»m%;ÍoŒó8ÌÞÛb˜ÖŲ—íÞ}BK´ÍÕ²¤ˆR;Þ DBÚ$¡¤eõÛœg9/væµjR²­åÕɰFÒÝ–€B]gÍë÷µàX0 Þ¢oÑùô¶ú]ØÈ»+›°Û82ÛØQwƒ)‹HGŽ6ªî±„Àë” ÛVm{}¦ò6û—¥¢ Þ…ÄîUWd>bp_hEvb6¨l‡uš]Â'*tô4jâ›þÜåq†äÍE³™<:‹WB™]£ ½Ùì ÖÐA5YÜt;Öú Tª)þÜåÏàqcz4ú½ÇùhV-º ¤>õÃ"Ž"QÒ7Õ“Fª<˜‹©x(È æ¸è4132Þ4—¿ùˆ8»0„póLm!qÚPt6yzS- †Ÿ" ˜ÈÉ×`QeŠ3å‰pU$[»N…l åt_êüÕúP’pg•$<ñ„x°«;%bÔáüj‰9‰¸RMZ-£{^ìë$âNT—ˆ÷¹Óc§Gßt§i­‘–xû2©L×us(Ø¢2\¸º˜ˆ;˜•ò~С–¢N}¡;ÝPê(§&Uê/®Ô"6Ô4w™³.¹;ò$xæåîQïºÉ¢;ª‰nê' ×û‹ïšnl¸ZõÁª ÷ß‹î)ÌãUœÜvѪ}æoµˆ÷ÆãQXwù›Éù¬MÌ£›Úyj¿CÔGT3ùSÔ½¨?_!íŸöH·ŽH¶I£MÇÆÓÇFš…ÓÍ£cÕÍI¢_ Ú³ÑùõxØIBIÄ™8v—GÆJì`2læoü‰Š¨ŽüÆÙãü`$¿¦üAÅUõ[¿f¾ 2ö#„7vt÷æ+V0I“¾9tºÙâd§–:˜F—báØ–Ÿ¨<Ü t8¢h¥ºž û•É8UPà†ED'-"YÇåÄ%Zµ÷Uwš€ï J3ÎÛn-’»˜Ï?yÍ`aþ1‡ J4™]c0F±·ÎË"LÙ%6†“†³ãn-šd—·-¡ÎÏéxTÎ9¸å;â¡ò\3j©zÛø2QÇq}¬¹G–v¸u™èÍl»HβcR»Ik7¬ìÈ„ÿûK'‰:ÕrÞ¡và:GZº±/êñIX>m‹[ÆÄÉØ×‡Ù®د8ð»|´ã ŽÎ²Zš7¸­“Gt&Ã9[Ç^ ÚÌ?çeAAHüTÀ WʉPb)Óª®tŠSœ¡ÌNîÔ'|z‚×ÀÊ{ﺙ†@ØQ)_§Oy¬ÈÔ4 꺇!²†¯šB„nÑ|(>³ÅeáÅadÇ|OávM«V×='–¡SãFy»Î“htt€i IŒ>ZøÏá!œ¡7G'§¾@óc¬®<õ™Y•»¾æýÇ.ŒäÚq)^‘üs¼¸uv¹Ÿ—B¬]¨óø=>ßé&ä;»m‰Ã:%Ÿvsè¦ô}8WщżkÛ莹.¦è\=ñá"”œ øÉÁÕ öM…óµ,Y°nÔK‹¯ÚÏú°^˜í‰y‘ ]ZñSÅšS Ñq6%§›‡ñr)žVóC‡ItÚúˆŠAŠ1‡Ä¾œOéJ]7è¿Ñ쨘eQUkZÇEJìœC¡k%$%ƒHI- MÛªï½ûÏö/=›ì@ý¤‘a†>‚u 6?C¨·Qâº$À#¾B0ºhÚ¥ü·|Îq'ø§Œ«å ÒÏÕåŠIÂPÁl M$Ú]+¿KDÑñ¯uãmõ¿;§pÝÍ'é4[eÓ¿!/=ž5 Ö]S¡¯éL¹¸šO·v7ãCcXÁ·——côä™ê*[V¿ØÝÜ}Ú C@\)‘ÿiãàÍð·vvÙyúz2‹†ûÿˆ%›[Ý?>É%êó 5°nË^~ïj‡ÿY[ÿ…€»°·\ØoÂÿ¼¹ý|k«^ÿµ»½ù³þëGü<ùCÿ5Yëø1©)‹Y$®ü%ÜI–NŸ¢¦CDž³ól‚ÂzÄGÙsÄ÷Hy³½¹µØ†7äÊôûŠÈ仸jßãlaºüLÄëÔ5ã/Т Ih Ž¿1ᢪÁW‡­Xƒ)!…™øÙ1£æ¶çÜfáµq Î(^¼”~ÁÏV¯Ö;¦²W#Í1j8*”‚èJ-¤øaK¢IÏÕ‚kBüÇ5}ÙõL³ïÚÙõh»Ù#©0<(Þk÷›uJÌPßX£¶Æ±>™4t·NM³ƒÑR®u+ðæëRø|üñdøöÝiüîè`Ÿò”÷-äÓ›égÇÕµµ¤k·¦c'XèDÙÉЈ–œ èTãÍ–Dmú¤ÉÕ¦#Ж®¦f÷‚Üg8 ‡{ôáP-é8šáDª7슨<•… ÒOb—¥.mRN¯ð…›!ïœ4» Í6P\lë«·(2Oâ:òÜV˜1ùü3ø¼a°Ð§‚1# ä¸Y IhÑä­äÙÿ:Z ßçØþ¥ŸÄÇ Ì?ù‹{Ò.ÇUúYÃŽÇʼnžÄYú%Ÿ-g òu]Tèã«‚D&Ǩ2¥Á`Š3vc ¢>:Þ¥" ÂLZüXãB:7Œ0Œ`gÚ¥·Ì6d¹4i„Ué"Te_Jë}vááIà „ËÒ Á a6K²˜ð¯«5Œ!´CÔòÚ£H yÙç3£ƒa¾’>¾æ>"€ï§»gpcÏCyÿ ¥|b¯í\FþL÷ؼ@Õitñ+´‰8<¾‰¸QkŸð6 ¨8ÝwÀÑìYÛÀ4´yqƒžtžÜ«\Sã·¸—”mn`c^!H2ØB÷—h."B…/+Gö,òQ¾’+Ó³÷Ê^Œfâêw ¦°³¿nþ\åÁ¬Á{ÈË­Ìæ# ´ú„üDHÊ c®ç[x ~,–¢×ÅÿUvºnÆkÂ<ÅT…tªB=û‚ ž7µ``‰d!b @'ÞŠÝ•I¸â7ÈjæÛ§P>w͹ D\E=UµàU®Ä…¤7»pŸL&]KШK±Øê £Q“ÛÝ”‰S³ òN}¯‹*#¥YÔ4’ÜD—+Fµ@YˆJç©÷Órðp¼8?¿õP{a§h¸ÝK*‡&ˆÜ.ë‹übA€Þ˜1oìnþO—¢»Þ± WWiÉZÇ>”5hÒôŠ×äT§n3A¦ºp²‹4ûÑÌì‹Ö>==;è·!iot9yH®ö Ñ]¨Ûðç5˜×ïò.ÓôM\ë5ªõÜqžbó%óbÎØ¡S³F†¾†ýkæI7÷}øÆñ¤(ßøz²ñ殽7åø:uºN;~_a 99é+ÈÉÃSõ¢0$2rÒ±ÂÔÚîÆw‘‘ó&jQþV4™ç­†Zû4¶‘ŽŽBÜ Ãí^`©þ¾" Å€ýýï]úÙÎ> Ø Ýìò˜8âÀµÐ.%̈£&s• G»;ꂲÅúüÍ…gR“ž÷#¥×A ú® G̓óAżÌ6Ž™`îTƒ0owЦ•eù\—ÍFž¯Ó,Oî9²ÖU6³íV)pφ¿o>¾òúØÖëÿçÚ$ =½ïÝQcV_yoÜï^Øþê{3«õnÄVZÉ=1ñEËŒ¿ºï=áhhV!¤l³Ùµ×Å×l”Úý¡ðíF¬X×W>ËóŠú´séÐæåãd• àØýÆ@t¶!ô‘g×]±ƒö@?LØkó öÛØØ½Vp?Dí~c ¶AåyÃ#ÒFöî(Ÿ¡–j9…”Ît—Þäi=Å`-°˜AQ¦MÁ4Åx¬Ñ·1jÓuÿ™ úDm†LðŽÂø>Ò)…®@3¯A×áJ´P(mM4†D˜ý(,â9_°”óÉ)Á‰-gñ:^€¾Oo9$@·…¶ÇÔ‹ËÌoÁí^{´â´!æÜŽ“ülÖ;ªf"¶„4ZïÜ;.ìrµÓ|Uj2ÊRbÊ4¯š_bŽd”q šäzÕ»²X WS¥½ŸNïY\5qœë“1)2†¾Eðœ3QüÄËç@$_­*SãtXš†î.S!z­­×}áb7s9m0¯ß}2ïÃ\3+nÛ)¤Lü5¤!0þ®«U+O㳞uf4ŽcQ7q°Í*¼\W0¨-÷ékâóm® ûY›€R³iAÜ¢\ÉF)õR-K…4å*ï"¨õrz‘SJOU ÷è*ŸTâÔ”´§hOf7 9vT¦ãi¦xa꯳½+¾¢VÝa̹bÄ Ô(1¸ü9è€ïrÌ'@¯#üw/ â§ŠCœËñ3¥™†É\Âwpõ1Æaï)˜qjRN ÀÓÞ9 è6÷>C+tLW¢OºL W€ÚÔqŸ¢-0`¶i_ÛDêÎL§7ˆb8Gõ?®µ°ZEÑ1øFIN¸ð{;ã#š3˜æIûFBÙ~¤}ÈÔ¨ïí.nÅU'î¹v;2°€ïÌ82]I4Y1Vs®l>íÖ¿Ÿi=òQW¿KªÂhµ¿Å¹×ê‰6Pá1ñ'`G­ax¶¾ù?(‘;¦W\/D -uhN€£ì°Š©5-±–ºä—j‚4v^ôU–“Ù¿¤X\߈wfÊ\md&┹ú9—½¨ÀômBÄp'ÂÁÈšº_õUó®WÇ1ÆàÃ¥ÎVw°¹Ì û(°6¨Ò¶Ã¡k,©F”¤ä3ѳPõr)ec»ôû×ý‰*±Å7Ç´é?÷“x0¤mIÑǬh—¤ŸÜÅ‚lRñżµËog¾º?x3ØC’dŸµ0H0_ÿ¾¸êð=á@9Bã'ÃÑŸc®à›ÿóYßUNñ¸¸7ð´m;Ḉ¤7Áø¸`¡ñ Nú@ú ä’yŽ„~”á¬2˜šßJ­”Î ‚ì.ô}tö~ ½êÚ¦òQ2÷i NÇýá — œœ0'p5·o#*)àR,Ôˆq¹º'ÚqÈÈîéa„$Ï·Nâð×ÓðÿÀ¯a(Þ‚koö£ïq¹­Îðyšek?㌒†­âlŽxæuÒD|­gºDoáBÑoØ~a¶Å<¢Ó(Dø÷вÎÁó’œ]âIÚÙdR *TïIÎ ³˜áÇ{ˆÖ!¬z|Ø‘Ò9è\éb‰rQÊ‚B[hö¶áZùºh øáýÌm;s q nZ=eAñ)—¤RÀI6Æ2NPøä—áVÎÝ®Õîô#m÷±s\ƒ7W úLo9BF#2%ƒW ªÂ1erç×)ib&YvÉI³"lÍßMÞ† d® ­`•¨ôö}¢Ønñéµd¬z¿u&º+6ÝúØGJbšé¹µ#°¢1˜0ò7‹­f:¶*/j#_©A²å_`×õ( íäãhS^ÔÒØîm·oâ„s!žÉɲ ùvBýé=3„ù‰ºœwÙ Ù—ë¼t‡‡æ¿¡Ÿ`ÎÙ{¡‡Ü>+Ä2¤Á_'ez#þÚ¥$EÞàµnCÝñõõРûrž#"CI#à\DƒÐ$ Ì¡‰>lÚñ"`çkD€vËöèžë+ö±œ‘ú鮊)ªÞlnW¸]—¬4èM]) ‘ùeSW¶mlžÁTNì.Øô9.늡?S-§¦m_ËžvL¨ ÐQらš¥ú$ãë@…˜x^vàyºÔ}í_Ч䓠-ýYÁÉÍÍPëÚ3î\}Çþe¬t—~´´¸L"B3èMŽhUi®U÷õ=ü®–‘b…)rÁG'ŽG§GÇÇĹwôþø }Óœ"ÿ¾ðæìp[“ÎS0̳Îã{´ ‚^òÇp"< LÏGY¤w}Ðɉ“ìPúïSÜ9ê©öÛºé¤e≄õ!N ÿGœ‚ýAL¤*¢å€.=;!«àì€(*ßœ½7½}4²5­!'~d¸G«|Ðÿ+=Óˆ_÷;å øÐp´/,„ŽÐòààèƒ4 +I0í8}ÁCš¥Öéˆ'Ç·ƒëdzßÿÎ šPQôKO¨Dp³RÑ#²U‚Uq2²áù¦_5±&îc•¨&ù"›%*§¬Äš¬Ï>Eäáè½éô„Šcã»[/^ìv™‡•(ImÃŒN¼±ê+ð+ÿ•ÿ'ÞÞ…»`ûùãç›[O7ÒîÆV—¤µÍ‡•4"ãZ§`SU2ŠŒ²keœ€ŒÇ±+fR”é¤üä×å<ÓÉB¡\g€@cg̨Éå5«<öýC˜¤ ”“±™×൑ô…)O‹ Ü%Ù’jE8V9-¸výÅoú a÷é?]¶”´AÕVJÂÉ1àr2ö1«æZµ+½èÅïÁ  ªÖÑ™ÙÈFËu‰ ®V@P2[r,¤/5š )æ\Mžâ\eë¨ShWùwÊVQÎ4­IÔ+)0œgX •2‘z·L«5}3½jZ{ŒÇ¼£T ÑÉ[S7Z’ñ½óÎt¹NÊUÂ.Zjðe»IìÕšÛ·G•c;x\\<ƸÉx1¯a$,-&zHlÕ˜WŸHüö v&žÄÏôöß3u‰ O Juá”äŽ=|ÿ·'åP©R£%mf”NIŸ~[“J°/çŒYviñpK–†SLü±nŸx÷m:¿\ú(yi=–[YátÍ<þ8¥à–\}ÈQØœ°Ðj¤gIË\Ÿ“¯Ë¬eEš¡}™¯Ñ‚Jø…5- ½A¤F¼?=ËÙ†zÒZ¨ØdÝœh‘®Ä]…j qI%bpwèÃG9Ú’“@Xbå)zJAÕý‰<„N˜ö=‚b{t¢æÙÑ©¨š3© ºÅ&h^f«hµj¬‹…°p¹È§ùßÜ$Ù’Çfô9à¥ãÚt\¼ö®DGö“KBªFAÇÕ‡æœ*Fèa"Å_Å­™Wɺ(ýÞàåùX¸‹óàniÿTzɸôXÇî'oŠêñÙÉè¬HÄ¥#v;Ç/¼Oýka.¢Ó+){mÔà Ãk¯¤ã@ù_“Θ¥«e{÷·îo„am…¼üö!ƒä.q|ÚôXw6‘gê±z„"Øù†à‚[Œ®{ˆ>ü<åYùw`Má'ýíáYü6›S7©”ÆtãíñA×yK_LôÃ-x×àíuá—¿¼HèOñÜòî¾~ŸžÈAx‚»/âÓ õ øi1$Y¼³³ F-\'øàû~¼¹½µµõx ÁjÎFý(`š H„Ðt`b´…¯oëÙðì9|sf80UK|¢}3¥Kè[\ž)â *Zt Û ŽO–ók\PÚ!zõœ›¯Ì=8m ƒˆL4"XW5Áh_Á¸\!MÉË1¾֢ßJµkÖÅžkÌþ]¦äeÉîþÁ(k—?VýÎ¥¶TÆô¢g)—Iî„ÈRV¢ü­è]ì…¥ÙÑc°bK€ºåç³CýÅsͨç)¨2As&"L>£ø;¯Y‰$fš:²êSÁÐÆr‰Á©>ÈÏKTyWM9ÈÉ,ôºœŽHt±sWhÞ¯ÛÀ¢(`çP|ý†t¶ôáÀØÉOðO|Ùc¨C¬§Ž]ƒhÀLh»½WUcÓÙÕ¬³˜š}aŽŠ?!A÷X_T]VºòÊQÁ }-\÷WXÙ¥Ÿ’”Š“/]˜­K°ÿðxÉ‹'Y˜WñÙ£Á>ÄœJÌxÈ3IÔÎÉ·JÈØ_ôW>«›C8f×î„ä3³7Î/1ÿá´PŠ^:¾ÈiIæ™™ÉÒ€ßÇÊ9ž`,Ê"¢1˜ß %}æÍ]vަÕ'þSkRfîBã§”–-ü r€L ¶d[VR^hpûç"~°e™ÏÖõ´óÈPü°¤Lå8@ìƒìKŠâ8YÛ˜äÅÉt{¬"´¤ñ’¤@…_2¬1Äy™;]—œÒÄDtƒ}ZO›ö;Þ¸¥ƒ•¸]fvÕm:¼Ë'¾•Ô«Ìt0óíŠ[Þ*ž•e£›µíQ¾o Ì$¹®¸|Í&Ôæ[ 9qŸ7ˆ¹ØìÀùa>F½ ‹0¹Ù’ZŽÔ“"`'¬¼BÝŸV09¸ ¤³¼|Té@ÔŽ„áðFפšhÝh4×™^µ¤QŸ7ŒX€Î Cé­Ò! .1ÍÊ]_<‹<³ ?’ME_¾Æ :$|÷rB(u[z+«•b`I¶K8«Ô$¯„×Xryaà§¹3!2ŽIH̹øäbJƒó -½¡Og¹pµEo8›ŒQV"q˜òžP6“¢øÒ¹á`àH‚IS’Ÿ‹œõ¿ ÊCI)2pÞx 2˜‘ýsÑ:°´c¸2+¬¿1Î8àÒaú–6cXi@>UÄ•L9ïW£[Ëy21?-Ÿ“Or¬îªG•'s(J![’ç¨:eÚc]ëWÞ×­›Å×·b¹Õ k(™B…—HFœtÈnr²:Ž?R„#°PðÁ÷GûÃ7Ã=òoGÑf=;Å«;²Åh2@$S€(„Fõ×é ^Ž\S¼'ªôVtÒ‚ƒU¥íz;]”-±“0¸@ª‡ë½º uØyCŠ;4’ó”(G†¥5Åä`¶ù‹¯¤*óÏŒO­(Ž ±—±‚EáU‰Õý‚æfºê-k}5+®Nß©þZy[CObênÙ‰„mç¼`êõòÙÐäÎIÜóRt㕚ž1uàQÔ c?Þå‘’¨•‰„ââŒfò¸ :(Ê1Ã/z“}ÏíŽb…˜P¬Žë÷ì+–™¤[-UNçnCh]öIÊöh¹œ7æ]„léØç= #4rÑw˜W´'äjÎÙ“âPÙ¬"^¹Ëâ ,…¸F ŠÃà‚šGl­Zné1˜õDSq;¬\¢Î|Í|[sw¸OaÅK°6]úê}ML×6^ N«@?ÎPŒ«\ÛÈ,qb®óñ²XVšëâ™Y ™N¡¨ÜÉ€¿Å2‘92E6EX¯âOYv§×_•4­”+ÈÑÄÔ3ô„:Æ×•3;Ž6Ï.è­»°\ÏÎÿŠŠit^zÿ§< åë úB¾Ö®n+LÒ]­{dp¥¢b){ %y‹ÊW\‹pÁ1;]Ç(Sx‹~Q³Zu_†ËÒ‰¢vËX/×·Œ´Ú²]TTÖDÚâjI7ç®> ·ÖÜ¥$Ók@¥ÃÁâ©%¤¹+)~–e çÆIÎr33HLÚõš¼BóÜÁ„tJ ieI³ C¤Ð“ì7ô|¹<$: 4Ñ€No«à™ˆ?Œª„M1øy£ ´'qè®ÕÐ…-'J¬R‚ßCnc†B!˜w‰%G„Kª h=]N|gÁ¼Dâs^×!ÈRúBŠ×ý‹·>EªÀír/¼¦qWun7ÑzÏaIÕC:a' iõÄu•jBù÷AŠ Žg7#ýÑ›ñÒTQëxºLCJÀA'P9aHü›”l8tlp“€ùؚϋ%¦hñÔ|÷hN£Zm£  ‰ªUn Èǵ‡»Þ•@/:Ê–M'ЗÝʧ@îEÁáÁç)‹ Ñ"þœg7+Ä(\,­¼ŒóPJÀÅ™M/Ôý§Ó.LW¥éšç˜ÍöpvH«ïZwË <€[±ZC½.)êU­"ÎD¼ÌN¼qUw´çÉA]@>(›˜b0‹A /È –Å·YZRlÄ[+Z” yapmEæp’*ôÓ[E¤Dž+»7ºaeª“kA—Âu¦u¶ßeºÇ«ö£8± 0VåDÀ™èð]ˆ¥øòWŒTrjYR?ú'…@Ùj¿ OÝܤ46œjÝ]²šÒÝÒ#T§n?åÄ *¤@dbq¬p-ó<‹2 z!á‘̯]Q‘Eù ‡(šË¾ÐÐXB †CDc¾…ï/;ÇÜþ X¨9[,èF·à÷ð%š0¹·(ÀÖš.¹pÂày;*ZƒGÍæ<ÏBqŠ„0Ã\Fع|ê („ _²®üˆ @c#`¦q«6š4†c…Íðp˜Qó[ÎEQ¿‹ÓLíkžaQZ†)2Z]¿ígé_%и׫xƒˆ=þ„ !‚÷K˜>ø„›’Ìj»”¯pøhÑT® H ýåSªw§rsAM4“öEãæ7­£ºdö~î¡öh›“¥3Ó§%£ é*Úrœ.A ª{ o¹\³4ÐØ|ª9“bIqn)—m*b 1 €ª.¦ ‡¶©w8ή3B½héBÍ{c&ƒ¡0grÊ(ેwMõ#T <žb ÅiK/eû(¤Ï]sQ·æ××|ÚŘ ï?ŠÃ„ei¾€Í*¡m½rgP'UaЏ8‘Ê$š [ÓÒ¢ÜmÉDs-ÍÈm%vŒŽ -‘f¢k|•êÅr:5©ˆ\ª®øuƒ7ãõ¢fGT9z]R¾#© (dÝØç’ÅF‘A,&S=ˆŽŠsmõª fQÕÃ.Ɦeeð/Ø]Ž™a [¯9j†²¨3*ðå?M5ú†x†VëÞì{Á8ÞØmþ|*®Õ`yã˜%®(ÓYª÷ ™q}÷kSX³RÈ {&h0Ã÷ý:mýŽñ.l~@íäÈ®¯ Š–“c.4ËᔋFÌ<Œ—k¿ÂÔ½AÆP*ཋe)>l“¸QÌÑT¼±XÌ:¶ˆ=Ÿ×ÏP˜°Êi÷œ»è’€Ïok"¸ž^L…sà ¹ÊÑB€"c—ÍŒ¹Û®Ø›µc[¶V\)uࣳ%Þàî,—t<}·ª–YÅ57–Ò“g‘vnœ€ó{šé ®BÂæwõfÆD9LµýÝ}¢áº `—œb¸#”Üm¢Õï’‡JRˆÈe¼ê…èÚ&¿ÀÖªòÙr 4ã`  Tአa“ë–ÁB’®a^ÓðúÞš]¹âÜI =®ç÷¤u4æ⿦l3Jª pàí¹6z~‹9IË-(¡¥pñ-‰q¬ªP—Â#†©Ñ%óA²%q+@¯tvÏ BÚ'’½Ûè±s’‚ ŠK¼¨œ+‡–xM÷Yg«E]g’Öäs6j ßÏÔÁÐ#Ã47ÎËñrV‘¸fávžN½ìÎló6‹“ý‰.õWSv|” õy4ªhÙÏbør¸Ë„ߦÍ_+³”MEÿâ3oÒ9~}EÁë`ˆ&×ÄW6°vCñ©oÁ«Aî<;lu;¤aèD°ØXV¦zJ±1,@œ 8¼%U"áPMSFסDÏ‹I3ðE%•èÈY™ÁýU`†ÙªLîhÃ,hBñ ábÏQ¨#4Èu^æ®ØC¾?+OFá[–|oŒÿ B’äCŸpiˆšÀâO׺"R$ÜXqîq-ÄK#|´a8°„4 lrÁv9ñH´…Næ‘»ÌÃDîý¡5£CÙSD˜9¸·R¯‡àSMd»U›¡1t‚à9¸½s<´@úaoô4D¿¢3\Î6ôYñ|•ºcAúA#éƒ2ÏXè¹ìo NnMv°¶ ­,¼4÷vo4³6è$¿»"­t»c µ¯­zì•=³ WÅw€ó#V.a˜KðÞ 1E—ä´Qt×›"¾,­ž4ƒŒJdDZ"° ¢FÜNð¾·öéWZ–™°Ž1+œŠu2œm€ury¸W.YL±îðÈ©Á¢oõâ×">g\‰“£·'ý÷±‡OÛw0w¨ˆhA¨i¦%ÊA5 $5ˆcDJ;Er÷×k˜=ZûðnpèJâÑiŸÆN†;R׿;:ØœP2ìE8QpE ƤøØBZÏx*ü¬„ö=2àÐ!ù½žý*ŒÀï@4ËØ´¯áÿ1à_vB†Ü»¶B¹âAlÄÐ;À‘ž þùlxÒ¶ 6å-l4œH»æÂ"°}áÂ'!ú æ|xwD”óüQ·|Q“¢Ãóé7fÿõÎ@€JƒÓA˜( â±vðÓo‡ƒÄ¢i¨YOÓ‡µÄpÊz1"äðP÷Ç)CÚΜŸæÞsÀ5ûýÓ~L=†ÿ~=À§Oˆ"DG©¿·wvÇÊ£ÏÄ£38hÃC^/äáɾ;K´=ÜM¸Áàˈ„MÒF3 ÂOŒº5|^½88±ãw°tÓßÿËpt?œP9ùÁ–¤ø(ŠÞqªRŸ¬Lö˜9… 9•„§,7YE¦4ùK¹¨Y b¯mŽŽ©ûu_®ÃK¦¡÷ÄÖ¤½«žEÊ›ØÑøºÈ¿|E|*t£sj†"U„òž¯9WÒ‚™B·ÒGÚT®…qœzÿêb‘JØÈë=.?VµBv-Äl}Wév»ë^žé³”JGa"ü‹„I˜íYŠ'Áç3}În%ìD¼|¬‚…9¶ÔµQ]‘o„”6ˆÏ–F®ûèésÍ ».ȰaE5$¿bGã½ 3Ä©†GóŒßÖp¾ý£ŠÑw¹ás0((Ó+åÌž”6€äX3¢)#¦ß9iªh‚õ|åªú‚UdåÕGå‹öœÉµuµ˜du_ï•)8àòèÌ5bb†éÄݦÊÛk³u!ˆÑt…©3 ™?Õ•à¤À"±õ¡73J½_¹ ‰ß‘vJ yš Ý®_°Ðó»ï×Q–Ý5¡\%M5ªh É’£¿ÛîOŸÀ¤e¬[(Mô3÷ mMد÷TS¹ =ùÖŠt,¸#³Ý&d [‹%'Eö¹€÷R†i_e1‡Qp±"?Ì`RØ$Jù‰lRb‘âä•.vš1H™„ðI–Š+ ‚LQ8Bâùvê¯`é~ö" O#¥ì8$m6-ê/ Ôði%ú¯GG $|´ºí+Ú²þñâ6ñPAæÍ#)¦ªq]üΦø vñ†'^ ‰œG-¤Wö3ãG¶RZvu{vE™|2´ö‹¾ïÞ–ªE¤A:r`Ö­ª½:º Ð†D#üçnHEË»0àEqXd¤§¨Ü•þ´öL*yØWNÇiï hòñ:ð‰\ ³l¾$Ø´êñc¾dØVËœCª®h]Ê(d¬”܆uµôâV€béw©¼òö Ám¹"Gszê!˜0L’_ÎÉMw—¯AéøR Õð+U/~—)\EqŒW†u÷¦T|,n‹É-²®ð¡*ý'äøбȈã,8{ÿa6÷# O1EeR}jKf&ž $Žx¶àS¿bgâwéø“r¢pêÆ’!¢OEÉ(Ue>%È ’ýú‡cèP®Ní#®ÕBÐy<$rãý ¸{ìê²§ÁTv:Wƒ:-J+|R –ƆQ¼.‚ñ–Hf5U&¥ÞAû㎀b@©TöƒÆ³]ù4i\œ9, n4ÅR ”'EkÉý‘Zü‹Qgï̳ãþ黎˜ÍXæ)FáÛãƒø/`㯶£hOÄŠQÌÂkV\xXÒ²ã5D×6Åy˜ TϬҗ¨lïtŽŠ‘B&» R\\!¢nc‡2„¬Tµ!8¾ }:ÒžK0ªä*õ-"Iù ÁØ:{S8 ×éâªcÆ`¹]üÔH·œ>@ê-U »\*‰éQ*P'ŠdóHµÁïõ›¶¥=Šò¿ß´Q–‚Á¢;l@oØ?zÁªõW„_gdMM ƽRâÖ$HþÇÔÈtõŸ—<uP‹aËôÊõïöÔÌ‘ÐÙ>ô¢øùóm?h?žñ¢÷l÷Eoû‰ìÄ'M¿dóWðÅ—Å7cssóÙÓ§1þ7üÔÿ{sgsw+ÞÚ~úts{ûùóíxsëÙÓ­ˆ7pœ+–hœ@W¾·úàþ‹ü<ùCÿá䥣W…Ž·¶¶‰·aÕon?ÞÜ··^>}ñróéÿ£ñ*-‹ø€6é-3xrç1>NÑÒY‰àó{\(Ћû æ Šî KÅ,ŽàŒ}©ÓÔ ]øÉ¼®UNê…@Œ‚Üø„']49Ù5(^A;Ù‚”ö?ÔzÅHC6•žyRš&“ wSH$›Á‰ UN°_”Œßo|ôÚ{_33¡½Ð›ó·èˆ(JÔN ­n-QqÐs”c0ÌM·Ó¥íd\‡”Ãbýв·¤ÖÍ cL Ò%udl1)ÅJÕ"¸©à· ¯<+ŽFÑ—ES#žâÊ»dÅ%%Ñê±° ¨)e"–`!àx+ÓÕë«CZz„¡«CW„*øQ£S&6eâMëÂTÑw†©¢*+–cFÚ?Œ6ŽòèÃáà$:: ‡èã.Šÿ¯èÿžÀÂÿkÈ%üËÆÒG^„•!—õ»–dïìd@0Ÿfx-üRD@óÌA¯Áè• µœ!›ÆYðÃØÌüž}}6Òœ O''gd¥uay?À¬@1ܺO“{Ä„[LìF‹ß³<À|z.ŒcíÆæ±£DdÐø-÷C×…ž„çëCÿc# ÅäY‘§sÐèͽ#3xtÿð䧆õßógþw›.Òyúý*àúßöæÓíšþ÷|kkç§þ÷#~Œ}ÜMnk.c,™y[Ìÿöÿý¿ÓìoQtì­û¼R?¦Ô $ì*GÅ‚ eÃs…˪ÁKù/¾Â0 • ör‘[G&nÂé¥È¿ÁZʨ~“›B߂ޙ2ˆ…P¨†W  á°‹%ò®„°Lô¢*c·®ÇÔq½sn qKòqñÿ•¤ÿª‘èbYÎ9ôçmãÕn= xsÚÔ-> ûÕüªòŸ"‡#mx©NIT°ˆˆî"ÉRÇaF¶ë¤$ Úu$IÚYI÷IÖNC!²¹-ùðÁh­î“¬ŒFNñ üðèP8¤K%†+(âd‰ví ÿ·§<8^U ­@_eî'½ÿ‘À'Ñ«ÿHUŒCA§Lœ ·"’Ü%i*Ü—ýAÿÚB%'¶Ë×û½%ÔÏŸßògÍý?)fâþ¹ëþßÝÞy^÷ÿl?ÛýyÿÿˆŸ_÷Þ;7ýÆùr>™²Ü‡ßÑèý5-Å5Ž'Óiþk ¢¼VïÃõ•u=6%aÜa=_²†‡ü‰¢'Àÿlø¯’ÏñVXÛO6·žl½ˆ·6_ní¾ÜzÿõjIYEƒ/×5'¦À›èÈÚŽ_—Ùb¿¤X%Óñ¿@-B}æ½ß‹È­%zCù÷çÖŠè-rkAŸ¶z?À¯•ÜáØ‚~l7ûñ›x¶|WŒCKÐÒ±k{‚5Œ4 ÞËßE-ÜíôÚárvuð°uxŒ„Mt/ï»àB´±6çÕJŸUŒiöÔJóˆÚä&.9HŽð?ÑÑ/ÊKZ·§Ä!úÒZz¢% >w„GŒôÜ|Bf!½¾ÎRu3æœÕ“Ü9ëÁËb^ê5|¶ª”o\Ïܺ4‚½ê†ñá0Ùbƒ±ê,Z@×Çø:DöE„Ëô˜póÂ-ÒÜeC <)JߎÚ Ä”A$q˜4ƒÁѨëú/™‹¨£9z¸0ÚW³’úê2ù­pÒ6®‹ë—OžÜÜÜôtÆžt{”o|ÑÄé$º.RÅë‹Â˜ÿ‚‚ÅeGÄ.-â¶OåDyô„žÇã²Ú»úÿA¦Ã£Gu¯iÓÝÓqº&¿?úÖôœFët…õ@+ &„êâ0Î_A_¾Ë‹ùÌõot£FÁ}‹5 ©ñ79R£†'u…­´Æ“µ¸Rã¯t¥F-¾Ôø+}©QÝ™zM)¶¥îæ”V÷*4Ï “u#ƒ©O çØí.”b7Á¿¤•« âëcJo'©ÐPsþxŽ¿qÂóOÔBè>ñE‰òOñÃÉWµÜS–w¶SîÊÁ*Þ?¶ …?‘ÈþÓ(úéuþ­ÖØ—¨¡Yõ拉~%xWüëùNhÿmoî<ÝþiÿýˆQ ôuÕ×£ý _ž¤Ê[Þ xÎgUí¥ÿ}¯Ÿ€ |͛ۜ5àÿsZ"ì@|êÅߪñU¯ÝÊŠ¾ßÆŠ£‡IÐÌâ; ,gÑDd—|Câ$m=ùjë»;ÓnHé7%ø±µ%¬Ü>ÍDlGɾ7‘à»òdD”L@u°ÑwgÎ=PÕkô]ùØùèA â‡È(ˆ ¥ÀkÂÑwåXM8ú椂š&}KVÑ„£oH+ø½¯¾Ÿ?ÿ°Vÿ[ÎóÅÈÿÜ~z_#ÿóÙÏüÏòó+ÒvÇ;½_z[. €WûE w&Õ(4‚¸/¾!*aÎú ÔÃ{Ål½YQ"±ÙÛå€uoïèý1ˆ<~rÁÝÉgXxObKÔU ¹ôñÙëƒáž§‘îÞn/BQJ÷ÁÉÜ?“ïIÈðV«ÇÇËŠ¯D[Ø¡µG#ìêàøÔCD@'ÜÇ@· ®¨ýÁ›á¡PÊa¥‘ñ(EÚKø}ÚUe q”Ô‰ %¸!O‚?0‰V*^.9,{_±Ù17>Ê%ç¥X[ ûá—QÞ•‚xWÖn¹6¢þ®ÎÝú¯"®Ub¤(iD”ÐU嘆d!ÐL” RCQ#*ئ8Étì–ØÎwüÈ5Y=R eóªÄGÔ zU©ãÛ!d¯šª0yoàDãd*iˆVñ¬Âšã"XŒÄÖà~pñ9˜7s? ÷ËF.v.=· ¢Ø1CW2@ÆÒ㌤’ ²‚¾¿*ž¢ÎR# ú7§•RÇɽfÖûÛÚ ¨ö] Hs*’cLCWÓ/Ô“U:Í$ß9Ü?X^NOPEµ¯!«sa§k4ˆøçÚª‡+Ä`ö„ýçë×݉¥&OBÖL'vÈ@l®„”3gß(MÙR‘ÌÚîÅoÑÚ@‘F¦ÀˆåÓ(Ly )aLó$CìäÛL5,>pˆ¾ÈðXP+°ž6Òt‚؉Iˆ6j(!=º±3±* OBÖ¶'%alÌðòÈ)e~#<u*]‹í]_6Gyˆd-iæ—á¯õž$Æ)âd¶~Ç~ôP ÿ~³\€å½Ó8z‚§’pŠfÙ%žU‚ÿ‰X%;½ €ºðë}åŒÞgÚ$#ì>'Ñ”S¦äR¥UxºÅ•â`Ø'™ýN X!×{BÄG0¦«QÞú=¢PTuÛ7Á©QÑׂãÙ­ƒH¨<~§ùD¥ÅŠrãÔ»Ö‹]¾œÜˆC.®¨ÖÑqÔáf£ Ò‹Æ]³ÙÄа½˜ ±_e£š¢KA¬jr²Êˆ]D"ãbc3U—%AÚ*N»«0ÆÛ9çaÐaÚ.üT:¯XNú4ì´%æXø¶•bò“| ô¹ý²Á@t—<%švZ?e„¾ÎOêBa[7@ëøöÅý4Ù  `´ìIÏZ¥ñby ‚[ JNË+²Ç@$.ÉŒßÓ,$¦¿eÙ0^––èsmÇ‘6³šY´áUŽ ú1 DWC9€žQÓßñ6ÐcK×=ú¨jH:¦¦y_é'Ï ð%¾/št›û¯0B UuÞþ.»sEuöù˜úî¯B™(¤`¨™bƒ–¯VGîÄ…;Yù¼©oìôYÍTúAï BæÊ­sûz-ìõ e3ðû«u´ ûÌÀD¬®ä¶c!,2vUósd×XD-jƒ n]W¢_VRžÕ{‘(3ì0´RïßdÀWÛý|1廯n{àÛÜÚ6fLµP™C΄|1Ç.1 ’±™cûULFœ Áù½Ï\xùF¸:)¥”Ø!3Ð{â ßE< ‡àùxyÅ%F)mНTXCAƒM㩨ÏÐi*K×Kg./•¹ëׇ Üþ`ÎkÂMõ¥Ýé¬öózÔ¤3ÉÞ`ùç°u‚§àXT&'‡ºÔT˜š‰âf†LQ@¤¸žƒä"è8‚KÌþšÏÔ–,,‡â}?¾1å-îE~ßô˜Ò|·kªvÔŸU%¤«½Óf¼rΈZiŠ_ m- W7ìÖ5Û3F_S-²Ä™e³‚Ù)ˆ˜kѶJ™·ä+ù¼ÞtCŒSôÖ¥’±j£Æ5^-©ieé„SÛQ–¦œ+iÜ2'ž#ï ýtóƒMÅ."V%t• Nö(ôbý^줫3¹eè[ Xrf¾Q­àšt2+ÆLÆÁadú;Ç5”Cxxæh¢š7B–!1;£Áx…³‘Žñ;©\6†}®‰ïžÔUs2—]š^í²JmcšÓçHµ‹j€‚%£Š%§öÄ×ÅBDX(Yt„†÷©' "õ&ð1}Kg“¦¯j£cV×zgºN‡Ã#WqY×EFL$Œ£2›ãcbÖF÷¡á¡<ƒ×RØrz‰4v,”ApW(ÈE¢‹¬¯˜³MùOaÇwèA|»dí”d$_Ë ò01R™31cd©™:ê&«HŠ¢v'rE—Oív.¥$&Å KÇ¢T;Â[o½¶Í¬¸Þæ™ñ¼÷Ôö”»–-?Ë"£Ú›R-Ô‰ˆIÎ9Jž[dš*u~ eE\9„Ñ © [u„Ðÿ‰˜[ùOxŽJõÒùÊÉEYù)P1¦¬/(v/Ô~^5‡º'¯ê…¡ á+ï Rð×´àÉ…º`ú¿Ì«’+¿-LÉx ;Í¢òe‹óˆ€Ér CI…!êtÍ#¾Ò¾r´\Ñ¢ÄæÉú1è‘ EŠˆ™€×y{þþrBrÊãÁ^×TŸœ„Μ¾Ö6A‚ÐFoµO=¾-8yìn#§eº¦.ð0ʬN.,›ë.ƒMבìJ¯ˆkœ¡½GM›ŽÔ»^|æu9HɺqãqJ½¸Ô1Óöv|÷”hƒž£KìÛʨ¢µ ²žêdmEz"n­i3ø2wM^'Åa·€Óƒ*Äóý‘&» Œù)¦†œ¾ã FKê(ê.¤GÉ.…æu45jS4ÛƒQ¯C˜·Y7&§D›¤œ’>¶’XXÜÖOœO –¤>¶5©I#Þ¼wúNrö—£]Hð6ɘ„Q= ^t.hlœèàªÕ‰ú¤ª›3)%ñUŸ*Ë$ë®$ËI×$¢l `ÑFå½Hô w·3«³q–e* á¬c¶hFıãå®Y:%© ØÊ$]¤‰gÃ@i§àÚÆË¹˜|° v2•åÒ1“í+‰èˆ ]NÔIÔó-»ûPö  æ‘Êc›BÅÙVïúÐßü'¿2£êëªZö>&Hj>T7ùÚ¬§‡Jzúºœ§õ‘z)〩ë†S¤°!‰cQ\ F†T”Eð 8,#Ú8Ï{JS{º8u9´X°dÀ¬g‹ ޹";Ÿ\2tº<š’@fn¿+12³N2g® "1--'K*we*$Ú·âg"I´…Ø~ ª€l—™—(¸fË™jѶ×áñ×â©!¨z?3=ž[#-áRÍ#v.ß…¨ÁÞЯéšêˆÍ|£wZmÛ ;$ÏcVÉÈÃFüoÒ«Äé*#ã¼î‹öþó6Ç~xÜm"WfÙ“§.Ú>ÁRf"7,hææòåvß0“0 ?|Û´°)áȾµ”Ý$ž©,ˆOÕl"ƒæêV cž¢ê:«¤ªMè#ßF¥‹Ôx Æ¾ÊK0[j{ Œo^ƒŸ¶}ì^ëÌé( ^ð¥) ®¤öq4}[yÛ\svR¶:*–ª,ãW–eÖp'Â}™ šŒ1Ðôgçô…ö¯„Xeóbnh qÃ¥_1z7îÄF¯CbLÅJK±ÁÖÐ1)yØxфұFio;·‚˜5œ:Žä5϶ï²5¬m·xuÑÍçKM4(?çŸIÎ ”ˆ$ â[kqmB‰Ž*YnlòùÇ \¸$Ç,׃›É}á—Ð>%€iŸ°+ŽP_gÀ®/¶t}s£E{b¢e"•+’Q",}§ž‘-ÄÞ‡¿ì¶ìÜ‚¾CÐçjc"þ¢µ7Ê(ê:bwMÐkøú½˜¼.Å®Ñ?E>ЊìùÎmÆ;ËÏ™º›=¢«…$2—ÊÄ’Í,é÷ 9V´ûžšh&<µwyTÓ›ôSÕ‚ ¥àÑÊnñÁ‘ôÎ¥SÚ}Ä¢$]?ÊÜ0¯$ ' qg¬‰>š6ò º†Æt¦ž ŽãNâ:tä^¨àbH»tZ膠Ò$’5/L0Þf:ð&ks±Ivm»)¦$Ù®£Ä8OáA­¨ÊªEq}M멾 +Œp!¶<¼[âf®,R‚`í.1‰eîý§¨è"Èÿ@¨D!a€öY±ïb¶4´:âpü²?ƒ{jœ’D`W¯RŸ×O óùãöÑQ-É1DyÂ[–f%Ò -¤ erlùû7)-?î;k–Æ]¢L÷µ¸ý<ºW!`6ïŒôŸ??òguýÇ'P ÿü§íç[Mü§g?ë?~ÄO£&÷—$>LIúŒn²lýf¸[€?x÷ww·wáÛ‹o®ðö»y@m·ƒªÀFÆ­² ²û»«lÿ>ºãAêþ e¿º²Ösu>LeíCÖ>d]탕Õþ>æoƒ—ùΚÚÕ÷ÿ´¸|ú×Áÿ±»û´qÿïì>ÿyÿÿˆŸƒ£·O] I{à[ §ZÏÇŒ Á½u?P’{B—@{Íò?]ãý=è¨Vµºt«·õ[ôFzÂWn½xñ¢µWžat¢Š´ø€ZÝclï!T;éZ;„eS½[§ß©j%“÷j÷ç! , ?­ Ÿ´÷­jP€+W † ±ìˆ´ÍøSœéf ÕFSÃ|¹ÙЩҞ8T7ÏšX‡)=çÑ©=…<ÀCèBäaˆ\Y‡rL`˜~˜*‘)N‰n;/'%%0hýuåŒÚ¸}·O=‚hwH"w¨iPNW޶·ÁŒJ¿T÷¶ÊwSû6êwSÿf½[Úk÷yÓª•×áFu¢hÿäÅ ~× ÞzÔbòì0ú(> Óßë:Ö!HïÄ ×_vÍja«£ø^TKkc`{if`{ji4MÀÖhö Ì B™‡öúÇý=Ëížîsê ëtš 5Ä!<ÞµvÈZC¤f‰Ð½t?sä~ö¶×0IÚm’šQÒn•ÐüÁðÛ-gš„¶I‹q¢Ö ¶g ”š…²ÂDi³QÄHiìço²Sô`‡øþX˜ Ó@ab{x8C8Ìúé t!ZÙ[ù‡5‡{%Œ¥¹ZÈòßìI«í¿Y>.‹ó ÿ¹ÛÿûìiÝþ{¾ûÿñ‡ü4ü¿»„ɘÄïóñUšMã×i™Î‹Ï?ýÀ?ýÀ ?0þï÷ý“£×píÁÿx׼qô—ÞRÒÈïbùåO7ñ7±`üé%þïé%¶òÝý9Moáý{…Òå;ô€»îÿÝgÏêøÏ»?ý¿?æ§Áÿ·7?l@P‡÷@¬ö_Ç+nþ¸úƒ9òWô ,7ßw÷?ÁÍ17?ÈõoläÎO—°~¥å{¹'Í]ÙwßÙÌ®±Ú½‚Dzv3Gt3GëÈïsGuGvGrGpGuG¿C˜ö7ûY}ÿÏÁìû2›þööÿÖnƒÿïùææÏûÿ‡ü„÷ÿ1ÛôOñ½zULYíO’dë£æâx”Vóê‘gï¢ú!ÂZÈ6è–ò±ç¢:hv¬¿U(ü*›N»BjRƒzb‹Ì€ï9è Ó¿^µXó‰tk™í·v éǘȚRv)á²\s…@»ä\­a¢a„¦…@‡UZIßk‹+ñcl à«4y“m|ê0½²É+"/sçú(GjvS’­®¬@~Ö°tŸiN •çÈUž„|eœsÍ•ÆìB̓KÖϹ–8“`ª©,óª•8ðí‡â0ûŸµ7W²¡€<×0&,™¥å',áò+^‹ÕƒÏgZªÜ>~G€…0Ùh9Œã3q@>ªÉˆ÷´Æÿ÷{ï;VËÿF–.Æ ,~ïp‡üþt{«.ÿŸ>úSþÿˆŸ£“£÷¼Ê+“€üFx L MŠŽôŸdKFa>" ’y8÷ökôÅ‘ÑÖ‹ÏüÏçñ}Ánÿ®¢ç¨¬tVºÍ<»éÂ"Ë>›H ¸ÜõÕ6ºb–^1ñ£»f3,T.H)³‹¬T°Ë Ti°^o‘0þSñx¹à\ ¼òRÀ]Èm¦îë9yŠg×¥G 5ø5ýœâEGà^ãO (²_1ñE¦XxÜ«ÄkÒa´`̮ʵ­™«Ô>YÄŸÓÆ¼qßPVµ×VIu4® K{+.ý¢?8VX‚ªRJ™L ̼)VÖ Y€È'Æs[¤Œ†Á”ÎÈ?!8í©V®è.ì;qì²qeü5æÓ5³;—úêÚ̼bŠ U9Q‰\c4¸»$û‡›Y– ¦¯(Rêþí5CM*:-p”„u+Ý_·×hŠy™ƒîôÂ|5mÞ¹Çz›Ò†´­Û:@ï ;¿­á4ˆ°€—]Êá­Y” J_çˆ×DéGfrÁÁΰözû)›ãŸ¹ ÃÂ> iÃéÜ¢“'Š,×@:wZ¸'ž2<ã¸)Â?|–²Ë¾ZÛE‚€ïq»Á~@0oB«•ÿ}÷qd"ÿÏXX¬ç'-,üëDÊ„Uo‚ü¢“|‹(4Ïœ‘ŒaÊ•Ïjø¾(POÙ£*>¥ ¿ÛÏæ(yްRdÉë[ìóÅ›Ùiî”Ê2Ê1-Æ"ýQNs`ø rvÅÄô3?I…Eà «2~ßÿó`„þ9$pŒÐË&PM'6J×#tΆ¢‰}BÆi´ 5Êø [\÷ &wºÉ3VG—êá­*ÎGüt‹×Q\†£³7o'ìrΛbõa‚Fg§ì$âû£ýá¢Õ Ptàß¡#WRÃö'ÿÀäþ1oì´¡§;µ? ß§±Oè”Æï†oßÅ'ÃÑŸãþ¼:¤iaiüЛþðàñ¨ÿfNàµ÷HžÃƒUìèŽÐ-­¢Ô¶Oân9[öä «]Ù%Þr5J“?•å¸c< x}%m“ì‚°aAB=ý%Þë½éôÀRÞÚÜA±ùäÅn7Ñü),´íàm°\N!]ûHØ·5½ØÚîmomÇ/°½ø oÉÒÔ‚+$}Q!Ò‡äê’¸xKuÚªÑÖ¼#Ö'‚â7Žþ289$GôàpWÿd;” Å;á`Í´m?ï=ßÞÜ~¼+P±ûÕÓxã#ŠNËt’¡‹¡Bξ£DµNâ7OÖéÝîv ]K gÄ,ãLPŒ‹-üIT]â¨HÃ6¸¸SãoLx%xÐR–v9¡ë‘†‰ÐúøË9&•Eu ߟi³‡ dÓk6êÂ7ÜŸPä/çꃲvêj¾Z9NÁõ‡2æYž‡Ãåô\SBÝMfypãî÷6ÈðÏjÿÏu>.ö’úû\@wæÿínÕãÿ[Û?ýÿ?ä§‘ÿ·ƒõßs¿ò k.Óyþ7®,ù­²˜Žù!3¡µ¯ÎhéÁwT=deзfÀ›«2Wo—Ö|¿(~¸Œ¿¨¥4åçü=í2VN<\Î_ôP9ÑäüE‘ó=TÎ_ô@9ÑåüE—ó}CÊÁêû¿Já?§éüûÖßÿÛ϶vžÕã?[OòÿþŸ¨¥°9ü‘q3®{^kž·{›Iük:_âm*ÅÓ•/µ—Í(XÙŠÇ2×®ˆ_…ÇÃ?dÓMè)‹ÒK .š­|iJ7Ž•Ý³#‰Ä칸ZAî„Ö1êMŠŠ4Õ†4–2X»ºÍ››/œïWïçz¿»´Ö1¯ýc˜L¿§´Óö)Pš ¡N7™Ó‚(PÓN€mçÝúÂ9«½@˜ÊéTš1,r¹Ry2„2ÓL©Óì¨+3çÁCÊfiIÝy¢š@;ŠVøFô I×ðÈ”·àºFiE)L‘Ì–^-nØ'ŽÌPŒÜ­,Q‚™JŒ@Zá?åLr4Kç©çÃ#‡!wÌäKùZJmÛ™AÏ/ šØmÙ ½Ê¯±¥‹übA$¡clzcwóvc-TÓÒSnh¹ ÎC¦ˆÙ«´Ehò<›gÈÞ†^OÛºé§_òŲC~fü_ÈžbV=›2;"ò0ûC0|~^ѪaûX…ÿòëĵví‹ô× šñO„jŒ…Jx-<¼Ó4tcüá”®c~‘_.Ù}Áñ7ßuö¸4»ŽÎcúÇ×#}u–!ÇôZGB}Õ¡ÄM¦Ž(4yzb&‹ (mÔ†)AŸ€«4‰/a'p€0ôèé#u96ˆ}ÏÖ˜0i¼¸½¶ÃþP”ŸBˆâ±ÇœÂ;ÍÄ®äa¸ÀS'ÃZÁÔe°4ÒŠ6 {ù1æäBh*9ñæÐ ‘Öçˆ_{+Ml¤se6 RÚÄxê__ƒ=’áÌ…®Ÿ…}à ©:õ€ßhŸ½´Äs wd›DÄà­–U¬òÂQK{a‹öwf‹»¦FÕ@›;_œ0 ð2ÛÓ$¹ÐKÂü7Wq¿Ì}ÖTsÍ›òXåÔE-TYŸ>ƒ8¯ ^J2Ä•×óIˆµJ_GÃk‰,¦ùüMØÙ´OÐêìZÄÓò"Ó%‘˜;ÒMj£S8;YqáWÝ⸶®xý ¸#k¾ç&°†=ëúkB{X¹Ùµ¥‚ç†Þ‚¿¯ê|błݬÈÓÉ\ž{ÀgÕ;hwQÏ+ ‰ºî‰ë¾¦Vè*—LQ¸æ¶°Š aÐãçŠÇÕÊËýnû¸ãÆÔ‘¶<<'V\0|oY€0NpΑ Ò¸ ÆÖ…ã)°“žù‰*˜MÔšÿj=S‰“]öð¾O ó)òVèÑ·Ž+U…Ô/oD8ܹKrœéŽ”'xù9ÚŠÓµì¤'FŒ»ÀÌ6ñ äÕxY9ò—|FòRÔÈ$ñüÕì›±ê~ĘÍu>^ËÊ'rÚ¸¸ª\>äl¹Úw" «Îap1 Ç§Ó<Â5ýÚ [Oà*O@L òqVû(aŸgÙÜáPc§íwü!~Åém˜Ïcx qvYm÷â·§øº_5«v÷S­;fV*ßAí-~¤¬.Ðð®3ÄHÖíg˜Ý_Aë)/kœïpD@±û\P:Kã67Ù`ÎCŠô;(ù³¦¤ó✻ǜƒs=Ma£»ßÓe`Ob¢ÛûCàd1)Ë/¶\çÌO ´cˆIÓÿ¬Î†O²ñ˜ä–³¬['Õ„©ÊPËÓ‘MìkŒW?ñËÿ ¥(%2êóc4eЋeøI¦†Ð+_3U³¦o ÏwM(ÎøY3¸óÛ&g¥“›J!“O=¡âŠçz÷Ùƒ¿IzÄÜ[ˆèøE|0³ö‚Hï´¡û¬ä…“OÜPÒ»Üu”¹ëïl!aYùz’=ßAµòÁë×”}HÅuŽî¥‡aSÛ·c‚Žì&¤¨^¬ Â‘6L žƒ½®é¯ºîÔ™+Š^µ÷¤`!Qð´^êsNÃ4ÑúR»™jý\ú»«ªµ}xe…y°Éì¹Péä ^™—þl¶_”Is–SÕõŒ—Klƒ–Yº¨”Õ茺6uTF*ÉÃUGùÕœf³Þ±&}h1¤qÆ+j(awäl9Ž ï›w×F:™àÿ.‰¢×ìHÓŠv]fè>'!áÙÇÄX;&²§RâÎÉæ“åLÕÖ`Ǩ`aûO—³.Óh‚Õ‰…m‡‰¼Uáˆz@¹¬ï?ž˜Uq‹Ö)òV©­LøUðßC'‹_ ¢IæqØ.S#j­–Û¢Á{×^KÈH’!ƒ ‰fol´$µÝ±Þ9w”¨=ü´ñæù¬¢1ã[ØiÝ̨&û(pË8K¥f  ²KÆŽVà’­j`üõxŠåÁ¸hÙÌÍÊwd$οq[×"3˸±Vº®¼¦_¬;r¤÷>ifëžÍ†iáÅëÉû‡Å_rÑ—ÿƒFÙ‚ˆ´¸ÐJºV-¯±ˆc’q YdzIûD)½œI䘅´B„,²ìK66"ž¯›2»LKŽ+Õm‰<âMÒ”ŠYգͩÜ:Õx‘ú¢a Ì2 z½²ò3—ßÒ?‹zΨlZí±îo¦jQ1í C,HK AEO’§zÇ(KáŒ_ymü³zštÝä6h¹x¦ž÷â}Ÿ–O}puðr\W›e>N Ð*’ñâ½`‰_09û•ïꑚ¦c=»Ö¸uO·°“Q_[ͯ"Æ–t1 Æ)Ã7iÒZ@CNuO¯œ#X¸/K6m¡ oJÚh#Ëþ(å%÷£ÈÖZE”]„UqÆ_{šl®ŠëV®lê–,ÛZ›Æ,ï½_zðoR|é ÒÞ„I¬± øS”AÁÒ6®d-°˸ æÙå4íkœq E»“À•ëXzÖIíÎuÉbB<´´Œ2a}ø>!)>9 âš(}¦ª" % Ã>] È)t…Hhô¹A¿)åŸcæx‹»»£ÆuC—fsédŒTËåóÔó>†‰ ,֯ĵW8le:¿,Š rß᧘˜üRôºem¥˜üT+G9‰cÞž bJMÜ|ð‡3¤ÈÅ}ˆ zÝ'm8gz:ùœSôBÒ7*G~©É Ò<Ÿ€½¸?Æ;gA%/~¹ï/js(>\¡ê×z°pm¸MµÐñUQ°”òLÈmw«›‰¤ªX}Æ’îÅûÅü‘Ë0gTÿ¿»ÌÑBfju¥4®šûï¯m›¥Ò­[ç_\ ”ŒzîÈ xqZa€ŠŸ?©Jqz–÷ ì2Ê–'³‹ÔÌk½Œ5´zžù”•bn¤x…/v sä¸FÜQfßFò v6^îâñ2swuîCAQޝ0bÍ›Áÿõ~þ-þWÍò¯EYÿ—M216S¸}›oà.ç²û ›¸­€ÓGS'j|>=±·ßQNʼn½ÕÏõÙŸØoät¡Ûý®”S©d} ]¦W¯Ò=[Il]jÍ ' ØViàß©~«âMÓ6ʲ  ºÉ]õÄ4_.aà •n=³O¼%^_¯šãú{¹ûùÓþ³&ÿ ði¶øµòÛâ?mïlïxüÿ§»[˜ÿ¿³»ù3ÿÿGüœ¶»¹è«é) ¬Þ8}ß Bûôa¼G×Ü °m÷v¢hEqôšKàö0—IEc¾Ž¢“AŸÊ^XÛÑ—þÛ“i±•«×Ðßú C ooì °2pðÄ©6ÒéÆ{ý“Á›³øõëÁ›#DŠñ ÚÀûÁþ««öþŒ41Ö†ÝýhÈGgÜcÅkX1äÐyÃOC#ý½½ÁhÔh{€#89:îõ¡»\xµ×?à{'ôÒñiŸŠŠ¨È ú:¢wµÅ?ÛÁZ«S,qb Õ.Wôlÿˆê²Üp¤rL?CUZïOa"O§g'‡\³tHµTn ðõöø Ï=>C×ÌHÊÊb\ ìÆI‚Ÿ­>ðÄ@{õ©àññàö{ÃÃÁ=GGXÑ~·a) ü7íjø*:$-VáýIi¦¨Å“‰ŽæŠ+•0X^k 4ÿ,+Kò#”¥V8÷>–”@W7Æ‘ÕCßà3ÅNé€1-°ùrvÎ.GÆWÒzQÖJI±{ ¢‰C)ð8ôy4Úȇ€æª³Ã¯ÓœPĶaâN\‡JΣ ¥úIæÑ¦œ.‰I+§ù‚Ý/#;!ä²ñÞ¯œ æ` ˜‹‡ºz†º«˜¶y%w?/bû¢ks*îÑ zåa•TÇḞÏH•$Š˜ßSHäàõ%9b,av“ÉÖðØ5l¼‡v£Ç’G‚õoì9…3CSgœ)2 û ìæV(¨Z¯ÏÉ @‘ÿ1rýè±íÑ<%‹Þ®!Ja&zm§ª÷“j¦øØÅ•N©1ôt¢q¨}·ÕòTŸ~v8DõTkâ“z9ú ÌÁÉ>í©o­J×r©‡–O}ƒ&Uä8ÎCÅ`µ§¥¨g´3˜ø÷½AíñâoÀzóAòçEZPåFkãJA4‰ÜC’—Î05•O#Jp…&Ç 4ƒ:Î.QI¸è¼f<8¡qGd÷Ž(:rŸãž}†“Rò[r¨ÜõE[vq!ÀF0”ÜäœNzÞÁå~Y ,º¸òakM5« 5Sk J³ ÁîÚÏg$ß×fÕÉˆ× ÞR9…ãøµðPžæl5Ö¾º©6ùg QÚII<`¹ô~e×£è9"d’9z’].¹Z²bl©@‹\dã+*·Ä+1¥xâg‚ÒjÛíõÉùg#µyµâ† # ^œñJÌê’ó×1{B;FÊÅ¢ºÆ/dîëÌM"%}`n±~×6JZr]eÃ9¤Ì¾Öm¬…ÂPì µÙò•ï=f)=ÖÿéG’:|çeè_™N=Ò¸0¿ôÐ_ZCuk`ᡘ¸.vFdOÇÞÃZ+O¢Õ–j³ÆïÍ6sR…‹´`­Ì/6ÜÉÊ®¤Œâ|# ³Ô¼˜×LkÅÕ@îEà¼>¬‹ •ÖRó£Ün{Åÿ¦¢Ð¿(ÅK ,·m€\Š+Éb܇)Ìg8=-шBó¡˜á¢ÑW¦‚œéD5Ë ¢•ÓªqPO¬ÜvÒœfb‹.çEvY®¾„ðc¢0ûŒ±ólqƒÖ>ùCX¯æ§,–‚®=•„ ó/°L3.|¾ZE’Œ¡˜¤ˆ#Cђγb‰V'V¶–^V”Ò)ØIPe©2Ф1’uö™/d‚žøÂÅ4g”Š0ÊäÌýç²X¡<É(o©-L¥tXȨscV鎹‰'ËRÓðû­—#ìw› Ú²Eõ\a3™I²«Ly$Õ®‘Á.5¹ÆÍ–«R=,Æu)$ˆ»å×þ_úäá%¤¤7è³}4Œbú¢. @·Eu„z8z|Wûa‘9&CždëV Óg7:Ï…|-.%ò. Ÿñæ:â?Öº“C¸÷×ȶ½ôÔ¾)—#S»ìêp§ êy³s’Wän[ŠÓb)Ì=f `.¡Ã˜94¿Ê§ëöéž\Šj8ø¹MÍÝ®€¯ð¹¤6ð¼¸R…0Qß+V $Ü]7T7æY•Iq<áÏL5#W9Þ·¦±¶‰ƒì¿–ä$Á̉wŸöã)jtÅ´¸¼uj…¤,^¬\©ä¯n“” ic%ðÕZêàåä}qz¹_Qþù«ÁßsÕ4“¤¶å\‹“€ÅL[sM®4š&Áœ×ó½Èê—R%Ư>̪ MÅpÁ;. ˜À*-ÏÓ™Tëà ÕB&&> ‚>.ûAqYÈdX÷K9œ=Š.7MNIb¨ífÎmtv7ôѺ¾“ÍøÏá!,難“ÓT·ô§M^¥Ë×¼ÿع8V×'atÐB쟗’ï©ÂVÎ<~ÏcŒ^‰ƒê~@w¿àÓnþÜôR…òæ„Ýq3æÅB¹Mð1Ê…Óea}{Ðú“ëëì²êÉÂTn¡+7-‘?9Xg×YXïeÉ[’¯EF\HDFj}Ñ3¥À³Ü ŒýÇ)7RbÃEZT\96Oð?ªe:¯©€mfóÈÂ{[ÊÆ0õ’ƒëCžÞúnpá`K ¶æ¿§‡vã—œiÉ¢k­«Þzh$#™2tÖÎ1hŸ©õ–™v)™ÏÙïrâS&ôTò™¢át @w\zÇ®I©À1¿¡ïãCŸÆ5‘BñjŽ/W‘CÄ/6·âˆËþ|Q@Gã I|œN ¤ó,ëû{ñtgs'Ž6Þ ÿñÅî‹ÍçOÞмÿ›[[¿lnu£ø¿y惟5ùŸÿ9ýk¶xüýôÏwò?ììn×ðŸŸí>ýÉÿðC~ ÿÃñ?¼ˆOß§Æ,&Q4úçƒ_34Þ™"ÔÿQP¡£?XŒåÆó„O~í44¡u® Ö1jØ›Œ7$]dˆÄéH>¯_ñtú— yèÁëMªvÛ ïíâfÓ>aïÚðÉp”8u¬%&ÄeÚûc㣦e2lõxˆÖÀÔlÈWëI­ À@kÜoh¬x…m¢– íÒØ®Ù6ÃR΢ƒi½_Ë0çÈBwïþÚr•Öž:ÈÔ¿ƒ‘õ)G€%fËrqdÐçîÑß1_»)™Œïaç¬Ç—8âüHP5 ÇÐÔˆŸQ\|ÍUƒAl´yòã›ìœ ¡4š„uˆ5Ap#TBùOþÍŸÚDëÏšûÿóüSþcîÿç›ûÿÙÎÏûÿGüÜ÷þÿËáŸó¯¹ÿÃçÝýÏ¿þÆûŸ6äßÕýÏÃù{¸ÿÞ<Ìý¶ù°÷ÿ}ûûÛÜÿ¿ÑȾéþ_?ÿuîÿp{ÿû“ï:Ñ»Z̦_« ¸v~jò³æþG‰óåûÙŸîºÿŸ=Ý}Ö°ÿŸ=ûÉÿôC~ü»á?ž­pò%ñÓ­ÝM${%`˜½¼cÜ{”ÂÉ‹ö¦i™†^¾ÝÍݧ %õõ9C·ÎSŽ€§þàЇ¹AļÁ¥1I£W®¢ ÿ@:XoOÝ~L–E”‰ØF™E‡Ž~É9tŠJFµnœ`ŒÔóøöú ⨖ÝÐÈ"¦çÛÒ‡9yˆþ MEJ“lÁ6¸äObfuÎi†¦øWQ•ÎçÒçÑjdJo€Øü¼=<‹±(ap¿NúññÙëƒážf~OÇ–l+‰ßdç%Qƒm½xñUPø%<ƒŠß``ÄÉñ70¹'p¡ø» ¯fDßrŒI¸Erþ;;›Iüº¨øôû~onomm”Û|[nÔâf/#H7®¡£¥0Ìõm=YƒH"ùLRÒ#нª©ÀœËDhÁX²Ðú¹U8‚…þ×SÉýåå* 2˜î½Iä+ ÊøíñgUâmè‚à€TË1â“¥¾D‹#·ð1Ý{@m;‰¯0ÐÑú[)…Eêý[T_Âø¸ÌÒb¦G\=árȉ˜ ¦Úl²2sƒ´½1¬”b$£œÆI'¡‰k•‚"ÍáǰRüZY³*©KÃ1½%|שŒ):ÐÏ×ÓQ.aoaz’„T×|Œ:âzýø± ÖÇÄRιX¦þ­Ì¤h3m—Ôöx6üNH‚… ºl¤žˆ©f KlzkÉ.¼#¡]èàíµh¥¬fåøK _uXŒ f„ ÅòPTÏ7Œf1¾Çé\~*x7ßàŒ\^b¥$•|ЖÅ…Oˆ¤],)îM©ë‰‚³!qûñ$qS¶ÏŠžˆó 3e#·¾tÈf¹"»— {—¤¦âF§ÊЦnå‹×çêÙ7¾O‰¢'X÷ÿ„sÆtc’¼«Û†iæ5HYÌŒ;Z®ZÚª±õí†JQP£a¶f+þ{ÐMÆsdè°ÈËu‰BK9ÎM^]u_ù¬a "°¨)Ã*_f‹Å“¼ˆ1Ö|a^ÅgäLGA“¡“Ì¥D­€ðÈn¸ÃbA1Ø·o)êþ6£ ¿2)"N$ÜS9R…æbñ)f½–jž™™-MÖ«”=Ï'‘›PÜð”x5¿•rZü”è!Rö[}’{WªÌǦʢRkVøÎ ?'lm¼´î î&géH«.½ èßN¥>*yK9SC¾¡4.b*KîÛ˜/´£Äÿ**J©$¾@–—üBýR ¬ÐüÄ}påfŠæfÿ6oD?ñ>Üãøf[£øÐýç÷œl&܎јR°({Bô]ªëL Ú“ŒMÖÁ¨}är…îÎ!ü‡cA(&ß5ê ܸø9ÌÎŽê’ 'áä3àZuÏPE—Ø#Iо¤tP'«+„cÃôoÙÝœß]p'0ùÿW®{›%UÖ¶í%/¥û1hª×è÷¹*&/côüÜX(0¼ÜtQžÕ6=Ád+¼ýí]ÅR¸üœãJÈŸQˆ×‹­'A>(çã™´:ùdýäRY9ˆt|o$›ƒ6 ˆ*"㺒 ât!­É”Yji8 ýÌ7èC‰hzJä’_‘Ø.XTó²©$#_c^I}ËKF.MÄûÝí’Ù¢Êñe’¸[Ìý5â÷Q„-m˜d§¤T1Ä…YíJ»f´ž`%äh<`1WÆáôÀ^ù¿P"ä”sžXM`écÊK}¦û Sɼ¡A™¬TP-šÛ=Ú„x4o/j’ªßª=r…« ’ëÍÆ¡DÛ: ê™kÆÉÓÏI…ò^•Ãñ©¨è÷VìÒ.Ê)—wL“ñE¾!i=i]­ÖBÇôÅH3¹µšš`á4SH#¸ñߣ ŒŠªW,|²-îB¯´%5k­Wº®élQ5IÝ'u3º‡º©×”Ñ3M¯Ô ÚÿO2¡<Ö½ËÚ½C…ã½3ê¸ú]÷1ݘ°›í/º;Fd]”mè^µKÝö¢¯Î?)ˆdÚ¼‰Ù…uh‚,AÙ²e0ñOSòlƒ¶ 0}¥$fp¡>É™Î& •Éä®À*^~š9]±zñB÷½ÌR¥¼¯%òáiúÅ7D°ÁÚ‹ðÚŽê—ÂL]&…Âì JŽæ¯wVçù䋈@åñqÚ1rŨ¬yTymúJHië»5jìV5©:#Ô»M 2~=¢:„!F§zž?seàuFÝÍ}ªÊ#Ü„î­*JKU¹,ešãße(1òüÖŸø„ƒï5æ§N´žÿ<åøó™Të3çåx9«†¸jêœXêKQŒ1X^\Éwµˆ§ ‰­:ìÇ1(1©XÈ@‡º6O¥€2Ùpë¯Ò|!é0[° /°~;&΄´Dß!b׎¯òì3'Z&ÍÉw2^ü/–€Àè¼½/J†ìæ Û\s©i?¨ZÅÜ®æï¯Å9:bplÓ[Ž ¹>Øåò…±Ñêt° k<ð*  ¦ø[uGÒÈmL®‚É2{g­ãÖtèŠ)¥’7ÉRke;­jî¹É͈QH.)W½4ˆc×Yq=Í|›S¼>/&Xz^zµÖÎÝžólÁ¾m.¶ögƼ_$3m/h"W 6 •ãJ%¤¤›ŒÀÇHf~†ÕKçÞõä Ÿ/¿ÄߣiíO1ˆ{yu÷*ຓ毈ˆ´¦G*É<´Ýà5k]‘Äã³£Ÿ¤UGöö£žÈt]‰·P…¤ú͉ ŸN Æ£\Î#-„¢v¹Ü$õ$ju¥Õü©ä=#z‚ÖR=RÀšàbF[úƒŠGPÀÂ!oØǘG>%}v!”/ªÇª‚2Î\Í@u(0x…d w8÷?æ'h”ËJβ>²:"/E©ùë_l–Ž»ad£ç_r¡71‹ë]lWÄ(§ÿÀ´³JÿUö6Dp‚!Ú;:þ8<|› ºÒéÉðõ¡%áƒïö‡o?~K¶Y#n1x(^g¤º¦ZƆ+KRa Ø:e©"ƨwƒ¯—{d±ÎI*Å–Èuz+.t¹`Ú1”µ"€uÎõ'oƒèÈX9‰;–_¡ÓíEƒÔ#£Ð)M',ª°;|ÔãŽÛRÂ-k¥9Ÿ 7[ZåŠØŠ&&[tñ’¿Ê«ÏÙ<—2«ÄšÀ½Jºhƒ§›¬’b&OIðEú1 SÌHDºÛ‘ÜIØaš°Ô/<*›m«§(â^8LÈÖRi@÷lóxFá\Jу^R[gTjj…¾Úàôæ¥ Bòå!pÊÏʾôÔa¾åƒm²pùÂáf»OÁ4šM¶°' È>À y¬±0Õ0Wb‹¥IžÁÓ†iØxGÔNäfJ\9±‡F¾I‰£u|ѱýéôº¸ SÓÛ—†ÏS»`^n6]}:=„žJqz…c%, ¹¤Iå¼oÖ»L_ŠÔyhÿ¢±h›\ò…“˜ø±dxG_h¹"7ÃïÎ.>yž¾@xú’¼CÞ*¶²gŽqµ-èÓi`ÎY ¥1{l |çÊÛ*,·$šàb&½e)%él’Cv´ž‰Fl\ì©]ÀvÏŠªtÀJB±\\/ÙV¸ÔÑZÅÚ35s®ifw‘gÝÕýB4’ûS?¼Ë×蟇D4aÿÐ _°¸¡$_t{d®ëäò)-—¸º×\è=w7ת?´~î/Æã.pû<­ç–/¹¼G@·6†GUÔº¹Ó*ˆªä‹¤N¼Ôì“ß?¤¹d%œ0õ¦0zò—Jo#óT“ëAFc8ÅÔUú*þ”e×(z`K¹s0ºìª€`ˆ4BV¬Òó*󰬑oº6‰íœ¼5"ÏȪˆž'dÀᕽº­¯ƒ£ý.ùD:ÒªI¢ /y¡„8.ç3VõšåföE‚Y$†"ø.k\Û~ŸˆC›šä•íÛC/$¹8"¹8WKÒqgÜߦ"z`=óº+#3¡tnCÙ+7m‹Âã¡7"alF¾CŒÍ¸ÖFƒ°””BNËçKMgÙôBìûš Y!MÚe²4(ãZ¼ƒv9 \¾m#\v&‹Ü “<%ý·öƒí={ϱ¾å`ŒSì 7À»/möUI=:ùo²­ÅLiœ:c½±Ý4è2J–SÙX!JªÄwD.äþ|RîñœšZ¡‰‘Ráh?BLjæt-/— ˜ÇñŸm,ïP#Q‡õóÊ» ‚~)†! $öìáîRÐÛ«ÌÉ”[ÌZïY$P4N3'~F’ °g0’ÂÖ¸x¯Ñu€'°¢û‚˜}-35Þz À°m•¢6],§²†/Â,ÓÞ{oŒ€§ÇÕ.)} ( yÐ…ùD¹é]ÇÞY,ðΦÓÇdª~§òë&û6ˆ}Œ– œ¹?ÛÍâRO•0š—»mcwï¯eeT÷gljP†× <ðÒ ®Y·\%<ÔNIز,ZÛÔ¡ {*QvSÛ.äTExŽè {î[Š"G s@£«6Ÿfƒyô kjMc^e3]0!>W×,´vËø/“¬¬­Á¬)ßêMÁÅòèýžÔüœU]Ò²Å*ÔË‚AŽÇŒ£®û7zêB\›CLÚOcâçàÐ Q ‡ü•®Y“X.s¨pÕ:%0ÏK“=˜Ûw«Þx5ã܇ -Ð…á³S Æ‘¥×à†Póe°dST›ˆì”bÉ4,æ¯ '&<Ý :Q2Å)¼˜˜Ü<ì©]¤¼š±ºš¸Þ'ŒÚ\‘rçôðM™Âº³ÎˆÄ¯bX¥+õÎ˧ÈH¡çBs-¬Ó6Ù6²„æ¯BÜÉþkÓ8¨ZƉ$ óäñgÉCïðüÓ8(<ýÿ³÷MeMÛ¡ ±¡¢F ¡Š]@¥IÔU L±bï½»ö²ö¶boØ»bï½cï å¿§Ý‚º ß¾ï÷›Ýx¹7çž~æÌ™yfÆ@Füb‚E'r<þÃbÊ z©º ¤t!%Õ¶Ïiâ£Ú’HûKdÕüÑé"ÿ÷bO†¯£¨7,Ç…àô®|ZbKdÒäbœ.ܾzB©uŒVð©ºI®a¡W°»«_fÍŒŸÏÀWXi~X{C¨O>»%ÜR€\ò.JY <àè Èõ ÅB©Õç2 éb1€¶"Ez6jÉœTe9 *&Ø’ E•:†{ñôáàðÛF’•@2²Æ‹Ð¹…Ç ñ}Q½P Í/÷3GdªPx·†è“Ð)y„á±pÅð6„Ke@¥ødƒŒ“(…Ù BÎ;BÉ‘„ZÝð¹Gr8Sõ”hÛá0ó^?>5ë/|©€–©ù\7àÏLŽ)ÎPæZ‰Èˆ$áɉ_ò1G#@.‹=°'v‡â› iBEä¹±l2€âP)s¡öødÄ/0ç|Œ‹â“ÍìÇ‚ç’*hÓ3o\N”„ÐwÛ™žšu”¡–¡>Ñgw™ÍK޼È{vÖŒƒqãc 呉ÐñpÒo>«—Tâ(³3€‹œ#¼#|ä"¿? €¦È±†Å´}MŸù`÷.t«O«Ëا,F–‘)ƒRzV…H&\ù»k`ï5 ü¸SVJ(Uz¸ Ö)ž6šÑÐg`Çó¢=^ ñLeÈÜÜ‘q8Š8('Ò½ƒa ‘‚CKÀÏð’x–Ö¨Øî^´ú²pî΃£Ÿsð ÅAǼ)bœªMc‡%`‰ØQ…ù°Â€'P²•úGaEËF¬±W$0€ë3³–«' knA‹Þr$ä¡ZÑáP½½ßé§Âµt½áþY Ã›éï)%ÎûÈJ½E|?D¬„&Ór 85Ô!Ÿô,òK+ U;x~'ËAÀ>¶?š ƒS±¨ÞÔ&…I$ Πhn uia7²ý‚p²ÁüUÚŒ‘sÈ1__1Z¥çq/nt2’œÃX úÂhf0 oÈ])ÑB"¾ ²LÙ€밊²ã“@v0.! Ç²D]j*²ž#DgT´±ƒ¾u£€áÈ‹qè¹N|€½YËX¹°;šÈx`µ9[ _ïÐE× ‹Ñ +U™©Ç@Ó ãäŠ)ËÖS±žXµ Ûb0|8§*tòæâ¢¤Œ—F>šêä€AIx—Є×gbý¨(Š+ãÓj dÿè$üCÏŒÅOØzøæXûbÍd ÚDbLTÐê# HJÈ`ÓµÀè‹Ï0 ÃÇg¨E+Nÿ8Ì"%0ý%,4ÐÅ̘G1ÂG”M>1šÃ¥³ H.ÈŠ‡eøÁžîpÃ"v5,:C ma.¬Vêa2ôu$P ¡EûÕ§5P%cÅd{´NšŒÑj£€„Ä% V"aãnŒ_ÏÚ¹%Wƒ6 :¤¶ ;¶ V>hÓaIÀQed!ÝV±h߃:2è _\g£IÉœ 2d rMWM+QY†8:æ=°[+1u†ApÔL øÏ1‘n‰MÞhc&˜:@7ã‚ñVÓAb1L‰öYÌ7FIÐÙ1<ÐÊ%ÁñÑÓ÷Ê“f-AÆJî& TöP  A¹çPáóZÉ#ƒã×ë«&iÃE)Yojhû•&O”ki¡*í‹ÃXŠ·‡ `JÌF²Ÿl’‘¡“z8g'Œ²,q+pF¢1‰L\¾ÃWõµõÉÀáÒŽ7>ÅR Õ˜®>_¯õØqC MKà! ᇤSýI“ˈ}è-!<û5¬W„æ³ÌQ„)C¾XKY/ì"Ñîp–•`éÅŠZ YÁ ä¸ЩIÑãs”ÜVi hX &‘˜ÀsiЀBÄç®*ìyé’(p+ÑˡՈwz–Æ›+³µ>€]S%)˜ à/¨ÉO"«ÔLÓ zèP€PÂLÁÂÒ o|nä ìz…ޱᯓ^|:ìÉ€Z¾:™ÆYÈ×ó!ŠúÎ ŽH£³q­H SÚ’‹XX2îL8ZÂü‘‰~4=šAñ6ZÛ|j/!bè3VÉï2ž]0OÉf¨ˆáÒ!®.C§Ð¢ ° ŒÁVQL*†A3$›å@Õ Ý› ‚ Ú÷Y¯a-J±A *™œ%,E)„Lë[¦ÊShÏ|²ÂP_¨wBn Ôªl©B›lSYk½¸Ù$ †ÖØÄˆiFŒÐÊ…¾#!¡©v &BJµWØÉšù"&Ý YyZVÍÞ÷ˆËb­ŠZ“)À-2^ƒƒüƒêX™: >'ÇÁ”åJ$ñ.Ø•ñ¸Ì۳˼D©‚!é2völÏoá…œìT LÔà ,‹zðBwL"H .‰øR¤îàfai¤šu–c¢í t!qD…¡…H<„¨L «R¶âNìzõ£†ã´§BSªT5+$›ž‹öãó1Aƒòå8.'vSƒ@OŒoÀ$Af>Ndq  â§´ˆõ ©.…ö§,çjˆÒbN²Ž|2Û!鵓#Q3šJ˃ Ç2‚þb;íV˜©×eÒ†.ÐæÔ5Y¥DýâQ«< 4ipÊæn÷?mt]Iýb„+‰ìi‹RLñnˆ1T–AH*wÕ°g)„¾Š‚RÄYR†$RÝ ë….$ÊŠïVhgÕh‹‘gÈ›xˆˆ^IßÂͺG)nÝ¥aYžüñÞ@û'%rœÄlkò'f3ª)ø"ÀŽÃ3TJ ¸†^xx¨%M¦8;%<–É“¨áN•AXfÔçsšÈ2«„1]“iÏ3LS„|¢á¼ÊñŠ,êñT™1(‡NÃG@w·%:8G¬úƒ0Ïj]K[¥ÓU RøDŠŒuQØ™‚aõ„NbKt ŠÄ0ØðL-ë%ÇþêÁ˜+eY|,ôf4Á?´ªF¼`nÁ²¢®">2€tN$f9 1ÂÂeÊÕrÚ+Ñ=‡Z|€¿õDfþè´ˆšiÐO¶Ì†EÐ~³6›šPã YnFÔaŸR8’ÔP먦ƒçú>eÔ¬4¿‹Ì–)ÆÉw/…“…E.ß:ö‡î1pBæp‡Ät„\1®þÑȃÅfáåEÌh݈šÚ8E‘a&ºç’'E±¶³,<^W ¥™nW0(Š VŸ$AV8¿\ Ä~{‰óH€®¬Õ™÷bFyP×Ä8ða¼” kÎ Ögª•T?Àë'Xp2înAFfž9gcFQ?ô¨†Ï&zØBÉn9Åd|ÉZAW¦ª Xj´;Ðz ‹B~Jù`KƒÃ@ 5󓙺á`ª *4RÐT÷âxŸÀ7rz#š’Nëô%a9&©è=PuB?[¿7ú•TDUÄœý ÄúEFú…Ew†t­©HÐNìï%D‹!’v‘~‘’(â#@) ÂþÁ~‘Ab!H))ÂÂù$/è%ƒ••*Þ‹ã¢ÅaÑ‚qd¨$:šÊ­]g_D•¹_»*¹_¬ˆ/ŽóGD bƒÅa‚p{¬„ªNT´H/ ÄFJ¢%aA0?à‰#R- GBw®á‘|ø¢ Â/2Z"ŽDD†w’pÛäàEÕÚA+‰‰¦û´Í/¬3¿ƒ$,@(K`F⸈Hà.$@@5LJUXLý( ó‰ €ž@ÚQ9„…GS¹S £’E‡Ãžáã´$wP*ÿPq$Õ}aÑ~í$!ªHà:$PF»ÎÕÜ?&Ä/’%RЃT&TGJ¢:¨à~íãGgDu.•G¨_˜?'P Ö8‚æ :‡ÇMÕîN§€Ž ÄbÿhI'jt©”T1Q1¡b>êï¨hØA!!‚0±?U_ðV”8²“ÄöC¤8ÂO)€NR"#A.áahËôÁ£&œ¸˜1aÀÿ •¾c ÕäáDM6Йԫ|2pj„Š ¾¾BýÀ ~gj… Bý:#Ï,ùhzPÅÒ®[¸³‚êRfrúµ }Ðü «EU„ê>¢¿P¿ qkÀ¢±7¡ *Bì/P¿SSëªz|ÿpjuŒ£H=À™@\˜‡hÈ` ‚¹FæU6^–ôp:1eŸ‚ð(8Ùü¢ý°ÆÔµ˜J͇Qý—“Ÿ¿L$µ´@ ðU›¨j±IÂР€ ³$2€^O Ÿù~’˜H2Çè¤J§ºd ç3 QáÑÔ:; áHùQ1þÁxô@¦ì ¦†¢˜JæÐIW*‡Z QÜ'Ô#÷£>£Z ß2àLJã |Á®à«H& Yêag@„Ã(>(„(1Ê e‘ï:dÕÃà&ˆ=öúŒÕ¸x?E®¼4Z>ÇSáÒ ë]pB\L† ÆHÇžz¸›<{ɈŸ}äv—ëG–p#y!r „Càì€8l°oèÉPŠy–rS!2«RJ‘7RaI ¤Ÿ8×s&>lik1Rˆ8 ’b}1Ã¦Ñæ[÷ÀÈ· µýk¤)àìxúí ’Dç2ˆ;$!¡äv=ê³ü«ò¡ƒ l¬®¦ÎÃuϳ‚y`o¶œ ¥&2¾Í“8@ü1>§fªà¡ Ú9 5VvƒŠ5iÀJp!x·ƒ ßg#UăN²N¤¦e ˆB.EÐdäÛúêh óↀh 0m©`€õ€œW[T.vJG9s®mcÆ™jˆwÅÆä´cí& ˧ª¾E Âaa¤†ÃÖþ·k…Ùv˜mN'rg˜X,o¥¸7'®_ çâL½ÈpOèEù¦3âL‘°€È– á¸À)‹°€6£ ÔÇÖPô -Éiت^Ÿ[ šP³ `˜…(íÖõêϘP½q‚3 ÷ ìyn¼ó«ãɉ:F÷l+ ¢–€öœi˜~€á¯'ÑMÂ8YpÆÅó±0K)HCû t¦:5ïdÀX­RRÝ…ü[gBïåràЀÕA@<°Ã¹ª¥Ê¦:{KÚ¢ž„@“©ÁXBm¬ìH®„ÞÝ¡¹ 3Æ#³ecõÀÇ`ìS ´ßTµÂf±à°ìX¡³*[•œ À|¨C]J̦ B^ê™ @&ƒà(Œ «#!P­JlD--X*˜…ø¦+U‰g¥‚‚:"©Ue‚¥Ié25œs­^ Ø€P“+:›"]*e[¡ÀÚÕr\ãvôƒDMÑȉw‡NÔLû/‹ÌÎëáæÖ\(R©˜ X2°‹Ï”鋊I€bŸI=aA÷4BZŸŒ·Žñ‡J`yjqHUIá/ù(ü% ½ÜZi„å–NÃ,AIµ– HÊÁG,Ž~$.g‡uJL]b'*¡ LÀOöÁU ¸xºÅL1þ^-ø¸e$•”-ÈGb1·Iw2 0ç}QƒÂX¾ +Æš¥ŠE¯hJçµ< ð ¶@$Îù¨ÃõªV„HF§i8YøÜ˜e„Á²Ø$ˆÌ&L­YR8>Ÿ:FÑ'9 PÀ²xX,Q$N^è¸Å'¢ðà‰°t…%[aÉK ‰Yøzb¯ý‚˜…oˆs€fH¢üCü$¡â®Ð"*>8­ä‡Ç†‰±Àƒi"Kfˆ… ­aþ"’!ŸˆãÄT[ Ì åi@\àô“¡†„:Ô‹CA•á¹]T´$ˆ:‚ÂÃ`?#‘8ª-&ˆ‰ ù@F ¦² zŠú™ú»]L”ö™$Œ:JGÆD€´35¼±T¯PuâÂØ¹Ð ng ) „§sаï…@žO÷Tžò]d0þÑìd@ÖÍgÉ6ÂÄA!’ 1”gE2"AgZl" ìug= þÉš°´äᤠ¸»©9ï(£²ÄÌ`ÏNR)ítPBPÒGš¥d‚5¶Â¢ˆô")'þ¡ Ã œ7:äÔ&Ë<˜|²+TJb¤‡ÝRIIèU¶ß¬DÚV[Çãùúi3`n¬ L½éàÿé=ôó§dþÚ_2Ë"úëÏã¿»5s×ÿêéö/ÿ÷|€š˜¢Ìä ˆ ; ,Å´ÖWËkÚòù Êâ|àÑ #ô„H,Øhu$$þ¤A p˜e‚!› UÃÖ$1΀õØdÌçh9ƒ;8 †Cª ¼P”>Á‚²£ópµÌ€ùÈÄO¨‡¦X.Ð,,â‚(ÙØhbZ)S(ø\o¢Qtœ ì{ãÇP!§bifG·„"“):µ D«^,YC,sKè^OŸóe{”…ÀÂãŸ4iR$7¢]SË•||ð–#ïÀ׈4Œ…ôÍÈIÕ!s&6Ì›aŽKX’¶K€µ]4#Æ/®ä2¤cþçò&ª‚ŒCXx˜$,0’*r-%p]|¿ªö‘Q샟Ëfg¹ '¤Ù&Â<ð s%~ÔÿP_µ›4‹¸ß!¤ùŽÀÈðP!³ᄵ CZ/¤ýàŒVŠbÕRvˆýB¨¼sÅ>Ñšpýû)“OÉû?@`Ë4ÿóñß=¼Ý=½‹Å÷ðþwÿÿ'>Å Å>~™Ò$FCñ£ôL”o7¡ ½T ƒ|{¸¹y•øRšV›ÙÒÕ5++K$…ňTêT25®ü†9'B Ð ˆ$MS±ƒžÀ ÜE‚–E>QÂ:Ðxƒ6\Ô•¾E䈙â¬8æ‚®Çr=ÄòA°¢-hôalôë¥R«³iÃ#ôŸGí¹Úlvð”Älœ¡7ˆ/)È¥17lÖ À[@ ³.V ’—"ˆ1©`Ù(6eƒdNð'Ú¸û5bŸ(ðF+ 5_à)RÉÕ2ö°  ½¡ba•*P1W,l6cƒÀ¸` cä€s!qFœäÎèUU°!l=g/D>˱wœ vy‚ðvR¥”Xw`°bL¸ÁDÉæÍîä ¨ûäTMàðhÒä™(OÑBN9 díÔÔÍÑY@ô_,;HôèNÞÐÀø“Щ,©C{ŠÚosrgÕ“òÎ*4?©œÙ£.UÂ>é%OÖ¼ÔöüÀ`{èFˆåÖ—Øëó¬FÊEK„To¦é…*Aa'!̰ó@§©gUC+8.N8‡ œ J@|ô+Sä©:5ëÐÁT=rÜū͜À3j8t ¸> B{êH’’‚â0ú=5' 44Âñ\@"!·8½f2ç.B–hˆÓ`6õ‚à Õ¥a”Ày¥T ÍÎd7;V¥N/FˆW9ažšiÌ^)ˆI?Î$;^ƒÍ‚Þ"¤½¤rË"„£àglä‡ÜßÓtAïCÈë É „^Èèø´³U'Ö=ÖMäâøéLø“å½Ql$g¦[IÐ!ý€¼7êÜzœêRqÚæÏ º´b$âˆVÅB­y¡½%HmU*èD"º‘ý49 ÆP2ª‡UjrǨØ« gv9ˆÇ²Ìg„ÐiAêóâô˜Ð)}«2ýîýÇöŒ)±Wd`\KÖ'4°'^+`3€;k4 v\"0¾¦æ ÐK8“Ag,¨êY{$Ý©Å*zG¦JaFÝŸeÁbpÄõ×½dYå野&{)]¼P/qÞMºT‹ à[Ôï%U^ÈZ8~ô;S—ˆÕnT~„ ÖûefªW,Š’ãQVãØ%ïlFPeX<˜ï‰2ª3S¢Ä óòk»½Àn“Î Çh#dà­hÄ„ERÀyDJ€ùÐ)‰XìN—1… §éÅ‚ÑÂnE4íb—`ò Š`7?% ^Ïè1 +„,Œ4l-FÁ’”Î8ü`9Õ@Ü Ík±;]È"#œY g÷´: JÌ€ô³‘±â1[cUÃm+™ÜÀHRu:ôœËòqòa¹¢¦"‰'ex&Â@}aÐC.{­ŠŠ/a=þšn6Y?ey؈uÜB™°x4*‰ª4»fbGáÐ’ˆ6s@úÖòC„ÈC$l(–ÖÒF·Q\I Áà k™±©2IJ:ˆ#Ó%`S’©3eZªgÈô£HŸ"Xò¡¼žØ Þº0Û,Vˆ|®«’!/¶›Ó¢UŒ¾øZQ‹S:†œ#t*r-Ü! ™'رU1Ù¬žý/Έ¦ÅY.V¢íÒ4@ž¬Š@ÖÜÿûGljq$}!c‰±Zt&–ë¬Ñ¶)BÆ”Tž£‘Ÿ/° ÈùEÿÛHµ´#t€ÆÒ2ˆSÅñйNø¡Y‰¦Bª†Ac(-«q‰8ê»wiºÉv HL{‰&RNö>öÂwÒ8 .”Ø=ê’—«õ_ "Îjbq *Ääq+‡‹È‚>Hð^Í¥¨ñ§ÏB$ =(Zl/‚PÓ-ˆܘ ‹æ­Õ*ÆÅ>†u:è¤Þ£@HÒ,à„й> |‘Ê3<Uü0‘‰í;“ X’M{I`yX ÆþÊl½™HX&rÅ+Å€i wX´;ÐÎ_ÈVK+6` 2<ùèÞ•#O“$í%ÒC1¾}$â(‰Øôè\ž~B}Àf„8Çf´…—@Éô][1S F“ûŽ “ ©³žÇ]¶ã âçƒÃúÒ§Cð)ÖPÃnq!æ.³x :†•ç(¨4üI :¼%³ÃÑu6ŽŽ[2;ôB™ ´’>ÂMýƱ ¦ d«9 W!žÝ0pl² ðMB3§¨–YnÄ>vØ¡W}’ >úöМ5ØÏO&6û&j]V”5Ò’â[5·Ó#IzüñÁ µCXx´Ä_ì@-¾ÞŒÂŠWPfL9ìÕÅ"VJ±žebª‰] hOºl¹¡nÅ>leìîÇD RÔØá¯ô++Ã=l°_QRbã|*3Ù‡ôjEÆô-I5¥¤ŽL_³/°f•æ‡uhÅ&æœIÆ^×\€“ÓtF/¬GñüUjañ^–^¯8Ê@/¥è­È@ûd8X,Ä3=6´·JÊÙÕÃÅ»™5Þy@GiZÈÔãôáU‰âÁrzÅ:b»]ÂŒ#Ù6€U4ùNÑY3’• ©:î¡_Y BÔû©În“šÄŠLN–)“u´ágÆ‚Îd8õir¡ˆ… Æ«¡Å¥U8:ˆµ ?ÿÇa†ô»ˆ9U@¶‡§A¿‹èM¶8)í#]eè¬,:?gq¹8xF´g@eT,ä™*Å@m„̲!^£ EØÒ9z)Áü@Ñ,iSbÚ*Î.LsÝÈkq‘E†’ãñIï$À¦ð°C $ð¬Êrÿ"Ä «`Ј·CD £»Ò Z¾‘­ÏE²„Y,1V‰¢+†Óôp94ÄEß ì׎f?˜3Û”©ÙžÑðûa*-x‰ÖÞШFÆ©òq†«¦ÑT ÍBË€5$´ñœ'Ä)}$¢]/ ðD†¼¶ÒK ^ºCP0:œwìàøzS¤0 ‚„>švYn=w„Ä]:d_ˆ ÈY zOI2¾Eq0‡¸9{ÉLaŽ©l¿ÊL(OlvŠãqeÓŠïH¢Hü%ú$µÅä³úŽ”ñn`` @=ÕL$àÄêŽÅtô" «š˜MüÁ0Ò,† ÀQLFž0ˆLÈ ^û¦ªNÄTÿˆÊN Ä—œÁE±•´ûv~Q’(Ò¹zè,ljÍRËsÐZØzûeZ‚íYbR¡ž ÕQWa˜Y1 L°$Ñ!b!@h¹°!ZÂbH¯bv‰8C։į p«ý*r] &ËЩ;]XÛ•8 Nƒ}F²M˜YòR‚rÔe oa˜\Ë5²ÓàG¸6!QgûEd+Z ¸I…s¯¹ˆº§AÔK!ri"ô.®ˆ”*:&3ñK=‚Ñ‚@U .&Œ&K 0Ú,‘R–ª§SÎBZÛ-äˆriÉÏOç»b€L_!ODq@åR<‚Ö["¿Q­jÇ ¯D=9ÛÊ!SÈI”0âph¥ÒT® zXÇ€}£³´ÏÐÌ«h'\‰3%ÈܨzqµéÌÁ.NïÕ@k\̹èMMctè‰\‰“EWÙ§êÄI­`À š° œ70fÉÓA°ÖÌLi*„ÀâP)R¹Ú@¼‚|@ ¥a$ô Nâô*ø¹DfÆò”b‚8œ-L—&#wU¸'“Ô Ü€³G+ …x»Þq¨^ˆ¥M—Õ?f£f-ŠØ4Àºs—«¾²ð‡ê¶Î\OH@™c>°•í(ƒT"ƒôD¨çµÛAiKk8ïdJ-abĵ6™l™uŒ­÷XîñhófŽº‡:`ÐN…Á¡Šî0ØŸš4— -JKBóÜX-…¸ø1ôOH“Q“ÌGZ‹ÂPtFRÄšX& ­¥ ú <ö¾ú&…î›dYŠL‰MÃXqÅEçRu¤D„¹¦{‘YÎ:µšÑ–sc`C–¢ ‹Ë³1³Á4ˆå˜˜ÐøZk6²ØFº.hÿÈKøÝ/"‚J"‰kIÜ„0޹Ð=ð¬ íj|¢ñÃþ/[­–E™ÀImÄHŸäSä2E²F@m 9Ÿ´”2jf:tíæ@>(™À»]6™L8¨;<õ±NÒ"S€JÙˆÆ °Ö(ɼž3 û©ØžbñézSPfÛféfÁZÑdSô¼7­…‡zTŠNÈA=ã) È¡ ¤EóFÃr…ØLÚÛQ­²±õ*%‹ŠCÏðTå àÐ`ÎÆ`/jâÉi}<î9¢w¥Å3ŒCªNJk4eb×lêÓMЕ}êiY»Áäx’°]õs§ ÅÆséÜ dAÎ#€ í ‹Ï ýJÒΛY±°0‹#`NýÈ¢DÏñíÚAK»Þù äûs¡ª _ù½$ÞƒåÂphÚó#×wGIx)ÙoÂxÃn#î7¸ªcc«*Su D{*°½Sê#û°´„á×5ÅÛõ¯eÞÿçøÿ …:3éÀÿ{x4s+†ÿ÷lú/þÿŸøÄ…†DFø3.‰hã[§Dj=+Ð6I=ÃÓÐEQ©/v µ/)òöI€Ø„_CÛMš €ï …£Q˜KÙ’ïòOøz– %›+üÔ,¡t6 Å Ê¡¬ŒJm~`0íO JkrPÆ¥43(­A)M ÊÀ¨ ,Ì þ¾!Á_7!(ãR› ü‚Á@)LJg$P:ó€_5 (I@©Jeð× Êú_ ÿ2‚û—пl þeîçvÛ`ý¥ô ÊÊ_ZÁ÷˸o(ç¿Ù/ °~™ÀôË  _&Ðü2å—Ž_V@ü²€à—øþ/ÁîËs/(-ž»”HîR!ìË[_ T}é!õÿñÎ/}@çKš/ \¾Ô@ùÒCäKŽ/5,¾ô€øÒAáK ‚ÿ ð÷RcßK‹z/%ÞýWîŽrÿëØvQ©pí Íî)* ’]ð÷ñëµ^ ¬ºàÇu/ÑßF§—“^*$z©ðç¥B—k^ „yiqå¥@“—C^ äxiðâ¥D‰— .( "üG8ðÒ#ÀKý.5ê»Txï2@z ~ã]6ï2€v—Ô-øÛpî²r³jö7!Ü ¼]6Èí²Àl— Z»LpÚ¥i—ž]*`vYaBJÆ. » Øe½.3Ðué×¥ÅZ—e]z|uY «ËS]j4u©qÔ¥DP—;ý7QÓe™þ¥ó{É`éÒäK.=4ºô èÒÁ¡K„. t)ÁÏ?B>ÿ§qSÿ¿|JÆÿK—k]ð½ Zàø³øOî\üŸ‡›‡g³ñÿÄ'š#¯A¢D>1‘CÑõÀäX‚‘|üì`sSjEÉ }ãío)þ‚<¡¦’R×[¤QH%æ>õPRd äæBc·Ô.ÒL9™ˆ=¤j~Y€õCxP3Ò…ú§$èêrí{ , „UêXÚtãïEÁú۰ʬLÜ¿¿‹#, 2 O ýŠ/àÄ¿bëfþJü+PgôGð?«sxLdI´@/Äÿ/‡¸Ò$N^ãÿýHâìWü‡¸"Í(SÿÃ0V‚¿ÆŠo Œ•àâ³ÃX JÆŠÂX þkÂX p+~©ÂXý§wÂÿ›ŸâüŸ¡ø]BÀ¾ìB1G¥ þÄû9ÿçî…ã?5uoæíî%psoêÕÌí_þïŸøp,8ø|IXE(Cü`„p‰Ì¢ømÊöt¬p† $l« Ôò$eÀÞ±9=¨°QfJ“Òá–Î5_ársÈ41_@èžLâ*i2ˉ/BÒÀàÉrM:{ö  £ MEaämˆHGZ €Ôh1Øå¦PaDžTƒÍ}‹ÙÓôG74×ô Â3eÈàQ % Pf45T^v¥x1Ä?egÊhW}‘+ "M~€E02=–¬*0ƒ ‹õ º†Ã­É/¤ÁT%GLˆ#ü¢ƒ)þ§—\­RBÆ ;è%U#I¡FÅô5`›P¸#9#Fh¨R#i/N€Asr vOå¯ÐA¶­}§PAšLš)ÐÈûP@×Áf÷Ê@aÖ±A¼xHFèÇP2âíå’H±|í:8#i Ksã‡UJÔ½›â)Ò¨,Yó¨ %#MUË™  qq@ÈP¦}ÿk ]6 I\”Û½ªDŠ© ÇL#Ó™ tp‘ôª“ܽ\QÝ9µ…ð>”O²TKMNhrUR¨½ìáÔ\RR¤§EXÐÓãLj$䣵üwV{ñ@m»œ@ Så†Âa„½ˆd>E›§†½¢§Ëð’A 6F”)Õ¦µÑk*n(NÍ8A„ï¡^4üúyÕd=†©´˜NeÉØöè*4ìqp*>Ü„âÒ˜¬Óëp$fk!G̃¥IT£©XÙC•]:sçP€¬E¢2¡®2Z&Íø—­ûïþçÿ¨5‚6„LejÙ”ñû_7O7ÿì=½ÝÿµÿýG>£"‚*ðk‚eZAI]sÀלúw[éqêRC+ŽÓ’0Ž<¿dU"Å:eQ¤LšœÝó¨¬5'PK¨Smï«ÏºYö¶?8mÀ…63¼¶¯Þ?9ãsÀæQÃ^›=´ž9´¾býwÓvÞÏD–3mwFú ¬\o1=¯¡ý•Ð},˜Ô`¢ãõ™¼;o*lVß,<Ú2ðÒuÏ›^Æd®—äåY0Y·iwäé .¼¿ùõVÇu+íÙN˜Ô×iq7·c¼Å‡LÆÖYlåÖg¬GÞcwò þ“ÌwïMÅÍŸÖ[™ý%­µËAµíôÎq‡{Žjmuk÷Ô+ë~xÐÚå°ºåôÅëC‚Ÿï$¬›ÔyƒÎ;?ú|Y¹n]óŠOß–›¿—wù²ë½'#Î5n_M4ß§êøuL¦ðo¸Zœ3dƒ4¼ðÉǶ÷^«æù»Å@Óy/jNyÙ¢h_Òøˆ°y]Œš&µŽxØ3gtVþëãó–[ݾÿÕ‹ïa½ ö÷ù´õè#ŸÝ–5î|6’ñŠªóx¦Fœ¡ú-º¼¦ñ΄o!û ¼æŽ1¯øQp¯çÇ¢“ÕÌó¾ÿ6ée¯›Y7ª?ÚZý´}yåÁå‘åž=óo|~ÚÅqÓ ^¾¯Ð&óÜÆ—ƒ|쾘 èçè1ا«yæýüËf!ÒÓÝz{Ö3V´¼ZˤòßÜkîÙÍ«W\ÝS×½y9·Åîg‡ú~—Õ‰î3׿°µUb|`Ääܶ_þÜîTñ᩵Ãvõý8 CuÜjõÓäÁ¢®9¹‡nîì5èøÂÝê++4ü=]º:/Ùé²Ü¯oÜJž‹&ã}ÚüÙ闗œö¼^ëzzD¿FCDC{7î2ü½òéÈ}»}íß4iä+žãªÈg›?míÙïðŸËŸ[ÝÞöyEÏÑû¾«¿u.ÏŸ07ÂJÒµ_ÇzŸë?º=øáðíI ›Ýo_¸,̹ɉoz>rXâùxì«Õ¦£|¶ËèÌЈ±þß/[N¬n5·æ›¬[ƒâo¥ùg~߱ξÙ*õÃËí,¼wé¦ ?YÔ’Üw¶ò-RðNWœ§½»©èÛ\×IuÊIv›‡:½rþñï‚ÜáwåW—ïìcûìÖî÷-WM¸ÓjÆÀäZ&½•}Þ=ycXóE‘¾çoMzÛãøõú§å “¬t^•;ÅùDóͨíÓÿîØ'º× iµcQÿ‚¾Oµž>hs^W{웕C'î9züÖÜOì¯Ùñ>¸PC³Ìß÷ÜÝÄ ZŸ6ê¾Ìã®oßiôB£ÞÖóúŸ«9üR·=½_x žo[Ö¨áÐÆS—síýÒ×®¥ÃÕz£â:YÏ]3.~ß×£¯ëî\à™óõëªG3ªW=±®ñëvžûΟ>1¡0ë÷!™Úaå®7®%Îy¶dà™w=«6½Ço“?.ÿÖí ï>þm¯hê§6mδÝ%>p˜ãÓÐ[y[.]Éáõ»râè½üË÷Ö¯h:Ø6¡_Mßµý×9›N37¢ çX«/S*äÄœødܧ`Qã×6=S6å~y±õñ%ÿÚŸ=k8ð·Ëå^ ÓU=æ}þàÆ{ÔhÆŒ*ƒ|Â:.O»êx}G]íJG4XÅ´›ÔµRµç™ÞƺDžÒÃWi‘ùaìhÛË­ßâ8{å³±¶Yâ—Õ ÜÇšM2³[ßÎlÞhï±ÃLëk¯»šÏ|¢Þ¶Àl›[/‹ŽC·¯¨W­êðž»ýýæwÔZ&›énr…—VνÛÞÔ©þé;¡jËèMì{:üa‚}Çó[ÛÖ™¯¯ømäʽ3/žN˜í–7%ž÷ýÔ‡)_Oóx1ökæY]´»ÎÌÝÖ º/nWîÌ­5ÇÞ¸¬½ÝyéäW‹Ëm:ì:/èÑÑÌÕÇŽ>»Q:ðÕõg·,š ˯:~¹4ÿŒôŠ×ꊚ™Ä¼híêžw¦×ržÅâûåÔŸ"–‰#tm´ª?/ÃÍdîšÓÇdÌ©±¤G•éâºKÌ V÷nÞÌçÞô¶[nj†ÜÞþ~öÀíýÃÍìkøêV.XÞb9ïÔá>oߨhk\£‰{«£OÞäK¹"5=d3}Ž»‡8C±ÁHcŸ[/ÅdIfˆu ÀõèÛ­f½†ÞS1ÍlÞíÝW­M/ß«(NÏÿ:¬ÒýWýÿÈéìXÎÔ©W«96â˜vªL¹à{ßxÄ~¿«rMŒÚ<{±¢çƒêŠ^wûlq»W‹h‹ÃÛvî¾onê4º±Í²uó›ô¿t8þͦ-µÞŸž;¹ oA‹q¡Ñ÷&_;8åÑwÞÅ?/fÝöm½vaxãE¾õ/Ø9ÐþvÃu#ßî=·»m Á—1ÓÏä^žßòjÛIë'0¾ïÿ¡±oaì¬ÞW6…¨Q¥_ÛÒj¥{…»î¼´–AK"LÜ}2̧|Pl¯Ü©©7wµ|™_Ôq„Ó«)›ûëö;ïˆÅãCê÷ì·¦|Qó¾5 ;/ØòÛÝg•rîmÚ¾¶bHWÏ´xoËzYf­®…?ÉÜzZè2×b{ŠiàÈgwNô»Ý¤åõOžm“T3ˉóX9ÕÑ8Ós¥“ˈñËæòÁ¸æ‹Õœ»±z}Ÿƒ3]o®l~è´§U}«Ö×=²óöí¸db™‹ïxh•îs¼ªêëýEã÷Üê%Ý?·°^áÞcu½¾>22Y¦Vš8¨Ãòixï}êt­5áéÓcá_•¡ß;V·Ø2䣗ÑКÌùM~eÝT”/~+—ðè{¤åó~Oºf¬óÉlx1ûæÔ—®_\æy>ü~݆×gؼn2×·Ø0MÓbRÞöº1ö‡g==ùºzëè)>é–¯Ê?v©5(ë…y¿£>ŒÜ—·h@ërcºr«~ûÌõ{¯?x寨 ™ß7¼p#žšÒí¯~¼†Qr«cÅFßœÕv·ïu=Ö£…fwÄ®ÂA¶A¯ò»n1R]±²i×Wt5æYbÕÞ¶sÄ&‹x9ŸBú]š+ìí"³‰éÿ}´íùî®ùm¾ìÿ6{Eü¬ÜEËv>8\`š`{ÍÂ9õš]ÂÛÐ¥f=Ç­û½÷©Š¦FæWì72rOeÇ×+¯Ø<­4´ºcAøîßf½ï»s^Á‚''b4§/웿K-Ë9à;æYr‡.nuŽ»ØZ¸ùŽZå}•7ûÐËÝ·®>Ô±åÁ€âÕS÷ÎäÛ—w;vpÙ4Ïèý_¶ÜltWíüäÞ¡%ÆŠù)v£·¿¾êùGÍö«RÏç¾ø|¿ÎÎû+çDóN{¸xW_<úí»A=šEL¿søÙ8“û÷t©™Ñdtê<ëIÕ?¿6å@¬ðî*Ë»žS> ¯•æ5|ÖÆD«}]CÔ™øf»6Ò%÷âÀ?_~~jæóòêä59–µ|gÔ(wûÛìj½Œ—^ÉIiòüøH#›éªYêû£øÌüT_xéãË› ö I¬6=2m-o‰§ï¾ò6!§öë8CwèôÌ?üå »Êß™©ö6ªc”À«¾¶ÎÐÀ„/=.~KÍy[}jÏ?„MìšU~Ø`€M…¶1 u’ cÏ/©¼³Óäµ í“„M)/3OF[ölÝÙj“Í‹AîÊÚ5µýkÜøº¤\áó+ë÷Loù2lt­#_›Ú[Ý8¸^“ØË“½s]1ÛíàÁ\‹´®óM:yXçuíá6ÈâEsÓwžQ_¶Í,Ÿpâä=á\£±Á3eågš6;ãëæ—?¢qJÅî'æým÷İ…n¥<7o_Álã÷Њl¯]êëÄ{&Í97¦ýªœ-/|Óë~ûüáÆ>]’x/l‹_¿Dã÷A{í®ØÄnêí#KÞi*Énmz}B lùïJ§èv §ø™?^U“%6µoÇs·_ýÎÃ|£åÙÌ •ädæ¸XØ\šðá~_¿Ï«™&µÌ¨tvH@yã­åsTåeõ©Ðw!·B•3’žÚmr“™«\jNžàmV}í¿Þó­_­üíz«¯Íy3š]v(hšQó”:ÜâŒ4ÿ„õ)S£?ZÆ4z5¯ÚßO·g;_já´kƒv•(Áºú€^ƒªTYß|žÅº)g‚{ì¾hº÷ÿæáý[·fm_÷Èêtç™™òñý67Í<úÇ‚“û÷ö uMèc¥œ:8#eí”UïwKMkˆ¦¿+ª| u—@¾}@ŸÆw6™¾n1/¦°öV,Ë&õô´mX·ºÖ”°Qz˜LŽÚw"Âmc%#›•û-ÎUÚÿêœÕ»¤ùë6Ùî´ïS‡F‘KðzÛ¾èënî7xëôo ‡»‚£åoWÛùØ^Ý¡ÕÝQFõVhL¶{k<Ñb€Ë3W›Iô‘‘·åª7É¢í‰a¡¶wÕÍŽué×lšQÈÑfs.:ØZÝ>¹oçÊÆ®ç¾-¸òrÛ)«É5Ë%Œ²Üç]/gw+Ûw§{E­™=`b`²üì:»¡[¼7›L¿ÙyÅ“c}ZÚ¾ê¾R`sæÀ®Oã»G]úùÊÂú!ÂZáÃ…S¯´]üxûýY~ƒÛn01òîõñSjìÖ·gBŸ¶¼¼(Æ*®zº‘Óö'æ ;õm« 0ºYÞLØðÕ0Scʼn7O–ÝßÑ&.Õw|õåþ‰ßw­=ø$4ö¢Cë„Ð ­s}>wFt§i¼êöl;²¡ÇÞ=“ì÷†>NlYXt³ãÑèÚ—Ë›Mîžc^Î!÷üŠê?N¯é÷þaÁàÖª¶+xÝ&Ïw×)O2æìŠ6é_L‚CùUæ<\óÆùÏ'Nº¸|x[Ÿ­»†¯ j»Ãéõý§3_Ï>¼ºÑ¼©{¾õ|½£÷±Mκ>]:ß:ͪ ·ÍQÏέ¿¬~ãþ 1½j·}‰ÓW”OŽÙªÎbñ«ìô‹k®˜ê=w´›÷}“ß¾xå.u¿–_ÃÔqÍÌe<»&+»ž;;ªúKñõèÄÃwwÙýñqÓìJ]>ô–¦F,œø¢Ëö¬j«‹>¿žvoì¸Ú _z~öÈjc†=ž×Wãn¼t™éU¹éìÃÏkeyý×ÿ„ÕA¿MçÏ/8ÐÝ÷–O÷„®îÝ|Òƒ\‚[,»{˯¼ëlËÅa«5;]½ßÙ‹aq}ûNŸÛ·‹,{Øå1#6ë6Ô’në¼,ñEµjc&ÎÝûtãÓ‚³×£§DMi5ûÊ´JC'ou´Õ6wÓ™rÂuU× ^ÏÙhåŸ Ú¤,òšUMÜug^ÚjcÍǧ{ÿ\èhug뛞Ißž9¦±²N¬wŠ•öŒ·Âv:?· ÷z‘ÓÒmF·¦é¸éºçP8Ö°æúö¯Oüywðì‚»ÆW'w¨w}œSNjîèK?½è4ÞÔL·ÖÆ)ùvƒ4ª²ð€n¢Ëçj ŸërC§]'t|:xÅ”ñ™ù³‡Õ¾QϹÃúQ=m½5F£Ý²樎U3šù íñ. Ã.ßm}Oìá‘›\´¸Ã[¼/ìÊ.ØÙÙ1æà°ÁF¼Q®y •BšÔaÒ«¡Æ;f»Ùïõ¥²ÕÄž›ÿÇ"kþô~M·W.v›{ùLjªÉ·Á‚ê737[÷êÓ± IõìÆò±Û´«ƒ®Í¨¢{êMü.ãËìùÃþô6þ̳6?:³ÆPÓ>åfݾÿ¾®²[V±³³ƒê‰fOjÊ—ø„wÞ¸¥º‰[e£åùÓ·Õ}~ÙD×÷÷‚£·&»÷æåéµs+šæ¯Ù½~ê€ 'Ý-Z­7ò\{ë}‹Ü c‡/ÙsÊÖdýoOL,ºwû¶»oÍÙ]:˜Ýs¨Gÿc¦™nÁÉ…uVO¶ðm5þÅåk× Þ»Õœ±äíÆýW ~önëÛjá³ZS—[°É%a‡.C1YjšSe™û[‹ÜsÙý­§9úçž­>zjëfù .Ǥï±ýü~|øæ›®z1EsïÐŽÆ/X²ÜfççÜäÕkV zêcÃ÷Km”»y³ŸF£‰>—»)íËïÓì—t·ø9K>­ ¨‹ÛÇü"»ö vôíÕügx*|[¥9{æ”7 çËæ{ˆCŒV']éá—7&¾pv§‹ýnÙ û‡U<{{–g!Â*>ºÔiê„ùÍzÞM9묫l oC×­•¾Õ7·0oå{Îá÷OS>6½¿hþša«e¡ ¡7úi|/•k~¯âà{†­žÜ\ÓïÈÛ=žá1s²êö}&Oû¼ø…ªÂ‚ÏÒµc¥Í __3i&<ÜóýÓò-j=ž3kUöñ;¼ý’GÅ´3kd^ð(¾ëððÍ_f&…é²Ëóö£üRSƒGÈ»DFÆh®fÇ6²l;Ð#¶|·F ”µŒ\gonjgs×uGÊâÇWžœ{¶nžW¨Íòm–]×jÍÀ6FËrŸèœÎ[ÞÉü(Úýá{–fèÔ©9…•sŽßr½½Þfà“ ….T^6?®UÖB»9òŒ×þcÛˆ\â3ëÌ’–C+ñÚÆ·Ñ$}Ëw>º°Ä>/JÝsx“õKo‰-ËîÓîý;ñÛj"Û>¹çªNž-ºÐ4øüšÈëÆ7š$ól×Ýzß(xH‹iÔ‘¼°Bùªy§vô0,\qôÜø–?7*_ûÒ¹ªÃëHúø<ùÒ³ò—ªîýî¤ßêЂçúF·çê…º¦ëSÌS;à›žÃ[Ïù¸fǰ6­ûÞ”›MYVǹmÁ «!{ê7ÐÅ:¸¬mTÕܪs¶¯Üg©>~,?¯rß G¯Å8OWζþ ³cÃöíi,´×|ØyïT΢É ßöøjἑçÅ „OF }çùø…rxB^‰ÏÀçËâg-ïeš³p,oLlȾ¢[QÑïÿœµ©QŸ†—ÎÎx’è^»ÏÕÁ6zúyÔŸí´è»Ó·Cׇúöû ÏüÓm|=Éë$ô½ªq’t²³µZÿ‰ì{¡Ãôµ­¿Yáù°U£ öf¢¬y…“?EĈ3ŽyóFÕSóÂäFûÒ=«VM²Ih5àu¹ZŠwrçm02_ÊoþQÝè»ññ׃_Í( ùüieÁŠMn½ £3·ÿv7õL‚Õ¾Ò ›æε8h<ÞòÆéÌZ{Fêgz\èwwÁɆÇ7j'é\µ÷›–Æî#¿ÔlW-¨â¿{–)£¿Lz·eó³¡9·>ZoN—q_*x¿-ÀÛfcµãÉ“k$¼æ;cöÞì_÷Ì×ô¯k¾F½šµ4À8Yêë`—ì‘w·‰ë¢ãækïo•4ݸpÁ’Ö ´£*Ü8i;jâ·“•FŽzÙ¢ýÜ›}-²r²æ.í5J²üaÿ¹aõ ¶”[èS³B‘ù¨¢ñkx'·žt8gäa—ptÚ’%u×èûdõçeƒ¶,??ñþLó.Næ]:4ˆH^¹Ñú‘_Àļr|b¶öwyüQ¥:t¨ÿi¥™KßÔÂ'óM„Ÿ;µý^ôv¨óÆj'gj&y~îž½×Ù+gî÷š;"éôíßFUÝtÀÚïjåïYü¢î»£U_X×êùˆÔƒsÚ5Z1¡ÊAûJÑŠÀœ·k]­3¿yƇE³‡{-©£ÛRmäì€T·©ÖêÏcUN*1ã\Üå©7|êÙWh=öÀÀNæm=5sWO˜róŠÒd}-jä\ÖÎê?ø±SmËÓgÒ¢†ÛÝqY²ÈëÚ‹ˆéçfM/ùu8þ"ãÓêKLÒ†ÍêiÞâÛ34+Ø2ÆèÔŽ>³÷?ùòúQ5¡í•}š›O=Û*zAÛqŸZº48xö·¶£?½—ë×í†Ï·©:ÞÓ:GróÍBŽG¾Ñ8gC̹m«ÖÙ‰í«ûûW¾àþ”㫼•*O¶ýóKýIÅÍ75C›Å6ø~øÐËäˬ€ª·ŽÈhœðdSUëo'sö¬`m~èÝÚzÁ…[ƒ_EŸ¸ücU黌ëŸ<<üÒ[÷/j¹mÛ#q°‡ñ¸ìÍ×Úš&(²/ÜŸe}áŽñðµu6V99ñì熯CG jN<~î²·²OÕÂA§ÊÝy³É®zc‡yµixÚb‰} ÃîŒy­våöX´~fÌࢅ)Ï“~—ïâ­ºð%¸¥vjá¥û/Ú èó>/·áÑ/g‚¥Í–Þ²0}ÜK7§ð®‡ûÈ…3;=‹h¾UÒ¯æM‰mÝ€™3 Ü?kfì¼Yza…`W»;¼ªµ-ºšëòƒªkl\VlÑ +oèÿæýŽíWoùØÝ¡áVKËïÈÓ-?µ§^½1£ÏØe¦›íLMr×¾–RÎ$÷ÀâI”Í6Æ9—ïTÍsKhlä¡k’KÛZ^äœüýûKºç‘½ß,K¯Ÿ~åû QÝÄ*±-ØgîXr+¸YèÚ= }S­øawíÆ }›?®ûÔE4cójÉ©¡—ƹ\ÎYÚaj»3m<†FÜR]ùäíõìšßÞ¹oïí»¥ÎÅ@ŸlUÀž„Aƒ^Œ7û,– ¿–2ÄÅf̡ʯ^z5Ú ÕæFîÙyæÒ¦G¼ºÞzžÞô}µÊ}ßÄMúcÇ‘—ï_vž+©=K÷ûHž®ÍÚ‰>‚û¥íëÍì4©ÓÖìù3S^˜êÓ!Ǹñ—÷¢&öNï¿Öêµ·ÉÀøò;²2¾¶yóD§¹tÛ¡míôWkZšÅ«|Ö×y.®©‹í½Q¯2ÛêÓ>Û®å’þaßlÆ.è9°Y­ªŠ&«·M©ra×û®ms¶•zu¦89iÃôÐÀ¾·oĵïæy.÷@cÏD©¹ã·sk4–[cmÞXçÕZ÷½ÆšÂK·Êðo$ý½¨öUþváØÛÒµëvÄT’UXìuØëû¬þ’oþ+]íÏYGÖmiüøÏþ_Í»œ/¨Ôï{§ßm|s?mY3î«·—÷‹ªö:ìÉlYÍÝé곞¶Õ¤;»¤ŸîÜàè»VÛOÅ]½Ð¥áÌYSZïýÖ;¼êÒCÏ{-:Ðj‰îÆ—KóG¼_÷M—:bÝûÈÕ…Íãúî:¤m܆/ã÷˜moYÔ)~Kèê_ÛYæž1ÔüŽSuÛ:ž±ç—^’¾ÕlX$êð²z;ŸÉßO÷^~ë³»GÛã½§Å\¼4ûe“÷‹êžêÕ¼ÛËy¯†iÚ<'M~q¸ÞÚ-ÇãÄ[Æzº\¹xy}­‚ͪ@ó´¥–µrO>+Ú7€íˆ…ÚßÞí—W¾úܨֻw¶ßºáÌòéï¯vôÊšôç,‹/ñÙ=k)j3#!¾õôšõrG,Žuùx¿oìü~WÚ÷|=sh«?žnläðf÷½+L›‡ ÷Ô^°c•I…Ï×oÙmíp'Õ§3ýãæ ñù7baŸßr B–ÿv©rØ×É]:v}ñhtS Å4ÿoí†6Úïjk¹¿ëº¢ºŸ®v0þ[Oÿ—6ú[ù>è³ýÈu›>'öEu«Ü0LòöxåV‰É|£Q•:¤œêúQز_FþÐˤ/E‰9ý?¹7Àd­Nåö?Øú)hÌ™õÝ=³öJ^8ŸKYr yo‡Ý·ú® mê8ùò•3Öªu- ÛtóÒ|nu¹Ùo"“‘·ú¿Õ÷È{·ø¡}yñAÇÍV)§nÙäíßõ¸QóüóÌ5n~zŠóèµ{v²Þÿzë§‹Û>m}¬çüUswñ^]äh4°b¿?3ê?»úºg³G_š^n6¡ÎÊøç©¼Ågr>mŠSÚum±»ß¾%ÎÝ;š ;¦Mm^ñý¦ãW6^ëpÇ­ ñžÞ{öÔÚÞ²þ'÷fÿñ@±º{4Ïônêîþˆk*í!SgDÉûÈÚx4uC#± œ¿*Yæ`…ðgwø³LÊw Ðè”"¹J¤ÓP?+UJ˜FÓ&EªÐȨ_{H{IEJ™V„\tK"zyEi¥Iém€{ð»F#É ÷¨0‰¸·V¦–Mä}ªMb¨œUʤP©:=*K&Ë ò‡ÏD)R–¡RÈ“²C£¨Ê‡¶kÓÔÊVš¥5Š‚øG?¿@•R…ѤmIÉÿWqŠ%¯6ºteütý»[ÿ^ÿÚü#κoF–8{Ý{þxÝ{x4ýwÝÿïý^ÿ yb¢Z&MO•)EUiËøñú§»G3=üoS7÷ÿä3PhddDß›Pÿ»Çf<žuiž{ñžCࣩ+·«þ ~VI.¯fåw|oïyxPn™£yõ_+—C×6øªÂ×9øº_Oâ+Xàz_WRùSÄd#¸RKo?¸Rk§k9t= <WêðœZðËñµ1¸R5 WjéõÁ×Ëø: \)â`o®¹TæÔÜ ®QÛ ®Ô„?A]ËQÏcF=òÌâ± UµÇ+À?}©ž;ºŸW´PÆ¢ÅxÙPºþ|r»¨¨ˆz/ê1 ŠƒöŸ¦ŠòÌtÌBêù°<­qQþ¦]»ícß`?HGýøøõÛ ýK¨¤9; ©Ð53äz¡Ö˜! ëG™6x}erß s/¤ëòÉh ÕáaϨ?Á8>õ'uÕÇÀŒ†|2«8?¯âæ¼Q0ÕÓz¬<Ћ`q=å3™ŒÝ?q"UáNQ÷}ƒÚ‹ÚdÇ ±§ÞQ8Æ·pȧ"mÅQ‹òÇyaJÝêÞv펦Âã ðÿJp.>FÝ¡wÍT«’\“]§X†§æEDÈ“[ò“yŽ>ýŒãíð9‰¾ã˜,r$ŒU‰"ö•‡é  -`e€ý ì”`Ÿ+'—‡ø—Ägh©Ä`çµ5Bû=˜ð``ój þ¬30Ó_ö÷åfèï|S´‡\æ¡=¤#<Ç÷¢"ÕDSX'¨ µÆT¨û/ÔõïžCž±Š›fˆ~ÝÏ‚üý[ œ‚Âbœž"/‘·À)&Q§ÔêЋ»Þy8sRz‰ÜDžtJxGR6ýŸOù“zÂàIá_¦ð_+sôG[<®`¼ÿÔ€ÕOBøÞÄbï±@ã}ÐŒä‹>c™ràÎ⚨“+’ѿɮ©`‹tñyмÑ#­Z&s•{6÷v?¹&it®Ij­\õko²Sïò¨þøE ¨]Õ[ÔÂg”ƒêcë³æo×GYfõ1ªÄ³17±¨eáhQ¬ýû°¾à£¯Ö¨ÐöÎ3úëUçñp_¡03ƒg’Ç3jcL±FÔ0ú&"£z®õ:§› g`&˜Ô¥žµ16COÀœ0á£TmR]]ÝÚÔ«sYæ•UêU¶SW0ãLlHÙÔ0÷L,ð½H“¡•&RW­]ÓÈ_iRMO”œ­¤’ «VÍ¥*u"BÙ7ñÔoj™¤Cd*´<äMEÀ=;O9T‘Z™<‘,->8/à‰€a¸†*]z$©aaÒ yU€J ÿA¹¡7)îz EM§žÉu©ñR50T×[àÊžþ z‘;…\)ûuzX3¼6sñ7Ǭ]Sügòø9 åà›o„hxyœ¬&@WLp:@ûÁ×–Åà“?ÁÙÐmÐlðmÉ*×ÛòZ¾¾¸ #šúðx¡Ô׿ö ð½¬×°wtb¥{ øZà{KVºxœ? e`æƒouV¿‘vta¥;b†¾V:Ò2V:°nÀw¬17ø¤³ÒU¾µYù‘r{â¿A€)_?é²YéÀ™ö¼S»Ü!8èW(g°àñ, ¤ÍJÎÀ·KH7‰•œ—PîtÜVÊ/,ì„•ä?Ÿ•àés-yø¤Î¤ß%¬t€·È³dÎ>ìtkXéÀŸoi¸qù°_¨t—- ·c+ésðéβîÉo{õÒ­çãSþ:ä륳£™ÀÀ:º®—®¹wþ‘ß ôÒÅQéZÈð\&¬t“(¦îƒüÈœ¢Ë'S4W½y =°ÔËo+µˆn±^Ô—}±?¹øj‚SiÈ=Ê À„Ü£?:™’{ôÇDú Oòé{(9ƒkÝ—ƒW}™ÑúÞ^ÿiÒ3úIÛri’-¼æÑ÷Hö#™ûcBsÐ侺޽Þ} ½ûšz÷µôîíõîksÆÙ”÷ºÈJï>Çô¯1Õ¿ô~—ò˜þ3¢úÑoÓ÷yýyLÿQýèh?â;Ìí| ò{(³²1gÊÛL]å¬{ýòÌí:«üÓ<|.ÀåƒuHÆÛˆï½ú€5äkÁä_¬?Œ¸÷z÷FÌ|02~]ÔÙˆo#ã*¼#ăÃüù¼þFÌüé§àüˆŒp©Wæø ÿNdŽß¸2GS¼f‰Ì±š17?gc®Ì°©1WæØ §'2ÇP|OdŽr½÷3¹2GNOdŽÃñ=‘9NÇ÷D渂EcÔw—1W是÷;ðq€%•âl’$U(X²KÀ¹j´º”*ÓøxÿèðÈøIT4iÆpîÚûÓ70zŒ Øóòòöäe‚‹•$YŸªP%JñŒ—êzó Ÿ¬ËÈÈ&ˆÃ˜üÉM`¤_¨˜¾…‘¿™\“è\ÿþYËSAs:‡ù…JüAU|šT™¬Q7rïæÞ¢T™6>3)^›¦S¦‹{óâƒBÂÛù…ćF‰£ã£Òx,mõõeÄ e$ÙEBZvÆHÂŒ¤¶ìçXÈËIÊ–ÝB†Iy™4îzBjÖ/"OZ ľPfÌ~H–Ù…aá2§|o¢j=ú¿ŸèóSý/ôÌ]º2~æÿ©©‡§¾þ×½™×¿úßâô¿Æýo[¸×/À{¡/~>±óŽ/¯9ÅúR\RM˜ÖìùçZq¯„Û'gF;¬_¶³p®Áx¿‹3æ¾gŒßóÅïùâôÿ¯½wªºöÇÏ$“dÀ 1"Ê’@€ðÒŒ$0±á¡kɰQT¥Ñ°~À%÷Q;ÞÊg…n=®Y_øŠð;Sðo åʱŸ%ÞaÇ*ÿ%ù¼I”©]4Á¯ eÏ! VÑØYL›1WñúwýŸÊå=0ëƒAm×÷ù¹£î C7ÊÕ5Ví(Ƹ¶í!òÁ ½—à i°ƒï·»ýuŠQB{)ùîÞøîªTxw~aéÝùðõ¼ÏÐ9Fÿ=Ž5sÑúŸ]„6Ó@ =“JbïÛíJ¼ãü}ñ~žvè¾L¼(äd¾èo©ß$Üæä¡|–&¯=¼ñ¹Õ>Þ$*"¿8ŬG¼q~J4àú9Ù€7æï2àÏÛR xãyŸ4Þ¨'3 x㻾,Þ(ê^Þ¨ŸgðƳG^œ À&_»‹Z^û[4PÛ-Á1Ý.%88žþ;ûgÑ/À¡sÁÁQ€Ñ[ím >G0𲽉ÁÇ£‹Ú70ø`tMûzMÜÞÈà£iÛk¼0Øm¯dð£)Û1øuÀhªöY Þ MÔžE êå Ä &¤—ŸU`Õj”×ÜšÉPœâU¿ðÌ™í¿Ã[;ÙØï L^F¿´ È¥áÊ)1.%¯ap”ߊÉú¹·ùl´·¶Ãæ¿§ÚåìŸFk²yÕ˜éï &m'ÒëQôø=U_´ÆŒ¤Ÿ¶Û< vµ”8û×±vŸK¶s|}‰¼6–sšàm˜üEì îC»³wåDã]u°Éê-޳ėúREÞ€}p zQÍ9•Þ„g³Šö« ì¼Cm1ýØÊìÐ~A¿Û¡Kµ¿Ò/µ¾ ™4ôNýxˆõ•,ã?{Õ<£Ü @_šL4z컫áE…W­_Líгî—`£!ÏW(n>ÎÌóš/òê©G1þüã©ø7@ÜðP)hÿ”sçp‘^Ιò €M¬äš@ž”r)çxù&¡)ÖŒ_$`9ç/¡œÓeyx׋Ð%胖írDÀ'DÅN[âÿU—Ü[¯NQáXQÑ>""±"œ*Ây",áR®áÃ"”ë<~¼G?ü“12}D?Ò3n(‡¿…$S’|Û¡ˆò _1;öÀöÒòšAÿWg% ôÃïi‰üÒ¢ªÚÙ‰ÿþ…7[Ƶp¤çò²[`¼¯ç+pÉq*Ãõ–t <’îNqþ—×2ÌŠ^^˜Gä¹ \rÜËð”àCò(ÓËñˆü£ 饑ápËÀ³ŽC<@ø—ãV†Ã,üGY¹Jèü.©d˜¥„ø·)]ë_$ò–é¥ÒCKùÖú—[ÒK½&C©å³kúåJèÙ .©Çehý~Á*?Õ–ôûâÌaS„ôryŸ%½|)C¯eh•:Kz9ïÈ0á;ø—çEdûu^b=z«üüÄ’>ÒóÂH寷¤ŸoXè­òó¬:'‚+ôüÃÖö²¦ÿ½%}ŠHŸòw¦—çJdúL‘>3!<½Þ¢˜Ÿ „žïr¸Ñ0þé%_­–òås†6ñðÒ*¿Kø'Kz¹ŽÐDúÊïHÿŽ%½œç'šé¬éåõ:¿ƒK>/[$ÒWûïå[ßgÈôS-x›%´ž§‘×S"½!½ŽRº^m²áÅÀÄ8ÀG Výc=£§¿Š‡µ–Ìÿ‘užní “çsŽ„ÅGëó–o7½ácôyÆŒÕç3>NŸÌx‡®ïÍønº7ã»>?åøKt½kÆÇëúÔŒïú¼•ãtýgÆ;u½fÆ'êúÊŒï©ë#3¾—®gÌøÞºþ0ã“®gqnHŽw3¾>ŽÍøËôñiÆ'+ÖçÔy—÷®í‰q„s0Vú~,M×vÆð]Û!“á»¶CŽ(·ÉRîmŒ>Ŀ뻾ÔòBLf3ÙH¢ø$ŠÃ= nùÎ7Þh–RÙ¸³ Î6ÄáLO?*¯ßËvn<sâ¿ËþÎèù;E¸S†úáø\jYш2¼8Á«úQ¡ï ó9¼­Å(¥ëù-yçöÎ0e嚌­1íÿöͪy/Ç#nŒÈmUsâÂêÏ`H^ézVCKŸfõg0$±t«?ƒ!‘¥›Xý É,mbõg0$´t'«?ƒ!©¥m¬þ †Ä–îaõg0$·t«?ƒ!Á¥«?ƒ!É¥GXý ‰.=ÅêðZÖÿ6ÔŸÁ¬ÿ·1øAÖÿ€›üëÀü(ëÀ뼞õ?àF?Éúp ƒŸfý¸’Áϳþ¼ˆÁXÿžÅàYÿÎbð&Öÿ€ÓüëÀ.7±þœÈàí¬ÿ+ ÞÉúðŒ‘Áo²þgõgpëV¿ÃúŸÕŸÁ{Xÿ³úœ~èvõÓÚýGf͹©Tù(kwÜ8¯4kíKò©ÁO”4ÿ`cÉoê ìFhô¯öT첨ã-l¡F÷fé)y‡ÝÈ`Û®–Æße“&é›OE©¯7èok{û”Ÿnf wË„0[$ïF⇀ f²›4ºâï- I­¤*µÆgÛuœ8{<‘&*þ*ÉÇ¥:ˆ!>ÚWÀÞŒÿ¹³ož·ê ު׾æF/F9×>@)uîl‚•v5à ÛD)Ô8Úº³L)͸Tà~ÀqSn"byD†ˆø>2k:.Yf¾+D„)~ƒØ­Õž²Õî Þ%xÐn”6›|îNíXAÙ Ô§¶ ¼q<Ô/ð胭à©îCgöI-Š1i”ÙzäX×äëªeÔ<,Ÿ…ô‹ªÊŒ6¼N©Ç4®Ú‘'{.¼£ ykóFÅÎSk¦éñ‰áo£ûuPˆÚ4!O²ù—Ŭ‡¨Aš˜eÉË ‰Ðî§dj+AXOhoRÕÕê$Ö 3õ¥?™ãÀ!îV´àŸÑ$+ÝíäsTûU—úî¹hÖ¯¿BÏï¡~ÜÆN$?ª“ö8N”‚…5ÍêŽWñ㯟ke €ÿú%IŽ[=£¾Ý|ºsû6 cÔf£ˆñ䟈ãsñI Q§Ù )í­m  ‡8~e !ÔcÚ¯‰þ•Iü÷Ïì!Vs´çh‘6þ çÚBh•_’ÂÔû×Ó‚Uß¹éw”ΙÓ*Ëx’—Çä×i©ïtÖ ¡_b ¾„18è$vÖ%†ð­À_ÂñõÎ !ÉßA FõúCÎ:|nmn/ÉÍ.ÿnnfêÜ$ðþØ:*ÑIƒü±5÷Ùß ôñ§Ø©à•ñ5+Ó‚©þ˜ÖìØ XÔO1aW‡»µ'û@ßøk:\Ú34b˜6¡ìêWÒÖ¾Ô®¹¨!;¾oI`³ìdÈÜjÎë?ئ`™tÌQ/HAßlè­ÿ@\fc V¦®0D.…¼Me2ós`DD¿lL_i§¿¡N“¢—ׇ7“£¶ª—A$Qé,çg Z ïCµ“ÈéÔªí˜FnÏ¿maK¨ý1¿ÔìXàN%4Ÿs-ŽèÐPËhXéΤ,“‘-DUíçÖzPN5“™Ê÷מõÅמµû¶\Šê³å Î-Ð÷µg£ý1[˜ºÞD !áSæàìß0Í”ü86@z T‘ïdrƒ×iÚáNX­ëÇXvö¯ ñOüº‰GWÉÉ–›¯·x †A‡»³%ÊÇ'w¶Øé÷üާYQ¾øWry <×éÜÏÏåë­¹4 Òá\÷;B¦Øu|/à¼:/ÅøTØë-Ÿˆ«É¤žÅ$Œº-êÑc m­¤€vL³c}Ë à§Ñ"YzßÀÉ­ƒ6aã[Vþ¨cpç—Ïýˆös‹YæfÃðÀzµv{¼h.Î/õ­˜Qü©¤Ñ\ y¤·IQ.e ŸÇ{öwCÌ\¢üÇYË·4¢­IÒDëïFåÌù/jÃK¨Z‰lÂäñó +´EÖê›ÿ ŠÇÎó¸’.ò¦¾«þ‰z<žZ’¥²½ªÆbJ¥žT¿é°“>ι?‡Æ¥¯ß¤îþãOú¨e‡~£µžÀ,h;ßšCƒê#Îu6—Ð{ôjpic‚ÔÇ€Œzžég>]²)öä±0i>£2ÆŸô9ˆP[zÌÐ6· Ie#¯Ïpõ/ºìLè…ŠTi½˜ž—êมÃëh©Ñ1¾$‚>(¡X¡Ý¥>8z”ëƒö£}0©—Ô(qkO¶Ššß/ôdë#¹X@Æ ‰¼&3Õß½†Vèκwí\Šzó²/ÅšaUOm©ÿÐ7BªoGOV”Ž)ÀüžhžBQ#)»?ØÚ_Ùt£ôíû¢a$“ñÞÿ8W¸$A)€S{κ—ˆ}õ_¨›.·±DéÉxÙ$ý_IÅlZü1ÕŒ§ë°UìKbQ-†Dâ²óé©*(}öLàËŽpü­!üdàçüõ!üà' ü0ÏA"Þ‹øŽ‰ÕO38OSßyAÏk.ðGó¼>!|͵åÎúSøqŸ­ÄYÿ5ûUí¬ßÏ~E+Îúð-Ò ÈƒšÊ},4.w²þp«giø$#¶ÕÉõÕ2Z¤wõÉžK*oœQS[j&®ôwS?ÎéˆÅwSêÇ•Ô9b~ß ƒŸÑ ¬æ^%ÕYÍ$añJD;—ÀåÍY‡]”®ä`ªzüZ1¯ç˜ª$Šýày‡xÚ^|¶Å6™­OIGöêÅÃ7Ù‚€ý}ˆŸ›Ns™ûã¶^ÉÄÊ ±Ú“ÀÅêv›ÈÉv»‚…N"]úXt©síèLj”ا†ùM4cŽ’-DCWt« žsÖÿ–¯G±hÔæÆÆõf<ßÇô:°‹b>×u6eÛ1ËTV“Â߇ּkhÒ‘i¬§ÏPÏ»°J¡öøì°>xX-õ`c{e€÷9f¿©Ú[„ßê\{)‰IÇÊÚ`з/íÃÚàygÝ`ÞzŸˆEüÐRĬÿ/ä’Gêñ÷hNnGˆ½1b+E¤}Øþ o¨¨†uS Œò£üSY~÷ÍHêßóÉÞ~§Ó’|¼3ë_¡)gÚãÖ“ŒÙiÚ§0Q¶c劒œæµx¿[¬3 ƒö ÆéDDn;ÅM5äè8É%i}h/çÆ–ÚíÃù²¨±q6ió$íÝCÁàûÛ°U[^$µÑÛ/†´Ñ<[¡8Û6RQ¶¯¹ˆøü¤Ï… _Ò;ºw†-DýDIL;ž}iIÒ°û¡Ð ³éÅP[ßÔ‰¶®½ì¬“·7Ëç6ª`;¾F×Þ>„Ý ZaÇA¾F¡` Yun eGYu¸±Ž—C±íßðyæ÷4Ïd°ýê}Ù’£}/†Ú±éA€2£©1ŸÈ$à6¡VIy´hQÐ~Eœîˆ„QÚ‡¬ ’n¿:€:ÒþÄ$ÊŸ€fÓ U—õjY Îå`Ãr-ºœ9§¨;µh×¢â­5+ÇѺß6£û@ì³V†öYç°9£¿ö‘µ§ã—}ž;ÕžŽâÛŠöŸóÍŸKm^õ)Þk¥WV¨4_…Y´ýÝë¬Çë«Àóî:®ae Yx q+•к?¨;çÆTeõhúnm=rWÁ¶çxí©+–Ù¼J©q8Ÿx½ú5Þ­õìà½&—ñ M=—#›ðx±#¤_KÊj8 ¤x×1ÀHrÉK†ñ’ [¸•…ßÐö9I}+½“Tg†i¿†q3¿”ν·°y…`¶Ú…¸•óÅÈ¢=¦j¯t°)ò B2‰=öRhþíX‰Z‰åeûŸ©»´Óíü)EÒ²A¯Ø]‰Šó‰æêËåð–ùWjÌöß]à×wh¡ñ/ >É0þi1±IS_õôf¶Æyõ¤äix:%¹Æþ§ªÙYŠŽÖ~¡õÿ F<¹1ŽM¨Ý›A™*G[‹G&+ßQÐzäÆÀ4;QÝþaGíGšÈb¹ß²–{ӌ؞ö”ÿ=VôôÛXÎæóX>šú~)$ˆš6Y4žN¥/—äXoïáR•rB›V²ŽÒyô 9F–CoJßÕ±@{ù+Ùx¿ý24¹¤$âZ ¤íjO¢õãïmí=ð¹û%Ô*W]à­â3sõ¹v<+iTßj˜žH\»õyT¾m'6 úlúݹ½ÆYsÛ³œõ08¨™o‡úøî8)&õ!ФoX–H'©\…g‰Í¾Þœ]1àAl«]évÑþêHkŒ’gjl¾¡röŠA}_=£ÝM_{ê‚síCò¬(ß2!)Z4VõÔ›%4?꽡ýصKµ)¬!¦$Š ,«©çK¾ÝuAŠöTíÑPÝ+_é¸BØSƒ«öBá•…/Û*½>å|â!zÒa|ùӌķÛÕ“lN:ö1_“ñ^”åÍKßEü;¨€Ô®ñ?;yõâòKÑÆ±”ylí¤‡ŒjXmVwÞÞ¢ïi  Äâߥîù˜÷OõÇú‡öËN¹ÏP¸Sl¢Z>¥ÁÄå¡/ø„íÈØ¼¿j6M¡ÿÝýq­5ø¡@V“¨Uñ|Š·'k;ÒÌ·‚öĈ¥"ÝlÉMØù{1ƒRÖ—¢˜ Ÿ`Æßê‹«™4.Õù`3›¼x«56ν9=8o¶ö·½ðŽS<= ”¹ÓþO B»ô#šøk±-ÚÚ|!Ššéê†b\fÒFŠ–~f`>ø*kwØÆŸôï¥UÚm·ç/léèa²'ƒwþììP!+ñøãa!Eú-ˆRFŒ(-.«¤@ZO1¢º¸¬ÄW\íSüåUÅ…w–/þAq‘‹{Œà‚v~Žp)KGŽJK6.}ÌÈôÑcF Å “Èŵ¤¢¨xhÒi¹óræÎê®à³”êR¤\4T™ž3{¶gZN÷9¥Å®Iw\+NJ½ãÚ”qC]‹Ë©€òÂâjWÙâ%‹}®ªbø"-éšTà*­*.™<°Ô竜šZXQ^Ræ/&Ò‘wûî¨* ”pRšZ´¸º²¬`EjnvŽ';g^j./àš\™ó5yÈyàµÓ+ªŠ]Ež‚ÅeÕ#'¥\ÛÝÄ[¡¿ªª¸Ü†GvvQð·¸Ú嫨p•U,û'°x32þVýåw—W,+w-)®®.¸³˜:«HaÎ8~`’x«*W\ÌgGèSÛ-¤nàR¦Ü”㙓£LñzfLËQfÏñÌ™­dçäåÙ9sºó@©ª¨ðQÑì£).þ¹Ñâò;]ˆ^œae?Yš*b[$Z\^éç‘“Êýee×*9ósç(ÅËË+Ãß4s&±Pá÷¹*J¨VK*ªV„¤²šd6 ÊY~Š¿²¨À'‹¯v¥ ‹& .î*/^6²5wÆÍž9S¼9øàªû îf89ë=øªàJ5˜#©¼ÅåK Ê…jË{žUôêÁÕW£÷ýåEÅU4ü$*•‹ËEÌWõÝ‹++‰Ù.‰H,|…p‰*ip-.(ã"Ö5eA9u©ëŽbÏZ¹HXœÏu¥û S™½üÏ.^“;Ë©WHT–*°¥T¯¨.¡Î[VP©”ø«‹Ù¿;ÊîV z¤2uöŒ™sr§ææÜ”Ÿ7sZ~^μœ<¢…ú˜åJªšê‘Ë?*»ÁGV”Ã~gUÁWIE¯z“º—䦲¢Šõ-Î3TÑb¦®j_•¿Ðç§Ñ@ª†Šà'›«Gvïn(Ôï[ŒOЪ]©.U]%…„ð­€`ñ#Ì)£‡kbèPÏUû ÊÊV UѤ%ÔE4r\©K ªR‰<ùŒ¤#»Ï+®º£¢™QÓ8ð—@.]\à ×T®âò¥‹«*ÊaÆE¹-†D §ž®®^L¿Ej¡ÚUPEbÆFïp6b‡»Dw±Ñ<œX/™H%þ2¦jDÅTZˆ=ʼnãR4:²ªÊÏ&wWÏÅxt¥òp¨•’mµNèJ!ÅÊÚ‘TvµçjÓ,PMíÊ1,åpÌÞe®.¥ø™«p&¦$„¢Ñ„é:©©%Õ©¢¦©K –ãÛ‹*^Ýb|ûP~µÐu¬ªƒ^v•TU,ŠÙ¸s‰5Ð;»ƒAØ¥óuƒ‹(ÜO!¾y2Ù¹[é°]o·¯߆ãlK#¥›ÅŒ;¦&Äßà¼Äg_®\×wâ°Qî8Ew<åU€L< Žú(OBü¢§$$®¶{’jcf$¤Ey’<- ‰žÖ„xÏŽ‡ç;d¯DzJÎÞÆÅëâuñºx]¼.^¯ï¾×ÙGøKù:¡îTíØ0µÿÎî€õ|ï ‹x†o¤ã î'`Ø2}~•Ý'×óëí<¢ÝC0ÎU|c ù–þ˜«6;;‘ï¯þ„SÖØq¬MI¤}Ÿª„ü þ`ÓØáÝðŒÙÃXtúî ßÏËß±÷Û}èB÷Xº§Ò=ҽšî‡é~Šît·Òý.Ý_ÒÝIwl€ÒÓ=„î±tO¥{Ý%t/¥{5ÝÓýÝén¥û]º¿¤»“îØµ”žî!t¥{*Ýóè.¡{)Ý«é~˜î§èÞHw+ÝïÒý%ÝtÇRÿõ¡{ÝcBõÂë £‘ÑÔ¼ÅåU®Œ‘ãB¾ˆÓ‡rø[m²5k¥°9ê¹>w„¯àÎ®ÒØ[«Õþ(RäTU¬à)äïÿ!K¤ AÈ0³÷`S„w?~ÉϪ)!»¤Ì.ƒÍl?IšMK7Э!:¬¥Ýaè`ÏAÚŘ{ÞÆ}<ÇèpÏPBöD1÷àø†ðñmSBvà?OÚ ÅØÃǬµ·+!û s3â¸M@Y®ô ¿¨Ò(ÆjÑá#Fc¹¸~ „ü»b¬':øX7Ö‚\k ƒnHqpºxÝZÅàß•t×În¼í­í÷#Ý¢;Bt³ †÷íO t° ’EÊp»ËL‡ët¥}¤Ù/‚,÷—JH^\Dç"º³Í%ó{Ê@ÇìtŒ //貈.‹èÃÐmU¸íOT‘Ùí¸.¼_Ô?*ÜÏ è Ûã#н«„ì<âøÄt*!{–Ì^Éu![%’ÕßoÈß`Ÿ “îvæl ? CwÌ@÷Ñ}”ÕÕÿ,®SŠÁÞ$ÞË]vJHð]"<¯˜íJ‚n˜ºäœiµÙËCu 3ŽdŸÉkçT*«;÷ÇêQ"ûcÕhõ7È‹!ë.ô‘¢„ü±–ê0/yóž×aÞ:{t˜FèóÞ“s®ôÇڤÜAŒgs#n):̱a|r˜‹;¢Ã¼§²$Ì­¨c\q˜Cué07NŠqÂa>вt˜;ïrüEÂÜÒZ¼s¨Ã|ä&é0_±œÓaáµMÂÜŠúG:,¬y¾-á®þXý&ý«Êòáï)jDý£¨þxÖ·ÁCFŽà›)d_±²ô—+%†úÁþ ìÁ`'éfhØ]ÜdáöNðÍ#†èñM\š°ïüa§µæa;Ô‹ÿùÿÔîø‹€q.p¸~‘R ü¡öý[1œ¾‡Í\þe°µð»ã…(?€àI†ü†œÅ Ù û+8¬Âã“•ëX|Œ^>Mcg>]ÆÔû~ewÜ-êW@á†õ¤ŸDyÀgÊ[Fp¦þ¡…ßÕã]©âàñÖþÅÔo¾,Û»'³cìoÅBÿ¬-Ô°À‚ï;“túK•í¶Pÿ!ö-¤<ÚHþ_[Ããy‚×?GkJ; ʇ٣!¸‰ú3GÄÃ?좿SÀc-ôS-þXï ¸²·O¯¨Êò¨ÐxpQÔZÒ?dCð¾§ìŽ¡¢¼—žõ­m~ÕBÿ' ü±þš`M”ŸHåc‰‡íŽ ¿°;îù'E›ã‡œõ¬Ýq£à'=:¤z‘þGpÚc|oƒø<‚×ýUž‡ô¿µ;¦ ¸Ø’ÿr |¿~ÔÿηXàw-p‡>oífx =Ô_h¯T‚7âg»%~>b£bÌpÁm4þ/ùõ³Ä'¦ D|.â önµÐ/³À÷[àŸÜDò1Lä÷kKüËøOx¯>FpöéÑ_—+'-ñ½cÍðØÐ|ŠòGX⯋åó©lÿ©!~¯ô³bÍöŸî 8â"~I¬q¼]®¬@y4ßÌ‹åñ÷YÊû‚Ûž±;f‹ôðm½äm€ŸµÐoµÀo¼ˆèÓý‡–øƒ7R¼KÄwâëg¦¿’à¬Çø3 ÐÇ~åI»cU‡¯ Õò;#Μ_©%¿{,ðO-ð3xs\h=ÿÛM–ø·-ðø”îN9eÑx¹UÔÇlÖ`뵨XžHÈ÷-É/,«(/®V ¾Ë&ìØÑ£Ç‡'ÊmÃóik]µÂb,Öå‡vï‚t ·+ßÙÁh×…w+ewæ—/-.Sø[X…¿úÎg¯'Ù! vª¢$/sGÞÁ=çó‘å2¢¥çÌrȇ=-YhI‘ÂŽ©äËc4w(x#ÉhtsdË Êî·§mþ1¿o(ù ¯ÕY5ˆÕ|n«+²Y\S#™ìÚ†b„Y×6r™Á¯Âj?7fËSðƒ(ùìaGW—Úâ…>ǘ_HUõ³·¾&gÖ¹s¦ç‡$fÎô)Ž9Hëca\…£4ÁkWߨÜœÃì‘勆ç­Ç,’™9…É5S>0èfâ“Û£íêé›5 ÌžŸº1¦ã U ût¼åª‹uòì ªŠJequ~eÎ7å3#o›‰5f¾ÍˆáæÝ¬^ËÍNËu;rF¤0!gò7ŽŽ›–3b„m–ØÃHÆl8tUb2­ÌMó™$ÂêD^ O41]Æ£¼°‘hÄ cˆæ1Ýa±chirË@½Ï š"J*óK— V©m…)Ä®]UÍ<Ì O3{ƒºõ® š†Zº¼X·Mh`‹4¢¸„VJsŒ]£Àe8ûÞÂÒ£eÄä”=ŽP6ÌÉŠÉÏ'u'u4ô`X-( Y†9UXLoû*ÊLâam\ì,š,M7iĉ“.&².ãÜ4,­æóÁÿÚë»ìÍøï—ñíö¿Ç¥Ëmµÿ1nôEûßÿŠ ö¿£Lö¿¯åöD{g18KFÌ¥ÉR2•nô_Ú1Ðe)Y¦Púk“¡|t‹í8öR™â¹DfT–)”~²dh|nlv¥“e íSS(Ÿ`Ëw‰386qÆ"Søšx>àÒÄñtÒFwŠH—"èeØ&ÈÛ,õ“ÏáçˆúÍõ’a¶ Ë6Ðã‚mrü~s‡ßœ”e %{2”é`³<Œk ˆ—äó&Q^¤v±úÿ“­çc3t+ç#hí;bl7v.ŸÝƒöï±užÚZõú«o|p¼û¡·k"Ðÿ—彸¼–E ?Ÿ¡ÜÁð·Eȧ8}¯ôG#à/‰€ÿ^„ü¿Š@_üð #äß7ýèm‘ä?B>"Ðû"à¯Ïðôðsˆçm7.b°Ôçw ü Þ`þ¢úÿ_ ‡ÿ!«Ýùäû|±›pö°”v=æåè0vçíÌ/FÈî|4ó·Øßwq7”´[®grùÄÜ~•A®¥ à2àç R x㹂4Þxî"Ó€7®;³ xãºËkÀ]“Í2àõæðF|‹ øî|©ot1WiÀÏy,7à{ð5¼Ñ'îÞiÀ7ðÆE×#|O~½oÔ_OðÆsb xãÛàMü¥|“ßÇ€ßiÀ_fÀ·ðF°{ xã)…}¼ÑŽfÀ_aÀ1à>~OðWðÊ!¼Qþ|>Ñ€wðÉüÞeÀý¦ðÆsai¼ñœU¦?Ø€Ï2à‡ð^þj~–ŸbÀÏ7à>kðÆsF¥ü5|¥?Ü€_nÀ0àk ø‘üÞès¦Ñ€7>+xÄ€O7à×ð£ ø§ øÑüÞøÈÅ[{Ðá ÄLÏr)^æÎŽ:¼µÛâ íà˜ë)*88›þã{ôà`ÀFC5 £3kÚÜŸÃ0ÀP…ŸÃ@Àì¨÷çÐ0TŸðçÐ 0³>Áý9t ¶…?‡(ÀÌ÷çpæ:‚¡Ú„?‡c€¡Ò„?‡€¡Ê„?‡ÏC… †êþv†ÊþþªJøsx0óWÁý9lÜSÑý9¼¸—¢ûsxpoE÷çð+ÀIŠîÏá?_ªèþ~¸¢ûs¸ðeŠîÏáÿfþ1¸?‡¾\Ñý9Tî«èþî|…¢ûs¸p?E÷çp+à+ÝŸÃM€¯Rt7î¯èþ®ìRtPt£TtÃRt»ÝŸC_ÀƒÝŸC/ÀCÝŸCwÀW+º?‡(ÀÌÿ÷çpæZ‚‡*º?‡c€‡)º?‡€¯QtŸ®èþ>·+O=¹ƒgó`ÊBm¦šü'¢Ô“雙ɔÕu“tÉð†óJ~Ì/è?óQ×ä‹Û:(uÜÚÊàâÀ˜|‘lÞ¥œX°‹ùsØÆLæ~A «ÆÜ>‰«ùe”l`³7[¶mÑÄv‘gjÆR<•°˜ù¾Ð6°D-Û˜›…ÙçÐfoxÕÃ[ÜmXßäïL,Uf3CçÙ^¯úµö6K¾W»Åoíë¨Q¶Íà,/¥ª´ÃžñýÂDjŸ—ਡ…bWžM(^mm¾Ð¿ùë¾¶VõèªO›€ù¸ù|ÿæC}m«‡›ƒ±êëCÿ¸ê ñþÐv“Ü¿~±æíÜ¿î˃ ¸¼Â¯ÆïqNßléÅæ ±ÞÂVæÁ³õÖ±Ô‚ƒ˜k­«ÇB¨> Âó¹3£}—mÌÃXŒÜ¦W õ½Ô‹ó½êÉsǽÏÍèV¶¾æÂ¼ÌïÆ§ïNß•ß Ú‡Ì©ÇŠË´^0›Y´û~Þ>˜:Œ—õ”%·pjȸž2vÖï°±û?­ˆf€œtßZw lœ_Š_AñÙêÍÆÚÿÚ{ÊŠ;¼… ,G{ƒ-¬wiytÃÓƒv3ãÉ?Ù¸—¤G[#²9´,˜Ëenë䱬ײˆËmŸŽaCPû›&€§bXÉÁñ.ÅÜ¡í éÊ3~‡sm9”Á+¤Í(ò©-ìËDŠ]žzÌëÌù+óˆ²u/`/1–¾Û Ã^ðC1U0ãõ473öK¬r GÖ» … rž¹³a™¾ L¾ï§ÆÈUwL¯§±v,×™óž©à|h:¬ðáÁçþ8¸VÀ¹÷IƒüqžšÚßyjP{ë$÷­0ÀÛ¼Ïå}…­èòÚv’²uyj&Å¥úc<­ö8Ô©§Ä`hÕ¶÷aÊÒY7ÌNº¨Ìc$M[¤Û…‡hÔwT`´\CMÙñ‹`þ¶.ç,b=Ö1][{Z¨9ŠÉîëÿâG4z½yŸ]Á“á{À=-¾ÎµŒ%mN'ë”é™Ô6kúÈvó7Q’ö^¬3G!êcŠâùÍ£‘« hÚó*›~ð Éã[ô‹&[¦Užù ^pòí&?:Ö¥36Û˜=þNP­ÚŽVCƒ³æ.idí9{–zN^$n„‰CEÛÚxî;Ï m[?ã¬G¨¸ö牰ö,-b¢XyµgÏ;ëðe_X>0“óõ}JbçI´~Tö×mXœ@¿ÀDz<•Múó&'øiõ@ivËS¿ñßè°7Ò<µƒ—~åXŒÓc”ÛÆSÒ7Å$6­ù܉ÓÕ¯¶1“¦gz°|˜@]Å—àc°ZÜÊ=¦`ÒßêÞ\õãlõKÖj¾xw÷ä “oÍa,òzöd†83sy弬vCøBG»ö0ÛXñ!®µõB¼Ž1y¸×$î„ó©ù;ð¡X1nw®- b8|ì¥Es"¦€ƒQÆè¹›àPàÃéê¹—Ôž=笯e¶I·aÞÔ6 |ɤ.t°´ß~ˆ^dŸNnI%}¢~Ý‘ƒù€Êâå'÷šr;ÆòZºŒµÌ:Éûpþ×P‘çH×A*Ä‹Á'g€º3ø†7Àj[<÷=†ý|®úɶ£\|–Ÿ†H¥­gæ¹oHÿ0Ô„§VšÚƒ-Ý·å±åÝ×”&û´”Á Ãa%¶aÁä4/ž9Iz}Û^^BQµ=ãaml.ý#{°ñÑ‘¤±º,¦¬²×!5›lXÍ‘þŸ;{–æ€c‡˜3#\Äíò\׬šÀ§íJ¹­f’Tg²‡nô-DÀ_Ûqza'v3SòÀÃCÌg”_ÇRíø!H!_ø®8W•ä²öMškÏ'sg$éAæÏ¢ýq6~;°ÒîùZÎxO›Á‰—iøŸPÊŽ«xÔ&Ex¬ÏÀÙgHéÔj÷}yÛ6N`$7I`²‡¢´×âÙÆy2ýþƒ ûÝS»`”{‡e¯ƒpêÐF?¹S‡5{ؤµÐlßÖ«N>M$ºª@̯†›ÏV|„¯óî´Õ\·2Ï™óU–ó¡7б9|öUO{›?uyÙ³¹i˜ãvˆÝˆ=Õù ßîåѯ<ÈÔï÷´Ÿ@Óykƒ)ÎaQGé]‰ÌŽ×ùÄ)gíOоI‰ûݶ>àÍ:Qzbhwp¨î 79i‡&+¤Ó|Ý'㬔gÍ!ÿ(çÆÏй…{·¹nZhE¬íj[kP<ÎS÷¦wÒÒCÃöŽi|0¾ÊKDÿ®:†37Ät”o€VPöº‰¹_¾h½ôˆbÚ™HûÛzûÒèÏõ½\õ„G=Ÿ~HÄc”8àßá{gÒoÒ„›»I½¨ý…8g5ÁæY}]« 8ø Å.>(fN$1ãñЉÄg 3^ýsjÛœº`¶ÚᬋÂ,*–Þ«Òrê#zk/úéÒãõÒfknê,üÜÓZçF’To`’[{ù@HÝÁ9Q°Å£îN›œDb^Ÿ×ÜÛËî_Qsooæß!Iñ-¡ÿÌ¿Ã¥Š¯€Ö?µoô†NƒÔRßÖ²g I$Ig\LÓ}­%jl ”> ϾÖn¤Áœm;Ëö·›¹ŒÕ… †–Ú³œëÖ±¥-üc„Ø­‡~ok¬ªrYÇû¨ý1¸{8ówL’´,ew÷°³ú*Þ¾µ²}©qÿpT6n‡Gý‹æ; â?B‘0:æìáòlõ0sè©á ¯³ qwÕ*›ö²&VôñÉè;º•X÷¯µÓ£¢5 åO[¦t =|Àá§À%y …ý8ßý&2ÍU÷Cgh˜ül )·¸‡‡«×hQ_1}ö\»p»uôDì¸óÔOsUlË_?‚Ö¿'Q[̽:Œ€Ì*ÀP_\ÇÕl·@&­8orRÚ4Mâ¾öxj.ÐÔí Lq€ÌCË›KØó&`0a-OÔz2Ò{3"BP¶ø*Ì;~ÿý.}7óÁ8zÀ¸ˆû’ Fr kŠôÝrÚþuœa³j}LëõÀä'¯vÑ,[µHÙ ‘Óz|kà’?ÖMŒb»0_{?^…¾Ív;è·›~3? ïØ„Ÿx¯ñ^F–ÄR=e¯=ÇVzÓë÷;ë`ÇÃø)¢s/#9-§7¬t÷ËÆcFlŸ<«à\%+G=âiÖ„äu’–™®ž†þ£¥FMóÉž†›·°Mh¶ Ú18VxÌáò÷¸zG‘õy"Ó¨Ÿòyæ0Í]í}¡v¦$2úܹjLÍkØäbܵù_ðñÓð*Æ7/%ÖP‰SÊFؼ˜'‡°'»yXõø<¼jŒ·`[–‚`íÂŒùbœ-Å—là¦ïÒöÓ¦!+ísÃð#iV”ïž\¶–:ͽ¾Þw·¡>,Š$åA»_oáìdoCu?®änØÏf^Œ’$òÙh&‘­îÀD’ÕçH«‹LH´®´[ü£â!¨#·!;.1¯ð”7`wçâ¹b'éø¬—l)Ú›Ÿ³Qãÿ’±Ï5À}õ°¶ñ£‰2kÖemÃôý,’EƒÑvA_ŒöKҼɉ×—ÇÎo¿–xŸoòÿŸ·ÐÜŒ/s™ ùß !¦Ên†Íû…ðh³æ%E>›Ø"µ’ÚN|udæ+7{rƒNRuÀÝCv Ú[ÛÒÏ3^sÖß"y²¦LÝÏwgï2‘y‘yDÆø»y?ÛCz2ܼͧ‚6¾d öÞléݪýœ§~Ú&Ÿždæ$áºév⫽šâ5ßgԮɵgá¯álg½ÍNZ/¤vz¬fÝ”’Ouã‰2·&ê´«öËÕ <6¡ÜÓÏÓ0 Ìk´åS(ß{’ÕkòÔj‡wÇvö¬Ï LMÄ‚«7ßÖ B¶*CùŠh1‰Í¬SžCmùóAhK¬/VD‹m"œíòŠ.œ¤WëoZ<µ7è‘o[óö|Šï¨4­ó°ÞêXH ÏjÔ\{¶Ÿ?“¯Už0LJW›kî4elI¦_6þFåZðWðœéàÏj óЀgª-ñÈŠ«‹a“Œý4=§ùÃÑà I'žΛ­žç»¢õŸ±ÖÏIïİî-üf{Å´çSà£ÑrNõîxáƒ6(x)§ß‡ÍÃâ`aK#Æ…=0Íg пây#I¾W=K:9O Üí˜xw¼€70ÑvˆŠñ6­U}Æ^ù®¢"¨4¢éˆö¢¦ÛÔï9¼…oå©;Ùƒ¦S†GtéM(±O`¦£~×}Îà.u&Ñ6{NûÍ-%ŒŸ+ë;—_>~Yü}IÞ@œ·ðÏ^5içøeŽÆ[ÕeŽ‹¤èM)œDr_w¼™±ùh6Uu艇=×íe[ƒÛÚÇÒÛX}ye/@"gzSáS(Ÿ_Ë $Ð*â}ÒM ~Bk "ò[h7¶ß³c*oÙÀµÚþOØ[>QÕö¿}¢?™4ók(/ó;Ë{ |y2cCI‘hØg‰‰y…ç™H`6y}¯.WÜÐtžïVhÓ¦%ïeƒÔ¡KÈe¬2G ýzÿ¤¾ÃÛüõÈÏNþ.0xëwù¨ÍÇy _÷ÖNjUüÎŽXü&Œßš«îÌS›¤ÿŒ]H›¤§íÎè(q|³WÝÙÒhê¯>ýµúccɶ´ªe+ž®B#¼Gü²*ÓÊüŸäžÆx¶‚ŒÑjÇ‘—å¥N³·ù´«æÄÃ;Ã*üPBÇþ˜5/ چ٦̋¥-miÎh3ᲂ´cý._l,8¿Íl¹ãÿâsL©™t-íÏšXÊùÈ«–¹÷ä©Eî}Þ†ïõu)y ƒwöÅ‹nšôËÜžöÉSWºiÜÌÌúMA` ù|t®ú·ôµ¡aàòõE{äaÙ™­=Á¤hV±yÇwøx hH«˜Ä¼@‘;9~¹ò>w ÖiT½LÉü7°3BâHÐE_ }5\ôÕpÑWÿÂW[Ñ\ô×pÑ_ÃE ý5ü?â¯öúpxõÄî`ßZe¿Kkc 3Þ LK<<‹z–˜ö(EÙNkçáÖÑÂ;0… (|ö`užø2|Âl-üˆÂ9ž °ˆÂxÚ'no§tž åJØH£}öƒf ·SøÎá`ððG‚Á$Ú>yŒè)¼µ§tQø$…u¾FዾCá;=…vÚháñE ³)t –Oa…u>JᓾHaR'åƒx OPx‚Â~±¿ËmWÄÇ9mq‰Àãðñ©w‚Aã¹ûðô¼­A¿üméç"qjBò ÎK–9j˜Ÿ‹Ñnöùδã[çÆ¿ƒÌÈ”'!ñú„äë\×'¤\ŸæIÈœ–°>º6nmlCÌ:ûÑ«ùW;8 ?¥ƒ3l–tž„´i 5Qµ±kõ$àO2ÖÐ"{¸‰ÞÃèk%êƒoiI`ëQ™–À>á^¶3I>Œß!_;,"ü ®·æ»Ö¾.ú(Ôå:H®Æ„­gv¬.ÕdmXDéÒöƒSßž„dO‚«–Ñ€¯:”ÿµŸ¥_ ×xiüÞ|¼hÃ÷äÁà-Öv“íÝfëÂÒ$úå$÷)QaÓy²ºò>ܰ¨™ù@ÿM"|)á'†é?cßÉòËè÷r8´_~ØöCùOÒoøàf߯P:Y>ƯFøMùQ¿MKØUkʆõÞiãòLE§G?Pÿr¹Á¸_CñÆï¬P&¼yÖ>_Q¾Uî`+qÑ¿û¾ˆðM„dÁC¯ì!ü<ôÌ>Â÷åÁÆ$~?Oxð…BN¥­ñoR|&饼0ñ¨ÇAŠ/¥ø;¿£Ðgˆn‚…¯á„ßCøþ<ôÞ¾Ã]ù]€×J„__èÇLÒŸ¹">ÔDßG)¾”âáº^¹a5IT D´DÍOpˆòa3±íÈE9¯‹×Åëâuñºx]¼.^¯‹—¼Ú„Ý· "”—ÍʽÏz'§“¶%¶æ°´¥ íˆÉ½‹Ü»J› É"¾Ÿ%¾´>Åó“¶7´8K›M"^ÚÈøD0(mcH[FÛ¸tÛÂ>ƒÜìÆ?äó¹—•¶$šºg™ðË,ùöŠPÚòåÃÂLA°lÏ#ní–¥ü+/iÇÎz½+úõKvŠ06‘‡}D8D„cE8U„óDX"Â¥"\-‡Eø”7аU„ïŠðKvŠ0¶§(_„CD8V„SE8O„%"\*ÂÕ"|X„O‰p£[Eø®¿a§c{‰òE8D„cE8U„óDX"Â¥"\-‡Eø”7аU„ïŠðKvŠ0Ö2.åõïäã¬@wrVðoâå,òeô†+dÇ’Ãý,ô6 lô‹†+d'’Ã. ½Ýý¥áò‰ô>p[è­éñLVúQÃ%õí#!mµHýku2hô¯†«I¤o’éEBé÷L¦—zÑèw —ÔïšP°ŸXÌÚ~Fl¸¤þl ¸Ü”%4úiÃ%õs¦˜P²”ðüË þÛì†üä|°\¤—óµýdýë,éåüÒ$ÒËùHúy³¦_§md†æãõÂx“Ñv‘¢tíÕ’¾I¤oé>áp%ZÂ-é¥ÝØDaÜéEWøôòúOKz¹~Ø.Þ0v³Ð[ù_¯˜Ç_›Hß&ÒŸµt˜µü§-éCöV9<Ü"pÖò7ZÒŸšœ%BÇ›Õv‘Ÿ&%ä—Žñ§Û_ Oo…aˆ@ú«Ã%×SÉgú=ŠÁŸ].‘Þõw¦ÿX ù·Ã²ËaiWö¯L/ûáKKùÒ.Ü©™ß^¾ ;,éåzŽ9[¤k“¥ÿ¬éOXÒov˜6ÝÈa³gª®üœQ þó”ýº7EúE)f¬òTÌ~õä%Ó³à­ëp«¿=yuŠôŽïПFÙ5^5·ŠBH¿|Výcõϧ§_ÌÃBKƒYËÿ¶ å|jÆGéó¤­Ïf¼]Ÿ×Ìø}¾2ãcõyÈŒ »>‡¿?9o˜ñÝôùÀŒï®ëy3þ]›ññº^6ã{èúÖŒOÐõ¨ïÔõ£Ÿ¨ë=3¾§®ÏÌø^ºž2ã{ëúÇŒOÒõŠiØýü J=`Æ_ß&|²>nÍø}T3Þ:+JŸ¬GƒV|¼ÂýÓYùÇþ~ò²,í?Rà+-xÀ[÷Õ7+Ü_Þ>Á§% ÷[hmÏ‘O›%ŸŸ)Ü¡µ_6E¨×6‘Œ á’ó\›àç”àGÎwúÆ~Yzz\ŸJü•¿Cà¿ù±Ø¡=!𚥾øÁø¹Šç³PÌ›ð‹ŽÿË}ÛpNÿ Pbøºù'Þd.w˜À»ªdûð’3lÜ_âNK}¯Óé L|Δx‘¿\ Ï—ü¤p~&Šß8„ãSŸw‹|”›Ìå.x‡…ÿFh‡Õ‚>Mð)D’çF÷¿¨LÉ2ái /çJ„|žeõëÕE>_µqÿŒÖq½]Ð[åó=÷×h×ðß¿]MB_É9ê¼-¼=äžQáñîø±Â¯YZ:Ï?Oà½èFÀû"àïùÏãBž%ù‰À׈rïøÇ"ä³%~wüWQáí‡GG‡·}Y4÷OiÕŸ£…_:1¾ä>2MàÓsü-BÎÇF‡çÇÞõmè+¢¹ÿÅ7-ü,@¿à§içgŠàç§èŸôm©œ>_à_fø®óæ–ù¼ÿ…È?Q´¬ï™ôðC?È.Ú9ç#ÏŠŒˆ@ïôûFqú\Ÿ¾(~Y|Cüúøð;#࿊€?ŸÃåÄ*·WĈq'ÚA>I‰ ŸÏ$AŸØ—ÓÏò“~^LøñU~E ÷—ØdásuúÿŒáþ'å:MÎ Ï>×§™ëµ1B>Ž€ÿLäÓ$æ)ùû@ú ð½c#øYþ.ÓÿªÀgF Ï‹€_oüƒðÏ ~f‰v“g«^Šå~:Ó~P`¢ß,è­ëêf¯ùÈ÷ŠPî>Aß$ôŒ|_Ò!ʵ귓‚öEq9Ćù\„ü{ÆqúJ‘¿Ø.+WI¼ÿ%Ÿ"ðGļ#Ïlø4A/ÏlMŠ _î̸ðò_~Eüºø'?.¡?¥|¾ ð‰Ã8^ ‚òù(Ž;ëú_‹À”#‚ø †ïº_›~†CȃŸBñ?î—t\zæE¿¤ÿoú%µzª„+áÝÓˆ2;¦«CÓ.AÆí Ð]ýHò‚Ã8@ì?IºxPÔ‘F€@~›ãT«+EÐ\q†s‰jöÈK5¹¥ÊêV”ñÞ1*¢L®Q»x µºÑ;ªÅ¥&ˆ¬ÎsἨvumÉúºkÕBîV­þ1Ûf¬V¿Ÿz‡Au© Å“$k°.Î65ûÅåt}ˆ²œÍj ÏŒ<—H>X­{A-ý°š¦ò|LîS¬^&EQÿgV“'ÖH^W­ŽC—åÒIŒÙÛ.gÂâ0W6n—®±ºaµú¯elq'Ì¥ú[¼³†q³+Ä5:ä§•«?ÞK!—¨]¼ì†…÷ŠÚÅ9l(A¯¨!w§!ï¦O²¬™Â8<íêP”]¼ ÙÅ7ªÐ#ßíÕêç˜÷Ùßé1ÕâEØØoᜦr °úQî2/ü]¾MÃûÿvdué·'ý»/8ù7®1ÓÇI3†â3þ?Ó2ÆŽ›6füŽ=æ_ìÿÓ·¸ü[é¾+þßÔÿ砬ëK»ww§ÖÁ·.wÚÐÔ» –Œ()¸»Ø5¢ ª°ÔµxlæØîÝ¿;Ë׿Õaü—WãËÚ’ øvÿ¿ii£Œþ30þG¥g\ôÿû¯¸BãP÷A®ÿW%4ù_A+š´]BŒðÁ0ÿŽ{䣌îÝ‹—c+éÊΙꙛ7'ÖM3oÈ™B¡gŽwò@wJå²¢¡»w'ò¯Ï‘ï9=‡Ð÷¤ Nvï@J\\èè6ÆÊin d”â³þïÒqáÇ¿®üÿ)e|çü?*ƒÆÿè±c2ÒÓ3Øø3*#ýâüÿ¯¸ ó?[OºÆ¦ý﯋×Åëâõ¿ôúÿеýÞx././@LongLink0000644000000000000000000000016000000000000007770 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/download.jetbrains.com/idea/idea-ultimate-fake.tar.gz.sha256ubuntu-make-18.09+disco1/tests/data/server-content/download.jetbrains.com/idea/idea-ultimate-fake.ta0000644000000000000000000000013413352651520030311 0ustar df9ed78b02052a54a14dbbfc65222b3bf5bfac1aa283a72e77f671ecc90f81f0 idea-ultimate-fake.tar.gz ubuntu-make-18.09+disco1/tests/data/server-content/download.jetbrains.com/phpstorm/0000755000000000000000000000000013352651520025307 5ustar ././@LongLink0000644000000000000000000000015000000000000007767 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/download.jetbrains.com/phpstorm/PhpStorm-fake.tar.gzubuntu-make-18.09+disco1/tests/data/server-content/download.jetbrains.com/phpstorm/PhpStorm-fake.tar0000644000000000000000000010212313352651520030476 0ustar ‹„r¨XPhpStorm-fake.tarìüsmÑ.ž²íºeÛ¶}˶y˶Í[¶mÛ¶mÛvÍý½yÓÝ1=ý:&æõ›è™Îˆ}2cí+sí\ùå·þ9òævJN¶Ö´ŒÌœtìÌLô†6ô–.´¦V&€ÿ.ÂÀÀÀÎÂBðO3²³2ü/õ&F&f6VFFF‚¯YX˜ ÿ}Üÿ·ÅÙÑÉÀá_(ÆÆ¶FVŽÿ[óþ÷ÞÿßwBð?éÿ“1áɸ£94´ã;6èÿoÇôÉÿ8‘ÿ®ÿÿ|ü§þÙYÿõÿ¯^™XØؘY™ÿÕ?+#;€€õÿ€XþWòÿçõÿ¿ÊÿÐÀÎÜÎñ?ƒtŽæÿ=|ü'ÿ¬ÿü³°0þ'ÿlÌ,,ÿZ+##Ûÿ…ÿÿ#äÆbhbÚÿòoÿÇ©"ø‰ øÏvr¶#p4r°°s¢ûïçš„ÂØÂÁÆÀÚ„€„òæ-Ð&NÎ6F¶Æ&¼$üÐZ$ÿó­‰=# 3Á7ÿÏLh7 §ÿiîÆ ÿ½þ¿¬ÿÿÎ>þß–ÿð?VvÖÿ ÿÿGÈÿílÌþ;øøÏacaùþOâÿ—úŸÅðèüûaab`f`ûÏ8#;;ÓÿhþofðÇâ‰íÿæ¼ÿ½÷ÿõ ÿOúÿ$./+ý˜ƒ“”Q€ÿy Áÿ)m‡RS”ÄBXX^RX˜@ÞÁÖôßG8‚Uvl7”QùÂm Ñù ÔÅC#†jT”´Ú~aW ƒK&]I¡­R‘r±‡—ý‚Ø8k.—óôgÿXAà!„7ô\{îm”T ¥*—”ð<D $»SÙëp1$WÔ~zŸàÜá<á>ÑÝáÕ³hJÇR K®¨Îš!IJ(AOÌþ1ß°( ²Xq&Kûwb ™®íeúb7râêïõ·ì3qGäæ\8‘\¯ ®7Ö+¬Âä¢U³4jÄÇ«E øæÎí(ppŠw&²ÛÜ9¯,!?TÌ,ÕZd'8Oçª)}‹æhžŠÍ¯v"Ó¿ Uñ3{ô±ö-Œ?tΗ:ê™EmF­áÛÔÏÊÝáü+M8·Òµz5m’¾`¯±ïó^Ànø eñÞNÛ'âzzU¨ÛàÛ`žsv%0¿?,=q0ëæžH/RG‰9VœÍ 1ünT_WNÿ–Ž*YììöIy—§é¥Û«mM4h¦MÇ÷”LúAøñ7Vu–‚MÍs±3ç£ßK«YÙT— ®W§k(À|1¥qëÆŽRZw$õ'âOÀ·»äaM K Ï‘ùV™z˜!­¯‚udc¬ÇålÍ_:cº¯òwrуãlè,*6ôŠŸŠˆË¢Ó.•IqÊg3%v‰±ñ2L0ÉÍ#ÿÙrçŒ= ŠªÇè¢ÍW(⩱ë«SçWZúÄ7l¸døe†RX˾šq )ÝÇÕí`Í…FµàMñôÐ)笌Î%+ÿ)àM¦0½vƒý>û’^+MýH,7ËÈ¢u…BbîÌ>ÏWbeÅ Ï3Þñ:}Õmeåôiÿ½i=ÂVk3ÜÜÿºZSGûi­Ì­ï‘œ7~ëÒåFŒË« ´@ wa»«1»®¸^WPtþæ?KLÖÇ?Ê79ß¶7[þÿ]fSªWб¸Ãm„Å]LâMåMýEáMîMÿ%á¤ÑNôE¢“Ôý—Œ³ã¦+‡tÕ³FÏe+BÇ|É*‡•\IvÜóã(ñ³ó³žçW-j›^BÉa×í%Ôóìn¦tƒåï&OÚ;PLRð,ð•aå¡  'tœ„bE¶ÑáÕGâíÌ£ä7®ìr‰ð›H¹Á‘}fà–ìÎWÝW²Úb§ï.®]kÒQæý,.{UÑGh§ŒÙ)ðø|É —e¶q4µµšòJ(¯ñV&%ñP´)´™# 6×Ö®þÈ’î@¢˜SÁínQ—-Xëk-‘П~î Us­Rï+ħìõ[Y¯cæüHˆ§ö®ý“‰Cð¿J\µ;¸gÒû[N-sn~/*3ä"ÜøìØ?ÕìØÜzD?ès&ü{·?¿¨QþÁ”„Æ¿> ƒòŸž‰ $E•Ý€.» :IE“øu½& ÀC B‚©€ äçT65@¨Î©Ž[?´4žGÊ3¢r––r:vËvÊ©)êI|¹â•02±R3&n¶n^”Õv®»·^¶ºé§eV<½;:ʧ˔JÎ3¹Ð6ê­µHéöúý‰@ʈ™7$«QàIp Áâƒ@ÄþYv >ñOA áÀçÿ™™úÏâ€áóè÷"q&ØëEšügáôçóî äâ¹âìv!ÿY1»ýrõÙv I\ ;PÇ–¸Ý¹†G…_á?_œÿ,âÖÛ„Jr TEdxœ¾V/’ö«äò¿p  Ê@  bôÿY»tŸ$Pÿ%<ÿÿÃ;†œöŒ"éi[ÿcyýÝT´&.‘L½Ö¸èÛùrSíöšƒ ¶{"~ï‚é ¯$½’B³Áw¤WÆÿXšÝS©R¸+}oQ« +Õo ïusÍ_7~Þ³pÖø¾ÓY:O›ê"–÷Gß)Ëëúó5Þ¼HGÅùpÕ³ÚQ….a´¸/‹ì"ḠQsÅÓ§X–‘¾â} ›dc£4N‡;ï^.êµS<"òŠd6¨úœtƒ)úN­hâH­Çyý®8iY£¼(øh»ù:ç9w*?fã/@ҽܩ°ùÚ-Bžj¾tíyˆÉÞ‰¸Z("™&ñW´<Õ£5Éjt;²8¥æwVoù<2ÔÝzÿvL„ƒXøÁ'øä¯légôóàLä6æ°{°âÞÚë)+«Õyú2S¡Jà66•+­º~_²\qœ¡ÔÒhé|¨Îf¯Àñ CÌ9€d9î}Ñ]°7)úAÊݾ]êP†ô µêéѯøø~ÑZ¬6ËWG8q´öÍ» ¬{Bcˆ¦vÒä¯Ý©Q,Ã~ÕÒ{ïž)M^ÉÝÑã=U£ƒ§R¡æ ¯³bß­µ®Ííkž°¼rå¯b«òÆLÔК/¿m·²Ý‰r ©!yf9àd}´­ T£áz3vÞ¬Øùµ~Ÿó5ŽÇÇáíHxå-ÖÉ’/ÁV*nû†ðôè+ÂWéÓñ§ëûÜÜ…%¾Lˆ¥¿ ÔtÝ~·xÅEÇzíüÜIIVç±-CËíaAGÁ…þ¨0Äïì .Ð (>à–üáJeeZñ\v²ü©À+º×¢Œâëû\íéo8ûoÑñ6P›u»ÝbêöØ`•ÏßAíû!7¥ÊÌè ­ß=› H@ ‹]| øBzØ«—ÝY­7Jk°L¾ïΖW5x…·J±Þû:®/Û|ÉÿªF½5¥W–ÂÇ!)Iµhß/.†¹Ú«âœëú¤XÑn¯‡ÉÉGqæ¶<°~\"§*Б2öz¨ªý5Äí´—:ÕÆ&‰>D³­Âö³´Q ñ·ÜƳ€15I$Ëóòæ½²èò¡ýdZ•¼ë-1Ýí¯Ë¼ Þ¦ÒÿÞQ~½ø»ržm“  Ü«¤uŽõ8•“õ¢þŒ ó­+')•߯:·ÿeìæªV>û@ ˜Žãö¦æšƒÓD#ÇŒúm¼GA øóÚXu»oQ6ЇÒ£ÃÏßÒƒ3¶oô3— !°q]ÿÚÌÑgÒ=bé¦`ƒâ‡6%ì÷ïî@ù‚Z‰mÌ~fóÛy ØùªôŽòÜÎ}Âë|õH-m±ò=С]¬Á .ŒScm( ;Ô8œð+ôDKt2?ˆUˆ´'þç[–ål Eõ—®ç®÷ÁzŠ$j/‰r,IøÝQïïšÁR_©¾Gµs4ü7O“¢rµµ® †€íÙE7–:–¥ Ô["ð+Š[¯ã.Í7â<ÉØ¶O¡V°œ±b4úi>§“š¥çèÑÀª?íŸ[®OµôÌÕt €ƒñiÐ5c»^ÙÕÓÍéÎ}çrçm{`óØÇ‚'_¡ RBŽ÷é4ШÉw B×Ol!u ªc˜r`ÂA& ¬Ç‚[~Ÿáó!3½Â[Œñä'2È|!áË$ ?ÆA†4œ×X5çî9Ù²–&¶ ”šÖf©WÎ\ÕíQ¦àR~M{ÈÔ6‘Þ¶ßê Ûw%}¼@ÕQHŸýÃ`B™I²eÚ0l´þÍ'Ë|ÕÙn¯á&ËžŸ®Á~Q‘jù€áàh¨ø±]Àñ§ãøù+D±óX¾BÙæC0Ú†‘¤žà`fîìŠ8NW†ÆÇÏËXåʧèªwð¨JÆmÝN~þñ‡{í|Y스œÝ.w…V\³Ò½}$óŽ›sÒm „‹AÆÍ28ƒÍ(äòUÊ!LÃùÊf9ÄW³íf1Þ×3hÖ/iÇ++òärËËpàÒcÉ}æhŽ8º¾À› ½zKÒåüè&ÎïåžNÜ oa͵²I¡:yeâË™ÐVôJ½]ìÿmŸ§^úýb°ž÷ëŽoj’÷ ORhý~L’Y ˆÕ÷ƒ¼a2ÙŽ}¹ MߥµÀ_¢ü„v,o¡ï³Á'ï~†Ñ¾l)BÅ¥×]®–Æ"4A—__9ð"Y+ÿÒ‰]‘´ïÐ+tz|0áÁ:¥Ž(H}ÞxS.ÍúmÆs ôzå—$ôiQùhes$ůUõµed¹ƒ·VØ8!›TÓîòÛNpÀMQù׿ú°| ‡Ê"‚·;Ü/a|[Ð}ö»=xêtHFý‹‘þÇ µzµû—ÏlAYضIZ†g¶!ñÉûÜ]ËÏ~—+«KªC´Ø Ø,Å r+Ô‘_RÝN,hz¬–{€eV ÃMìÃý3Oè®%³§Px¹fägxÝ"»q“ž’8 ¶|ç[ŒþAô‘^×Óõ‡Þ*731÷ßF¡3DöíjÞl dÛëÏ—}Àÿ”æ4–Ý·Kà›öàgxÏÖhƒ?|ýN½9aÚ…ðy?{!žÜ€ùZù ’“·ÝIÖÏáp¸Õ^Y›oœL¥óK;Ój†„eós¼4ºâ&ŒÐc/¡2l©Aj\™4ö´Áex \(Yå(u¸¼Ägƒ€U<š­ÔÀsö+–>‘ÇSøùã[,z  $‡ËÕt±¾¥O?ÄmŸ²°÷C=íÕFK}¥ÎnÞltéñ~Sœ._{ûº¿ì¢?0-½üÛš3ÉÙÇí•4·ª¾Âd9Žì€ŽÑò§§Ú—à¨Ô‡þ·\ÁrÎÃW_Ô¤<º©/:ùGb„èSï¹8zdQ·ëïÿ‰[„2ÃXÉ͉Àxý<Œ@–×tÇ9ÌÒñ¥ËŒiã·¹uI8µ0!܃B´&´’Ï´âŽø O‡'–¸õ$l“6ûo ×1 T¿‰ˆCƒrN»8UK˽¢äìær©Z©]?ü¥G»7 ™·:„ÖeÕÌSéß §É… ÔÌ®“tˆg™ú„t\ÞmìbÑ^Ûvƒ¾¢ÝÙ¥©lúMÜದþr¯× •ØÁL·LÝûQýòD2Ⴠ\úÏçüŒíͺÉ`ƒõEÇÍÉNMqÜæh! âX:‰þ<§þ†­~:õ4œ*«Ö{0ÅÍæìb¶05Ôq(4lkû“mÞWާG—|1•+ºC›œ2AÉŠÒ¿ æŽ3·X˜ ¨å‘¥õ“&AÛ;ÉäïIaÏÒöA GUlæ áÓ/Ý]Ü!ÇÛ 94$^8©î0Ê™üùMþGÌ)q­4îoÛ]üÆ‘æË"þÃmFÿ¥ÖÑ`ºPrkë—(4ódûWÉ­øSW~ÀŠÁsª:^ö4/Ûˆ¶Q(*)ê³ÕŽ@GVOJDZÏŇð*;Öúe­{H Š#˜.V”ŸÃkS\™ï()„nÿpç${‡Ô ÙÄש>æù å€ô¿Ò,xýÜË£Ä!é¡eê~„ƒÌžÏÇ´wbˆÖóèI1–&D”ÕS¥ùޝ/»}6¾Ôü™ÏK¦ö‚7[çXåýð{ÞѤ–=þ=èúw?c&`£¸A-øôõõÀ>¿µÐ»£/¾c…4Þ÷[Á,¼|¶àUCZYW¾nô -Þã)ü,4Ä‘5Ú:½±E-¿ûÓêý†'·¿|ŸY4ßF˜(Ç9}“è ù¶‚Ý}½–ATÇß1\. [þµÆGú‚l!Ì¥»¼ÏÍ`ÇÙxÉÁô…ïe—ò´¾¦/ÝH’Dð#¶˜'u&¥vÚš M3Â%&n«ÓÑήpvdOµàô†»›ÝÂé7—ŠÅ—:›Ÿ÷”‡€gIöR^6…´bAei^“ÔΔ­ò9䥨í³l²X¢e¼ Ö(IN^ŸÙ%!ùÝDѤ®Gù¬p´b3ù±d#"N}4ÆŒì0À“^f¶çñįˆÃIk q"Ø%J1´æ-L·ùÒ6g¾MÚ>Š¢òÆvÕî+¥Ÿ!ùÊ ýá„JT’É@ªð?hÐ'߈ý@Ó&å`›¼ZןaÅ>zA Ý†Ü~Û‘àÜ:Lºn¶Í6¨Ð€ý®ùƒ',t@´lºîJžÓX,¡ §B{¡²wÜ»–<®¬ŸßÿÜQÀ>PP^Äù=bÝq^¸á¥`çöˆN@p|MFÐnÜþº–(ŽB gJl& ìöáêHlôo3,Ý’EÝ„Mò0˜V”±°I”h¢JÊá¿Ið˜ÀùéÒï‡×ìÎosá’•/ˆÆ’ÊÇ—bí 3eò ¥Fáì%[œè j˜‚Ä$qϸÃ!“¢Ä8Ä ±~§ýi`ùE0ã•{À}p8 u½#¥Ïb—„çÿtÄÝ;Zê‹°'ÚßÝ/.p/2ËÙ˜H„Â`¸Iƒ0Ì"[§‚ââåËUÐa¤OS›·²ÂŠ^¢âœY¥…¯«q8Ëe9/ïC±P‡(s©j–1ºÙeúÔ(S¤Y¤öîÆH嘫¤ô¹ öÏºŠ­°bQp7æ0Å´û+йöƒÈa–U¸`´K꫱òöÀ:´ÌÀd= ³§sü"ð“o{% eYª:_MyRù8‡\ss÷;@„q¸ÚðåqdR^ ¨l颻Õ `¬A‰Öò£2y˜µGì§ޏïd2 òõ|wÂ<С ^Ú¬øç¹f”bÉ ,5Þšõá‚Ó¤äÒª9ÁÇp:•Ë¡ô@¨ú-ëÆ‹°r£±oâì}`ü’`§9—œ6™ MhšZÖÿ"´ì3Š” {Ÿpg˳Î3o*µ‘žïŠîgÝ!®a kÒþpEÕAAòGD*{t§Xu€fß¼ .\¢‹Ëc1´Â ÞÈ‚cóH( Nºæe Äg÷TίODBì£`؇ÈöEcð`úöÑ~®½ZFïi*ÁwB±¹ªAµ¿9Ü"ã+Íþds›Û1-/¶‰g á÷(-¨}E¢þ\ ‹LÓÌÅTAdêäÀ5¨P©qhé lúÓ Â»b\¢0»q>`»qtx#œ¿hfê ôÖT©bËþÈ(R!ð°D* `¦)dI©JÕìêcü×%ùì«èM˜i<%7 ›–²Ò°X#Mþ~&6À!z‚»cÕ˜„lÏÙ]Ç> _Ä"ÖpGÛTm| 3 !Œ¼Ô_÷`Þ`p¯y4"Xãv/©QòÈØ/èŒ#}@2”„¨/@ 590PÞ† ÛœJ;ÈN;.ŠÙ‚Óž¤}c I"Üê5ß§³pLR™|€Ý}þL’cû­†øÔ‰URV&¾„õ8)ˆm8oa÷>מC•ø L/}(ñíOÌÉQøÅr˹Ë;˜U^Ô# ‚ôc#çϲç¾nÒ1þ³Ý»]6p n­KˆúFå3Ìw|©éÀ$÷aAh´ñx™Þë`Á"W™݋߬24Ù®*͉h`8EÁrÅ.X\½ª?H…ýùxÅ#À>\zßœÐ:ÿ™ÇP&ƒ)áª"ˆ’ ߨ´eVŠ-ì•äÿÛщ 6„º¢›>OôJ’sqìUi%Nîe—ZÖÅE÷)e-‡ ©6–(óÙØÓGç„—ì3ë–Õ˜FôÈòE¹Ö:ðë—O?îôb&§?ÝRú®]åÓ€V³–.yÖ},ÿGL ôoABqb+8ò %€’ƒÀ¾Cå:8ÿNü‰K©2êfÃA&ŽÒ©Sšgwç/Ž?c‹ÿž d—F+Øh™×¦bù"}6fhk$Ü{¿…ÎuˆüÁÖ`Ýndï —dX­„ <ÑÄVÞPÂV)>¦&D yLFqT¸°%iµ8çl Kß>òÒÝÊh°K¸DySNáE!å pÞ_Fð/m(šOmo¶hY#çlI wPà~Ÿ$±â5Íø·hZZºé3{òX0ù±4D–*&N=ˆy)?§éË^W Ó?2_v§Ÿï¨~„•ü6úº[žz7µë f÷¦œÆ‡¿ÊÒÐÇÿ¢½lU%â26¥¿Ò”Ji»'˜ïŒÇðs;Íì4jDîMÒø¡ á•‚"̉‚´:Þ…-œ©Þn¡ñ”ˆšŠØò|U~Á"°°ùòìÏÙ;Ó ‘S~Uêi{%¥â²xîämøc€òp³“ û’•—D–š—–N”'Ö&âã–•EšXùX\s| ÷{ —êsm9ĹRù)úËH”µéhl]Õ-Ýí¸¹d Ÿ©3ôÛŸ˲ós…fý]»½{6deyêU¶!žöìOk.c)ŽOç€e 3(¾‘%%«Äò#C zZ’Äu8û‹q7/oÂ^ 5kÇ• S3 ¡k#ËT†|Øï&;0QBníux7û ³Ïýd]†!i½?(Ü+$¥´¼ôAÝaV¤ dE›ú4„³ Î|Á½¾”iOÙªAÂk±†öJ†ÈPÔÃÓ‰“<ȧŽÿ¡iÃ475S½:£Twñ8t@t}HDÆ$¶Ï¶Ãæj j€þ Ì‚S#LJœoS”äÓr3ž¤Tð‡9}7ÿ4¢`žôZ©HÈkÏ+5LÌð›ŠÏx„¤ ôÝÓ5Φ‚æ*v¿ÞŒ°¿Îˆ{J€yù1ó}@°ªyô.HX¾|ž:X”LúœGqu~Ð;u ¼cE±Õ¶?ußj¦xIýv³T^7"*¸.ÏcäçþTàHÎäñîS."%\7ðbWyp?rf”¬´-*!Õ&5d…ѻթÑOž;{zJ]}xF. ‹‡MY•à³êjÊ2ךÓ'_™Òϵº9´ÇGáÁ%®£Ö÷Dpi;^ÉEO7Ỉ·¡u1ÙèÏ)ù(d§ÙYUžÕµ65@üOÒÔªåY'Y“K ü{{ö|û©Qvåø…ò,§fú¿v¨ŒÂ¼ŽJ—;ÃÌÄ¥P&úÒC⪞vü%«ô‘ùnZžÂÜ‹–gG]#V`‚5 :îóyç¸8‰EûýGMþíK2ò•ò)[ Ãb*6 qd§Í'Ûél/„Ó=Þ•§p Jؼ—…«ÏíªÆ^µ#*!u›%ÓŒióV}d¨æx&ðé“c’ÆÔ³zã៯ô\8å€2àÛî7×êöû¤+°¼k­,>#3>™*ty(ÿ/µ¢Š,²—Ò^zzíµ+b²4–’ÿe“¾˜ªõ†žD‰T‘•àÌ“’ Ò& ´@ 8&€ÁUªÎhÙhÿ¢^ÜÄÑ8òÛÔ.b¦{x JE”ûEPMÊ#"å€~i•ºå¶ŠÓ)‘ÝÂzuê÷¸û®>ú”†šr礶Éa·'ñƒ`&å6C个0§q6Ú²9ì6";«Q)fP:/ágÀ0mG¸ï9‚ÙA‘Š@å±íð…Õ¯êh¦µ¶Ë]ô¥ìì ;ëyR¿Àåí4¹r€oÑ)©| —¹Jrûœ!€Èí`sœ­ÎShtà@€üÕ _Á€;}l¸z§p3©ƒ—´þöw)©1 €†Ú/;=ì9Ã_ˆâãZoï',ã?çÅû¡ŒÛsСŒåŸ£:ñG@? ( QswÀË“%Êt)J[Ì\¹€gǘÏ$‰ýXÒmÏ:åVÚ¬1σke(#Š3'Õµ†£?|+=A`Õè#0ÂX, 3¢äÍeÜxE*·Û5º‰žû=cJH2Ü'J€á[rÇKj“$¢ :$0Iü»—I‘;J0h±˜•Ω„šïé´}ÄîT­åÊË÷uášã5»ýµÓÐÓ·GX³Úî+»5Eæî5UÔ%Ïgˆ%µkÙ˜Qk'&–å©ñ¾ÅU W»¤Öãe<[C·Íׯ‰ÍËšÌãÌ*> M±ÊÛñ¾Ôí RÞÀ¬ûãæÄ”)uÖýeìF¥4G<Sòë˜ïtñ‰ÚGø+‹CÞ.ÓV¤,ÔËß p¦Þ¸Ã¾î|„_ÛGd´EÄ^ ͈g¦I?M _/ÙC>¨Zxv;;pÀÜ/ gæä(뀊“&ÛÖÚ*D…!*nO äš\wó«ÿe±O§¥@—רZÐ6€üÉÆh›í»ù„&¹6)Z¼,2]ùF_’·Éš#øüûÕ ÃTïá¯'ÌËÐS]Ýt¯‰É³'ðT?Pëv6áÒ wazítGAFÎ1—*vv©ít$„Y´6TEq„T+DÞ«Ú{ _ãFþî§:-0sRFÀÇn¸öè…ÿƒø’-O»2È^vÜyüÓÐ==ξE§:þ=æ-,ŽôÀãJ¾zì)Ó¤Òár†—2±ò^‰(õG4­'8s y¸Ö,\ofyž±åõ(M’ÿÔŒ¯=‰ø« ïV/–ÛU£»¶o¸‹˜¶÷>²F'±ã‘¸gì§ou,ì@ P ã—][Hë­)€ÊqýgkUJ#$äÞ¡ˆt}=-˜A5 œ]‘1 @in/€„eÞüçeW/H&dÿÑÉ‚dŸ.Ä Wãþ"RÝ}.@Ñ=Ö›Öܦ‘'Ý­Sm¤êXLJwE¯ßÏN=µ/§Os§èúÖ}¹R¶ÉûBVùÙDaÁeËìæí>xMÏÏÂv³ÑU +Ìݹ£´§ÓêVö mà˜®×‡D4·²‰hÑkH²êüzĺéI E¦ã€ƒ­kßè%†‡±ÈÝþ?·¾‚EUhncMd®ê€ ›ŸÎL™˜ž Àä…²äË«ºÐ”4&éи˜Ó\àÁÅC¯2ÊÙ›ó%²™‘ ƒF‰î¨´({r¢¹¥°µÔ³ý\H‡ŽYPwºù YK%W^ƒŠ+ÞàµÝýš’Hä[j@ISþìBçþRgæìÞ.jš«š.AN½BXF0G†ÐAÊ€Åuzéçýñ&@Á¬&»"€´ÜÔ³W½­ Ú¡‘¯ ¢ðÒcUEhL¾cYõ¨r¼ `ùƒäÈ€GÌ‹tU?ܘYJ3(kœ&˜1¬­>V jäø1L&˜ÁÑ¥e½Í›}°ïÛqFpRÄý¡Y©óà‚p¸”ÉRN»Vó‰%ÒfD°fÙÏD²Ö‹š›¢¢ç(ÕÑ~pçÓd„Mé?[¬IUä O0‰‡0>gŽQ& — @0œÌmAX:ešÕܵìØJ»&=Aƒô:iwÔ®ÿîÇ V ƒn9Ùo í‹v/(€iƒ,`¿|]¸+>ãSRp£O¡k®ŸÃx¡T¾/x˜þ Õ‰Òš9 >ºûxTÞ'^}$ÕrÜ0?ÂE“Í3Ä€tÏaÍ(1MP8‡#ÏñITm³ZUÿtź]læƒí!eÈú+!ÄñY dü tˆqô«0CŒŽ»è7m/†éÀ~!© ÙÜ€P*#  ÃÆH‚œ y˜•|x_B–ÈÙd$CÚo¨%ÜTŸ°ÖóX½ú‰YÝ^E_/©5OŽŒïÆg1o®+ûcÁל6[i§½×LØíPr ¸€i¥ØÑ~‚¿C§O¶8ÌÛÑ„Å!ÙŸ,+ ‹d+7óÖ!:øn0ö`?}Îëí×Í­À2ǘsyZC-öĆG”k3£:z ¥YàH¿_I8âÒ~R»1äàƒÈv‰½‰ÑP 4&, KlÄ3ðQCH~ê0<ÔÄÝ\‡Š,·2D±Y*XØã#ll±ÈÀ9Ãf8B–â…:¦“Þ ÙàMs¯§­¿¿í…¼ TóíÎR‹o+–·Â1"»5_…ú)6u?BÏó†ŠV\góíÆ¹@}y¢€d«ó}}û¼â'‚kø½r¥¯]Zˆ/ªý¼0O«pˆˆ"ü‰×µ]µ§ïv#ŠÆrÙ)nkcÖ–|²H;Ô ”L¡^Ñôtͯl>ˆ†ßJæÑÈ€¡K”˜цä@Ñu+Žîä8C~à•EGw7Me©¦³ÒF›¦,ž¼¦:]¹^uqñ<«ü.°é©„–ÎWÝ‘£ õÓ)SÆxŸ¨¨Ã#>GÙ–JÄ zž‹Ã~oMTOûÅm5ÌgLp)þD\Ôê­Ðá*ü€¡j mìè¡£yÜ80¹ºŠŸ·€M΄¬ßøf¸o¡ŒVAzð!DE@Wõ2.ÈTìÔ¥ Зl©”#šÐbŒ~e:Å3ê+ZìΑRïr· ÛÑïó)dè–²© &Ø;¼#RgNüô¡GÞfN‘ ðÐh¢?K®©yÂÊŸ;xP—êGðTžä-¿̇¤„5Aqˆs-L{?e)$aÿúù¾È4#ÿ#ûÌ?zåɗCÁrÛ7Û(¹Z 8"@ ÍbbÏcÈíïõ&Áêæý ü*R€§£à—hMkŽÍ£‚èW ¯gįbBÉ~;ZÅâ î7ê¦ÜÄQ>r ÁbÖm·v.äŶ>ÀNò›¤Ob·ŸIìà¡p~Oʱ<N~û‚ûZ±¹Ts¿dÄ´m/†ÅGOBÈÿ‹Û[2×CM•,pbLí?+(€I“¾Vª€Jdé¢Sv†kq*‘o?[“SõW£¿(‡°v„»¸2U¯h?8uMÞ3ž˜êgÿP‚ƒ+&!™|kÏ.Ep‡f ïn‡Ò ÑÒÜdh-Àü ëš}Þ5z 6pÿv¶ƒîóK?µÍ­H£ÓjzRËeK7xÄ`€<±#hrT¸€¬æ(RÙúníçò÷"ÇÖÒ®y?üz íeÊöññë÷ƒ‹•1ª5˜˜±yDÓ$Á¾¾Û'HM{fZˆd We™ác‚ÌåÙ:dº -y[%BÈÛè_Hà¬{@ Ó¢{q÷GLè.­ %“»¨‚и„&‰å’H]{¨]Æw†ßc>¡s;û<>È](í‘J¥óküÖgQ¥„.ÝÑ}õ¬ëWkoZšìªg„“·å»ï6k®¯«XYQ¯šµW=žP{UúŒ³cðAï\}¬¢­ RšÇ ¼ŽØÖèl @”D¹þ”9v˜ÚöuÄ ñVhS¡âE¥$ë>œ–~ອ¯ŸÜzb}12˜åå*]Œ<‰[Ö'kUÁí‘–ªÄ½›Š;³ÍžGþ€¢H=‘É Š©õX¿HlŒ-?9¾CêA‘º·à?ŒŠê÷Gvèòõâ<›ô !óç½\åæ W ôãÐèÙO¥ùVªåõ²»ÓÃ$À­í  ƒJë_ÿ>}bBmÕì ÝK€²=„æçW€ˆè¿Ü»çQ÷6WÒ¦z}BtúÌp<#’ØáV«ߺÑa6@·e/9`í+œ-Ö6ëüªSþÇ;uáSuæ±v&"eàSs=^‘|¯,Ñz‹eùðï×0u/W–-›`¦é” ¥†S*m"4iÍ2ô274qÐÁ93ÓŽÀŸŸñº¥=¦„¿tŠ˜@ml6=ú@²?%ÚP|ýTãüjñ\öš.°cxJ Vó)<Þ|9ùŽûA'Ú‘HÓër–°è®#öƒIšþIm‰Ì§EŽûá­8æ*¶Ùm·KÞílôS3B#\ö‚GÊŽqr(ˆ®+²ÙKtª¦µ˜!Ž_lååxºáÕ.¼ýìgCpvaÑzñœ[Jf¸U³<ÆS[‹1³”ÏœYËbŽKì»îÑ&–¸(=o6r]®.Ë2*b³ ZÓÔÙãÈ÷•ä¬:UðÊ6’ésJèÚÍÛÒ™¹k#WbMe4p›ZµªSz.Õ›¬=c5»<²Ö-ôÀ4v)£#N¡oÖª¯Ý©øYÂê©«'5x}CKsàDj:û79ö¨.ºfl''é¯V¶ºí%ºl,"ÓCq]B §RW,ËîæY;8Ã,½OBªª}ù0ÙgøÀ"c˜ˆ¥üúéu¨!ù?oû”fÉêP¡¯àÔ–—eg?|¿vÄ•mkô€Œkm>“R²s§9ëzƒH~EDfãfý>¿ŸP+]P¥SäÿxC9ßõ÷mÝ÷9“:ÙÏ/ b/Ÿ1†«Aïô¹Ÿ½I/aà\d£þ¸±Ÿ8éµL-ðùèÀȃ\žø%Iî3<±ô-‡ÆÿfÜœ‹ì9p!—DOμÅñ¦I½7S£[„çí”Ñ~’mfòNåÂFÒP¢²2ùv¾»Mëõ³˜FÍï23ë}´bÀðx°l˱æáXÎê¸a7æótE_AÂV¡š‡Œ‚2yòU©õD4Ì÷ QÜ0æf†›ÿ)lMÚp*Ò—IðûÏÆr¥ä…x?v«zV§›Ù”¥Ú÷‹ûù$3ºø~ÖbûÍû”‚Øç ëIi0CK×kAöÉ~„Jo&$¼OcãñâÆŽOrûíÑÄìHtñßP¶=ifNŸD&*<茈Ãò–L:ZcÔ¯áÑ»B<ßÀ‘ÍX~Ÿl¦“Š‚Ù§ˆ€/„Nñ!N\è·+µœè:`o™Ô>|—Ö¦²äf¬ÊSJ>~Ͷûö"ÞræÆnº=Ãx{ÚR‰mVµê|7Ë¡‹¿É*ÚÕòõH}CT¹Üù *‚T§-­æÐŽ>ÈÐ!³‚Ð|ÛÅŽ?ÉÐrFó¾¼!ÉFŒ×^Ì¢|%†˜}f—-‡£FÏ6¨˜ÔÝ*“rÁ·Û¹—¸·íÙ\ÂTF÷-˜OvižÜqS©ŸQ Cá‹'þ:é>7•á9‘7Û\ü=èK¥¸ëºšQ-³õ¹ðÁ!Ví˜oñ¸íðaÅg ËPU빪¤Ú+©ÌÙ‰YîŽgÄÅW<»Þ_ªD§½Væv}.ÓéøÐéαë×v^Ö^FèÂü '»Xxqn®h1«T³[s?Ÿv¯Ýæ ™t«t‹1y30¥¶ q¿ÿ+Èéìrx¨ÙZ«tµH\ËXk‘ˆõfGÚŽÂÿ=FKÙ8£^éñb-¢ÌÑG¥áZ£ù´¹Rù¦xè7úÔÓâi«n¢c©‘¶*õ<Ôb(#à?rÆäLf»<î=sgf¶ô–|ŠIŒmzgþì£F O€µ2Ÿ©"›–—Î Š>✧²¯¿^L ±Ø¨‰åâÌZ¦Ös,òÔ åÞ-ÒhÕ˜^ûÒŒ«ÅáŽ5bÑmÄp¾‡kÛŠcp3 ; Cb"‰SÓîÔæüõ4‰)Â9ÏdkjJ°|ß Ý;ügBÆ™tعó3÷Èá1ËG”Ú¡_É?ᇾۮ·iZµ2µB–Ïä¯Çg]+£ºùñzGJé7H'…[{~7Hdn›éTKS3´?º´~’³h2ìhª7•?Ì {™ÞŸx¬9A žUœþt*zªxªµ/…W…ª6L×ô5SÄÙÆÕë¬g² ]ûLá=÷/´ýG Ï\~>|ßþÌÕ~Ûø’&»IFæ¥I Ì*»lûwÃ&ó9X‹=íuÑ1MÞ¬ÐÔ7†p®³ÔGMûÒ»‘k‰W8©mΞi8X-Ç¿þhöÓkÒ}Ф´yEC8n.§')9;÷Ç u™LÁ?BNSÉ9|Ô4Ý‹¤äû‘©$ðàÇuµŠxj˜=h=(›œ:PýÉ®ºÆÍ³¾ôôh©ÞæHµÜ-MÞ0º1ÚSøËNà¿2dna<h8Œ%Ô·Œ©hš¾ffk=U*èÛµhy–Ž9ý3¼@¢¼p€î>p»v`äa»`#ÜFĉÓΧEQË!Iq̯UMÑŠ1E„ìRŽAçÅ}º¥é×½à 'χ^3jŸv4‰/‘ “µºãJ¢ˆnŽoNuAé8ŒƒiÍ&íöêWØÀÎ  x–ß²oò"i%)ÓÓa“~y¶=ö*Lä­ÇS%œ!ŸËš;ng'ÒiPùÕ·讟´°Írù‚;Ô»’mW¾–¼&npSÓ?Æ cþ¥s´{§,w5nc<¬(_wµ^q>ËHÉjè´:ë´ÔØChà#@òÏibAf{ýÕ³^ˆÍ½0ßgø¬Â{¼§/UY!È>ÝÚh*SI#¹t>1ô³V¶êî _•N –š$ÉP¨}zn6}¾šËp¬ –‰€xuÞ åûåß–äfê«¡}ÁXn£et¸²žt¢)ùtkC±KJ¦y“(#Z"TÀX°ƒ~ #à}£·…èhxǶú™Ü¿§b†~ÏԾ½×ÍO=Óhs>%彆ëâ0oKh¿"Sdfz-"ãEï–1cÀdGi ‰b!§èVÃ@!"ñcHð7 `ÑćGáC´Ó©9×{аƒèt‘J›.e‰Qm$püÖ¤~jfV»þQ£‰p(,@îm 0„ŠêE~ÅJê5pègrZÓ5›d ²îzy õ ­*f®#¯ìGçüDácÂ5°ƒz­E%Μ+FêËÛn£÷+“4È‚d‡ Ž³ÈŠBs7-ÿ›GI#DËa3½é’†]æLcÀ’Á¬ÎÞ»lu‰é-!§mvÃí>Dº‚rt<}´ [{ éO:d¯M¶Á ƒƒ«ßã»4ŽàmÁòJEZ‹%å·å?Ð[·¤‹ÒRËZtܲOLÅP¼dwœU`2S1fó[¤´ ÒÓ“º…ï¨ýþ†y¿‡^àÅl:Q^á´iLów•±G[ÖÒÌ zȳ2•‘êŘ¾£OÕ¦0ÊŠØÞ^¦yÛå ¼­×‡§Ð¹Ó.b¡aüèbfºcˆÆëh(Ð(I;þ‡PSâêÛQz\‘”Kª•r9Þ롪ÀåK8˜<24@ÊÖu‹O¡^I\&à²zbd?GæËÿÑrl M À9 ùè³w”ß,hêbDlw}Z2ÖÙ¹/ #S–.B› Kô4üa_ÐTwÔ»Oš$Ø>+qp¸6a¡p(c.¢×bk`g¿€L[î’…¹ ï¡Mí§äûW»“:áB¾M]ßûør¡úãÒœeY"ºäÎbׂž (ÒpZ…!\ó•×l’§¦°Z;‘›ÐÖŒ$çû˪ò}íÓ†î¡Ì€ü£¤ÜA® GÁà—.Jªf†£6`Ý›åÊ[bó1´p¾×´¡¬ç{ÂÂvžeÂ=ät2U|ËmKü}«i{ÙîÆþn·i<³ ôÔøkiÆÖSsëk¹^ú/þ=NÅ!ñ1!†¶ò!Arræ[X† zãĸ´0¹Úïýª‹óÆ•\ÅÆ—ïÇ%^åþ@î,¦9 YÙKË~ýoÍNg:PÚ¢¢^T¨|‰Zì¿MIã¯ó/A¸Êbœ²#öþ(íG Ú£/ÕškÐ:Â{%³ z}ÜYàûÎ$ù#C-jYŒ8ªÕ§ô1VyÌÓ@b´šK}ßî-›|¶lð‹áaq¼o1J¾†º¢9ž­´yi?r>œÿüÀôÔ·£Š®@÷aÒ!fµÈçÚLŽ2ÿÛ±CzQÓŸ³Ê3îô¼Ç`YYb9ž°f¤”i—  :Ø+Ãí2ÐE|¼/±): Z šÔ¶|åñMxé]Cˆm‡Ç¼ÿ0ç&jó:D¬Í$ÅØK0nšègo‹è-”a­œÁüñÚë°Yˆ`=[phá½W$¿2ºó®U¡);9´Éä*Þó ½ž©×4!üç!ß/«9Þ&énhm[ì>·ß›F~NCŸ$û¹F|v`{çÞü\¾OOçâ?Oµr¯i°ÁO±êý Z9òÜ.Ïl™à¿»´^Àï¿xˆ'­ð´s|mbß™íå_ÓR¦V×?’j>źÂ0^÷=Þ¢Í*EÑq‘ìéþ ‚ù‰Õl K”üë§Ú×øý%¶k,ùu,]wó/Ç69kÁõ 5tF®p²PÓ6yÚeÇÚ”ËÍõéÊ8­ýAzIOªSR‡uüGµ—®dàǧ.{€ð’œÍ¢lwSq’ý>ÿÎv˜ ÉCß¶ñð¨_húËûŽˆT㬫ˆcbÙYÜK5¾_^n—$¯»¶ìú3ˆ4ë\­òïgÃ~`a©°/,7–uŸ~|šdŸ–9⌉“ÉkD_þ¬d¯Cø,Õa¯D/)@ËíEšåÜõµƒB§í_är.? ¿Ú®%ªeRý‘(ø]=©67ZtÐø^˜¥©êd%¥êå -ÐH.%˜ñq)gGÀ¤üÔÆèe¸';$ª4GyÆ?ï<ær| •÷ºí­Õlp‘¦°±õˆå¯ÓyÏáå(œvê¼ãP×lÛ‰L™Á‘dâ¹í_ü˜œbù<¿!Ë B¼òÞ‰œâU6ý¨UªÖÝüv[W$®Òí3xù0L®•cñ¹Åçfû]fL§ã}é1ˆÜ”+JŽ9ÜB”“†Ì/Kwò€ÄÄr‡k“azÊh,êvqÈcÊVÊ£©wÁœOb\’30ï#a鵋ï1ÖÂ^ŸÕ…/.9V•~Ÿ‘¯¤Y¥8ø´ç¼ôûÅh`†ð9§¶Ÿ¿¹'7û„°@, ÈGˆ”EšÀB?²ìpu9‡˜Ó5t ¼ÉTÔŸ Ñ!² AÇ[ÃrÁR'oRoáéFvƒƼÎÅ/9q3, •Å#Íq{Ú'£zgßw³ŒßóÇ0;dN|åñoC"wæƒí3"v[ 6Ð=§…¦ÏKÒÇbÛ_½g¦7xìÈI: @¶S…5Ô¿Ýdþ¾™3ÿü‡©˜Hn÷gº¨rú gî`¾çƒ7õ[öx™iyôË Îû×ø^š2ßࣈ´ïs’K8BˆÒíGßµ¨„b Ÿ~7wÎv(A»Èp°)û–™.ˆØûK&ô¦Þ ÷ÎWóœ¶6^[B3ÖöÑ#'¸D€¡ŸÏòš¡ç“-2ϧ6bÐ…$Y-Ëb(Ú¬(4ýiÞööóå5cÎüOºÂ'°„G*7$þ¦?þþ<ÒÝÂ.1Ø6,¨‹¿{J̃vfß$X_ghD¥Õ³R·ŸÌ ÔìŒ èqV1ζƒ|›½–Þ0…!yéB<: è2ÖTÛ6AcõË«³ì TÈŠGMè°Ç~PQŸMv ÜK‚jgß½yâ´‘—·”À×–»™Ï­ãÐ/qK4Æë/¤nžîžÒç<+vlËÌ&­?w3Ò®âÖÎN×à§*“ +`¨~!…kôÉ”ºÑ· Á ¤}~.·׺…öÙ]dv˜ÛüÅ‚¢h;H.­¿Õ?=­;,TrÏåfÚc³!l;=êRœnÆÕš !¾ÂrtBÅtwZ{"‘w{sõ¿ïß̼vÓ5}öþö–êµØU\ݼÌ3Õgc •s+#³àoM#nœ£õñ|  ÒÄU˜ z² D…úsÝØý †óÇV4â꺊l;C^ɳ~ •qضù·!GÒófx«=–ƒHÉŽ'þ<£Ü_`®Äa‚r ¾B Bït;Ø’ QÚê|Ãk3²SŠe8Ýô‚ÍE•¾Ü/•/=õè¡ãg‹'XßÚr p~èT‹Â{r¶ »¯ñÅîòP÷”+}¯Zа&0úœv#2i"UõAs¡tÃôüÑ@ë|´W ¶Ã\Ùù¨%@dïGùü øG¸EúêÂü1lß÷q1zs9¤gÛE'ï^¢<ŽÜÃgņlÍí¯É~¸ð%Vø>úîGz¡Õ¶ ¸ÓR$ƒ2‘sp•ÀË™ylˆ]©¹}¶Kز™”||2ó»i£®éy8R¢Ît]ÊÝèºp…=…K£®.~;6ÆL!b¹@TÐÅ€ìæÆåý´Ðá2¢á•k<ùôÿ ¶sªæ]‡—$y9A k›˜ÓÈ…º#d­õ‘jôŠˆqôÑ{¯´Ä¶DFs¨¢ÆšÃj†™!÷Yåý¦uª0ÏØÈáZ=A!¼v+°Ô×ÇwhtQRÂDéCüf!J>µÚVM±WÖ`H[ Æ©¡ØDÙ«IgàMÝ÷kÆ58ú¹Ù´ ÛÔ 7òu>;i)/n˜>9xt5N'Æ6·H~ÓN·Î:œò“BKê¢ÕÁ!þ -E¾öT¼Zë½Ã æÞ¥w°…¬òß!W šò:•%…”o £_ˆ—†M눥fE¾•d»%–b°UïNéz»%9àCV UÏóc…$¦âç) ø¸‹IúS+Òš¿pÛ Vyâߪr> q ¡-²x"Ù '޲¸©Ñm¸E¸‚ˆpäГÃò0CópíÞþ{SgRêÄ!Çß¡Q¤ª°e5‹†"s¢~g´À’.ýà‚#Z‚¬êÆ|ZsN#¢]}+¼ï\0 ZÕÌ|¤Î­*Aˆ²,'!Á‹1[lFÅ•B—1AˆçΖ×~ KãæYÃÁ‚‰s|}‹a¶ØÉïßå®Ñõø"£-)ôŽø­Bî°Bø· ÒV4—¸à85EÌÝl|>ÔX¯uôw&˜à´¼<ŠÝ—ÉÔQùÖÓÅŸëõöB×+å6æi´æöô%å* §ª!|íËþ„åêˆè†Õ i½¶9ă"À\?ýCÇ ƒEçà•®E±và/.lF4²¥ø²Õâü…žd#+“<ú©‹)Ø…¦|ôäóZM·À³TWɉ%Ð%Žoþ3Ðʾ£®½“µN4'©<ÅÒ$·. ·Ê/Å¢ßIÆçîûé¢uƈk‘ŽýÙþ«YSRJfè3yµf/Îzh¢ôåã °õ6YãYžXÏt¡QéÕ)-6 ŠÓÍ4<{ ”úËÜ òW³¦¸y· ¯Z_8šŠKêû"‰\¿ÙÓ/ˆ/^^ û{ÂÆ3Y)+Ýú¼â°‹ÝIGEýëçýÀoT„RÂ&|§ŽªAaûþÓ%òÔå'3"GrBnsx ¸Ïç±ú™Ùi:Woáu=KLWb½ùAcÒx¿ CHЯY¥° 橵ïCAßræK8ö`:ò¤M$iZëBžvƒÍV(+À2¢“ñ@äÜdV` ß^¸Þ HŽÒîpµTaM3++Q¨@:Šé¥Ó:†ãކ’·ÐxÏ oS¯Š’z²BÓSájá×ÕoÅþ–qùM\QÜO­ø|1Ôüœ:Û 2²šêÂ9#"¼²Ë/Â¥Ò8¥A(OÚI#z† Ùº D5Î?”þ7yæó5„L¯7mââ‘zPäü,rT>_"ç™,«hÛ—¨ð‘´W{«SCµ"4‹TD·c %yçKÅSÜ@zÊmhfó!#­ö%WýÐ\šêÓµ½{-÷a;?Pýd†z¢ÂÓTw6»T"G£ˆ-Š;®ÅF€Lc£j^ yÅ[8¥ðÏVÃÒ"¢N@kƒDÍû;¬²u•Uáu›Õaذ5õZûÐ"V0~„¤‡éÒ?_lÕí¨uEÉ5‘ÈtlµßÐþ†:4G­U¼K‹&FFµ®™ÑÅŠ  c©s|A” #6d{€>*~—ê>•’+BMÄWְආØÈÏà…@UQz÷RaV§d=ù |!:7`¯mÚš]zC¼Ó#¤§dC7¼¬CŠeÃßÐøè€i[®Z!}¯7ßPPå3Ô1ôRè=fÑãm§•&uTÉ¢U¹­<ˆ0c.Ð2áªÉyÿÛЕ÷o¨7ÜoÀuûÆ Þ¾(}…úµ+ÂèÖÆÅ~Ϧ9«àÖu–ap4‘+ÍXT ‹)I #ÚwÛíÓ¼6f¾C9j¨ÃÁ̸֗önv·9†Õ‡Û¯Å:´¦½ ™((F !€*gMd3Z}çn õqr·^†c*kßD…™CÖ+ëë!ñgjìåZ©-ÍQÙcšFe½.twa–0VV0lrkˆžo ·Y&@T¼qs$±¼} {´+¾¥¢¢}@è6û.éŸ{~ÛUÂè÷>í1 —‡Ð§=¢y…Ôx‹ú>‡¼QåHx&‰™ú±c¿iîVao_òVS±+LèÄÔA访wa—˜1Ü®´Z§g¿+Œ/:¶¯¯Ð–qÃèGæOªcЊ ›{?ðéÄ^¬ØÇ`¾¬~t³koPøI}ø{åá` e5ôL`óoIpŒøèÔ: §¨Lƒiûa‚;LR—£ÀtŽJ»ï¦Ï»*0¶/ù@:±â‹ÿÐ&ëEå\L’i#Z©P"Á]¼ZŸŒ/)z6ŽõòB•{\`_‚Zi šŒµÞº}ö«Š›°ú‘I#ÐÛ ¦ ­¹&¾Ø»óŸúS A{|~œ‰X=æòÌ)ŒKÉ÷¾@ÛysÞb8«^BB̪ó,çJ˜)q•Ë:÷0}7d‹Cqq¬ÔúZYŽMÿa?…bàỂ:¦×È8†ïên‡eÏEƒÜ1kDŽ ú>Í^ Y>`ú»ˆÌ2¯`þ}8‘à·Vxz‰£ ž˜Y¦ïqƒË{æÅÐ2“ªé¥kÔÄ+þdжêÉ£tY¶ˆH¹Ä4>³r÷Zü Éˆ¦þoŒLçï- Ym‚BwŸ…ÏØÃéMN• YßhÖ{)q›ÞS¢üˆoÈ×Ï.ݘ†¸(u0(’Û1Ÿ‰è@¥Ÿ»‰.’Eíú`2j¡4–Ø®ct@¸†´Gܰ %ëïü!r¢ÏÑ,Òs>Px_…Ï[—&ªì"dèîá>–,.y[ï· ¤õYü˜‹Ò[ÉÒ*Hèn9Ðm»wù#R„\aii·F½Y¾ôi›¹XF{¥Ädd¤C9LÊýÐWàZ/(ý€ ‰/ç]CElX$#æ~ý²›j5/U‡¡÷qÚ\àh¡Ãyý½Gæ„Ìt®ï…³'$É:ŠÏI„,:i=ŠnÁ%€¬¡lÓmd-Xžðö’=æ];+m”­ñ‹Æ€]~/wùøŠ[.%jֶȱDÉ}T+HÌæ=m¤B[„™ }4 …Á˜ ‘¾3‡ØÁP"pÐJ„À98qêúX®¤“b¨pƒH€ dý"¢°˜>_ù·´*RbÔ9-/#yŽX óˆJ-Xlƒ_VÁŒ ËE¡(š€Î$á\y§[µBÏëA)¥ÜJUõJ ñ)0ˆdíCéyôµgò*_EÀÙoT]| m DBžh*\[íG¬‚7‹Þ:$2ëèk_CKŒ ñ‰xN;Áo7‰[~¦vHÏ…q¿bvg0Zøq¼ R]ɽê+òèhò¤òÇJs˜Ü,ù?î¡Ë˜nÕ½²Ó(Cˆ¨§Ðb!h݉—öyЧ§Ðh““~¡¾!Ì ›*#[Ã4O»54~Þ]Â÷eô_i•‰–ÃcEðõå¯ xŠ;úß_QÈçzÃý˜LÁOt•Á‚†©1…ÁÁ<æ%}¬;´2œ<Š%ú]¦d‚¡¡ß‰ÚŸÄÁ»ÏÅFÙi¨7Ûü¹\wOûͪ;2 áÇ=Û­mÅÅy,ª’…øÆ4¶í‚ŽJ‹¥å 0Ib¦ã<Šð2j¤YVŠE˜àF„Ö›hP¸Æˆ|8¶/PKðž–ú®/ý:ÓƒX~ʬzp¤-‡ªíÇç¹Ëõ| ãûé×7q:ï(l}XCɧ=.ÐVJ[# ø uŸdS™hü4A¶TnwW”Hx)§Î1Q‚[¸H·ø†¦„yyxØü2!+Q½X— ø´Ù0«s/o°T±£²p—wT Y!ÊÔxS,µa׃—§ ¾{EÚiÒLHlHž*Hĉbñ¨UnBo‚в3|¡úµðIÆÜãsÏ¥qŸN•?@÷TŠ“ƒB‡ƒû®¹ò1õÏÉW)œa,¿ÓÌÜðÛÙAz® hYVÁòVwÍAbÞ¨ SðkCŠhúþ»yý|”„Ð:muŸ}Ç}ƒ€Ÿú€†·a `³áõBΠòW;+f|PìmòþYüþ.ÇÅdÍmÁRÓ[b1†Õöé²À«›nl¢[ú…®Ô£væhOÕ3 Eb$Ž=S€6W•@ji–B<Vßh›Ú)Ö\Äa…Dˆ¤Öé‚?ePèùx 8óé÷ÊÊäyI÷„ûµ6f|¶Baüùr.*fë]1|ՠģSœ@ª±â\Œ9Ï7à ÚÓÇŒÞT‡'k™Å&âE fàû áˆHUcàÏ šH4dÍI"„*äh'È%·cŽíùÐ_5¤âÖ´[PÉlÖ&tKFï Þ8ÆÐ¯Kq\ÇP“X+¢켪î³öž1<)~ÌI[+…¥/N ÚGE¢É¶áÂf®6D—cÔOç¨Û6߃q*ý5-à((¬dóï&NzbÁ)ÌÁ*•»ž'¤Haµ¾Ñwbۥ9‹ÏŠN·’X}Ѱ0U*DÉý ‡Å髇‹w^í÷Á?R¡a®²„`¬Ø±`ET…‘`·Ú\ªF¼þdmqäñ×rÓ î>IÏ´4ä d¸Ùš~”|ÊlêÏЈƓjqîB°¯f ÏV)Ô2à7jÉ>V²u!ü¤wÔµìQħ®(ÆÔÙÊæä”ß"+»úœ<Æah$¦‘‡ºiFÚ½L`h8‹ûþžXýj ™óhšÜW¶.Ǫül3~©©‡ÃgÍ¿xt¹ PëòËG~áIÒÂ6A·èØ=ÿB;Š_Wùé7‹Rþ˜: §Û®AV?\ȼ^?ã®dO²pJs’žBõ@ƒU/ZÓ,›”®˜~¤ÍÎvÉó5–rÃI#—“*ùà”¾ð)ºqÃïyZóElý |Ó`‡@Ô!GÿÆÊ¯Mßvþ’Åß*ƒ^‚›zë®°2ÁÇgƹ#Т3Õ‘T•Næk‹æHýG+vÌÁ'ø§÷¨MAãúgæd¯;J$ÉŠ SAé¶OCS«ê]Ó-¯7m–b±æ6ã L%P)WSÏìaNOcå öOï è:—RE†d*¶¥Èï ÷ÙPé4ƒ˜êÉ ¶‡™ùÌtM<9ŸW¦Ømü·» Ô¦2÷´Òu“€iý‰šÉØÙ[Všp9ÃüÐ+ª—¾ãP?$ì’ÏC¤£ òz…`º´§+ Û9\îh¬ÓÍí“*r‚ ÜÌ{VÆâáÝÛŒ~–ÙlÝÌõ;Þ‡„‚Ê_j×®QÕ9ÖÅÔ]ÌÑ¿se‰¨ë’Óäœ \üà™I_*3Í›ÛÌ&a]ÜŽÏîœ-pÀâJj­F×µÅ>N#~“™Y,â8«šƒH õyÁÚà–Ç:—Ø=6[L¡éwXaøÄë9HiËÙZ|bæ©I‚)\ýÂÁÚïuÉæeÁÒÎÔÈ ¦H†º¨óÌ«àÑúé$kM /uN¾Äè@+*H^ª#žÉå`5²çE@Ew©Ó óÛ °Ïž)ÀÍ!C¥ï•15q¸ýFO¹¥&àÛÆ‹Q±Š"1üA.©é45Ihà^æadg›~Ýqâ ±ó’ܿ¦õY\{Ã¥ëO†öQW‘½1Œ‹f[þFÍ13|áŸÚ¯uÔÃ<š‚èy2;õX &Ù)v¿#¥ÿûjK\×z–Ö8Š@¿]{âe€ÙÆËÉ«ÉuYîÎ`)ÁY¿!ä[I$\> ÜO,|´Hûa‡1ï{V?ôZ>¯†…~ïä0™P÷§S î‘ æè²¶N7«Ñ"Q³Êg’·ªç7UxZn•¹ ²§o;-D{Xz;ÁÇO›ŽÂ²>?oÉ¢M_(hŽÌ@\5°ñ‚:†£~Ì‹Ý)VWÜ‚/ôqW,†î5~¥£Û³K†Gf ù¡…ßÚ~',,uºgíY ”d¹Dq½\‘ÐÑÙh"ãŸ1О©…ÞR¦öü#Âea'Ȫ{ªü l4º*~ýL„„÷êEZ«e¯€Êµ5-N®AÎŒ›c,4-Ñ¡F%Ò‹(žyƒwL¿-ª-à0ªúEÌ«uºV‰‡;õ"RÆçó*󧮿3L6ÐÿembñH­2H÷p¿0!VñçsÆV÷ê4˜yQ@³µ°ÁÑLN‚ï±W»XN{ó0mööº­1´0ÿà ÓØ±À‚°Fvì5¡¸µ+çáup=@pÍ÷½„_¥$§Næøø·”ì»ÎûxÒùû…ÞÉqµ__—ؼC@lÓ«xG^Œ¾žÞŽ0äχx¨hûØîxÒ1•ø÷æ¯ZO»œÑ 5L©ðïß)“ªmðÓùñY†ç}¯8‹ãCTnã¥ÛÁ(ÜAûÄiFXÏ}› t‘“é 2&·Þ]†Å·Ïk!ç\ÔÁéñÅ€á˜&fÂx–³ûº=rñcÛÕ½Ö öRC¯±&PT~Eè¶;¡Ž«°ÁzCp,#Ð\º\„gpÈúYûuOçþÏ||_Ü­¦®.r<ÀßnL¿õ øÂí¨yÝÌýy³íê%¹…NO6˜zVJÝ¡ðóÌBÅêÂùí$eáù-6Ÿ½…dâyã)ñ[)|¹#òà ±‰LJùHÖU„Zê~XÃõ@lßmÁV޾ªIëf¤F|ZSiê÷·Ókò0 ü3s¿‹Êª¯ ®Ò‡×©ˆ•ê¸lÿ½Ýæ8 ! ‰Km»CF õ–äC‰/м*š;t6Zœãr½Ü> yÙ>ø’@9¿=M›!eðþsvÇ^c;̨"O¦lYÕvB1:<©¡…=ÖÇÈèÌ.‹ë#c†'p a«;q–jhøFÅOÁÍ;<£º 6 ÃöSÓ‚P÷Ï&¼F‡uõV”»›£H‡kL¬‘¯xÁâ\û‰ëÈvÓ)²ž¤é2¬H ¥ªë­Á®Úøö‘HC÷ÇÿwÎè2¿Ê¨v`z÷×+XyQE$eÛX²kP¸Æº[P̽—øÄ˜ƒ"ú½†ÑϘ?÷#oyÏ@fD7Ay¯*)!¥R°$Ï|÷¤àPúv©êZãÎÎkÉáC#ªdK¯¬‚Ø¢HbnçÏ@å Ub*î™_Ê)ðh*®«ižáõב1E•Kùh¸É>8ñzYŽŒŠ’š&U~ù·g@èç¡ß´?P©œ*¹æÜÿbǧ¨è—ÛC„À—h«ìÔõïDÛY=´qѾ£”„cÄn²Ãá9ëKßô¦â 'òeb¸ (‡55åsÑ]m+·fÜöh|ÑøT<ìEk]hÄÐÑ;öaƒ‡~ä®Ï­«a#f‡UÎmŽòÿ];GAà{®ÚRp{±–Ô‹v‹Ä˜¾”H¡F¤×Ýðwªi%L#ñUã½4!ä7ˆÁë5V£?„žqŸ ãÁ&«dò1ûºíñå„M® ªˆñ3Cìy2Tͺ>¶þtþ²xÁÚ½ØÿÛh"»îÉNS·¼õGÒçÖßLt´bŸ`gB‹›ZçìFeæ.®›Tm7äŽr?R¯¬¢Ï< W¼”Å=…Ý ¡¶{Û¡Ó^5ôPŽ´p®Ä4Šqóg¼ÉŒœO`žy½ôÏe\È O÷kf²çü¥ëïŸ{ÙÁâÂU×Oû«Ÿ6Nª1ú–ô?Ü_îD÷÷Ìö(PvìÖ³óGï2Wß“É#cX~Á@â¥IO55 Î3ÙêI C "Es3fœõ@ÆG(ÛgeÙ¹(ü媓²ï1~Sú&ªT[9ÈtHˆúV‹£noþIÕUiBãñðÖI*×M¯QFM?¨ódÄkÖß{ê1Ì´·\4´yYo­oˆ@µ—!IúÎöN¾DÚà' ‡v1ƒ¿ÙùÓC=)ù—U庌xq±úκhµù2Q”ÑO>íË1Ôë{ä§µµP|9ÌïŠF&oG2ƒ†äcÀhܽMA¢Y(ýÝ]ÓlI9éœH´t/]Ï“«|t ªxÞheŒ° Q5GDFHAM6º0×úˆSÊóâË6 ÔjtÃ쀑žyVljHúK•—Í'scksIÁòýcáC8HPq\çÆyа UìÞC¬'s÷Yü½(5èÈ^¦‡ÁH«¯v^ùÑß %yùúF¯-BX?¯âSô×É^ƒç‚d†”š—·Ýk z3Hš¿¾ä©ñ0Uc©>ÖÅñ¿ÐÅü¶ R4”,xÙn“Ù3åÄÞƒºjï,ýõqç}±9Πߨ²BqâMCf—_8“M¶PĪå€0‹Š;6<3}öòvYrÌßìæf å˜cˆëÀ÷aôZu¼ô~€?†µ‹öÌ«9F‰ö-C £Ù¿À#ÂV Õáz¡Í6½f7Ih‚9£ÄûÕé‡C‹c2’) ”5áN—ìð{Ýáõ^÷qϵ~ÞÙ3ÔµBaŽÏy#ßÊ®¸ß§v„/ô hòwÏftb>} ¥´B*kDaWMæ¾þ]Ƽ4Åúœ”(0<Ê•,üøU6×pø§{>Îy,å`ì¾™Rÿ¡uã?Pÿm‡ˆÚ0‹³û‘Ù§‹9(HÝþÓcµüÞ/Óú2B=hÅàDšZ¬å³}6¢‰èlÁB4+Á3½…ÈvÄ÷•†¹F Œ†"§œn½ºñÝÂþ)d½=ȘCñ~V“ÕXm¿ÀÖëP“å8ßOqmî‹xÂ8ã¹âo45ò/õʾ_ìü)<ùáâüMa‚ƒ=ß?Ã! ëîã_¯†á:¢÷yïû%sJ”ÍÖ˜©¿ †²‹ð+Õ†ò„J¼ì­©ùGÚÎÖÍ^lß2™›Š=ÜV €$O ô}©9_ñ–몵¯ÁaÀ‚È Ÿ8£¡Cù$÷-T­ñ©g»’mWÄÇu€Íö¸a™Hƒ¨‚´º›,©/c‡C™¹ª¬ ‚ØÅð€QzÉòŽl‡®üñSüöß/㣄Øjåqö ¼^u–ï:éb¯¨Êh‹é–Å{Û·O£/þ°¤ ôéÏç™ÒœïG„òžØóáð‡^ë^AlGµ«ùÆBEm1#4ÊD†¡úe8Œm-ÜŽýÿƒÊ6 ê/üÊ5—ˆót­¯±šýã’;N¸Y„m öQ8> ¾½}|M3^LL·o?Õ/ÊŽ×/M–Ðd¼´¾Èµ$±ÞFÐV+”•ØxêõÝ(ü–Iìø7(³[ÀrÑψ«Ú«o¬ó¹…ô¢Ð&7Wz¨ÙäSiIövq³~ÜÌi;…¶Ï8 ûq–ï:¶‘äò lå&ñ¸ÑH3Èùm'œã%¥ó$ãÃbY jƒiÓ|Ÿ®†þB±÷ù9[Ù×EØztÔp»céìÞR D£Ý! pÖàä…-ÿz>uŽ÷óÎ ØROîØûlýãï0î’K;ž¯Nf…=^Z~K"ø‘µ[XDqRÝh×|àq­EX„ÏS‰8ÊIÀÎCxO~–PjyrJ¼±¦ƒ’Ò-#òq¥8Îwí îa{™™Ak`«ËŸ7Òj6ˆQ¥ôû÷ƒ”¦a‹Þ%-¼Ïåwç£û}Ì3<±¹ü˜RµÛiýÙXgò¤ázÔ8 Ž·ã++üt²«‚-ç &|ñèîÊ*Î’m¥àݤ¿~Ð2{i¡ŒsðV†Ø”~‚²ŸBGÓ=°à?«n-xŸÂ/_9ÔœP¾Ð*cÖXc‡tßÚùù ó|¬”ûô!š´Ô‚Bã6ÿ%«¯Ö„–W}¤¿%8õy †œ½Hª3ÓƒAÑI³§E_çÞÅ›?!G…^»h áõðoý“o†É³_—«š_Oë75V%žD‡ÛŽ«NJ“ámœŸ[¾¼7»¬ R5`C¾~®t<ÿà aås²újмs===9ýyüÑövœEõ]¨KG.§²´«öj½™‚ì]ë,ÇV½™åamâùæGP™˜Öm¿y…9”v¥¯DžÍÙ”çê>œV€” ƒ?ÆóN了å=ˆ§§ýT´°]ø½Å¾z?0¹‚«¹«=Éîæ?ÖÖ½–™ÿ™<]_™û:Èq³Ff)…îÊ®,m–n¡CJ›%X8¨?Õtµz‹s³ä1OÐÎÁ9ç›÷A4÷Ê•õ{”üøFäFÝ:ÕF;ìÍçÏ#âeò’ІñçRyj4œiM|ä,É_3Ñ1§fÈ+Ôa‹‘ zŒJ“£$fÞ¤Óï„àm›"g’ÌžíÙ0ÚØÐ=/`ýÒlJ{½—4òR‡-Ïê‚äDƒ NßjÕ³ùé¯dwº(À“J%‚ìY›’ðA)¢…Í|D`–ôˆ õ6Ä”­©ÚÌ™°y… ™¹b9­nþÔ¹…+­à˜>dUËã7¨í§‚§]½æq³%»müí›f²Aš¼ë‰EÄ*þ„{½}Ëùì-óÚ ðò{A$ѺyG2ÀÞ½•âR¹èbþÙwŒ¨ì‹Ü:Îôcx }5Ò3ÿ<0„ëz?Nc>ÅZ-óOÆârÓUŸòÓüU†Z ½r÷:4ÅŽÙvc‚Õ ­^Ç< “Ю“+´™ï/>$äZ!|ü=Ïû]ù ï·âØÃZÌpm#Ï÷ÚaÓ·Óf]”8=ÀÏâ£U¾ô£@ÞêÂÍÏ© øÉŸaEûÊ4µ•ì:ðˆšÂòÄÞøÒÓ­!"ȱ«þ±4Ù '4ØFur±æøw³Í/2ØñµuOa_‰ÏvâŠ1è;åeø}¹”^ãö¸öÓz®’lœS’<ž‹Y8†TɹLoòa+-♦ãýë­õœOû ¢^sô/áþM‰õ¿8¡µÔdhÂZ |d-‘É‹b0â,Ÿ$¢°YLPÉÇf µ×›ª<^Þò[A¾ŠX"nÄ£Ql–È‘ ½ægQˆW]`'ñÿÂ)ðøX¼8÷»%Ï´pÍpËøfisTÜQW ¨ÔUôpèh;œ‰¾×Š?ø÷ÇV+,Œpts¬igÿe\åòÐ;vУëçšÏ@¿aE¨®ý ʘ!t<ÅPÕ—£>ƒšø™•ì—^›´©Ê‡vj>R{5W:AÒÓAàÀ,qJ©!`"Kâú¶ôÒoyz…¡¿ÁZ ήíôÄYêk!S¼Á«Yáœ0ìèLuÅZhSþ~K:Òñèh{xý†ßM:EJûâfŒ_Ñ?C¡î²õÅ7Ö¶ÙÁ'P¾›{ý¹:À³€¨QSe!ÿQøÿ/ˤ"EN.Z>€Áõ~ü 4jÚ_¤,ÊD„ÕRÒÜ"Ld¥¡~úð÷ke™ø¢ýíYÎ…mNÀú‰¦NµÁЛ6¶ç·¾BE™HOÞ pÛ}Ô²yRÑŸø—Êú¡ y?>±JÂDÙõ®Ys¯í\n=g¹×kÕ¢]Áõ¢be'Ou–ôBÊít‹ƒ2¸Ú÷{h»¼Äáö»ñÿs‰$@q^â´C7wU]`XGþiS™½e9Æô ;à=‹ñ«H|š‡‚¡tv†R<ß­×ýû´ˆ[ð2d4ÿÜ{ïýü ·Ù&c\ùIÊÚP5¨Å»Lζ^R^a÷Kæ>iÔ´ÿÈZ]#îOH¨Ç ãi@¨²—§ 4 Ænк×ï1}c䦪“4ÿÚÓ]Ú†‰< Û©Ze½ýûHs?B@HòùBxEÑB;"÷hQY×Ñ]M¨,Ïõßw¢Ó(Ž¿ïÊ3RöHȧüj:ã›W'Z£öØß|DÞçån©öΟq<Óž¨®ŒùØuÏá*ÓÜü‚“yé[ÖKG;™Ä1Í{t.¸ˆu|±Ö°Ñ{–ç ŸŠyZíFÈÈîå!ˆ—üYÅ( ƒÈÈ÷Ï_Å>Ý"J:|Îè!W«è«)Pf´»¼Ý×Èqëñ<ÈÆú¡.f3±ýñöû4Öq RP[y§?~IªøX½‡€“˜bT3¸Œqü…¼/Á.»Múušú³ò¦(®QuÔ@d…ôÙ>¶ ô¾±Ó)³¸¸Líå £ö«=UjWë$äWÙõ#so·¯ì·[D¼ÎoïLÄ_ÛÜTŽ¡šïG YÉM—ȨÆ6ıño¼’áãÝú¿ŠËDl@ŽÁ¨©ø©ªé®ò‘i$*‰ 5'Ã"ìµ»è§ÒÛéÀ×h*ŽråHÍ#10†lØ$íOÍ;_¸/\mù¯ò„vªùb¤n¢]ífâß ÇET/²ˆ@úòÏúLƒ±6Dˆ¹ˆKÞtŽHj)ϲ†ñì²s(á!©Ÿ”|K÷³ÿS„¤¬h$—vòýFmWæ™é@Ϻ朷í$$™—ªéŽêŸnç%ýo=Æþý_üĦÓ|¿\#ÌÏ.¸Èý€à›Jßh|;ÙNúy1Áݺ[Ρ=5ŒHÑ|[ÝŸ¾ˆóÈz0ÿئ·S?i—9Ü`ÎZ¥,H˜ó¬Ê®Ã«#Ë'SÈà}èî¡ò1Î1 én‘öw÷àí´ƒO5Î"~ifdo§ „1SÓ#"…š}®­h3 O¦©ÅjÁ= l àlƒ .“?0›Ýq<¿9Öc´æ@Ô]òslïÓù ÅyþÚìzÃtœ¦Ô3IBÁ‚”‚'Öûå÷vaÝ…þFÁðg¹ \'€NQ› òÇ€dˆ'§š†Cð¢Ù@!û_Ä]'ݸ{=P­µBÚÕ§¬YŒÕ—™«©Š_Aêh¨Ñ]`6Ço4©?õ” ƒ:®“#²­He<ƒðžØ†í3@U1®äÕ>¿Àe(¾=XÜÞvB; 9jÖ®SÚe|€â’¸<ß/ó`Û\ü;LÀ˜[Àý ˆõ7hŒ¢óÍÒ¬q«Ô·©­?[Hˆî6f7&-†¿Æ„~ˆaEm›|Ït‡5_âXÚg×ÔwbŒ.Âívk2ÓÐëµ+ÁÅd0‘?Ÿ¦@ò1¸¿üØ\.e ¤Gÿ¡Œ2Wü…soÿ7Ç/Š*D»¤eGVHX &>0À^ãg—÷|òCa_t–{ÌáëÑÓ\†½{Ô‹´ÍG%ÇS¥ƒ[ú æ¢eÊuŸº;ŽÖ[™×q‡jÞÅÌÙí1o—á‚*N^ŒÊÂæ›yV‰ò¢º[  Џ)þÏŽóCšA¢Bk—ûØ‹¸÷ŒûcöêÊEܳU §k'C3C•õ$ðx»}•'nûÿ¶bžÏO_§wß|>·ÏzžtמóÛ:ÏœU÷¯õ.ëÍ^[»ºe5ÍWÙÆPýQTB÷¢åµ®©g™+EçxT·•©ÁÇ?!s»ï¿ô÷=ßN^Ô0™vQ±3úŽºïš"§†Ëµ‚=¿_~+'ÞÎwÚ0wÙ¡“w.ÝÚò+þç†eŸž ƇN?géS店çݘi%š·Õ~|`8怠`£ßá×óNimP^Wÿ˺àâê‚Ü™¯®ø»mö©blˆ™p6sáÑäŽsîc XìzOg<;»Ä¶QàÅ›W"²se7¹,X»;zöçügK÷NõSázV~nÕüÂM;^ºù}ßÙw­è•@T÷—¯Ä¾¥„ŸXa0ÿÊëoÏä>¾sáhµÛž¬[¹ë¢¥Ù¬Ô‹Ü ç<7]=ÞZÍì¤ñ1ð^rö©‹GN.±ebÙÕW¶ðõþðe QUù—O¥s«=w¹æôØ~ÿ65µw;’ù|ê–˜ç-cŽn—;j{ýýé7rþfnÌkNg~ÚqÕÿ­Ï>»ž e®¦£u)Å×çWß¼ÐüÉ$¼Ùá¤@Á¼;··¼ªntøÕ¾ßoýY°£ó—ÜoùœÕsæÌú½¹¿€á†õ¶¯Ç$Yü˜ÎåÛä£ÂÒõø^=o=ä{åû EU­9]³ýY> ;Çó',jÊ:•*`ÀñBÐÀ–ÁVïØu…1 Ʊ«9\™”XäÄg hp³ô0htg™µš€Ô29ôw4å˜ÂÊäÆ0ÅÕt¶“Ë ¶Çþb9ÅĨÌpjÑ,_E^¦* ¶ “jx™RRÏ.›ÀÆh Ôö¢Ðp[ã&‡ ›V¤{47ȵ}Ù!ßì©Àâ²Ys‰£C?P[ULÏzÇ:L tVݹ¤°Àýmœû_ušusïç àéêç²Î)¡‰aŒ‚Q0 FÁ(£`Œ‚Q0 FÁ(Õž  ././@LongLink0000644000000000000000000000015700000000000007776 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/download.jetbrains.com/phpstorm/PhpStorm-fake.tar.gz.sha256ubuntu-make-18.09+disco1/tests/data/server-content/download.jetbrains.com/phpstorm/PhpStorm-fake.tar0000644000000000000000000000012713352651520030477 0ustar ee5314df51bd0de709be4128f55946b468c291f036c850931ba0309f94ca47c6 PhpStorm-fake.tar.gz ubuntu-make-18.09+disco1/tests/data/server-content/download.jetbrains.com/python/0000755000000000000000000000000013352651520024754 5ustar ././@LongLink0000644000000000000000000000016100000000000007771 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/download.jetbrains.com/python/pycharm-educational-fake.tar.gzubuntu-make-18.09+disco1/tests/data/server-content/download.jetbrains.com/python/pycharm-educational0000644000000000000000000003406613352651520030641 0ustar ‹ZãTí¼upÜM“çÙb°˜Y-©-´¸¥¶˜ÉB -Ébfff‹, m‘ÅÌÌÌÌÌLëçnv&6vgæ.âÝwbïžODwVTUtVuvæ¯úo1þ÷ÃÂÂaaþ±¬ŽÿÁþ+@V60';+„ÂÆ daý39þ k898êÙÿYŠƒ›µ¡¾É¿?ï?ÿ—}ü«ý?[7S={+F#C'FV&&Vf}3kfs=g=Fc= £ˆ¿âÏÁñÄŸ ü'þìœ`VV0+øOü!Våâý?á¿ÇßÐÌÐÞÆÀÂáß›÷Ÿÿ*Šÿ+à¦ÈÈ–FF¶@Näÿê5ýÍ?ÿuþÿK/“­õPñþó'8Áà/ÿÙÙÿÔû¿ê?³pü©,l,ìllçÿ?ƒ09 Td¢¿rUJRTñõýë…ÿ罋_oè!tûâ¨dcìè¢go2´Ñ7JYé™)éºÙ ñ?¥D…”]½2Hz*]n,›IãNÇéß„¢}I* ¨>ÀBÃ"Æð‡á¤îò¸½#ã$©ˆŠê€ è·e#@øÍÚë‡*¬N£ÕÚ2bVÐV’••šµÐ’Ó”Xí.OuccmbBã˜ï£¢¦Æ>Êu¼øzf½XÆ4ßhªÕB©°Xúoé>ÌFwm:Ü£!M^#=µÚÔyjƒôÐÒÏœNÒºCúGµ˜š<µ5ó¯ŒK§GŒ©äž§3k¥í+– Æzéþ¥¸šUžµ–‰Ͳ°KD–o'\–òkk£à§ ÝS~âë6]€Ô¹¼þtíÃ<šõ¼WÛà ?òa!9`£Wõ\Ãïô9ÜEªT.«»«»»Õz0ZމÐX7Ev¤`‰êµÏ3·¥÷a¨õ=K8M‹ÿÉ{Kf]bÂÎydì+R¦%^ÊçIxk׳t,e¹P%ô%@ÁvrÚÕìûH¹³¡¶†;›=ö‰p Îä ¿/8ª¥ê0ä¥Z"( – Õõé5 0ìÕÍ’Æ@“Eo­«WöíY±(ÓŽ¶¤/o¹¨|ÇksµÇ’&\r%⺃ðNplï›Òº¸¥ö~F†”0s§³²X½~6—Ç)Üu°¬ê½'ÿ¡­D¶W:X[öDéÐy5¨ž ®}9Ö'`¯j @¼»va½úå³ÚfU¸û ­ã…ç= oKµÖi’O¡ÑÛcUtb‰Æž˜Ú9nÁQ³³ï·˜Z ¬Íª×ûìî5ÏÖÖ; Þ⫪ ÆÔÞÏÛ0{ÃAH[½ÒþéÓÔ'[}cÞÙ:X™arKè4ûcê‚«: ‡9“·a³˜— =Ë…e¤†¯§Lž9ïb1óÀÁðz¹S-\ÁàÎ×]#´À´B·Ú¶\nKZ¬õô§w3w$Eý q9m‚çV}ÝrŠK+_^»›£¥ñt$©µQQS%å"Ñc£ˆ›¼Eÿ>“¼_±»ÓIÜ¢ÉtlWŸ«lTá±æÿ€Å— Ÿ%ŸŠ¢P2Òß±«FèBÖÂa¾ÿðó¼Ÿ9ö^èohVÿg'cü J*VØZsNü#Ì×òhŒI{$þšßWâP˜ÂœYƒ S”©‘Ü 7o$ÁÈ+-^ýOÜÓ³³Ð›ï”Ž$ÅÇ/ž_ýBü|øVñš9^SI߬“5,L ê[8ÚÏäl€ OÙŠ’ÛïcM k,O’8dm"÷–(HÙ±ô­Žšµ>|Ívw3ãm§0qÑF}«kmù¡ÝÙQ'O§üUnÙêB´ÕëßááÓ`S“¦»«ADᘙ PÈÑ—\Y‘T0)2k­ùÄîT6¨>Á¥äK53&Ù¶×jó»«rû§gA®ôÕA/шh\aRœ¿–w>xæ~ƒ½°À‹¶OŠugtÉ52ü›_«ÏpÑ6¦¼á{-ç"¬´lÞ½ix‹töïµF¶ý m€wÈg³Å4xœ1"žAGÞKSÖÝ.ÈNoöµ—"åÄbr{p+<:õƒØ+òóöζŠ˜Èø÷~'…a[ ¿~;Ÿóiƒwã;SµíGI•‡öl;¸ÍWÛ±³Ž’m“+`ŸO›¡:Õ7•ê-+¡?ô–ÇYf¨yåoòŽ ª3š¤qcíò+hG¯¼R“ßᆞæ\å½™‰£¹¶Ûar+bÐÄ*c,²Lpr( ¡wa®Æ}ýÌízòÀƒÄ…c•Õ襤ÜoF_  ÿîòw˜·ëKëÅdë©¶pÏ»$ E2—ShåÄ9Òú³ŒÃ?»:œþü=tžkù¨!”λþ“%í#i½Js¾i[¨ÑI«¯`Siû³{˯»V<6Ø>“5Œ04ã$æƒ÷´%oŽÔ1i@TTZ—~ÀÞ–·¯N~- ðb -Áç"ì òìÈã!jæãùyî„Ç‘¼Ù[ÏØä:µïØÏ[«Ä‘2”·Œ g«Ã»½¯/™xÇÇGGæ1¼¦k Šˆ‚©PI$ ²QpŠÇ`W$­sb‰‘%Îùç3} ›ÓÐ ¶TX î=Þ笽…£óûWX1û‡¯Ÿ›ä.àaF$9ŠpøÏ)|ü’.gÒßÍ׺B°>0u*dSd‘iwÑlóŠåSº‹zxs‹{Òi­ƒKéÓ ÕÊÂïÖ¹ŽJ>E‚C>9ö4Û†^Îg/ñil¼ÎsÝìæ©ª¼qÿݼúh«Óó´T<,Åäø–@:v‘;ËÍqœ!s¥¬êíêUiQ 4!¤üûw"¬bÐ}×$ôÜæU«ó\Mݳ4¿\–‹‹ÃUw ï‚;¬§g…\»øn„Œº˜ÜÅf¼ëå4·ÿ(:xì¡ ÁëoÜŸ£{µ}j%ÇÆORv÷y½¡èòÜ›}2ÄcŠ]0Yâ~ÞÛcyPt¥þ€’¿}¢Å xÍ [•ÿÍ]ì ÚCwÝéè·‰ÖÕæ¯¡g¨·š§ÑUéŸ?‹¿•%Cñí‹÷`!årцR}嵤Þt-P” "®ž)whz¸‚;u—ê{‘bå §1½Åsç :Ý]^÷C²÷FÒW¢~¯Rš¨§KRð‚þD¾§îãÎÿû~3¥=¯ƒù†B‹ÇØk…£t–.‘OL°o¿´PÌ×Ö¢–Âõáີ ÷ÔÐ7.Ð+Ï윉öà ðõút1íPiotÛ?46ìDÚ"éù“êà±ÁoZ3ôœñ¥ Œ/d¨’v2Öò9‚4òCñšGE52'Êø|[-G†2Çh‰WæFZð´þ¸¦ Ÿä¸¹žÍ^Çó|;½lõ\Šcúhœÿ ó~’Ñ\”`0Ä`àpv^X4á\"@à‹Ê Ö9˜¬]ð­•ÙëÆo¿ í¢-hÁÇüù¾ ëvѫьüÛý%Þ#<üW~ÇÊä²ã¢¨¬º’E” %[ÚìQô'âp”8ZÊpDCuß/ás–Jð‚›J žÓn:¼ÆÙ=j©yö†[k"›mÜÆkü1·©abô<ë!Ñ*äØf¢ÇCômÎ=>ª.Þ)îâß%ê%o{ÊÄ`ɪœ"ˬžxÙ`þ6BU2Y”àЬC³í§VrB Ø?÷— Î©!µÃ©.›­ÒÞÀ°˜¸µ7~¬·rjþb¯,æmOò’ÚÖ‘ôÒ=mÉ—õ{]Çü›B5O^ó<üB9³Lv#ňÐåÏÝXR¡ïã䈃ìèL±×¡0a±4ÈU¯Ìni)70õ‘#X?¨MÅîÅ—ªÕNI…04ŸL\¬Øá¿TþØ}~”šbâÞ¶ÝܹØ'bY|c3Þ$¾·w¯_53ÅVš m~ 1©@¿ŽÇã'xJ¿Y™dheE;{ÜL˜]Ù­®ÑÚyщ­¨ Ü´0Ô³à.¼v›†’fªni7uíУх,O½!Œaë²D~þºjÖñ•Ð+ ® ³ÏFÉtÇ"^ó°[JLÇO+y‘f{8¬7)æ¶X”݈xššaxÛéߟ ¹avê¿]SÇ!AÒÙv;?/!P$¬*ÐÒú’C5Òx(eü6¥ ½xÙ?Œÿê>`oˆy›~=²ÞzWÇXlÖ-Í[lôFŠ8-ÃÒÕø»ô_éåuEÆÝ3ú4Xñ0çàüÅg›‚×±åfÅ,Yg½ËÚÍr3°À­4> n>1:N¡¬¿%ŸEˆ:]¨†4x±‘ˆ€ ´ltçJ ’+!„E­VJÒ´…­A”%€°ôÇW<0ÔôM< –¦ö¹Q§™3î驸Ýe„ëqZÊi ­:y³½³Ò{h8õ{ÁË/ã—Ïßþ—ªW˜ð}²7… ¢­àÇÆÅ¼BÙ,Ã¥.Ð'¿Vû5Å%)Ç"Äá™Ešu5^Ûf±,÷…ï„C<Ë­sª÷2±C²™¢k.úK¡{ÖNÝE2íØ…ÊÙ‹,n½—]L¤\2lÜoHâg<ï $laŽPÞç¹È24JçƒáÆüdû¹÷m¥gr-ÇÍùû7ãì…ªöòT¨<°>´Ï”ñ‚§âƒ–Ö F MèĘëúã’ñÈM…ŽdûÏ‹»oq©¾4rÅD19[…!YÎ Q÷te6×ͨùƒ#…UÆ?ÆØw$–Þv#Êuþx ”}~Ÿœ ÁŸÙ`¾KáB`à S¦Äô1I¿+ Sfc±ì DÂ@ë»=<:{¢iÝB&ô:í8²9#;¾s%“b|¿Hâbêù"ª¬©ˆ}žÇ%Ádý‹¢ô?ÿ©Ýn÷´k¡ mP2¹-h@àãýÅ">EÛ¥Éì…“–øÅ…D¡¼U)J´±'ég¡µ·`õ±šš--¤ SK=ÊÔ¯’@ô57o±†°†$•çâ Ù~«p)9‡dïqß{ô—{5Ò÷¾}òeÜ eÙë.¼¥7ñ½·œ÷D´ïöúµ‚%nž€QLË6-ÙBiY]H]H—Äé½§3¾í¿Ÿ*E?¡ì¼Ú,ôãÌÍÌ„SWÃàÌfˆêÚµI„ZÜ0ž'S¯ËÉ_/HÑ `/ÉIëÏ-wßÊÎd‡åê¨ÇÊzLñÁà„ …½·vÚâß6Ði*Zyâöò,;¶WÒdßR޽©2ÐÞŽ8¹b¢s‚Uzérjé3 ªë®>Âñ:Ûï`rlÑx{w-ò·V·{9Ç”n"G{Y/»oÉ0¾YÖ%ÕñàJœï"“Î&I?$¡Ø–·ÌW6¼‰Q`¢I­ìp·¦È’)'bâR—‰÷ºÚ6+=¨×j9û\8`Jþ˜= ·^‰úÞFéñ ®d _÷üô¨³ªþ¸;$žn§…™|N¡­Ir#î@C ¼¹”zî9•?¹[!A[ÖY«âH&Æ„áuVìRqBÍ&°È¢zÉ´Á‘<. à—ä=Ó•Ï¡D$V+ q‰3wÍ^`·¹Ü:V$˘“Ù xü^àMÁö¨EŸøä!™$Í7+ªyÔš€'Ò ÊÆúàíwRÐgÝüÓÁ¢ü€pÓË$ ,8‹ºn:NC&-lœ`~Ñ:à%A¶-êû*|*”+ŒØ¦Èy °9[îöÁ@g|YrÊÏ.B/GQžÕv›ª îá#ê7D¦{ïÛÉ[¯ÞZ“bµG¦ß( î³8<ÜÍî8ªT"º´„œr¸„¬“}¶,eÊ.1¼ìËY- ^q¯ßÍCqÁ1d|ÕÑ´nãÒ¬»&ýö©Y|ÁspdiyFH©Ö”×û`ªŽ7+ |Íâ);£i;$'è´¯ ü² s4Â…‘!ý=‚?¶ÏŸŸÔw£Ñ’žuø“1OÔ9Ç.'¸ŽûV`BEø&›AòQ*„Qóq¿µ­*šÔakðŠ§µ‘Í2Ä+HZ{S®ß¸JƵÎVŒÀò; œýèý #ú" Ÿ«¾®€g­€×©?q: Iµ¤v(¨•4²¬nxúcļøêh&Ë{íäìiÎJHNk.·RñË ?TEò]!¤cŽiS>\ëß9®ýÁªçóä¾…3å%þíU¤«cÝõ²¡”BG‹ùD!ñ=>¡h |Ùê‡Xœ¿õj{$âì½@»k–ö¶ÇÔö³Öý°Cx&"ŒEËæ{ús¥ðv³Ò’$TÝXãŠÕCGI )“äVe‹œgö<5‘ã†z.<ÅÂçàØg”T=÷vu•¶ÁµœÙW §>WbfZ¹!œ€d¹òºcÊáÙybšË›é`l¾,ù1ô€ÓÙª`(û¡O“|qc­ ¢}x'¡ãîa5cí±· =BLüFÜ"ëÊf%I‰ñU­$‹p“¾KŸhnú7Àï~³ÔÏ6‘´(w;F1pjWeÊ­ì‚>¢ë׿:ú¬÷¸²ëH“vÔ[Q.^eùºn] +³Æ6@}oÙ ì,z|ò(Öí¾X}¬àëyöÃ~vr=Œ—Ȱï¨|¼ 0uô?úÑx˜Nú+ýø-8¸ÒÍFpŒÜ¿³·ƒ!~éˆí*m0¤»)C@__‡C16}]JnsŠ#Ï~Š›.½f7ˆÌq[É Ø‘K‹§M}+–-iéK¡}ØÐyâÀÿÄG=ÊÉöe¸„Œœš÷w ¢U!¶CTÏšø†óG–0Mr|NôXêYÔÌâžv޲F&J‘ü& •»…„2cFõ̪ÒÁM«ªמ­RŠýC.GRGM²rT`âýXTú˜Ì|Iª³~Ý^ÈÖŒì–eåÌ]<ÓáøO„æSdƒ‰ºµƒø{Z J/yün3˜èNÄ [)ä˽£û¤O"^}ÌNs &J…¶ËûÂŽƒØú<›¦mM}XVeú‰G */ì#.Ócƒ°gøÊ›áj¥tàu8æÄ=Þ8ä…´w3¾èEwG 3aì‹ïûâ$RRÚÀi`Ž˜]X JÔÀXžœ±qiDaøÓ0˜72¼ßõ”𮨨„uÜ~}ón˜êa8Éew²K&ãÀsV´g,à •ÉŠSå- ó¼èý„oFäÝj˜-OBaNfrèF.¤s–²¸Oækž”63(ƒØB7ñH{tŒ+¡ÒÑ’Ç·s„=òçœþô7m|H(ÆÑµ :Y ,IJKÝjM¢ÎùÞo)²óØ…ý²Tú £ƒá·ÑˆïýÚ}ôI€„¿Õm3!­”’Ú¬ïØÊeÕÿ±ž*Fy+†°Äß.ŠÑP´y(£2´’Ë]ý0‚7kånkdÍ“Ø4²‡R…Hsêïý9Ö¬yOXÊ:eg |bHóÞ|îø7ß×ožå„ëdìºæÐ%0’sþ©2³¹&’ñ…[¢”;IÇ­c_=ñÕ›hk‘Ö5ˆ$$(=Ñ´PD/LSS;PFEöõM°xvyñg«KiÆ;y‰ÇBh$RèU #¾3Q&·qüôÛí©‘Ù4 1åÿ–™1jŒÒ\rÝa¢¡‘Fü\LK0P¤`äþD4a¡¡GMA6ºR 0ìÍ  p ذj1 ©í4M 5ý<‹õ‘gÙÌË„ëtÉ=Ô8tŒ?ÊüdH?R—Ú<»Fõë©Íq ™ÈÝ“)Q6âˆÍ8Åð{ÿì%ÙeJ¬e8„Wž¬ðÊ^ÔÀ¨i3€*f"šs„îºV=‰ðŽZ>6Äö›¾V;sì ?,_œxoÿ &½ÁO"ÖŒm%ƒïî©€.Í?Ï’;y—ö°BV‘MÆ9»ÝèFÛrULoçFc®Î°ù6FèkæKÞŽòG}»x·ŒDá”NÝáIî¯Fœ!±qÆ&ÒÁÃþ1Øç¹&™3Ò¬'fÓ’Ÿ¸¹)À‰=oˆâ†È%•2zm/üN©’ZÆ·ÛñƒY’Ÿ¦5Jû2©:Š.NÁ¾„I¸LÈÄ6‹7þíþîqDøiA>Ÿm!q@FUœE× @%-*ø‹<Ù0½qÊb¨¬¢zpbü^ úu` ©Ò‡¦bϪf£.¸ø—ÔxòØ0X8¬BÜœ’~©È,‰ø²5'ÐFgtóøàÔ¯µ22†/y!?K´8wãn;ÏHÃèž™HôÙÐò[‚ eפqÙ•Û*òèÒÅ]0×ì Bê±nòG(vRUF[\ò”t ¹“~ƒj<‡\x¢€œVÙ æé4c#SÂHáÎÌëé»÷Î$éŽà™¿Û®f;=‘@›ù Þj?˜ÞÁH ÿÖ?”ÁýóìÒ§- Õáé?É^Ë.gØÏ·°JZœ{Þ¬µàRß¿s‡™«“П´èO7oN2‹w~¼1y/ÊPë-ï¢Ø¿y"®­O7®òY6â]Ée¹¾É«wõUƒg¹»špî+‡3—Ó™~HÔhzÂRI”±0ï³³ÿê<1büŽä¹=ccƒšßÁØiPÑù üЗQ‚Ÿ¬éw†,;¯'²þ¾*iêms5È;û2ïçfñq|ú£,qÖP>ưQw¤~Àx^ŒÏ[4ô‘±¥c9Ò…{\bš4ÆÏð9foÅ©#ŸKæîH7ŸŠ5n¬ÎøHÇ8Êß-à”¼Õ/UWæŠû$|dâ#ç“ñS¥¾ |ßÔV+¬£¦Jí» ¡‹¨ ”³ñ.?»x]Áî]*üL÷Þ‡ÅöÔ!Ó_È$þwmâÐ?îð%âj¼ö* öKàrVÅJy&å'X–Xø®2ÞÕp$lá£}††öœžBŸpÜýü¼«lfþëîµc;,ê‰cNñœ ûkÉy¦=Î]®exÖœ©Bú›øQ jŸ~ÊÏ`.<߯“§ˆ‰>&åΫÁÓ€]ÄœÜ@U»ßZÙ©öè¬â{$W¹t@Y e! ÿ„œPöYš|Û¡Ý;|¶rÏy©§‰ÞÇ®„jB £ÏýIC‹«§>‘HDy.ï–’_ÇÇcyÛJ7Ãñ;N=Áw<¹l$›ë©ŒÒŒ¤ùH‘Ap „õÃá7ŸÒì3p°óB¥r2_À{´WWQÖÉ­Ÿ#b¶2=6È™ˆ5#î’âºæ@s!¯”°Ünš¨š1—Ëò:Žu޳š”õ7™úŸµÙnÄ?ÅC\zkºh”ƒr Â4 ‘Ñ=éª{VöË]zã}]ý“B_д‡8ì°Ï ÛÏ<ÖϽ¨E| '9ó8¥Pêó´k ¬kÆÂMùeYcðÄèN¬÷üL.(ž¶n}…Ž`W<án~M £›:D91£“MsÊŒw•ö“™DŸ(©´*ªé„Aš¿%ÈÕÒ Ñœ¾µ’ ô]|VýA~µJD¸Á^Ïÿ씽kñË£z?`fë»?§ì9ØqrC^¯I ÎcÖù®óœQÜçê¡¡Ô/¹MfQˆZ’Ö-–Ì%™5Æ17o+ÍÀ>…:Bø>Å.FÀ¤Myñ-8{¨CPÝâ9m-Eä çö“!|ÇLff²¼í,r(ŽDxlIvDR¾Í²¹„¢C*ÆrƒÃžåÕw7ZŸA=8Óþr `R*i„S%Hgè“8Œ!gäø©‘–M£Tün9°•ôfç©°-5äqØ`‚Ùí›)Ë®>(Æñ[_[IB¨ëUûÚ§‡`IeàwÔíb…)h+R×m°"S‚[U \ŠF‚9Љó¶3&xmàr±Sûð–Ø„¯ê}ô wÀ¤%Æ»ÙXáš™gç2T}¡âAnÀ[‘§nFú|•‚!à‚NÇSòu`lÎ¥Aó……Ýá˜&hcDmhÏ5W$0£"W‚¥Ê¨Æ~ØóÀ²5äœ:Æu2Ù€n_Én¡06hl\·»ê X6I¸0ç˜éµýO734Q¹âŽf$ncrBíìמ]ó(ôå']Ùéûí4É×°Ö>sDÐr>½âP *&å¡ Uá<Ÿ*~p=€]?joîï6ê¾ü Óy RoHB’{ŸœTvêZM²‚Ùa )ûÇv;µ>EÇIúoÂåúûêÄðÐ6¥¬ ñ˜.!c³|õ\úælRÊË~ØûU¶.ĶÖ½#× $„r5–Zƒ¢ ÐçZ­x?,ú{1Ñý›!Y½ùd¿#¡½çx "?Òªr±˜/—ÈJ£ãM7/Ün+掇¦r8ŸÖz£LÂY„Ò»€¥8‰2†Ž”›’›íCS› ¡/ƒÝÙ%ò$Ù¢ód'ôï%Ë­1dî¢þ/ß4‘K[ŒYSèRgöN0h#2Ì%»Ä®ù°²éÄ÷³šD–{>Õ×Õ†é€îõú‚RJ¡ë‡:0/i–ÎVLYŽ£bÜ+u²ZôÚÎ(ëœPž† æxʳ˵ރpË‹<âiÂç}8´Û•wrz ž¬‘¡IÎäÃpú£6ZqÃnPŸG,ð5(Òó>ìÀË}¨lÒ#bo4ë·vd’«Ð§C;r¿†ÕÞ2ž÷[BähGŒÇÍ×6Áj¶ó8Îâ KUõ!mX~Í·8ÀýUh>hy+IÕ8¢Ä¼*ñH?Á‡˜åvõB%#ÊÀŽ” ‘ju xÄUv;1À||YàbxôLŠü–HDÕí–¹ùí.eð©¹Ëb–)OúÏ,dœwÌè*4ý TλŸ(“SD¶©T:æ×gÙªúÈwdXÞ#þHMcŽŸxç¿î V_¡½#~Œ´æ}àžïÐ4“õ}×,­ÔÎËÔJD¬Fί)E;,ë(Bh±ÑÓK¤L鑉VVŸÆ&áÛp`@ý¡y€ÄT× 8Rj‘2R1ŒÍÀB–5x‚“&eó{Öy‹¥öûm1ª5Á£P‹²> ¸Ÿ“,¶1çòõ0ŒÒn‘í0¾W}©À¨/!üåP#\zŸާ&”ß»â¹fÈf-ʼn¯.Á¤:Y¯y 7‚J,.гkZaÙKÛh,ôñW‡©Û¾|§€.B£7•à=ïPԄ̱y(ßáXVTŠ÷KÐú“¥¯¸c®˜_sPèÝ dƒý7QîŠH·ÂýÖ‡U?ÈðCLȲ)Ô~¥¬¯QÇ쿟º«¯ßC8ïG©"ö2¬5ëþœuYT±×‰èª¿B‚PFô¡mh/ðÚÕ_§G@ô$°¿S–øvÐú¾¬ò9ˆåe&vÈG¨ƒß©˜Ž6-<À'¸wPºñxÜ3ð‡ÊòÑ iî({pלkR Ö<ØôÀ#n*º3ÒÍ‚HÁ»ƒ•û– >ËAµ K±áº´òíðÉœÚUæôõ×wŒkYRe,´ÝÀš@Ž{ªÐòÈçψ TäÆðS‰´rp3óú7âÜÈÚIxÔwˆ?¢¶we€N†ã_á{»–w^ÚµåcÅBð ]í¸u¸³3l©αÃ-˜˜´DÅÀŒé6~¢§‰ãZS-VM:5^rg!ž,Ïù%îÈL¨úLLØ â¼M¨wFÄûï‚+dÀr[µÐŠ5þúôõÒ˜€½ž ,éàqK†õÔÓðS®EAÁϼ$žI•ËJa3ó±GE©ÓGÛy/:_Ë7ˉߵŒ™ ÆK,„BT$(DR± ìW°–¬ÃrÎèhd¾b S)&c¸b1„Øi;∆DLéRô/3&Q˜#´*Ù0„~ä Efág ÊWPÖÓ$‘xÞp!³ÅÒ³'ˆ–•}Ù±™Çõh*õ²<1Yt®éE¡ÚµÑTXçå]f‘`SÔƒây |±« ¹€ˆÃJˆÛ *ð¢iŠèÙ-3Û¸Ák«¹µM9{oùgq\ù÷®}Tú¶«6›Í¥oPÊýù·Z¤´lå¬c¿Xû`Q†ˆ+?‰²2ÌwÀ·#„@‘(?Y»:í2±åX°œ!‘´/“qçE„S%ö¼ç ù¨d£k/Ëo^eÚk/=òv·E›-}üdÈÅYUºÎ5ï1k!íà 61ý¥_VS_})þUéù@X†¨h$`¿Å—+iFŠx”ŽÑÍ×»´9ZQ5‘°kRê ýGÊä1¥¬Q¢yäàqeX°«“@õîÉTõìb¯®ÔC“/ÓYDKë¤'›ûñþeW?jºótðÇ峕 熿›ÿŒ»˜,{jeÊCÜÆF‡äLd yŽŠÊ²&k¿Ùw dÝÄ[J•qÆ¡½iÖŠ¦(÷kPx’¾…hæì¹’ê0ðu ±;Ô´©4ÑÕ ‹W…ƒ¯„ºÌÌ„ÈA¸8“`ïF2>QE½Ñ਩%VL[ý3•=•’U[<Ð4©fcÃaÔFs©#Û¸dY}M¡ÎñËaøY?ª ååzð@Ïó“”áQÕʱ½ÒÇa!¥¶… }©~[üŸ¡ÿ÷ƒ ü '"ÝñEŒKÅÔNhÞ dƒÑzüÆìá3(’-'LG^¾=–±’›½fÎúá*™Ó¥‘ÏJ·Ñ f—^üy‘î¯2_r=[ë¸aεc‚ÛžN¬,¼O>OU7ÎÈÊF]Ý-{¤ä;à)¥‚%E)KJ{xküu豿ÜrŠÌç:\ùUdÓª§Gœµ{û­e…EÆ®ØQç ž;|œ Àqrå´+Êsò÷JX3ÁµßŽV­ èPc†Þùp XÖg¨[öÚU•į»…”ÏáÄë–ªç¹Ý{nä sŠ¿œ÷&@ö‘á’:¶BK‡Qd›g1Mµ+Ô²­šU)©¢.‘…qãäQód 5 ÅÇ%¢@ED¸@HUªY ò]¨*ÈHþ5Éý 6_%•ž\€àhp¬·-´Þm2;ÈšC_Z¦ðrÊNö~9ª#ò6Æ£ò%f/Ê‹U—+F<|WÏZÂöÛúGi„Sb´ÒwèÌÂçòü©ºíø:ã·gÍgÞ·*ø™!j FƒÕ³ "Z¤†WêBõ~®‘ƒcHh ‚Ê ¡ ¬``}ÃW2|ÓL:±Hà­r0y³p„d67<üxï><Ú7«¡Ìвþ¬‹ñì¥(¦Ë=v7 E9H"g*B6×–¸/uµGFƒ4æÓww.È7i ^¢‘ÁïÁx¹Ù8\XÎmH£Iy˜ŠLã¦÷=†¶I§|œCꪗВÓ÷Õ  dë”ɧßÇÑ‚Ý<àŽ&Eq²òͻһ‚/Ö°!™¬}Oñ‰LF¡h%ü—W{»1–@,_>sÇÞãŸ@óÍ(é&œë7“QK ·€}‘™‰×ÚZèxâä¤G^å@;^éáØšñðŽT0çˆ¢Ž€³LhOøMcrªû<«-ñq#A¶wÏAVä8‘ÁŒ-›" «ÞDh!üË˰ziYr΄mÝ[Ò Ë­-œ],G¤Š38>´25(GW Ïï·I#ý¡x½¸ãðõDRÆFw¶\‰„ïÁå#•yo‘OkÎÏÚN+¬kЖ4ë{ÌÓªD‰7ðÓÊ„¡ø•s´FÃô¥%?ry¯Ï+õ„J¡¬Ç³W—Q„í7˜bi ´4:Ò‘Ë~ðBZžW]¯Âaœw]ÜÁô}‹1[Øú¼iañs$ä ¥ÎÂP,¯<ѸZìJP`bËŠ-,è~D\±&ä¿òñm8~VeóMS˯,e{iþ2£ýÞÞ¤€¸o7VSyE§™T ½3ŒM]ÓUá…'àC´Ôá-P^Œœ'ÌšÓG–.Uš0Ë#„§.²3 ï†kíß’4!èþvΕÙcŽÂ+ÎÙD(_÷R h™Í›i.kïÓ^þX–53£ÑS†R;.Juj5Z;Á£?u¾Sú¸jìßaê]Ê=48/!>0ÖSÕPýBm·G ?ˆ·KkFxY]H¥$CZÅ…bvo‡\‹g¹í1=¢¢;‹4ö”¬\JÚ ˆÅªMæn\O(¬–è’™òtG¡íïÆR׿@ÚS2ì"Gäì\Õw\Åvàùoé*Ô7 Å8ÚLéO›´„‚bY‹¿?òŽ!‘‚Õw‘YÒ…›†,ÄÚ(¤[3Ò¦Á˜Ÿ³Õ ÉÔtÔ`ê“Ǥr¿ KëOD3‡Èf^Y XûÑÅ—?ÖÃèZp´cÜN›Eáfç4Öa·¹p6Ø]Uz!…½îè²°T¢…i«àâ]x ÑÐ,É©ðÿÊð‰JDؘ±e¾j·Ò€}·fÖ{ å'6,øY6× Í~îË„äjí<ž×Ù6TCNc½ô€@'NÄDUå;qxéwJPI´:1¦¦Ú§¦(QâÓ¢¨YA{#îÉóº1ùS‡‘}]0Ðö#õúaÍq£ùÒ/%<íçš+[þZã„@$(S)ò§ÎŽœ"<úÁábÒbB ýOø,´ì~Ìó—ßù¿ \7QØs¿Pј†î-°›Ï×F£šlëÚä§’d­­09`øÊÂú•ÀǾA \3#_íºQ‘GL¿c§#ù–‚¡àæl©”8–æ” —äò_o ž¿g×­ó¶UyoíjRsÈŸ‡L;³VfÆÏ÷ûdáu*jûû+p9Ø ÏˆÀ>‡DˆÑSë‚eéfÌI níD\–îž• k>šrcäµe^ò>°Žr¸»ÇÝ‘™-DýÚiŸÑ„éã)±Ï{‹›äÚ­,£ÌêÞj :L‚ ëún¯ÑŸIóõÞÊV_×ÊlÎ|e˜d-Bs ]ÌÅsLÆvÙàú`ü€¢[v“€±¤vØÉÝ_Ä5Áº¡'ÕÑëø%q¹ðÈnNâǾ´èM•bš‹0¿B¨œòä“ËŒTÌê[½Oˆˆ•¤¡UÚwÉc‡bRiÿ4.øùeô÷)´öÛÅlˆO@‰]yôj–„ªÍ2àBúYs¯Bd+vÈè¤]¥ó°Q™^¯Ñ'댾3q|aNìð-ù¾¬Ø º…£¾gæØ$-3ÚJ‰uÿ(5›ѯ)¾í~ûLÐÒÖAE¬§uDVVAé3#[à&-¯·Oû4²·@›pXÒ¶Rc*$ŽMMHVXþGŒ=NHFT³¬PŽÕ^bA€ò#\¢Ëúíò™æûß/lv»%¨Gjå‹ÕhX •UUá%©bÃ{áa“Ib#ºý7ˆÎÊC;þ\NRž5 ÿ™ôÙIícu·'=€ v=[mýAö"Y]ï ðoíûì §/ËA}¡í2–k¥(!&²¦$[‡½ª7BLÒŽÞ=~f¸g±ß-rzàz7”+[¸c…šjøÝítøõ3ù¯—P,…3¯‹ÚZà¦Ó Sšì)1C™±èUF¼Ñ)\}“æ„Ϧ¸q Ñ÷%^{üXÇ÷T‡îü•Çû4iHüg’òªƒ–Ê‘ÞÿÔRÑ«#Úµ(M¾ÚpÖÕ$D¹Ê—¹Žá8w÷ ÜÏâÝ_òkUšj3-¦œ:˜àçkNô}µ–þçÆ[þÉÛ;ñ=¿æï} À¤ÄäDË„uýÿë$hó_Èÿ¬ÿüÇûøKÿ ùôßÿ·þÂÂÉÂÆÎÉdaå³°ý“õÿÿ?ÕþÇú_Ó„ÿLÿæÿ÷û ìì,éY9YÿÖÿþ3ø7ý?2ñÁŸÏQpùë÷3t2Ðs4³±Ö³üÓ6û«üëZ à__º£“-ÐÁÀÞÌÖ‘éçDkhfo­ge±ÐýÛMÈöFŽNöÖ6†F| dM èß:€ŒFv@V0;P HM ü—~Ó¿f² ¹š9þëÜ¿úÿ?u?Âÿ:ÿÿ±>þ_ÔvVà_Ùæø»þÿÍßüÍßüïä¿·«EL././@LongLink0000644000000000000000000000017000000000000007771 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/download.jetbrains.com/python/pycharm-educational-fake.tar.gz.sha256ubuntu-make-18.09+disco1/tests/data/server-content/download.jetbrains.com/python/pycharm-educational0000644000000000000000000000014213352651520030625 0ustar d79e343c70f2dcf1e929329ff155ce666ff4aeac0d8e672b8922ae8c236662cd pycharm-educational-fake.tar.gz ubuntu-make-18.09+disco1/tests/data/server-content/download.jetbrains.com/python/pycharm-fake.tar.gz0000644000000000000000000003364413352651520030464 0ustar ‹ÜãTí»ul]Á–îyÌÌÌÇö1Ç|lÇÌcÌ3333CÌ qŒ‰)ffffff¦É}zj½Ñ¨ûͨ¯º5z÷'í½Jª-­Zú´ªjÿñÙ{™8Ú0ÙÙØ¸ØZ8{0‚™X˜Ø˜ -l™ÿ$XXX¸¸8€#+Ëÿÿ +˜‹…“…… øwÌÆrü³ðáâälàøw)ÆÆŽvFVNÿÞwÿ»ùÿYÇ¿ÅÿŸ`ÿïèÿÏÌñÿIVö¿úsrr°üKÿÿ þ=ýÿÑÿÿsŽÉÉü?—ãèÏõèÏÁõýYÀœlœ,l@6V0;+ÈòÏ)ñ?æÿpý)Éÿ‡ÔN戈 Zc G[ ˆ…ŽÙÒÀÕ€ÑÔÀÊÈhàhd´àü̉ˆøß½ÜñOæÿMÿÛÛšý§rüíN0øßëvvVÖô?˜•ƒ…ãýÏÁÉù¯þÿ¯ BQ^‘ð"-%¦ô7úÿã‡ýûî0ùœÅ5œ•íLÝ MÂÆv†&@i3%c‡!>€ã—´˜°Šûò©\q_µÛu+±sÂù$]€ü»p¬?qå'hHhøÄOPœÔ=^÷¤œø²U11]ÐAƒöløpXûà`ƒÂE4itÚÛÆ,Š:ÊrrÒs–ÚòZ’k=(ïìlÍÌhœ ýTÕÕÙǹO—ß/l—+˜û-õ:ÈUV+ÿ·Á‡Q¦_3¾‘ÉCU‡ÏxX‹OÕX_=W}ú"µQfxùWNýÓîz mÞúºÅwÆ•f£óÆt2ïó¹òÎ5ë%SƒÌÀríïz-ëd£V9èBë 3nk…§ .“З)ýs¢Û(6}€ô¥‚á dýÓ"ªí¢OÇðªâq1`«_íRÃ÷7ä%ÌUºt>«§»§‘§Íf(jž™ðD/yn´P™Ê­ß+µïA¸í#K$M[à•5³¾A÷"b Ö Ó ÅëÏÜÛy:–Š|ˆ2ú2 >²P'ízîc´üÅHGÓƒÝûT¤gjH€¶Z¹&Y¹Ž(òƒ5òöüñîaMc¤Íb°ÑÓ/÷ñªT’í@ ]6P0…XR¹ç3†±ÞçÍ•!Rv#꾇$4qð]ySÂZë0=KZ„¹ÛUE¼Ñ0—Ûëf†ºNDÎåÑ[à€À^2×' ,‡%w¦|ì:ŽR‹ŸÐ¹ïtP3$Ú߸2†\×x⬵[éý@eëz㥂âk«uÀ•0‘ üI‰À²4}ÿ~¹à×ëÁ¡f?ˆœ. ØuòX¬u`g'Ý%9Uĺœµ@qil)7X>UF{ê¯N²ÌQó)Üœ“Ôæ´I&:áÖPOÞŸø¤§ÀŒ¼,¸Ã+ø>3ÇrïvBå5ÿQB§‰;VA_f™âäPD@ëÁXOø|á¦8›ƒ ¥ 5Ù…ÝîÿA¿½±Q]XsR»^1„³Å"†ÅÚ0i){iE q«˜×\ßLN£'‚oõ J¸Ò÷-ÿ1íÂãvúÈ‹ØcÕ8°‰¸¬2`ÎP°(ïáúO„¯û[û ùtû¹®HRФ©Û9¤JòIãEÖñßêCŽg¿þ_ä^=i† §ómübMûLÒ¨ÚZXÞÑjvÑ(:ÀPÞýêÂòû¡— zÀl=UÖ4…ùˆŠ¶ìÙ:.ˆ‚Bë68رóõ×+¬ç…^M 3ø]E Ù!Î=¦Æf>]\äIz+˜¿÷ŽOmUÿá…õº³N-KqÏzµ9~8øö–{zêurbÇg¾Ñ$¢/”‘B¼$G£tJvGй$’[á\|½0D¶²ËS4aK‡&Gæ9`á{Í9X:¹||‡w|úöµEþ jLŠó—(Gà‚âgLy³Á^þö5üÍ¡™ãpa»«l‡«V»wÌÀ»ò}¼ðã»{¼øÇ³nH= ¿^ˆvÁèM²bl²é‰—ù´J~GÉ/{¸d Þ›w/5•͇H‹hãY¬.¯³Ò‰ÐäÓKà/¤˜‚™X%ž,w§ ÆÌÕ:Ðj÷ë7å%9Ȥ\•?~b–‚ƒ¸§!¶oÚ]ê^e¼`rÜÜœnzËø–<¡½½«ä;%ö£d5ÅM`~*1ÛqÁº_ÏòŽ£'žzà|Þp'9z×;gÖòì.úz­‹­5#ÃQtNµe mx`© |x£‰Åzéoºœü1Ó¹³Ùþ=ò ñQ÷2¾.óëWé÷ŠTþC‰>L„|nÚpÊo|ÖÔÛn %òŠaøõ •î m/wp·þJc?B¼|1ð<ޣߍtárI¯·ÇçqäIîÑDæF,à]Zå|EVÈ)ÐÿÜsÒµ ø8h¡|às´ØT¬gõ|}«¸w’©ÇÄ-ú… ¬Ì7(#÷­½¤­xs4´a#ÄMÏ3=üƒôÎ;¿`¦ût|¿=_Î8V>_Ç ¸‘´Iyÿ¢Ý+Bœžw3,V• ëÊBìt„þªÃµk€²‡o†§tÏÿH™zÅב"9Tê“§è*«7n.˜W ƒ@T94÷ÄqDœ“/ÃUO N~¡~»ä|Îmwk©z›=¶ÖÛÁEå‰0‹Œ± нxEÈ…üØÈÂÔ™Âu$¡ËÍ„øøáã{7‚Ñ4˜Ia,êõÒRæµÈlMb,Aå?¿á‚!fìñ4õ¯Íz­œ //ÀncÜϳÒ.3¨µ‰àè»Ýƒ¸µþcã™?K;‘è¿ýø5jÞ¡"I?³wBŸ›— ŠårŒWz@_ Ú7•îh”¥ßáGÇd‹”h6ÕiøìߘÅÃr<—ž|“Žq­w.)©dãGä²Å6Ü WÂl]º{Kd;±ŠUr—Y<ú¯{˜šI¸§d§Øx>$.x©IÄlξ—ùˆ²4ʗÑ‚¦S¤Í‡ùåòm§­…‡\¦¹K5•é`C8HÞÓ%o¥'5ô8šð© ÷Íç=¢±»*=©Î_WßÒýiäK ãòvŠÃr\›bé*ìn[Q ñ‡ÇŠkLN°ïI®|ìGU?ëýÍ,÷J•šÍ…7·ÅüÆ2ņ%¡Bág–ùP¡ÂÆ>fÝŒ€Ž:p|rñBÓ¾ƒH0ìsÞubwAzúàN*ÍHµLxfîý¦”®¢­„uYÀ-ÉdûŸKè ~ý»w{<Òn„+v@<Éæ·¡Ï äËxä×fóWÊL:WW’Å 6åÈ!¦Þ$_ý°…7>B5'êêæut¦Ì­ (Ò¿IÑ6<8|Å›¢ÀZR”Þ?‰ªäúܬ"ådRý§Thoê$TFþ < U¯ùÛÜ•'‰ƒ<*BÚ!¤ƒAÝ“PÉ»` Óª¤][®pFŽWwBú5Qf?ÇùœçП—j±/È{ïvKƒØ ss‘ÔµÐFØóÙCbú#ÆŽ„@bávAtÁWøéôÛJ²÷+´d|èk2’ÆKë}¤`¹¹Üˆ¼c=Íc¹a¯~(bì04 ˆïÎ^GâñÇ`U;ïQ‚ÓA•s×îZ†ÜGÚ©/5ÜRêÇ '7@\l!J¨æS¢]þS½³³}vQmÃÍ—c>WÇ= Ž_ßîÓ‰eöê½ *‡'Ù# ™2Ô·ÍŠû±É¶Â(Ó»U}=ï!îäE*7ÙL6éhúÄI¥Ž‚UþŠÑmô"3mj§‡ µ`–lyQ3·†lÜ÷C”Žy™a@£NÛÅ×â!s²çÜ!ùÍj*å瘲 <ýËó“îšÆÓÞ°Dº½6f²ÅŽ©­„#-i ðöJú¥÷"Dáô t•$m锹©²Ú=ëúƒÉ÷4To£†#•ŠÏU©OXÕ%—LÐ*‡ò-Û[ê´$H@ŠïB_!žH½<Ì$Á4Ù3…Õávï\”*kIjçõg‰/ Ë«mJò‹{”TŠ ÿ¼˜öI{r‚D|Xg<(ó“oÀYÑ€më/'«Ê#²üù§þÓ'¤Q¼< ¿f8wo#‹Ÿdª çÏá»ÈIïª êSmNW”t.)«ucX™ÝºLÂ÷ñ>×Sa”­<(Ñ?¼ÄhEv“,S&25%-q'i9mãi„˜ý:ï‹ìZy–£PFq9ØxåÀ/EDä ­ÕßosïD1 Ür'ÜDÛ쟠/elÀ­åœ -¦‡ñd™¡E´0WbߤhØF©_#§[,¨/è­O:³Öˆö @9CüMJí+RàÎm‹Âû°2˜)î±ÅˆßLPñè»Ó¶+62-½»—¢qÔÏ);WØVˆ8aÖr ;§`-ul½Éšç1ጠdXXXÚ_©¤¯ºÖ õo»9ny£\ðáÎËIo‚F’Ñðe&à윉}$XoÚžâ–¼P )Zxº¯uM®ßtl’¡}ýË8:äȨÔƒô‘¾¬çaðPðTµVÆ…ùEŸ=á6¹Gˆ  â>¡Ê]ÂAæVØe›üò[ÿøz4ëG­ A £Ì{‹ 3½ß$’Žá#𷍱"ÃÉP m)¡cw)_tF×£0†„ŽápœQ‘Sî/\¾^3vº$EÌ%ž÷ øË\^ëºZŒÍyr‡š@¢¥Ã?Wª›h‚$/êcÉÖ ±¦^ø¤¥:B^`/m ßÂû®!¤çàD…¿fåw0]ؾ?%r­©Û_÷D‰‚/Îh­õº]ñŽ~7G”k­¯Mö”(šÄd›ÈÚ¬eV Ñãæ³Æ6 As[ÌcßW#ÒP9šÀkö5Y(¿î»ïJ²¿!6x·UW‰à^o¨M+„¯ñŒC{˜6ÖÕGyÛFö1û^│㒿¶ÿÄPTý´ôr#SVä}ì^’ÆóVݹŒÿ¾È3Û«}È:Ô˽h©º.,T×Eî|z}N9Š}޳©MÏo}@…¿/Lñ ¿û»Xw¹ÉKÂé¸wìñìݬH\í㉾¨M÷ï£J)O`^å6?ù.{h`:×âʈ2ñÆx_$'?¿ åÁüÊVâX¢½T¶ˆõÎîê¸Ëùæ`õW{qyRñ7‹þèû‡É#ëªÉ!ÏG'o;bšE€…æQ6Í'iHeDŒSÌoÚ#‚|ĈãÀN“%cC%#Á/ÅòÅQ»äyO”Cv«"½~èhŒokc#.…¹%h•È*óº‹! ¡ýcü„ƒÆˆtTþ\›µ;Ò¬Žˆô[å¡VÇLJã¹]'Õʤ#׎“€°sN#·°ÍRÒ¯Ö¥ l¹ã†·Cy›e¡žÍ‡En†¬ozÚV2ÜÚ ·$ß¿! ‘-y­¬Î +×›óùÍ4ðåaæb¢‘mX½#äfµì†å…œ€¶õûP'c7èY2?¢âHq¶š­éùQF¿˜ò¦@\rìs‚xî§TEîr¤ž… µŸÛ;jbIœ¦0‡oxÛ›Ù¬Ã|Bdt·åMkD ÜìÅñ=)~ CÁ8Ž?¾1¢-Óð»ê z× úœeÒ×J醃ÚI¢+Fg?G-J¬g³P馿îÍrVsåµç£ò(—¾ BT¥>TpuÍÀq*ǃ{cG2õ?Y ü^èOÛäÜ™"l¤(ðп©—ålÐ÷.Ìþl‡¾ÃHØ@kÅüùt_ ‰å"kOÙiŽÔ%QHbP÷ù4¸Ø±áÛ_ç3tÍb©+jÌ¿ðŠCD|ÆaznñŽ\û0^¯– ¾Ä˜zÄäz#éßN,yÓ߯VÆHšÐð§*M!a £ ž&â¤åM섪±†ì«Q‘&_ŽRó1Ó¿é2vÁ ƒ0ÙnÅÓB¯éO¢A9°fº>9 zý–|zâV~XõÒÒ¹A¾6ëí¸OOõsÆèÉÂTT¦ÆóæMLÊÀè€p£_~‚Á¬8Ñ‘ƒîçdt¥¦f¬“Ö°›Û£”O£)nûÓ=²YGÞób}Y>(L6œªÑ h¨×eÏØ< Bßvã\brKâ³c2a½‹´-øCRË”Œ¹aQ(ø6º©gÚ“[DIÕ®Á³þ½¬±¿àÌ—ï|“#ÂqÎÆ(-©Ò`a–}êvKHbMÎo°+Ñݧnì×½€.!å?P†Øè[Íx¾ï½'_‰Ú=¶“2ŠpAié­†Îíܦ1ƒŸ)ãTvâˆ+܉‚ 8-%»§ JcùüõOc¸ó6žö&¶¼É-cÈ5ð4ç¾_ã-ZD¤mÓöVÀ'aÆ4T– §ø¿}÷®$Ø$e×·„,ƒ’ZØ L—Ï7×J,Þ£ØãH9mŸøæ§ÙB[°Á¨E()eB᪃,vežž؃0)qläÚKä&2ÅFÔZ/Œì‡¬Óý¶ÞŒZx„·l¾p7×XîÙ³xãžÅϨš^Uù€U‰®_åR3ÿH?àO³œ¯¬QQÆ«“ƒrËk Sñ"c~ùy·òkÁç3%FX*ÓgÞˆé¾1@5Š{ârn(OÏ76¦*?Ü]B؉Ÿ•ˆs÷÷þþµCŒ¼5 Â|7Ž‚3+ÚZˆ8™ÝKó—2—óë„@®¦´v¢‹WˆD|0d½*dÔ&ŠÔŽ_û}u²ÛF4æß³³ÆMáÃZËn»Ì´´2ˆ^Kiñ‡JM<_§¬´ ÈbÉIÇתÆýYøä.A[6m¢AB¢õÝæ)áæ_ç‘!>ó®Zø˜qŸ¯"x†›†OÄXžFëS»ç /(¿t8¯ zz3%ËE°™¦ÿäg¯ ‚¾&½N‹·®‡ñ)ß8Š™T#l§PÄÍÄòNÐÜ7j§á¨2hÃì¿;êtÒ¹Æ ÄCð'HôcÐý"dÍÚÓU6úá™èÑþ{?(¸uF³Šn3.8ìÇ6ÛWªaøâ»6›rwG,v0r@Þ2_óuU>:$bzd%‹¤uëNó|3á ;Âçšú™`j&Š>‡uù”ÏÅ${A’óÂl^ö 'ß*( 8uàË¥´e2EN§ˆÝ8ˆ|P®¦–õïÆrþd‘ ­GܹJ¢‰¬Žƒ¯Wt¨#PÂÅ$R!lfŠÉ—Aÿ†Žúøð<&r°§Pȶ”<$«&Ρk J–„E_ì˜>8åÐU7@1}ØqïEƒzД™#3ñ5ó1WÜ+Šê¼lè,VaN©ª€tD–d<¹º³ H“ ºE¼!pú·úfYYƒFAد2Îý„ûî ’ºW&bC6AÔBø¶P¹dç v!•ŽªAúã§Œc 7Œ ˆ¦°FÌ»‚ãñŸJݔձV×¼e½Â¡$ß!š/¹®|‡‘A®KëìE‹tÚñÑi$0–t‘½IRt'°Ì?¾ïÖ²ŸI¢N„îuŸÌHPR" eqþž]†´Eĉ\ƒË¹[¹ÕÜ1ÇÅ6V)«Kï»õö êG$O¨…IÃi«ÁLËà4³héh·ìóÈwY–Ú`uÙñÃ~³ds¶y]€Ðº÷âFá$ÇýCA=´g <ÏÓÓ‚ýX=š½šÉôS²NÛËšR²‚…ùýw÷™iãO®û 66ˆùÉ=ô½&U½_ÀOY%ax©Úˆr‹¢›Ÿak2f>¶×C|s¯ ~m—ž&f>Ë匢šôFýLäCÿº#HC_>‘'S|ðÉ-®Ekòãiþ^˜>öµládû¥TëÎd‚£i »ì£q¥¶:_Â/é«?ÉÄ$¿l€J8õM0UKG½ˆžºµÿ’–>¼¢rÞRan馢R:>ì\ïÁ§åÎô;aó߈ÄS?ð$ê]|) JâpÖÄK‡ø§&Ù~•Ü@©1Ý×ò$íà¡~…„ôžA›rÞÿúº¯baùûá½k7"æ…cA þ’ ÿ{Åu®3ÁS¦mtÞ’©Jæ»ÄIÊ€aÚ¯Pn\ÿoÓçðÉ~f•ݮ롳€}ø¼ü`58‡?:¹éŽYh¬Ä7ùt@9 Å”À”ŒpîE†.lDZ [™÷"ÁÌËTÿsOR-ºÉ×Á”‘åõs¿h®8xnß¶#âß§§»Êw£‰{.}¡¼ùlÄÍÛ›éŒEV2Œ$…Ñ!0 £‘w_2³pް Â¥óš³ßÀŸût×ב7Él_£a´ O3½7É›‰·Âï“ã¸çAr#®•±Üo›©Y0WÊñ9OtO²šU ¶–˜^LtØo%½$r¹õ×õШ„äADh ¢>{ÓÕö­Vºõ'ú»¦„¿¡êŽp8`]8w^xm^úP‹úLspJ#7èÖ/ÙÖMDš ȱÆáJ$ÑÙ ˜ ^‘¿ìÜ›ú Ÿ@¯;yÃÞýžE3wŠqaF#å”ì)$5‹=SVmWR׋àjyþž$OX'D["LsþÑN:4põUí'ÙÍ:!Á{#oâ«Kî¾Õn¯Ú๜r—`çé-ƒe¯yׇîK:x ¿›§¦ò€PÄÙeaj)ZxR·TÖ8çDœ‚ #Ç4ê(‘Ç4o®Hq|&]Š3.ÿ¢‹§8µÞóörxþHžY$–PR ³Õ]WÑc ‚SkÒâÊ]–=®k:„RÌ1¬)9>CO“Í9”#É ]+,È ³r)ì!:c¿äQtyç/Eð´l’žå«Á•y‡3wª[ h^³°é$w»Ø/ÅéaÏ£F“à0Œ^ÿœh9vÍaqŽ?†Xʲð\ú> ñïpÖ”fgýV¨¢ŽMýø&Re˜uE¹àÕ‘Xر“Ñ_Sü÷&n7õOÉ-xj¾'¿q†ÌÚâ€|ÛÍUîÙn#µWª^Äà&Ü5êV„¯7iè‚nht¼eßö¦–ÜZ4,ìN§dP![cê#îù¢ÁYUù’,”&ý€ öã¾'–Ùלð îödçZn¹ñ©Š ¼½˜úüÀ«WûZºßþyÈ\R”8ƒÏÇûoœ«ÑÁ]9L¿OþËÃŨYJPcª¾^‡ÚÆS‹PÊ9©^Øþ·™†¿³gM™©r9¬ÇÌݾøyÙ¡²qßïk2`Ú¥à@]bdÔǼ=,PÅäK»ZxLÉts›ÜÃx‹ ô-cЊT^ôåfw3¤Þ#ÚNù-tBÊûõK@$©šU†/ÕD^ñ~©úÉývÿ¬»}¸ß¬ÿö;Âä-D½%Å•Úÿ⢺çÔÐn–ƒÊ}dL18±ß­ó%6A*p&?Ð_/(Ž—¶%m ×|‹å›÷ÊwW³r>öãþoºÐ aöMxО]ù6¸ a䛉ô:dm€!÷zÕPªØŸåxO´ïƤLô–ÓƒòŒ0VôÞ“ÁJë*¥ÂâþÜ¢kÍÎw½|0ûí\P¼ì4Õ£…$ж[’®Ä¾E,¥)yPt$<4Íi]íûÒPÚP¡z4I+‡ h鸦Y¹X3g9‰ò¬ÖËi3êº"orBx7Yââ«Ì¯Öû©,ñJ¤‰\ôãÐíTÙËWì(z³:E‡§¸’ÂŽÛé$Œz@|³ÂÓ"Ï,ø´=*ÿ©ºIØ€½ÙbÐÖ™IJ¼ÊõÄóZwÇt1`ž£>§P× ³ÕÁë4‡;"]Íh¼i ’yñˆ/ ò›ðbÈêNŠšiT™eMò~Š>Çã*æ ?GVŒ!+žKºÝ-BðGUÄãÌãùm‰›áÙk8 "ú{& AL¿Wöî§´Ñ—"ÄL« Z¦™¿?XˆØHÌhª4ƒM”NG®û_(RÓÄv)U»7ç›ÙjÈödY¨à¦g0'N!nú‚5×hˆž£mùžx»´-äü‘Ze”;ù˜Ú ‰#("´¥iGåœE ¬¶úú U(¼²Q+3Ø$ý›î‚Œ¨?µ›ë[ÇÊ­ÒÆªF±XÈÀrF/02$l¯zñÔ¬Æu¦xë‘7§÷“ R¥v–ÓBh¶>†Icz‚Ò=FªDµ·*ôÆ2‚ßNu"å°é‘¸êÂ…ýkÞÆl¶Òœxš’LjÓÚ×0c(DB‘bØûæUÖý´Í¦ÂŸwy‘x*t êÃ5ûR¨øFb¦d5Å!üGãY ˆQÈ©V ƒ §ƒËßq¼&Ü1¾å!Ó{É…n#?”ìDlŽª}’à2#eÊ¥Q”s°v½Çœ²ÿy鬿ÿxKâ|7¥Œ:Èv²Õnø{×eQÃÚ$¤«ýÆ‚€;¢G'††kþ“œ¶Â¿‡: ±Îï$^Üs¤¥ FR5oYz‚Mòüá¤|çõ<|`‘ã§ÖÚUñ䩽ТH­}´ ꃅß%Pòd¤›‘€÷‡«­›üVCê›V8â#õi:ƒ`ñS9uk8‚,éo7r¤+Xh{uÁ”á•ѯ_áAé,ˆÍ‘ç’M¨•và2WaÞïã…žèì@ˆÆl èÒ­‚m$'¢C¤Ð*Y°“üN=¤R] !}£ à /$G&tÒša3 å<òœ{YHèë±wÊSõªrÜÜ"@üYIºÍ|èÙ~·ÎßÏ:ÏCÑzêO=c¶¢é 0%12¡t¼"û ´u먼+ª©¿8è\šÉ¦ÔM.~Ö(ª) C¦\ùÛ‚ÉO êÄ µ†E.n1d™Yäâ”ó2M(Q0ZÌlµòª@ÛccËò˜&œ7Â62%Ì€ïZHm0rÍ4ùˆp‡e–Ñãç2Ÿ.šgs‹S|Ê|ÿT¨¶ÙÉòàŸgúªÔ"uu'ƒ‘+‘uµJÂæÑh®©ý²£X´RÅ` +!Ÿ4š…l€‘’Þç´ÀR_ækñÐ)ª“EçÞ¹bÏk0Û… uÎÝR¢ñSaàêxS‚s‚s}7ãr x/̧þÉjÅ™!銳–È<šÚ1UŒUýOI²@á²õø¨–7œ%í0É¢2,þPhüú5MY-”[>š`ÍööÒn,+`4{™>«ÈŸ1ªõ„ÑÞÛ«gƒùÑZ³ œnGéõtFºÍ{#•>àÂ¥#ÎDéXqjᥡK©YQ .‡Æ=»,\¿1žíººÏ,jŽrTºTè#r’$uz@ó˜ãU^µÌ¾zdçš6ùì´Ö£t¨ä¬þê J¨üÑsˆBßqÓa·½òB}P²ð^§‹„–­2˜uâ7«é4òQõ1V†£Å.ØN¸0b•›Pw—}&¶Â!+–£ âÎURž‚¨HêäÁÏÔ ?Õ\4Ý•S…í›lGÝ•çb¾ÞŽX‹e°_€,)£ë²jÏ¥V’Ð#F=WgÖè3ˆMÜp%ÍŸÕÜßPZ`]f1š!&8¨C®q#ãÕLžˆÜµ&¶äþ±@L+¦N,qKB]eøL‘:¡œ3N¸ˆ:© vwQ¨=¼˜«]\4”{i“ãf»Šêèœõåò<¢Ã?¾íâ%@Ìöbœÿ¼~µQåÜ ô<’õ”“æÎ¬ÍxIØÙé_ˆî .PRZ×er¶ú¯àmšùJ«1Î9u¶ÌÛ@•ä Épeî Ã[¸z¯¥; }›ï͵,G+OõôCãÖ`ãÂ*c†¯²‡r Às,Ï%9:eONÕPo59k눗ÒÖþJgO§ @ÑÕ$ 6O©ÛÚr·Ó^©DÏ5-[ÕÜPlpþàv}B4ŒéA¾E¾>2pÄø"m|R³vjD¯üyTXyméÈPzÄ–ûÀoø#HÖ( ¯Ê…PrýZ)ý“K0ªoép¬€){är‘TÛSó‰ºu¼TÕv¿…«a¤jöìsyô«ò},¨Õ­oQ´÷›¬F¾w{Ô¥nœ`hÇËù“•ïÙ×™Úæ9#9¹˜›‡UŸ¢´<'\åt°³ä³EYy_p] =–ÆÑ=§èb¾Ó a@U.­fflÑE§YÀFNDtüšuü¥Óç)rlwN+ù’—@Ÿ¤ 3ÇÝXµ*ü.ÅfàC‰²uc–¦•Ð@°aMYâ¦GøñPåv¢Aq¹fÇ£÷V§ÄÛe ä)¥g/¼rCº}×R¿F-—Õ®íT“–.æ]œ0I³hEº\Z~^! V‚G† æªI·ˆb£QyW™þgÙ!°k` TS& ‡ÆûÚC ânѦ²ƒL! Ð%ñdd‹¯gäWCA a_S\J"ö’‚xµIùR8PÑëÐ5‰œ,/°½±iŒV$&ðg;Mi—Þïß]·Ooòþê¢õÂ÷^/;L½Éd¸v^QT‡ÄøFS¸1À=zx¢UQH…kJx 3ØØôÏë<ÛŽN<x¯JÁ,%•Ë ;Ù‹úÝf$»ªb0gÈj2÷NT9†éú€ÝCKIž+™3.—{GŸºÖ+«Ic‰é‡§7×w A²‰ÑŸá4XùùhÎ]d®f³ÁÊUÙæmßGta]³n…y†ôuáI¦!ž›a;®s&¿A?g++vËH€'ª4ùÙÚwßjß*þxã¦TÒÎ¥RYÅ’µÈß>¦˜‚Ðü…Ì]Ï7ü‚­wã$Û0îßÍÆ­É9<‚Eç¦Þëë!Ëae‰RÃRžùT‚‘ødFãë~&òvÝÃËêØ–j7*CI)wæš*ËH3Ø8P-ÝáÜ!Ï‹¿V¡AèJ¼ wyDŒ0[¿°¶o,Tsûn.*÷…K#o&²×–VPžE6™cj‹µã7;Ó‘É}òAXÁZTÛ¬Áf\t_ÞÛ|öÿˆ³XÚùºmeõk, ä ¡ÎAWª¬>ÓºYíK’c`ɉ/-é†_’µ%¸ñóo:}UcóÏP/¬.g{kÕ˜Ó¥r4ëÀ:LÔUßÐi§ɬŢÇR×õTùà ú®tù V–"È„2†ç eÊ•§,r'`©Ë…Œè»d`Úw¤Ìð{¿_rg÷ƒcpKó¶á*7}”ƒÚæFÆ æZ+:tW?WäÌÍ©FõU WDAOŠÑǜی×OñÎ\î•?¯‡v¡›û–óäŽÌ/JJLL ?Ô Õ4ˆ£c-qñ GcáqWâi-®k‹ƒ)•e‰Âk¸ÑÃ,ëq­w½f ÇTõçᖠв[Yg‘x­ùÐÂû¹Í ]*Sþ8¤ãÃ$CúÆ¢"HwF–]ô„¬ˆ»ö»Ô¼ø=S•Zò®©[—)óe›–@H K5j„®*î•× ÍŠ¼ªÀï,¿˜d¸­9{æ›N-h¤ ‹þ{ˆñQ¡¯rù¨Ž SRëõ‹¸>ŸØPŒ9M 2ƒÎÝØ%\fjª?ˆ"ËP€Êb5‰0´Õ¿´Äˆ—ÄÌ 9šðL_6L(œ;âëƒöŸ©7ëN›-W~+ãê¾ÖÝØ» Ô›&#@€˜Ê¿ìíuwå•àÒ–’”:H~Ác¡e`^¼þ!ðãfè¶…Ü‘ç’Æ<_hßd‰Ýr±Þ0ÓbßС0“"gkƒÁÅ_1¨ >õëJâžšûæÐ‹‚8fþƒ(Á¿ ³`O©Ì±² R¼"_ø~_ôÿ#·a“·¸£Æwg_›šCá2lJÐÔ•µ:;q±ïÔ/·[I70P‘ÛÉatNú5,JœžZ,G7gIbtïÀ ê¶òðªÌµá§-?AV_áãä¥àí,o…³ÚÝ6E8¨›ñU„>‘벿_ˆ±E¾ÓÆ:Á¢á£¿Ë,Ô¸aàþ–핤Ðà£bý}£ÂîÂ_–IÎ*«¨©"ÂJQÆGöÃ#¦SÄÇôïà]UFöœ¹]¤½ë¦Š,ès™óÓNº§šP/U¬F¶úÆ£ÜeÒ†þa‘?ºOX?“ÎßVCÃ;d­7Ê‘ÃÌä̉ávŽûÉÕî„™dT~)Ož¿2<‚sñCØ–9½ð¾ äËïÙ ¤ÿð8ßCƒ~ûŠ@öû-SñÂ窾Þ+´å¼Êœ&wFÜXv"öSIÕw|ÇÉЬ5é«9oLôGå¾^ãå¸ËéòXf{]¾ÑÈkѳ'g{;±åÉnš<˜;0+ónèÃT7‹}ù²"­äÓºŽõ%q™;ŽÿÂ4Tm@» eÓ{a§lé‹Rž>TIOwÆ-äoì3ÇÕ]6¶$œ[[OôxûzMUv »¾„²%x,dãR®‰†P³Ð‡ßJ¾À»ßZûKó]ˆšž1ê÷Nܼ¯P©ùæÕ\²b/@ø;mXÌË@?`µÎ9ö†k’ä@qœÈuŸpU'&ÚÅÐß#Ó‹WŸw¾ØÂÉò—e^E®¥½žòצŸòãØÑúø0›˜HqYÓ`cGoŠÉÄи•u?4ˆö¨+Í‹¥ +Té¹ÁÁ%±Ñ8pÃw”nì_½‹~fŽ{cDÊÉ wÑz†ïäZ/FP’ú¼È‚d‘6òŸñïU)+…J‘)H0ðIé éè¦ø6Óá…´C¯ŠÎqÓ£/?ÞÐåú'Š#J¸6oîlÏ\ ý‰6ž?7ð¿4 ¹þAáõÆ:O‘ø•¢ò³æ¨­z¬?Î+0½\ìæ„v#B›¿>’u=^¾úm¡k4ÁÓ³ ç«D¯Fa½jK}¶ÕŒ«KìbÝ™¡¿ÎÊÿsðQxöÄ z„Ðþóyà0iqy± ýÀÿ> Ú¿øoä?òþ›ø?™ãëÿfYÙØ99À¬¬`Vð?üŸ¬\àù?ÿ+ø_üßNÖ&&ö@N–™¼ÿÅ¿øÿâÿþ/€)µLJ././@LongLink0000644000000000000000000000015400000000000007773 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/download.jetbrains.com/python/pycharm-fake.tar.gz.sha256ubuntu-make-18.09+disco1/tests/data/server-content/download.jetbrains.com/python/pycharm-fake.tar.gz0000644000000000000000000000012613352651520030451 0ustar f1da47377d7b8db8d31d1ca93bd329853c74738e7947e00297ad1e28d3a2ee1b pycharm-fake.tar.gz ././@LongLink0000644000000000000000000000016200000000000007772 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/download.jetbrains.com/python/pycharm-professional-fake.tar.gzubuntu-make-18.09+disco1/tests/data/server-content/download.jetbrains.com/python/pycharm-professiona0000644000000000000000000006101213352651520030670 0ustar ‹ ãTì¹Pß·ïyzp—àî‚!ÁåàÜõà48ÁÝÝ‚»ww„ƒ;g~ÿW¯îÔÔÔ}·^Õ½ojfÞ·ª{u­^Õk÷þìµzW5'à¿^\\\\\TÿXn¾ÿ‹ý7Qq¿çåçáàáæâ¥ââæà} âû_06€›‹«±ó?Cqñ²73±ü÷ãþ£ûÿý=þÍþ¿DŽ^¦VÆÎߨy9¸8x9ÿkrü‹?ßÈ_€‹Ÿë½?÷?üÿY |ÿ‹ù›Y›9;˜Úºü{qÿÑýÿOð7±¶ÿ/Xÿüyþ ý‡?€Àÿæÿ¿BÿwþÿÝÃábõŸ•ã?âÏËÇóoýŸç¿õ^®øsýg à¤ÿŸó§¥þoÐ]¬PiQi©Øÿ3ôÏsÔ¼¤ÿµ†¨Ôœ,Ì]\¬ìí¨,ŒmÍ©þ5Û®nŽT.¦ÎÖŽ®ÿy9QQé˜Ì¬í¿™SÑq1sÚ»³ÿ+%ª³¹«›³½©ƒ™¹(8ªÝÿé b7w¢âæå¡2 b` úï~«Er¡š{Z»þ[ì¿|ÿO£ú/Ñ¿_ÿŽöÿƒÝÎÿ”þ©~^Þ¯þùøùøÿUÿ|<ïyßsóðü«þùxþwýÿ¯P¤šª* ê?— ò2Ÿÿ± ¤ÎýbÆã€‘›‚ŒäOóW”xs-ï4dÿ£,Ÿ ½ëÃ:Jš¨Lv¡}³V7›fø ê¸Ö‘õaùÌïétò‹ˆÕ5Ñ™×Þ“7—&XÉi§]ñ§ ‘1aÆ}ˆAQÏgK¬"d®'ª¿Gš–(€¬Ö³Üûž:·4(SÿŽlå¬Wcr´ÉÆaœò¹ßÔJ¿í ‡‰j =ˆ¼Å‰ìÃP¶aË´O¯èÛ‡[‚"F.‡ê¶ëï*ΙQŸÓ86ÂXÏËG'˜µÚI>'{§Õ¤Í€TÐnŠû Â/6òçcÚ›4  7y'=4·SÎ¯£ç£×æ‰íîÛ{Xv1ûäÇoÒ‹in¶gõÑÑ ³t9¬»lbcCzu6UçcpÉzá:¸DzvX‹hÃdpáM$:†¤ƒ ³|ÝitM[Qæ7ï;žÌ{üx`9[àç£O¢ß›gô‰Ù¾6æa¡dE¬W¹Îˆ’”¥J– ‡£Fœ63Ø)0:Jõ|1m´,G«E<î3V¬•1ŸdTïh¦×›I•qö`râ#¸Œ6%rx}© ºÁ‰ |ªy›¿ÖMÕr-£œª?ó[1{‚ZqéþfH"™R(ÂWü(TdƆ˒–Åe6÷DÛfyø]Å: üûPÃù4ˆ+ëð½¾Ï,VÿÔíàn„Ƕ¾EÿQº;… AŸîo‡eÃÖâÕ¯8‰«êlâÐ]GéŠæ5TFh‘ÖΆ|E9%/e‡XA¬«$mrcrãâS㋸&ó&$lˆm—7MI¸"<Õ‚iÕº”€kmßEêÎ|kÞzp»]†yóTtƒÖË—N=Ä"±ŠŒ" _ »ï/7Ÿ7ðÔÉÆÛT3‹>&ºg5™§hii‰†þˆ¶›È¡ÅeÃg™ë«ÊG3·©2«Œ2Q¾ç`03—Õ,“Ê*—yX‚²\@ô\‹‰q¨QNQü„ »ÞÊU_áé#iCg‚ƒý¼ €ý3ñõ#ñuy>§:Þ/JŸšs"kü¯Æk´4ÏEèÀ—¸tõÇ 3¡-võ v…ĶGY™sWrÍ?ŽÞ˜üAˆ&ïöI’YÕ¬j¹ño°™ èú'Ù¾b¡ïÃi‚}ƒÚ‚½. pÍs‹ÒTÉŸõ˜;Z0úy߇OZÀ4f? D×À‰ô¨Ôáßïï5]0ë?Îld‹PÎÏåoÚ´9]ч ©ÚgN¬"iM]/÷!e?½g¦oSŠËÅh Þû%'N9óÉÇ•ÑàiOlÏ7†Ó åxö‹ÿ–>6á‹6fH2ß^ÎëšA»Þ-ðómD[ÿu Q)'Ÿ-‚r犄íäT¶æ=&3Ã;3Ä6Ö³¡?Ò9z|¬Æ·› Š MSàòkw ŒZ”í­æäü’R¿i(*AAÛŠ¾V3x. ¥O ÀÝ/Èå>d½“hF[!lEç+M# b0„Ú¡š£à¦}ŸY²WïzÀø²1*ÈÞê7÷^ÐÕѦ¨f^³æ-Åëøº‡ºcÝé=eöØ™Oû³OkÙnÑÁGÍEÕzGÿÝ™¯ý}/ŠŒ-pS—+§Ç÷>ëæé»¿»9x÷¡Ž3¬–Ѧ¼yDsM“ʤÑÌÔårÚÑ † ¬ð/À6HNˆ]ÈÓ:µ¿Â§ppž.6ç³¶i,ӯʂèïõQÌr òA 4AFâ;$e¼(§ïÊÄXŒw»Òq¯œ“™M°L¦c-)(¨gŠ3«Ë,ìÑh¼e.` NÕôëìŸùï=Ñ´*[¹M¬ª¸@oB3¼3â+øwª-”^2*&àv=0­O/ØNžÐÃSþqÖvù4sþ@‡¬¡%µÁCzNéÇŠÇÙ+^õK†´+üû½§³RÔ'²»»œÈÂÊ*6N—§3!Õœ•í²èÔm¡þ¶Cf–ËZÈë¯ñª3HUåxì(ƒO’_Ôg ,MÝxH-Yï7tÑ{yŠ„°HÕ«órT؃ŸÑ™Ú¼â Ú™¥ »Ã’öÅ ìbÏ’´HØD˜¨q—Ž`÷ýˆ7C.ÅnÚ[(S‹Õµ ò:‘‚)nåÑì·&N¾é5µ}2ùözšÃ}Ô8ƒkÔe‹æ»¾{öÙ Í«koïzŒÎrI¹¿üpD8å\Þ…@¦Öš¸v±TßÅÝ68åšÚG¬lÄ_mÌ>%XËÞî÷Qü-¿ÞeÑŒi _8ûúOL¤‡jÔLXž‚G–  ô Ìì×˱ªjÌÕ@h"®â[®—TL·ý"MM£°’õ~^×îýÇ–1zA¼éê+Ø[ tÖñ´úúO‡{ð½C›«Ø£¤"E³¤G›Dj: Ô÷QÀhk’°€¿š‰|À˜¢7S¨¥Øíkà¿ÑÌ7ÕýS¬\ëÃgîßEåh\:@ÕùˆˆTBAÎgGСÔmG´Žµ‚ål0e*(‚J§rçOTvp̤-}§“™á·ß=­3Óîwo Œ´IÕ?Ä]<[_í 4•~¶ú†FQî×8š¿:iÙ¼ïE‘³A3ÌX?dËü5ëG ‘ÂÄ¿HƒþÝü÷Ûv‡)t£Z%Ú.Kå4DÞÛ@Ló•"оY‚ˆæL¢ M«ÚD Vt¿D× JPeI³ $ô¨`pðÇË Ä†XàªDÍ`5êÞp0šÀYõ|ìÖb€QìWˆ«Û«¼¹'|ÿ4Y£”¢ë–ʯïüùdËå±’é,hBI,©¨PÁšcèJ}*ÉÀÚ/°}[#ÑGž²{±¼Ó()ûýé³2ŽœÝFz}@ƒ™žÀçÄ7߉tN„ªî¿K†Äí;qÊ>{±§¶îŽ (üv™ÅFžuâUR’0{篋NÈ»>tŽ ´sÏ01&Hòm#fÈÂ/ú1·Àä÷=¨YMoiµò@M«ƒ\N0«ó@eæsPH)‡ Û·ÊxKæ¹Wn(P Yû[B‚Ä<^¢¬r÷–Ÿ³±ÓÛë­Â9|§5âþâ l ¹û…²Ä¦7ù0?›w­’Øp E~ûà»MÙ÷ÂC…hæ£f/©/щšnÃ:chC1Ž»P7–¨E!½üv]@ë°lá«~8=Ý—åYªÐ‚:|îµ^.}o·‰™Í¢o–MŒb^Do–¥ÀšSËÊ Šo¯_,HS9Å'åÄï:}/î_pºîgâ.Õ^鯛0uµ7™°7/®>5‹Ú"sâèDd¡ªahð5íÝÄêªØÎD[Ü@ûzi¢Ë™wetxNzðå¥oþ‚XG=⊠ÂI’¦F?.Š`[âH‘aT`LéF$·Àí©ÓzhH GóHßÐŒžDNn{?E>Ö·ýÂæÙ²¢¦ðÃæôýA£"HCã(eqå¢qáåìªxP‰@»6Q#H6áÖ½Ÿ|–Uýã½gé£Èn#"Cõ2™ƒÙûùø¶`9 °ÊF´Vjá?T~#og½½wÈD"×®4.öÒ-7»ý4¦·oHvå c80R®¾Ûfé?¡À q/’ÀùbÍî|ðAÛÚ}9«qúc#­¿nÛf5–•6ýiÔ:Òÿ›,Þæ~7?>ZÜ8Ò1f1Èx(6½±òJúùãíã#âjC»|…s=â‚J‘Î0UèˆëÝþ‡s/0åH¾ÞÛVöúØãj½5G³éê$ÿ®_äæbUy"–Ò‡ÃÍf>ó:´ì¤j8¢ÊK0s‚2k¤ˆ8˜î‹[õ){[Š>2;Ü1.:ZHz¬µžÎHÁR÷5`>'ó P$"ÛIu—«–0äW%ËßY‡'¬”Û'–†ÛexqŽ4?KŠqQyØ;|ËaæÍHKj„ø›dÈ?S ϸ†M5¯EõÏÅ-ÓC±Öá·LbQÞûrM¯†PbøË}¦õ62ì^¥ŽBs”I.ó~ä‹m®ûŽí[<ÚCËUíØf*—VV&w<y#ØòN¼ŠÙ9€Cˆ0UƒÜu‰€èË‚j¬l"åC?t}+ìéƒ šÅvÓÏYÛ@Ö¼³þ}å–<â <*0FnOJ­&¿SRÖÕ ½D¤@–þé´þKDZöü¬¢i¡3À>ç¡iâc ¤B¿²¥]áþè†IäñØ4Îå`Ì`2à´~†žegWÌÐ{wÄî^Ùè]SL¢¹€Ší½ïý-þ‹À|—7oKxß=KhνÔnSa—»¶¬¦ç]0Þ´a–´!ö@¬Ì rphðë+V¹¼  3I¦k4[vÖÑþÊ2¼l­ø[v¿M´K _" (xJ“‹8‰é¢ |¸ ëÜ„ÝÛ°×]1¼´!>Lç@,ß„é\ ÇÝ(wñ+ï €+ü15’íGˆ! ,4(Ѐwg/•aò¤1Ñ(!è¸ä8ŸjcgïP„Þ‚á@3ò9Ђ¬õœ>¬"#­ôÆ}nýFDy(Mùd_­ï{ÈbÛDоd7Ô}ì—}É×ÈñAŸˆJ úêsþ÷ö±Zu‹Ìoʾ/Žj1t¦gÐëîïÆ{Ëá=Ê”%¹>ûX©W§ý¡Sy¶OHòs\úMÉ™ÑZQÚ¡ö…ÿËYL8;G+œ1'ñ¢"¦´Ìï VÀ-g‰²8yÍñÓl&TD :#Ž–@’(Ëu ÁÃ%y= *^2n?Ñaì\éí`Úucž ð°1=#¦ý·­f8Öv´ä)€ÿŽ;|†e(uíàjÒKN)7)í^ÓµËJ~Œ5üvyì3§°¯jˆŸHP¿ÒÝwÙà¬o;É#ñ xèÝÚ³ø§[ùÀOô!?§@ߦ_#*¯sR?ç»ô[µ„'%Jkv(Hë}É·*¾e’$¢/Øîur[§ìÊÈÃÓ·¾o¥ÌP±`ºÊ:ÙÄVWÄ‹4C—Ð<oÜØŠg‘¾ªF=I‰ä/ØôËù“ýD}ôƒÄ)ö"=´£íUpubhÂÛ0ÃÅÜB¯¹ÏôÃ(E8˜:ÞU7BRÿV³`™Jµƒ¤P*›Ñ›Ã ûËX ¾håó‰{4Bç:gèËåJeòB 3Ö÷w<ˆ+]’“‚L´s¯빬 ‚†÷gvw_š„–žhâæÜ u©ÕÉks0]¹¹©]© }[ÌŸb­/Zð¾î øŠW¦;ð‹ ×cLØÖ¢Ë äHO¶´ÉQˆXœi¼ÕRT´˜"CÞ;e8tÇ>™ò­¸;åÃSYÔÙð(ÁûÜ~}D¢^åvY7ìõÆñ2üItlðPø¶µ—‚ƲvØô—ˆø¨Ó´–}J Ô•Ï«ïö 1'÷Àð™¥ÁžZŸts jà™w5H”É#£b#[ØÂ(eƒ—MÚäW»á:eé¡Î¹§-ˆB6 wÄüÆ7X(QRÄS4(¤Ÿ<`ïä_·f?µ¡Ã"ÌÉÂ~‘Û†yA¯½Ø¿ž7\ß4t§ÆÊ•-ÑGO2\EÆõ¡ %6/ù üÐü˜m‚,[ót3Åì8ÑWs(/°õüv‚0§Ä„‹6?pT(0½Þe~ü}÷ªåˆâé,å§È¬ï½šèÉpg7µÆRûÃýO¿øíî rk–eƒnöêW§Z+·Ðª×Ãd Œ¥-ä®%(øê5Më5 Äú@¢7%@[­øvçÀônP½°êEv“ímâWSqÊ©/5ç¡v”µ:«ë;=2õBåýÝúb’öÅÊXÛzþjƦþÐúëú‘-ÖœuÌk:PO° ŒÓ?÷¡b®ª7\϶ô@¾éRÐz”×DB²Â@´"@_(`ìÌ'ó(6ÝAÔ…HO•Ó³ÉN|[ן•o´ GLM6jÒ'زÞVtâúxÓ×Vã_õá‘~›ä[uÜ[‡s|Uv§ç÷ñßbÃ+?4ôÿd‰,üxɼ¬X?î–Ï“.7C¼ŸìÅ¢ fÆjëè$C(áÄþž»‚IzcQiƒ—xº¢L¡rÔfWÕ,kîªkÔ.7Ð^ïÞÏb…ü¼8’¥Q4¶zò`d$R¿Í*?>i`H”ªŒŠÿÒÿ쌇; „ƒŠûÝ ^ŒUÇÁyÚH.gI|·-Á—yÓ#\ˆ|@ƒ ¹ø­;‹nb · §¯)Jùö¤‘ˆ2s»Põ¼ o[SY½C Ù_½{ÙçýC¢Ûôß@ˆí ý}K˜Op¬Ë‘@ëÕĵ]Ö‡þƒJ¶ì†r×'—¶ëgݼhݨºŒÏÅz†…ˆ¨ÐÀÓ7j÷X5Ü‹dê(üÚÁ`¾ZÄÉéc¶ËõþGÂsÃ-Ÿ¾lü릻­Ö‰»ñzü:MµèH\* i¤_ž¸q[Ûÿ<HA ¼îÌ­°g>9 ˜;>é›õ–)hü~Q¼Þl¿ÇÆãò‚t£í-å’ú(=!@‚ÞBä5.²!þ¥\½|ÝÄìΠÍìÄ*Oû‡w¾º"^h­†]âJáz-9"N»…í®ïK¦²Ç®LÙZRÚèÑ9Í}Ö‰ÉTÏ™B¶5z[€þdl8¼z$[ôU+W·ÀES6UÒÊŠÚ }x©×iê ¯=(äR÷Ž~’%Çk™zŸˆJƺýïÎÒaÆæíW™s;¼9ª%ùŠGA&mnñH}øÍ禜8ó—•§è™^»SÏ÷bXÀø-in-˜hÕ’>[žC +WŠ ²Ó±}-]󨃥ïð°Ù6ØÉÁHÌùNSr½Ntò„´ax“›ç‰¯¿4ßìŸ×šU®ù¶Û½š//76&)ÏE.ûS9뺜2JR)Í;ýÙÙŒF*ž½f¯¡ç'×ýv¿ dMß!ÈU0ÙKVçpùó3Kîµ®ù›Ë×¢©/÷€í_£Ã8aƒp­ïòèb¯]´vÿfwFŒB¦j8º–uN_\>Þ˜ 6“®‰ªïªIÈë®É¤óËl% OWz?Iñ“ùÕf»ú·‰Uù±p-y<^5nSúîdŸü–!Obkijöü»~èÌõjJu-1‰]¬E½†%ÔÕ!î{@)  ³ß{ÒËcÀ-˜X”Ö×û×}Ô_kYk•ÑÈg%ë…ÅqîÛü •ȃ ÁÒoáß'×–mõ7 ¢£ß3xßk2/ ŒÀñ仕Ïü;" ®7c•R:Nç¨Eò%ËR¦UKî8¼ë8ä«)(‹ ¤‰¸jëøà)ÕAlß7£í@Mò9¶¹ê¼¢åçVle¢lUåo>,ÛÉ!~îP5©¨ö÷R­îbšWl§fÁ Ç*_,Í[×µŸ}¥…©è¶3¯0Ø£ÝåœNÀ¯fGê♌àá.äÅŒ QŒU#O®6Ì$ö’ï-ÐþÓ×qA¸Pó $¤iþVFzzcêÄþû)ÚkÓÓ5µwç*üÖ­ß„üY;´Gžždqœ4_µì¦”68gÇï>íˆ YG±Ñ+ ãÏÝ€~¡À±C%ªPhµ£g†ÐpiÒ0¦¶¿Læ=ÜL FK`£*k3:¢ê2® œÓ± éŽçoŠ+ÎÉôEfH }ŽÐ!'Œ+¦Ê3ýhû3ºÖô#µÒâ†[×¼ cußä½ÄŽÆ-¦$(Ý;=á´¾ImÞð`BùÌ<ÀÎ`#ëá½ãša¥@xA0¥ÃüŸ¦¦ðEÁºžÖOµ³†ŽúÙú{wÇn•0ƒ-_€\™Rýh¼+ï€âb`4O)˜YÉÕbº ÓÍò ‘R‹E¬Ê=lG lâ°S? c­AñŠR¤È¥_Ÿ!7Ö%MHIÖ‚EÇŸ¸…žnvWˆ>ÅhŠÇ³ðäÎüØ{Ħ•(™«?Á<ý"BuÑ-)C£Å1¨&$Þ—%†××ÒäáFX«¡ñ`¥ãoý½„ö¼-‘<öEØÕy¤ úû³6¿Nó]ÕŒi-Ên Ù§F$^˜]Ÿ-\•™S¶õ„FÛ) Z¬éÂNñ…‘M»c¿Ô̶Ód¾§¸›Ùc.žß.¸.X2×ü\ŒØ^+ˆ7Ö±yæã(åi¥HŠÞ€õŠ ~€ÙXÜ îxPÔuÈpŽCÆQ¸%äœ#rQê’t6ƒ+Se©Zõ?¶†fÝEÁ®/yÇ­w°¸ß(g“y<Þ3Ø´ììç¶‘üy1@åBTî÷îr“hÊÝ /ë Ÿeì{, ¸¶_Lfkw"YªÍ9pÜçX[p‚²‘¥×î¿Àщ¾^÷©¥†ìï–7l]ŸGG¬a`l 5®æƒj ïò0Tö1ÌË©ëuq[K<;FY4êß—,Œ?…†iñcž¨ãh»S–"P TDUéhÕûmYñ¾t ñO´n§íˆmgu[S¹u©gŸÞ;£ ·‘­ê ·\÷U·äØÚ‰ãH¾Œ\ i»8ßm úÏŸYä‹ Hô< µBM!ðg+.Á[ñ ‹;š¾Þ¸Zð®@$ý-iË^yKÕ¬F(¶1Ž @ixuü+è‹ò£«ó”‹B¦ÈŽ.¨Æ™¡•¶>»¶„þÙ\@dÜA_àºNïéqñóÎ^¬¾v9’p)uYÐ)%œˆ3¡<¢J@¶Í7–ÝÎ݃ºÑcÿõÔúkWk‰±§wbLÔØËy©¥ *65ýh'JYs©˜‡š$Æ‘Ë{ü¹`.Ë9ÃØ9vªê¶b3TÆf/ ÂþšNŽPxËX`Ö¬)œ¥I.£·Vj¾#™÷0Õ[S{àwÙ3ÅÅÃÛ[¬qg­¶_/?›mªz®H²ž¥©¢ˆ²àš+w " åã\ ¯  :AëÉÆÖ£Õ®ûóiĈEnþ;vعô™à“{÷à.kmæÉLœ<ãîÁ-ýaê‘—ó-îí!Ëš4¶·"¦ƒx ®ÍæXñ´ýŸÙ릧pO¿óÎå› âÏðMÞ Gzö¬¹…“Á¥¦EQ4Éî5?À9óMTß$(Ïn:5d³ÝÉWß(£Žø•JÏî(#8Ðy„⨮JRWd-ñîA l€ÿÜÃ=PÇwN|/"ƒï3'_|l®Ýi¯C±{ã¨\ÿ¦º_Ã;¾·Ò@¤Ü³˜°—wzvôDvE‘Úz×̵é0·U[TÐm4 ò)iò¼NÉÀXæûÝâ®õ¹Þ}éËÊoëé·%ðÊZù;ûwö1óòp×¹³{‘‡]—Ïosyv,_cì²| y‘ÒL¡Êøï5»Vh8ët$ù3(tPçou}~MÛ]Lœ UȆ³h˜äácภ{zÏ(’DÅQgï—ƒ¹âú.¯$EÂd®a[â–›–>I;Ä+{ÊX±rÉ‚N$ _Ní–úé~²C!n \b|½fŽ­ˆsÜò¡s þáñÿ|õhpÌ‚{»Ìe>âUpi~+Ó¾>8ŽceM,º= =°ÚSð ô³lóå¥Ü9³{1.ßm£|)Š ¶6Y=ÝU4ª‘Mœ+°j/ß 5#£NÙj®Âàggb:£ëþpi:°Éð)(;°m[œA2»J8ÜôÖKi2Oç\Ê6,O«t.ÎŽò„-[¾Ý–}º ¥ª&I´–†°‚ˆ‘¿¡s³^nðZþp°‹ãЫ6ÿÁMÑ2~ÅóÔ„ûªé»Áκ:Z×ëÅ2â"dç:{Ú«ƒ|.@ _ø^Š©>Ž_h!8t.°úìÑc©5û {Ø_ïL™èMÖL¹ìì{M¹S˜ÐÐi1 +ß×.þ3ÑÁämSédO$]·ƒY®ñŸcÐȾç¾FÐÉ.Ðô»Ä’[ö£ 6ÖV™Õ‰ä°uÍŽ:ÈÈžÂCÌ—ÄWº¼¼T¾çØ&¼³œˆ¢81×hÏUîüg©è9¦I••t}ùWIÚíéy©E f&÷sAª û¹¡X„aÝÆóì]x½iU:¶j‰#Åã«wÒ4¹dÒ«Áõ Iž¤ÓSQW8å¿©Þãø…ߨX늌ÔCìðCó:lSÇ6­9º…y/É·©ˆ™”y»ßÿ~ƒÃb·#³†Q‡‰ØšàGöûÛ 5Àþ¼‡žô7ªÝÝ•÷kËè‚5¹iÙ»•¶J`.ër[NT¯<§­9¹¥×¶éÍy¶\RàkïÓ!–ÀìË艪?59~äPT»s=…^™M„™a¤.ÆXP­ì6ñaõÖHèÂKÜäääë“oRl³Ãꃻ@[Ô&/,¦ó!¢üIö¿~’d)9¨v#A)±d·Ýd‘«nv•5Š“ö¹‚†¤ð¥uL®Õ‚J9€ã®_ÞS2(˜z‡O‘öH^Y¿l‚amÞ M©«Y:¢ãéáòEû·£*Þ'bS¨®yâ•D掽ւюBÜ”‡ý¢.J¾Rÿ–{|݉s¹á5uärÎ^Ý݉ÒyröÓ……9Ú[8 Nâè–ÞÈúÏNfn]Gó Béócñc‹„³£1HHùòCÓ¬˜áÒ“^‡€O²’4ˆ˜ä5èÉ”Å"Ý­÷ÇѼ]èf;«>™‚ÔŠÏ•ÒrN¢^‚Nˆ=™Š\$QÆVW=_¡D¬òzÐúZÑ>¢Já¢R'§÷¦ü¹¯H°/­x§ºñÇÕÞ~eQeÛq–zvØÚæþ–œ¦g¿åþ-]DÓÅÖ5ûq°Ðb†0èþh m )î€ýcµË¬$¥eöýQ(iñ2ÔËVqKç¬P"Ž'¬3ÁÀ&k]”PÏÖ§P73 èú*ÇêfxKà—˜¬¹ëe‚<‡¡>øòsæÐžÒÈ‚¹L q ÂÔ‹®à–6‰_D³Ê';°#x1XœšëD@¼õU²·;ŽÊ@·+—d:†ÀõÐøÄË‘þûåíH8°6[åþCÄ´.’ì亀s÷‡lDžÆ&‘†/¦ý;NÝÊëýq”Ř5æö¢ŽJ¶aoÖqʈ")úb§ê0“ów’cè‹ß…óA"‹6o÷ŸÉLtd1<”¿4äÅiëÞ*$ù 2]Ö< À·eöÅ%ûì,ŽW[ëA•í§‚¦Þ‡¸è¥ÿ§¡‡™ ü[´8¦º· –èOUx¢N(uŽH¬¹ÎŽ™àp.2iáìèÓ°_Œj.Ø¿ËÂg–ZÔGKF¾l4f-]ÉP2p¦O$\§¤9±rÃ*±AY€ïýXš=_ïV®ð2‚F6!—3Ýå(”!*l'ï«–Âó½HÙ8ù6þlú·.XWÜIeÞº¥žÆ@ÖæØ¯|wC¿ŒÖPÅà·Î9y¢.‰³–\ ¬ÆPÖÞ}¦±Eͺ(ØK–tØOùc+pÑKnÜv¼•;ªÉÙZ{]¹üëêï4:„à9xŸMßæû®îŠ˜WSBr‹Qÿ妀Ô,/”ÅtLœ/3mù£[W*÷ 8I€óÔb‡˜|©÷ŠTÄg› ®”œAä,…9ïúy»¬¡?èDS½>ÛUòÿø2ûë+FbÜ8¾Õl,opËÄ3Þ e•wvÑŵûæ—Nº»÷¼y’Úº™ß¹Aì¨*ëD].HŒT¤·’Ï*„U.…ÁgVÍ‹;!Ò ¦…É­R¦Œï^ƒó:X!À®V¤_wxhš›Û^)‹æòý©©9Þz17ïévבóšþšR¤ú´¬¬…œt9@ÒU©X©&Óh4Î÷ÌOå“ VB´‰&бØ®‹ªËè!g,‹x!œÇ_Ý¢m?D±I\qîv˜%è (¯~;ÄŒK)ÅãÇÞÙ€c! õäã¥÷ü³·ë±åÒàJ7żÄ6$ÛŠÁ]j¢  »8^Ò¯ßW!hxß îþ¬^ë<(Þû ï!2kÿôTjlÞˆ –È9$QÕw·ÃöÕÍËX0aàÛ¨ÞZ@ç¼×ë.^”ËV@²ãæE=â2~ûøšp(oh6ʆqâÞûX¥›‘]@¤p)=UH’T¦&›+² ŸðicM·¬/Ê›†ªº·Oë뽿+qp¯åEè'訪tB &Ü6À’k‡ƒ2]^fŸIiÜìŒéë×¶¤Ç™Ã¤q*áÁJ·²*M‡•U\F"½6î Çõ€oß_»¼l'=ŒÅ),¥À Ï}mØŠ üð 7„éófÄþãŒjƒáO_k V€Õ›»åëábÀÙÈiÜ—KdʼËÞ‹ ¦8éΓ"øå'’û>3Àí2Y¯=’3Ù~«z$»Tè_’L7xD¥vÌ-³T€§ÉcN™†—tZéU|ø –£/-Ì`% 1-ÍᣨyqQÒ€¾ìVI¥“\õµ)|&½ýæGJüCå>°RÄš=[Ÿ0V5©hca÷Ö5¼”cê…wÓ¢‘±Y—hFö]ްJº…ÜpÌÌò,XJD‚—ñ× §,âž±ÍoŠ'©÷±ÕpK†V”ËŒ˜ü°ñ¾”¦¹#|"1¤Û¾û¾QKjTØc˜›ω¹£`¨²´uB ¯'¸¸äô•I¡‘âÝÒM¤Ø—€¨Æ§6.öÊŠ¬À)a t‡Ä…C0%·ì6«”j3¶Ÿ/ÊLXP¦@ ´J† ˜ÕµÌj7ä´Ý¨ð*·úMûÚvß ¤s¼d©Úœó¤TÓ‹ké Ñè7¾pQVÙ6²?=¯= >Î…³e§3†6§¼XèDÐ-{õ¥6‰¿`÷ÓA•aëÔþu¡R<ÛÈOÿ©e>á°{«¿$d‡|Ù‹`–ú,fg [Vˆ¸ÜÜa§7ŒÅô#H®¬OxÅñà6ü•@2þ}ßÓöø`ÿà+;l-H6¶ú/dC6XÐÌwW&b½L³Ó—›Ig2K¯»ÒÏŸ‡bÓ~|%$‰6›šùý´œ_yåëòa»ÂSð0¦Q‹ ƒ“y®Ì(géM?ÝZ¿ôS„ünKÆÒ±“êOëû%±PΫõ—À¡EÓÒ`¬FÂ"Ï3ÅðÕaCÈ%²9¤¯ëÉ ÏáÊc8Cþ$}¼ãWÔ 9ø•ŒÍŒ.7”Ü\Þƒß+QŒú…˜Š$$²¿fáaÂ(eA˜è³,~/¹ø¢ËYèP/È­2}ïFõcÊl}ð=a…3í§’Ó&:õ[‹lÕNii¾Ö¤ó¹ì3Ó>•G¿“ý²«*!bîÙ‰¸‰5.¹.äå~HVJb Ä:¥ÛÁW]’nÌõ·åK§£mKW4¯· “¿c(˞݋öèIðÝ~}oøíeÈìæ?ž‰È‚£¹ØT±¿òÈ›ÐB.Šò¸½_+bT‘¯sÏ«íã0Wµ„îÿs¹üþdŽè7öu_Mñ«… <—¾YÃLGz@‘.–$ûW±§×5ÚX¬§M§´Za@(Fˆ>* %†ÍÑÌ'I)Æ7¬ÕòÅ]>‘9ØA>˜º?÷P•oßôcxÞ|pÕì9ˆw3~¦ŸFŒù|qM~ßW“ ÌÊ!ÏSÒîPÓÎ6GGÚ÷1Òê!V´ Ú@à=ÄÔ2üÌå8ÿÚ™¬ºÅÆ™ÕÞÇ)téÛ ‡“›-åÖʡŲç§RÑÈâã ô=|—EìfA‘.“®vxÁ$3×yÚôóåÌ!JL¤a7舳Â[~“·í&? håg £ñ6ªæÀ+2•8zö—üÚ#ü­£Qž„£IßúyçâþoTºàª]|DWëu^xï‚=îÊùCBÍzªõO¬“(]¡"FÀ¤ÏÆ”ÒaÑÅŽŽ(/“®çh„¸ä¡ý±_¶ §?FÖ!…Œ(e¡¤KqÁøy= çb¾¶=!‚ÅíaužPý.«)´(ô]Ne¸¹ß© ënnÞo ø…µ˜úšñ‰ž4…Ëç'0Îó›ÄmmMÌŠ,Ú=ÕÃ/<œŸ™M0C€£`Ák‘!n>qKÖ€ qFÚg&ïÇÖ¸¶a^ñ›çT1{Â.Ê">9’‹FdCÕqªÓ)­mÓëÂ;Æo~ï=›g4b/o°JÛ±K~³ < zÍÒŽÉÖT6†øc*n Qª§œ°$K…¾9*j¦~¥|ü.Ê7ñ°óRª<¿½Æ•( š‡ÇtxÂC”×GQ”ªÂKÓ ® žH08åEg±;jÇ,(K+§˜ÆVl“"Mì?ö]ê<ô¡ŒÑô[Ǻafÿ°20‰½UN&ú¢—AÛkµt$+8ƒˆI¡ ˺r~Ù0šµ½âW•â¹ü#$mÂùÖ—°—øEðÂ… –œË§ Aû;rœë›¿Kþݳ±RÞ]s%|X믩ÆÁþHu ü»ƒðUÄŠ3eD£®¢Å4–³ç‰L \X´ÐË’ ÉÀ+ì3OФ›°éòa}Ô¦/±Ú{õ FßàÅÛ1 Î/dãe_èÂ@7Ù c<ØgÖ²âë.ŒXÊpÜ Ö$^¿”Xà¡ÆuÀ )·®Õç¹PèpaO0¨C|/zÈOyq›½Ï›N{¡–5|Øå³pdïqK3ztÿ¨9HOj{ÍYBFÖÝ×nu÷Â1ï½Ï”í ÕpÁ®ÓÃı Cq,Ǖۨ]މ b…Ÿ¶ß=ûÜe×°ȶû Íu¢~¸î¾ýíÖTjˆûˆÑûÇ¡äÌ|0‡[ôÉy„O~×ßœ€Í ‘~¶¿%oÈ‚<÷eçs?]èû¨‰êãõ4‚pQ$ì þÜÌw¹wä}Ã9X fù¸É2ü¦1„L–Ö¿pÍÍ•>QŠQƦf;ñGršf“Úc-hlÌ­HT”ï0z…™óŽ w°ÜÎPŽ'ªÊZ}ãú¨À=)1¾¤ÿ5?ˆ0en}²‰qv\›stk|SŽF¨Ê"ØIB‘çé‘0ëáÞÕ5´ÿÑA?)c& QZüʪás, 9髞Kj ¦ $@->Óô ¦ËûòOg[HŽOéG0Þa•µa^;YÔt{ÿX’Ó²žÏœO$Ö#.FEzö1D¯êÃE Dû´M¢Œ™~\ß“œášf:VË^ŸŽ°åÀÆÏÎTŸøhö†ÄJZ]qc²’ݼªµŠÔH •ê³™CÄgrÖzˆü9\¦Ipì~¹Àéí6à(p¥ÀUQ³"È*òпƒ#áºèH,~4Ÿê4´¨_HPw‘J§S·%d¢Z ãçñz_òs¹G3‰Ö·¥%×Ùª§øý[Øb7žV¿u¹ï±æõØzYy­&¬rÞv8úw¨ûÕSwZåj•jZ¤»»? §ƒ]#§ø¬Å?ZšŸcaÙDŽԼd8'ÓVÖ22Dç xZDõ~3ÖÁc«úèh<$‘ÀPì!Q"ÆÇ‚u2Üé5 5ÞÙKìJžM#)ž×*Z@®6!¥«Ë–ûbÑú¶û:áB\ •>3„ô œ ©è|¦™ÑÔÆ;;}e¹­Û„¶à€§“ѱÔD…=Ê¥Ìs,UwYÖ%±€¯˜¿Ñ#¾)“ žàny–±UÐ#Ÿ–?Ú•ò#–öX‡[|ùª!ØÂer³Ô#åLx:†Õ=Í_>Ãú«n#b‡mjçÃréÍp•Q4Îåh.°Ä »µÑ¼€¡½Âè½9f9 °ŒmH˜¡,—k¶ðVÖã˜äõ^ '_ôøg$¹§¦ZRêà Fí;ß‘ÄF°Öý)„É{oÀíí3ï|_æ*}ÙWfk)uß¶ÜÞ|ë…äÇÔ{×Ç>ôý$ŒÏO$¦εøå°àå•<û㣂ö9Z,ÓÃ' ¦ÞÄÌ7£tÛ…Ãb¥“Ýn ;e5Æäã”Ó2¯djˆ.õ0ÏÙdš/ ½ó‚Òg Ö ýH¬*}ÈI‚3EF®Ì%¢˜eKª•¯Jt€Û¨ÕJ_8rË Ö<ÐÅ#<›ZÉ›$U¤ã$J±FÀ*•…3¸Y‚Áy±KX÷gáZ§FO%ýs°b—Ø;þEJñ³Ç‡4$VJ¶uç© >x_ ±Tµ‰™öDËÓr¿ðBºr֬譣¢˜r6ó4QA¬Ðý‡£ÈÖÆzÛ‡'›û`Rn¢ºZ^dF xW´+Ñ‘à;¹+ 4öû3Óµcl.aºtêT¸*È<È•¾#ÿ0Û†½§ã/\¹MHBÏ—7ÊK•žaø0¤Ò0Ì¡ Ðnuˆ8¥¡:k “÷¦@TƒÒžÏ6afíq©yN´þô§ogç¹’19GJ„vn4./ˆúûyÞº„`¶ŒSH) Ùƒ^Ó0^”ñß±ù?r EFß]o„¯÷γWû7l âôc"9'ûñdvw>«Y#qì¿îÀ3áØ ¾3£ç×f> ˆoB’0…ð©sL;Ùy×wFš¢â/Äf_ š¨+^¿T-b…Å¡] ,JIñÍJXÊè–#t¥Ÿx'ª¨’D^Kr’DNd²äzþÎÞ­4ÏÂôkf÷^©½Óž-÷špÍÎ’,•–¿­½c3>J,]Í\ŒÈ€.몹2*c1TO¬gBa:fù¶=·%6nàÎå{]%ïŸý®tÝ–Á;– ûCiA0 !*¹]‘1ö¾ãJ—>Âă#~'ÄÆ5T"Ÿo'cŠ•÷èc dá—WL*+ sÈcµR‡_¤#–#LèrE©×:QÔOÐ;WqÆN½rú‘;püm~S­ÿu¹·¶r‡¥Ê¸Q¸b3R¨#ÍOkV¿óSô»C3XßÓW7⯯h.fpÈù½äíÇû?HЧ½ØÞmä[˜£« ôe7cÿòèôEPÙ„â õ«ó„2ÙÚŸàhÛw"^%S̘­PCNGÊT 5êý:8ùßšžßÒr(ØÓùÌ-A?@à´Â(‘ò…LtDzF¨‡~B#BÅËíû‰¾ºv“Ñßý±¶Å]Î.Ï5¯^GoáçùNnÚ09,—–öèþœuÊ Q!’ï_;F¢%ÈËà.`?øw6uñkÐ3[]HôöÊs»´½^Yׂl?ñÄÚ?ùéÃl÷: ™ã‰Œ9 VZPmU¬!ˆi¨‚ë¡ó}Ël›HþÄŸ!s\i){É7÷Tfj…b.¸_öãģs@ñ®{Snà/(€;Ñ:¦$•<1ÐŽ°…÷²‚šÿ AÏLFÏu,’fOç1 ®6jàóp;â|= ‹­áW}ÙØ"®Ú©RNõÎîDξ¤žOõÙPè'¡Í—¦I¡ •I)ž¬6µÍœ,^ ë<Ó£‹‚ï¦uE\~[xø»ûZÞ,¯×ï_ÍqS† E×.S¨‚ª´ò¸¸Ø$EA]€HKþl)áËÞR„rÃéÕ§xTµØ]ðÛ¼:ºS)aõ1^.‚§CPÏ .çÂL9ôB ¦ó°“FÕ$ÄÔ#Óû19B~»Qf$qîT̨Û-ÚÓûv;N4@8à)ïdëYë$ý÷¯÷a‚˜‡Èçç^«ŒÐ|u}2¹Äó1ºf“~•Ö\S§®úZ>üÄ'¨LÕ‘Øç-Ÿw IhJxÀ…jº¿ßÚ¼h?$ƒ ¿~ñ›I~Üuã=øs¡QbGØI¢'û9övârà8ÑJ–&ó”ðN¶okŠäw‹ø—6ˆ¼uˆ_M?ht6rúñéùž+LíÌ;P¶d™ÞÒ'2¨ÁÓÀÙÌ™1¸Yiý ŸdÜí ÅëߌûdDùÓTÒé°r?’¥ «²‡–ѸÑçéìì!,NYzéÈŸ˜zNa˜‹ìQ–€š{Èë¡mç—Éd k!óÍpÜÉÝV#Nõ½Ž´û!8 ˜¸Bðyü%öE«F‚“!M†Ÿ©±ÑOVs M™’ë;3²´öšÐ'å?Bé(=‹}_–ôý}/Îûö$÷©6hH]sNt n©t0`Õ]éaè£1‰Äg©¨¡Ñ‰lÒå5Ð¥ (ß |ƒÞÜ'ÿLbû&c—¥i÷a b¹¸°P+Ö 8ÐYÞÃ'¼ã“¿ŸÚÑÃèÆ”R¿*š1c nodcø¦M“î\鲋'_/Aĸ20[Tj²9 ,Á˜–à‹Ðƒ7(+P²QÎA³e^žh{v8¾‚ôøÔHËë8ËÂM¡¶‰U'/_ý¾Ìóz»Lÿ´!{(ðû~uztK»5N¨#GÙÁ$š¥’w)¶sÙ£Q¸ Fm1"§§ÆÝ‰$œ™Aþ~„$Tø­òZàä0ƒiBLÅ6™Äb¸!Á†”í5"eÔäÚcó8îÈ ÕhÉÎÊ<ˤ4kÙF¾¦9wn¹h1G/ÝZ„Täó¯RPðMò¶?¨D0%{LFxÇK´³Í’L;Ð .ïz…ÿ7–ìn?›bJ‘Í:Ê3.iDóó»ºN¬G‰í^—Á8æù ü7_&“À † ƒØˆAúá+æÁ«~·ù†u˜ãÑ’=¤ñœR«!ç=ÖXÝèBÝž\¾DQz^¨Èá\£Ž WÙ²:­u,Ça¾ã ê˜È¦’„ÃOªÎW·±Xp›TÐ*¢ »4”þ¶çÞšï×_U‰µ„àúÖߣßí ÁÐ9.ÏäÔ_¯_IÓþø¾°JçÎ|ë}AC‰™öSš!:Ž,’'G¡*Êí"›ñ¦ RÅPêuS«Ú^ÅÇwÑãš0nD¬¹ §™ çD$Æ@~ž¾Ø£‰œ!©¢&—ÔÁ¾ÄaÄ,óÝp ’w1Ÿ;h{õ›ñ" I`¶Þ+àZtt‡»IîÓüLå{¿4 iS^¹H,¡¡ÄC~/0Ì#Êàh¢íÐû‚Yœ3û=÷{î~î>üyw>)›Tºª#º f«¡\*¤h` ê'Evž²d”d7b½‘v0_2¦3Z8b!!ͦïx>¼ÿ§ÕlŸrx¼ ak{”=Źj‡_ÚP]ÛŒðm(næCöYvh˜Ãý¸Û"=ׂ~C|ö‡¦‡^X°‡!ÓJ e#D¡¬ûbh‹#*]×6‡ ºà~%ŒWgH ‡ê÷ßâ&‚R֦˥ÿöÎê- 6Ü×ÃPC4(!#% ŽHw· 0H÷0ÄPÒH(¡tw×ÐH7ˆH— „( ½¾µö>Øëd­½O¾ûxŸë¹Þëw=G¿»w4LÜBº‹ËDÁ˜ºy²s…@ˆï#³•AV™³`žF>%Q>lZ§³ÄDæ§Mݸ_â”Õ§.Lù“/c·_žŸ ¡ªÊ“úGú¬j€ân7O†‡æB"¨ü(’Äó{¢ Q qûcºn¬’÷]`1gk¤evS–é1Œ6T+Mœ]Þ©½ÆHò i?¯e¤†}ûZí¯Ÿj6K‚z‚šû 44:ŽÚ„Á +µ»€QóštC+ Ñ${²~´Y¬®³ö&ç¾Sñ'V”…Û¡éá9 »‚óE­þ=3úñ ~h³Ó@ ^h³w¼–,'–þ僯TÍýüKqçÓ¯¡/¯Ø8@G½ŸŸ+mv:|fÕìÓá«„O~jZÐ÷7¬wyb4’{/ ^øO§‹Šø¬WÈ.çÉ,Ÿ êH]ë¶.PÇ{Úß=ƒHÎÞ3Y±dŽã…ž¼sã Ï¼ªFÇdëwÌ}¾éÒ}@'SÊ•—p6ñ#²à‚!3çÞýaD†hú„ÕÚØl¿`ÿÍ|@h ÕκLiß½À›$¥Ó-ýC#Ùܧ–ü!ršiŸ[c™Dz=»ûKŧ dÏû¶*ÿî*°ìîˆ\®ÑË^†³T£EÉS=QR;cò×JÌÇOþìðŒÒK@ xS¨ØF<«UÕ¨ÐÏð-·paðV|é+y¢õݤσâú£4wK-²îûÉWeó<.gã—Y$­”¡f¯Ôކ@ƒ#lµ«Åì)áâ§žbµë´W?«ïn? ©qs[Älè.2pñb²@±´1y=Þ˜¶¥ë.l³lÛ4%Ú÷^€‚Üþˆ{%[Ærš>ÒtÅð.ü‚:?ÑSi¿Ç²wþŒ¦hÈtàIÓƒŸîÇ/¹÷üÊ [WÜ%q*+Ñ|樜H² †Ss„eN*Gk³ªtÏV«GÃwq–ìÈpüs Põ„³¦*tŒ6X”aéHþÿ±®á]õªNï^íþót{ÇÕª! ;êøÇ¬oÃï©D¼P¯0†1<ñ45ñ#ü¯VzS8ÙéD T qƒö]Ç 2ì¾ßÚ{¹,‰&ØœAȼó¥ÐØ^Âl×`^“øâÁ= “bÚÛº½îÏÍgBªò±ÃyNH  ˆñìÉñ‹Ãà ª§µž$ÔF ¤Œø¦EJZ"14q¾d)ÒpâO@í”Vü+Ʊe¶«(íuë*TMŠEÊIê\õpÍüÏ/$50°ì)^”#[%´eQÃó=à"<¯ër¯{I|Œ½Î$ø{ܹ Hä §×#RFnöÿ¡‰â–Œ´< çû²GÌèI6˜®ßL[^ŸàÇòféF¸â‚üZ2ï¤Çƒû !‚©F€1¤ìì€+ìšÄê(L¿ç²<ðSç´kAÎ ·'€¥zwÍb[FK…•0É5IœõB¨œñ]Ð1™%àÖ¢—,|tÊwˆÜS+ʬè&”¬´õ8×m¹®JžËF׌v…Ξ“ý-k×3 ¦?‰»—»o™¶ p¦å ”rÞeˆp)}3!! hýû‘Q¼Ü¾#×xK¿z´»|bíøÏÚ˜BŠþ¦ç Óe&|Z az¤©ÞNÓ} ¡¡ºûP@&·?iÝ#tbë3$§î,j¦ûQ–&~¿SËÔÖÕ¸¿än'³ï•Ü ˜Íå‡&Ñ!àÛíJ‘ú"ÛЧ5›Å8éWî|Α¸ ã™ÁködM…ïh¡œ€Óa˜N- %ï(L†ûƒî÷<~`„Õ”1*V^œí·ìèþ+ÄŸöž6CðaEKÌ ÐÓîYº_wjõ:áFûÊW#˜šç%“š@äµx^X΄Úß¿½4Ƥï/C ¸l¢Žìõ팧%UíðgÂn…&×ûvY\ê?dTµ»kÈ6£óéõC%¢\ð‘UÕ¨‡ÈŽSüú+’ ošÝ0³DõO{Jó÷#¡gî†Át R?÷´7¸^Ô&P¸üí¹m •òÏ0é[}ãëî-ßÏ…¨‘ÈîKúKÌ.P:5\ª‘D [6nT“sY°~¦f%Aòœêy}Ãô){PÓpɶL1ûÔ.kéBæòª«ÎˆMôg>9!¸ÖÐôý¥¶žÖ™ÝãùHåÛ4U‹Ö?½½¦+sLž¥ÿ¡!êó=|!'ã—:ï]ÙgÆÜR®‰ {ž˜9 œúöS ͉îaIZõ§œ,‰÷Tª‚/žº?ÞaºÊÚZlùÉ,¥âñ‹øCæË‚$ð¾O\óÂIëõlQ¤9ÆŸ‹‹uJUâµHåh©¢%*WÁ ·•)Z{UIBáþ®²Ý:ÕÊ­xÚz™sÛcÄb-â|ƒ)ÍVñ½Ôo½&÷2ËSúã„2u†Ib(iÕ²Ü|9íâÌâžÖÓ.Vw«´¹8æëÙÚ©YŠRüõݹŽ:ŠØtÀh?+î°mpüІ:p³vM—~ÿc’@,{ê|ŠzÁBçןã¼í[ßgïCÚl–[êi6~ÖE ½=-¦½5VãíÄl‘´1ò…Q6|1‡Ù…l1 „ä¼…B¬ÄNÐ!…w–<Ñ8#t…åB1h,CZ«¾wc¤øf0<> ¼Ü—\õ³Ôe)2:£"šã)«.!¢i‚9¬þì­ –7r¨ol½œÜÎ˾Fœ\&™È^žÐnÿhSÍ ÎŒl RãÚ.JåÏÚ® %ôçî•f„L£àŽ¢Ö¡l%€u‘¼âG]9ŠKd˜âMð}ñ¸HÊ6Õ¶cö¥_ñßn›hß |q7ó)"|ƒ\2‡xS¡ßvòfÚž–ÁjˆúÁ=YM 0 ëj Ù‘cPé3»¢^ê’°r^%>r£B8ëoËÔ^"á¹Î0Û8Í)™#6œEÌW'Õ,ãÑUm;+ ”€‚f"hwõ”Y‹ ;—Ô|]’‘xÓá|zø¥½ùIuÞõPÜ_TÈ7¶cÀÒ8ÇÕ|È©®}vN'|WÆ1WvlhH9×Ä/÷ïÅ#xʼU3T#²Ïê4ð‘QPÝ«Ú#C›œ%JÇßÿÆÂ¿s…¸¯Y»<ûh_²öM®uþ›ÜmeÉÒtÿ÷íÔ àYdr㈘̌>Ì~óÇý훾^¥ñ½]]Š×T ÝO*±x·º¥£*Ö´c N¾8Ú ­ÏŒ}ÂNÚ,7zæKP6¢Ý™›ðÊ‘¬¤FøÊ5ãTñKµ¤IÒ½[/®¢²“Á$´³ž[ÌÙO„R4^˜ôˆS­J‚ãE^:ˆ{ÿØ\ÿo`çF7ñÛúr&ç>'á,çµ ,ÉûºÑwÅ…9¦dÙ4»›4®vD™±t‡A²®)Ä? -Z™Á„"=\„›­¬®ãGeuEŸKÄ[y„àžE2x~c:Búæ,ÌÄ–z§Ôðû¤Å€žˆ"a|õZ;Z0h†¾oÆÂF#–’~u³ÉnTBláÿAÝègxǶˆ·NŸˆ`Цø€« UùwãFwùà?épÄ®jïÏJßPFõ ‹ –´ê©`ù¥øu\WÕÝ‹Š#Þ³,®)øaŒ§™ìƒ ‹EPnºÓ=h§¯åjüï«Ù“ÇO—Ú•ë¥E«wÊËÏP´€ó…R{þ:u-)©\›Ñ§¤¨Xýå|þ>Õ~£zk©–†–¿çGûšæßõò°tЫ-•³A濈vÈÖ‰,×Õ—Îh:Þéÿj@³%/§$höp›Ú;¤•F@9–ª"0€SDb¦Gï]84ŠXqTYúÖ´²Fà²O³ÝÅ,ÂôZ&–¯‚Ž.îÁœœ"Ê)iß*\jz˜ó®œy\ZÂø¿¥¡ö:¯rï6YDý»á› [ó»¢ý·¬sM妦,‹9Žv†N¿¬‰‡\î¹ 3ÿ*ˆ -!~DQ¹žhsëÇûæõYG’,™¦p;„¸}!:°‹x*>ød˜ÀCìÛì’™³§·J×±3Ù]—f.fÎ9£Â· jbx*ÏGÙÛc³hçÝVH½  pOU-ª”Ô¸¨]ŽƒÆOá*¦Ð±næ YÒ•Ïv-¸ËÓF°[,„à@Þ ®½;’Ï&p½î7¼Tj¯ƒÍÕ¶&:ÃÄÂ=ZÏk¹$?Jè0|Ñôr·þ±·0ô•¿Þ›h·96n¦­r7þë×þÞÞ¾ó>KÏÈŠm‰ßN¯LϵÌ+1öƒ÷zBNy,»®¾í|8J/ƒ´7¹71|Œò¤+çÊD¹Tz«QMªç–Ù&%÷ Áʱ¾ƒ2h¿÷3ÑÓˆ À-¡ “äéqùòî‹/C´œê¿Noo7Ëæì/ggýüš!“GMÉÉg éêñNóùï¡ ¤MôÜ»Z³7“µäÁµ8‹øYÐ×»ä˜>¿×x©·l™@Û¢‰¤êxöÔ&úmùà^ãnîýfBrolLÿo¯UÈØEðkÙ{¸û͆NÅ÷Òço¯d¸X$Û†Yv7)Ï»#K$ÈmrlK2O¿}w?Ý2Ǥª“{? ĸ“†bèàÅÈŒÑ Lüà†yáKùÚöô(M»ÙmïA¸Æ)°,˜ã¸ü6nþÉWöbö½àäš¾3f3²Qÿ4:2ðêÏ0aD2[‡, ùêÝÒjLMMfbÒ¦;$e32µýaÄLXV{*NSdA]LD¤ðï\“£tµ(³J cÀ‚(|ÂTp‹VzYË>ëÏ?9gâ*–°r#ýevÏüà[dô5p€ýý÷§³¯{\sǾ$î5!&M;«ý%ƒ1(Í·×už2÷TSrƒ*ÁLþ;Ÿ‰óÜÏŠºh¿®RWˆ‹Ø=^X J׻ŃJ°n|Nï„Ý™pØT Xb}qú«øg¢Ÿ4©(œÔvt9ï^eîËÒàDQM3¹ì‡°Þ éýäåYå%–} oTëUÝ,d÷÷Èpá0hUìÅßb #‡În;ÕÎ<÷´¯ 6^ضúo¼ØÅúÐÌj&y OaYÜ®E"sO²œRfĪÉ|?}³Õ>ÚggfÀ¡ÃV̯™z2ðåùî)’›@–ÌÕ,/©óª­Ô}ã5#ëí:”DÏw Ë^òž¿3»$ò, ½¸t5t¼´6@Ö¼ÒuËŒ9þ€˜2í÷îel#§4³¡½8R]ÒPâKæQ8Šáyyzu ”€‹iF s‘¢ƒ7¤“´r$hþèWÙ Ë#Œ–Åp }$bÈôÓœl^mÏÇοlÚÔ•«©¥ç€)Ji$»f8jß7[“´_œÇUPz¤x”œÚ½²ë÷iµ1¯VïxEâ~iø˜ckð/‡ÿE².Ÿ+ŸÇÙÙ°dƒWØ0-ó.,x"Ü÷ý·ÁhAâêóÃÞ1¯›oªB‘ƒ®Àá¤IØIsøaðÿlšQ³“­ãºXñ‘“·óÍ|Bl!)âcF(âõŽTÖôüé+å|ìyuWz ²¬=ì¶Ç§gñ`]ßCÁ[Çábz{›7G (O™ å—šÎdЉbs4+Ϙʚ¼Œ¼ÃæDOMÄØ%'Õò3 ¤Kîný± ðs plåfÏâ«ÿ‚ª1³ÛÜagH|÷¹Û,À7²8”ˆ±Ãì“›è^2ínt{’LþdK_ð¼‘0dÚo›7è~U:ü76H‘›Š ^”ªM§hÇ$P+€³Ö'™¨¢Ahʇƒ[õÛˆ†0Öµk}uqj¾‹Çƒ2ãǵ NVÜ*Wî»ifßD0ja½ad¶ž/·mHÔ¯`§¾ô;—üîõj›üD%sN\0VÔIWsôÙ©ä&õ}g™øaýóušA™¾ÛC`ÉTÎÞÏ<Þ_ú“>‰%YEóEÓ©ßÍÃc©®Õ—5máü/"|Fçû\\ jõ^’?<Ã_Ï““¢]òÐ-j7NNIDjhÚçÒßä×øH âá6 Ž.­_ÜÊÝ݈å¹ì¦Y%z`ݺëÇo‚/) âbNˆgq4DçºÄÚCÓØÉ¿×¡ìLïh#À“Æ ÒÑ…iÚ•¥âΕ¹ÏÇÊt¼ hŒ,L¬]ýß ñT¼£Ö\ÐDÀÔ˜¼ˆ–}Ût/–ƒ=a-â/„#-õ)¤ Âœè–˾–kgº>ºÝö´i°­%*Ñ»á4YAç0ErA6ðÖ¯ûµG‰›ôn52ÜÃ\î¹bÑPh‰ü9׿ QsæÝMOCrDÛ޼Ķê7“X“‘¦QâÜÏ•\ƒ0‚²^ø¥Ê}«n9ü«ÂÅê¦2ž“¹Õ·s–ú ^Þ4àJÂÅ¡ûÌún÷§õI8*§×õ" ‘ùBDå]ë"t@›_åid½ŸÖ2ÀfqŸ¡æÇoÚé>B k—tt€u‹Þwyä˳‚ò½¿8I±òëÉŽ¼O"5w†½î¿qÂSnœJß7Ð&Gýð!ÄVfþ¨‘Žr»X{®‹¨4¬$n%~iyvì\ŽÓDN? ^ëý¶j|(ð׿ó¢ÙRÑ•Rui¾öÍçøêðáºQÝØxNÕ…×%Pp”ù¹éÌ: œß×_sH¢×¥’ö$„ßr@­(Áâ…éós‚ÈtÖJ¨Dœ'Mœ; b ñcŽ(Sòõï£:´Tö!…WÆYÖ•$?ùÅb™ ”È—zŒ‘>k¯_ð¹ôßðáÕb EL~|½lP„P[íà¦*æ9klø.o•ø\1ÿz¼ãÎÀoÉ÷0s¸ò[^ðÇCÇMàK\޲—Á,˺ïÌõ’¡ Ÿ2©6€x\äu„úJ=8ïÒÔ:¿Ð´ Å{~Dçé–±ïÌdTiY´•¯é:&Glö‚ .‘{ßÀܦµéD{Ì ±j¯5FE¸‰4l‘ÈŒ€ž¼wñÝã³3ÆH že¤è“¼+Q­u«ÓûÐÒ2¬ˆÛÔò‘›ª3Ô•ßpREgL)á©ûÏŽ3±B«GÇ&X$ñaØu¶!¶e3?”_ÌXJ,ËùµŠ/é¼s˜ø0Ó˜¨µAˆøCNW*UQÒIŒùÌ]©"U)½–A4K"äOèWnT…㦟¿aa |/þèÙ@6L¼D_¹h!Ç´ ¹ßçî•Y9PhĨÐ?â‹õ^V ,[V —ÙY Îø½m¸|0ԯئ’9¬ñ!%JuPGÉå^aaÁè”özϺ¼„‡7î«–¹ÅU>%áj8ŸØ•gaBEƒTÙo“t`o·žpj²Û±k«ö¡aE“ÅC8+FŽámø´±¢ ²tB‘!$`f¥XÒD$9ˆ]l²Ž–BÂ#X)À^‡y)6$u,#JV;ú(vQ¯•óðì²u NþÇ&€oÞ»·Z-ZRh¨[>'” ÛÚèw¬ e Ö›èÀ¹+]ÌXëʳ…5íJ&AŽ•^v¶^Ÿ}b¼›ÞìÝüáPQmRE£bòf\Çj@^Ÿæä:õHÙï§kÚ@éBjÜ,N£°¯…U…ßZ$ÜôŒžf` T´ÏÅÚß’!-¤`—,§Pí-è«ä3Ý k`¥«HÈáß_0óÂá«Ïõб¶mENœ5Þ=w&¬‹là’.i6܉ÄŸèÁ3Ã…¬;+–ƒòÅà®sŽøãKÈv‡ÂÚßGðDejù.òëÔfŸd9O¶0rr{rûj—¦<ëq>²X™q¬Iûm•JýjŒ‰KÜßA”·^õ.»œ°pjÓ«Yq-u,UEž°ÂOvF)±žôþ‰xíÉFmðòš×5¬×ùõymófJ-,϶G¶mjxî6á6`ô? ÝÔ`· Ü–ã¦×“ÀÄ»g¿¦Ž×¶±xs½9Îzo,{l2jHÀ¤GIfÇ—á`-rZízPÛ¶vÏ ™!( iÈf†œ‡ J’¬daÈ0HÎ I@EFÄ@Ž¢€’É’“ HVrTr|xß9ç¿õ× õ×½u_ýõÎW5³»w¯µ×Úk­ow﮾‚öUñ¶sñôº8 ½…‘p„”ˆ˜(ðï—’€·) ø_·†ƒ‹KJJˆKJ ap„¤À$þ­^üøùøÚyŸ»b玴ó<Áß‘ûg×›Çíÿ'¸ò·óÓÅóßWÿù—@ ~å_ )þgþÿ#øù÷þÕ!âãü/Ûø§ù—‚!Î3..‰”„ÿâ?.`ðÃüþ)þ—矓ý/¹öq&#ãâspñö´ó@øàü¢®vþvÂŽvnh˜°·½3ÌERZ’ŒìÚÝ?ñoÆ?àÿð¯Úø§üGŠŸó_ìüî@ˆ#ÄÏù8_þäÿÅw4Ú & ÿ“äÿ‹ðOïÿ^žNÿªs>HŠ‹ÿ=þ#‘ç—ÿxþûïû?.!ù'ÿÿH0ÐÓ¤ »ü‹óÚZj†ç-öׄèü¿UÑ®ç¼aôU7÷5Â8úØy£eÌM4LÛÃÎ mˆ¶sºÕ…–‹±¹¯¹®Ž¬=ÆCÄî—ŒH ‡×_lÈ+zÙÙ»¡}a7ÑN.ž uM03 ]¸®—*ÚÙE+Øm¬glìf/ãÀ¡¤“”=Àík ôp÷ô‘ TàøË¸²çÇ¿ºE9`ñuSàøo§Ìu `ªo4LBDRØ@À¤dDÒbH !ØyeKˆÂeDpa8B—EÂa¿ãÜš·ƒ£¬¡šÆo¶ÎÏ8œ}}½dEEDÄD0ÞN¢Q8R‰>—ö òôµ öôáü}5´½·‹—¯ ÆöëÜî&ÆÏWƒã÷)xxéêþ1°§Ïo:™h —(B.êá!ú»´¯!ÚñKûy¡E Ñ>?oûó|8rþ•©¬úKðÜY5Œ½ŸÚÓW[Mã¼GÄÁÅAVUCLF.¦"¥.©Œ@¨KJ#¤ÄT$UU¥*ê盳ßuµ=ÏÙãiþ]×åÿè*ÿC]YUo´/ÆÛƒqÿ={Î_Œ3Æ ¦ªú—lÁøÌ\<0>ü¿Âû›·ho´ƒ†7Æö—øÈºü $TÕdÄÏW)i Ä/”5ÔÔ4¤bÒbp¤\ Îñ›®ÃߘûoºÒWWôÜÑÿ+Ù¿wWЯÃ?J÷üäâG{žW¼÷yi {gŸÓ 毭¦l8¶jEH§>VV’%ØÅ¢Ï\’!PS³»øÈˆžÊá‘ß5KB?õc‚‹ 3ùMüŽÿ¡¨é&²×¡éo6B~`òXU-ûµˆt¦Sâa¯NÆÄÏ/`§×w`è!¤(«(5k}IïÃÔQÃÔ5“Ödö&¾’®Á%œÜÕ’ç–~â°fÓö°O?ø,ß3_Xµ02Ý÷(S°!#,÷ø(ö²™ŸÆ¾yÉx-³ÀåN§+õ¼) †E+/Ï”ì°lÊÀU:)K{˜ NˆTŠÕM¨Ÿq"aÛYFN;ýÌ¥4 3ª:¼Ú|%˜9b'&[©1—¡¹^-‚%½.xœ±®ÙЧ¼Ï'ò£X0b·h­¿A‚mˆáwÃd'%§OØ•^ |&Æ-I\Œ鯣¯˜-ó,5\`–=^s*ɨ x­:rÑÂxh{±£¸Ð%öhÂAO/ÿla9©¡…€¸ÜQŠwÑŒËîkFA^ Žtâ#d5w}×½VƉ¾F˜·6 #0§âSë¦é›§A[ÖóSË-ËHlÐcJ÷Ûn“i›G!WÐ6ì¼O­§U@YrDZŠ-bÂdpÏ. yyæ “×®ôLÈx%ѧ½}Èiã7«ß’ŽD¶ª'ÇKÝq;K©« ‘}VEr–qaC¤„þ«‘nøôNÓŒ ”CôiXPĵ¼J_Ò??Y(¹¡kì‡R†®š"¸V;×-¤šÔ/½â£FéÙuÆïYSÀFtM›ÈIñŸ¡@`éóß2~ácÍâö’ˆ>ÝðGÙþfº óT }`4DTQRitZ¤g)8ôfx6ÙÓ´M+|-çã¦Kj÷»n‡ÎN„mô ØÑµ“ £P9 L;˜ÑcD2ä½y’ý2ÎÞ nT±øghúÄ3W5ëìÖ„ÊûÓíiMljÔt§ Ü“ãÙakå—Ãè|Èða’êкٖÙxuîñCÖ œnìÀ©SÍ!‡ùܼÎÇ„ “ĹE6uk}ó;ææÂú2A~Ìó§á™@ñyµ>÷Ô\É~E-¢gÁ0<=HàéH†?!ð¯ç"³Pñ[oúæ[æ:çiæt(å¿€ÇGXDÁSËØíš- •º± üÅCÚ¢ºOŸöêD22 ¢WT£ó]mÖt ®cõa×ïôÚp*s[Ü|3Õ‚oBÆZ¶|¶¡–©æ­MÞä÷éK³6ÕHF°·ñÆÎ^TŒh¼¨¸û$g á}ê8\qËýÒæó¹~ù‘N»žÉ' æì›ôå AÃóhÏC€âk»Ñ$øõ'åéÑQ–òýoÑü¸Z‚kò½9Ì…Í-*¦’ʦô2·/×ls _õXÌZy+ÑMJŽ=´©oz1>éH>|Hª;tK[垸9ƒñÉŒ[“Ò´«Ôj†‘Ò1ùTÿl|zÒÛ¹´d€!uuË3ÇMçaâ}·‡F_g"|¥èI¥óHØî­× ±L¬HÖsÓgÂg¾=kÃ=Ðë3©'ýF—´”÷ë&2?r‡1Ö?{AQæ•Æ^kV˜Î–¿ï[SòÚ·™xHs*©/åu+{äÓDÃkÕÛ"o‚ ø\[“|¹ÃQ_V{JìÝ—¤¿oQµUTÿ•oàÍä÷ÚÚ÷ À-Ìzm8ê}d÷ªþæˆ^Nê›î=$÷=êÓÂUÅé½zIǽBùϧ5Žé—}cØH˜ûY‡¼¤$êÇ«Ÿq‰9_tס€(ªÆßØX²õNâeª Y;›Ü;ÞÚxÉpTf%UU™lÁ åe¼c)ÍnÓ¯0ç§*pÒ\-zqò#ˆÞî.J[ÓëÒø#,1€úmõQ+WŠK¨ÓÅÎo©áO?sŠ{ÖHi ÒI'+Ôçf¸†Xˆ'“2Ÿu´4­R‡Z4Wß½©õÅaœ Ò·/m‚ŒJà Ȕø®2’N’ज़ âK§a­xŽù)5‚¢‡ñBáðWfH7_õ¿Ñ*+ê6Èý&ÐBÙÔÛK*Ô2ÎÊy ºEÜz‚ŒGo2`†‹Í^5*+T`ŸÒ"|P\Oº  mœtPbEôü ®TÈÿä mVL`t¡ƒn¾§·)ð=3à#())iÎUkÞ]o¹MÁÔèKdiKÎÖåOÈ캒¹m§›#G¸ûáò¬ðàmçWÎ86U©"gggß~`འ\ÑãŠ_á£É›;p¦oÛQ±ÈÒÕM'_ÑfœÐôß ØE;Uå›ó½©àíÅ'°{^#V‘KŸŠ 1³Tkg_—¥lJ…÷Ç||Ær«@°7úß•¯ùå!°cz¼oÖëìw‹cû[s-½©bsÁ’H+&âKßUîê§šzÛ8Çæ.ŠüN®BBž1‘Q°1Ù“—‡ßõ÷—Ü™$'·×¿*ý=Ũù<|.18ÎI…­íüHA%%6ßÕÑëŸâù¥½¦ÀŸ}Rsƒ°Î+—mÙ®ß~1|Qÿ8."Iþ“•±YT…J 8‡‹ÐR¯œ ÙPØü ÉöþØj¤ÌªÅÄÌJM(f^»”\´ž:ôìdO{çç÷'6DSáG¥Ü=ÛSl–ÁKÏl?_C¸œ¦{‚™¤< ,jܶ€È[tX¡Ûì-äÇÄ?­/àöquWûØù¸”oãr¾¤b½÷Ö'¦x³€Å£—ßnª<ßæ¦&ÁD³:Yò©ó\BlòD$B‚W¯ \£Žo2©_ÿìy’UÿÒ‘ÛîÎ5/ÂÏÿZg—ºòÁz}%ÜoÙøj;¬Ôi ˶-þEoºà,N勸gÐð⥧[KÛmH-<(à§ÑŠ%'¤›•[{éß,gÊ obëÍR`rŸx7ô£±Í÷ýQ(ÞLuFOð®qÈðÐãKYlÒɤ/®WLû7òH§ßtw_é9ªµ,Ó€p"È©”Žá8.¦‰r¥eTÚ®6ÑZ|¦Z˜HãþÏÊÛÞE $ÑêMœì´¨àÚêgé‘_-WžÅ»ºº^®V’ X¿'3ykøºwÎ5[E§nÜ[s= ·º®lóâä—YuÕ³t¬Ø€ü§íð[jf…ણZ¦¥7ÐASŸôäú¢@¶m¥f°¸ülNÃ&•äÁ¤jtlùQÍ›õ`< mËðé—)ÜãÜ}zU²p³K#"(6Xj!uw…“_)T&ƒ!1%ÅJ”ˆyÜõʘ¢YÄ …!6yžÈ&OúL‹e„m:®¸öEk"T‘OTôÍ==¡#º‰-±´ØÑDº'“¬òYÕù…U›ì¯û¿È_PÓʯ’y´ua\ëöõ¾ËŒ;œùî\˜sn~oèÜ\í`‹øêpöd®#éS£†Ûõë×_‹EÎß·Éë»[~V‰ÑaaåqœÄàÆ6ýuhÖS>éiÕP°)fxúWØDdŽ9¥.FU#6ú ß¾÷:¦ñ 4$Ù!O¢ßÔ&{¡ï`­ ,ŸˆX]6"Y:nÂG_çäáÈ á-?‘?úªî·§INwõœïÇûsIÓýrˆ XP§×ÑîšîÀÙQ P¡g²X¯:xþçpÄ B!£x›¯¦iu¾qÿ‚”§½º¿ä !‚Q°§YSÕnf*Ѝ’1ª–3®+ÔK+M5_½fÄ7\45˜ÙøRÙQ^ˆì;îWËë“i•öÑ’¯Ì‘Ýt‹°˜Š6À•äCP5Rôƒ£ÌnºP7}‘$wâDgþLåvIÇ=DvæˆÛðKDÃfEfæˆQú“ég¥£G6/Óà>A· ”^Èõ Œ%§×è˳òÿ‚ö•Ÿxù࣠rs1DŠB=~ÖÉ™4X!^©‘¬ÖF w _YKöMR®uÜŸjíë¥QÞÆÌz¼É„âÜĶõŸÇãî¨uðw ’Ž™¬¡•ö牊Ô–ðšj Þ8jg˜O Ê¿~µKž5èê~¢išŠª–X®Ñ=Ç&ä; ߆2‚Ëêtó,Ùœ¯Ïj à^Ž3h<˜gê™Ò2Wëøô<.lß5 n¬O•·èÿ¹q ëëÂ’ê®ÌZaÂ9“=dð"“ßÙ«ƒ|’¤°Ëx¾6µ,e³Š]IUŠPܽ\äP›ºöÔÕ'Ò›a«¦ìà;Gð¦N¥Å¸ÒÉt¤éG·`U^û=GíªÜ&Ï·-Þpž¬p½tI 4qþå)ƒ»*¥îaœs—¶z8ظh­‡rÑ2g—b7ÑËŸ<0gðb‚;ëk¥_µØx´žïsØ+àݵ¹)1b©êá!pÂeòÞ_iÏ?Ox–å½Vc;…×ïù‹,‡ù„°yîò`¥ïÒ‹ÖÔ¬½™bµï¬Þš'¤®Üùl¤ÿ~MçŽE ³Õ‘Éñ<Ü–™÷´šZ­g|¥:n)$BÕÃ`Ÿ  UØWÏÍÅü¤W¾‚çj´¾{ Õa°¨ë°eœ½a£fŽªl %.xÀ‘Të³pCƒ°ÀqJ ×ßû7;TÅIøá€ZzLÎ<1õ%>þûüšBûýà³»¦MÊóŒ!‘íw®^½º¤cùBãJuÈÎò%ž¥™kOÌOà¯WF¾çŠ3²ŸÚ‚}PçÔòyEúʲ ÙŽCê/ù‚[™@Í„ô–¶Ë¯.hnmu°ÓòèÄÛÞu8Òö¦qˆ$1L¬8 w½3\j¡)öÀªÂ?&Ê7÷us{XssØðaBfã™´ÅP­˜¼ø3V^>B ØðêS ·qºç‹Ñ/ôui1dàx]Ç)Ðm™2ïN°èOÒ×Õ%¸OÃtû¦ÝKxp€m‹j=?à'¹„ Î¨ ³ÿì“1}&SY>{…:5«“çRËõÓBÑ"»`g j~(ªØ@Kü=tø4d®ŸúF݃*éoõP í#ž8ÞX­£¥>r÷jÞ¸®~"ÅkìJàPÃÔ ÏRð1Pàrm®ü»=/ÖÁ™ÿä…Lëæ[¼iÝeV­o§ö·©zQ¼úžj ÿGëëëåàJHQâPc”H€útè§;üpaÃücG óÌ{€Õ*ó»OCôã•Ûc¨v¤|ø¦?Åêj‘%“2:¾vÑÁ¢.Ñ âQdà) ÄAóQõS&Ó!<Ž,ŽùL¯1#’_pYü¢4Ïà[TáÅUó}š.îs»®¬€€ ââ*ˆ*ÊÑ$ÈÎg°œ=› Ì.:—ÂÝÙ( Ý^Cp þ; ò(4„Á­CÄЉZ,NÜFÓ[¼Ãh€5x²¢0ýcÿìqï‰=…mÂEh´%–ä"J€ Ê=×?ÙXV€Ö ÔpG9ˆ@Åá@΋ң¬m fG£„õ¸«fˆ–x’ôÂ06m:ˆV™ é„ȰSK£A…(h,ø^/Ã2AÛñ¶qŸ=†ù^RÕ@>¨mË…’Uô:Ms(ÅÚÏSùÅŠÛ±‘v¨·7ßTú$y¶„ÓÖF¬?LàhËâLLû\©Ð¿ÿ`#*†Å8TÇ@ráàþ·”B'Éj˜Zš#åþ NòF<³ BþFE&HE"‹& Q?b‹³¢ÖJ-ÌZ ÇæGý™Æ1¤Öû ´ …ä^&ŠòÒ¤.é8cÀö[yoâ< ÓkÖµ´nÞÑx\Ã6;åA³¹ÊÞ&e­nç[%Ðæî–øÇnczX,G*ˆ­'¸lH÷Íø 0|ȇi}7a3„.vŠÆ²Ó<»ûù‰¥c ‡G]¸ŽŠï :®òçaÌmµ»>–ï «dã]”茉r.DyîùS§hŽ¡Ø)íÊ#­=yn1žL«ü²!ðqy&oIj¼ P{v5þ¶[eJ•¾[3¥êFša»((¤€•V²f¢¾ÃJôƒ”CèùÒþÇ…-S 9dšéñDZ›ˆ¬’%í3—1}NPBÄv÷aÖ8ˆN¤ºKp/[ ¦ºƲqï¥&y{¥²âäJ}ùXð㋆ו{¨. 4ŒÄq’ÙU•UÅþD`/À v²TC]Á[ƒ“2ÌôotƘÖtÍÊ¢ ¶ Å?5ÂÛ.ÐÙUÒh6€ñPXOƒãEÙ7nŒ•Uu9 òpâK„¾kOd¦PvÄÜHTr2Sü{@ó>³‹o黃ùt—.ÿ«Îì7¨âñôÔd¢•y€w¢`iò©›AÝÐf¾&ºb¼Y5bFõ1'Vˆpk2Ú«ï‹ '€ÄëúXÀ]}ù~×mr-ÏägÔì¡% M%ƒ¹¢Óüx ž #gìAŽs`×|h²úkh“Ñ(>ôª8Š˜•ä&ΉV&íqîNܵ¾SÃ6/ƒSTlæˆrãÍÚ K9ßlµ¾ý DDä €Y”S>ØÖåa»`-p5fäÎÅÅFA>¹uRÀ÷â5aR NÔ»ùžÕúÞeM±7€;ëÓêLäñ5½·Á—í–…‹0ÜY-¤€îsÅ¥½˜¼hÎ>€ìC½°³-|6é"òz¡ÉC²ÒÈ“»ýUb2¬÷,s¤e5°Ùਙ·f§g×N0êæ2É?xik΂퇖ÈÀ±x–ŒŒGt€w}µ&"¥;?(×þq½šXä ”§Å”¬w¾3ÿÐfoÀT¢Æ“È5õ´» œ•1Õf8W;ßÛßàÐjߦ¬]š™Y²Nˆ ]®B¼ø ԅϧáÅè3-jS¤µ{xD² :Ó£ïm®%€ó\*­…¼ÙmÄIÔSRò:î4,ìi#°B­4ó -^CÄ¡‡O%91ÀÔ‰¼“áÍÝø<ÙHˆ2‘#êO³:R’Q‹ùõbVú€}&´…?œh”€º–’‚}e@z†-}¢OyAšG® QÁ>zðBr¦âÝF’Ÿ;ܼ™ÌU¬«eÒÁäÌ({–ÉvwºçK«ØS˜;êªÂ@Ü›´çe"43¹A-S’6T¡êÝé$ˆœ~¨è°Lufûl&L0rÊŠ9T30È6˜›(lî·èîsQc–-æ°Á'ïIŰ ¾)qȃOð«O÷ˆsf­d I*œY- 1Â)Zîñ¸k– Ï™¥î :GÍÚä—ɲſ0(üI‹ÍJ¤ƒ‰ÈÚÅ# ^ƒÒ?㛲ˆÁs8©iž–Ù)"5©@×5jœ<ÊKLù£^ñêC²‹1öç¼£4uø¨]¯K $-B¾&›9:”‰SýšN ¯¢>^'…4§yQOå’í‰gÛÀ8ä뾡Èð¹°Á'Ô†‡¹cWz†|JyTÂë‚ Ÿyâ”iÉòqÞâúfF_¸orÜ­À'Ü‚ªí#?…Æ Ç ˆl_§Þϲj&g*„tEÂûaóJ\wî{Ûäè,ÍÏú»ÈAˆi©§^-M3\ßǼÝ*"ÏöQ3†h–!!š£†Çg£·Zô³uyÈrÂÜ7vã|ÏÉ·½*(¤WlÓ»M%ðd†o-wHqŸ ¶¤ýÊv‡¬ jíÍCÒ gðå§X0Ö: Prýx [|îR|B¡¡‹„^þ4&@Ápu:w·Îd¼#ªéLžEÏ5+î*K[Ð Æ)x‘øÙw€ì š‰<!ö,ùÓÍ5Ù"$ìÒ_zm#IEÎW§f²j«0bV›ÝìTý…˜ÐpMï2þT8Y\gÅ2T Ÿõsû´n%5ø W¬ÇhP2ò÷ -2mÅexŒ'‰c®Ïe™øìÓ¨Þ&´ÿ”Ï/Vy\ûÊ„’iæs(h÷,È»¯!ç›3›FÀŠs÷ ý#uˆD¶–_ ³¹íxteŸ×e’W°*`í¯Ý`m%bÚ´œ½÷,™@ßÇ]‹óxÆÕüÅ2vÆK’n&ç7ƒ~–üÁr“aöŠ³Ïµ¡•Öj¶[ Æ3•º’Òiï–Á¼ŽØ»H×÷îæÈââÖ˜‘Ò8të]qûko˜Ãø¤ìä0q-1˜ 3Þ¸}¿«nÊ&ÓW% ljùWfH[s3‘"µb•ù½f'P[È™¥³‘MaÄ0ß^µY [܉9lkôÀ¹¢tbŽò$¤ý„[ô%–Tèû²–¤: Êœ|»#" I„¯f ˆ Îè'h µ¡?‰/ÄX>õ—§‚‡˜µî¬>ƒåèj „ñ=r›•it0c‰oÑf"D ®‹~Ã1°HÂ!ÍÜ­ó2µ'˜ðU{ÊdCÖ¢ù¤4ó JÊxAßø¾6«hWϸÑ׌zšÆÕK4Ü ¶Ïé-eZ›x0 ±Ç:œÔŽdÕORf#´ Z½“Lâ“*GŸá•{uo66ú¥’tis øØÉ‰ðŽš<6½â²¬y¬Ÿhyv欤4äá%û<{"•wT{3þa®Q=¥Ü^ÕdÉv&ïÎí‡dYò£ ’n‘븤•D¡pÐ }¢[áØªœÊ¨¶Dr­Ð¬™­gëþß·vÖWÈm”Fõ8¹w­ËÐvLY“63ˆ»›>°K¼¶ø:SY²›€2‡¥–Ô»c×ù® šL3Ý–ÿ¨k@×ät­EVÏìÎ"©×W"$¢1ÙÓO’fx ù-™#µÐ ­çVЦ-hº<ä1ôme.ÇøæéSö7›;þ´ó«›¾ „bQ¼øù¢®~Ím‚>«A¢§›ÍWõø¹¾°U°˜2ÉÓÐ€Ü Åd þ²’T€_";¸ÏEÁœ6ÍâÞ%£—3ˆýõ@›Ð¼³]Y3‹¬Ê…«“‘ž”ùÖ,Õï/í½“³Lbk伦 ¿ ‡©ž%&]ù-qwꆜ½çËWe×Á¨#{ó§2I{ß$tÚ£²b$šJ)cà>Óƒ#lŸû¢*–µÞ’ü-Óç9×WØLdù¼Ÿä.*Mx3"Ï"¼ìµÓ÷UVù¨ûZì“Krú÷ºŸ$l®"ïiú’|)Uœ€¾4˜ a­ƒ©ŒØƒ’Z¹©g8â:{£õ*YÜ—diZ ÜÌ6Ø®»?'Ø´Z¡”ªø-ïe· ý3IÚ"é"'ŸÜ-9¶òHdçä­8Å:ë.r6\c^; *ø'çèWœÕø3£W¥ïÜ#ŒŸn#!¾P|]9á'dO¥lÓƒ¼O?šZÈÇ臇•„Y§+Ù.æé™)ÝXÛÎâ-áôÚónå3Âõ§o™ï2Õ®ˆµÜˆËŽ0‚4¸á¦‹ì0Ûb1©MÞÕÎÊhö»‡D%ÓµÜÎï€4µB;¶ ònw÷lº=‹££(‘ðêŸ #d2E˜…>åÈÖw6“ð½,cü»K@ø4¬|jæ¸ôÝlfqFãåAôói¶ÈS-²ŸŽÌfû\×½6+QŠcÞW3ÜO?¸9°æìç‘büö^ Ì,1–g.ìmq+霯æýü’1~¼DÀ~½Š) ]âä—)#Ë»,šK—…¾qø…6S“Æ€ýLö=ú>Ç:ΔŸ-mé[?yÐÝÅv)©¶ÉÚ+àŽÂ¢¿èû˜¬7^sõï¥_’K$”I›ÂEˆ€ºr¢´Þ*#¾DvtE ˆ«áR"w°)ëañ^AZEÔrûº=Ä­0uòÎÂô|‹"dÆò´¶çÖ¬ÝDÞù`^ ÝUà ÂRñŽ[UUB$i¥l­š(•†~ÁÒ5&­Þ÷²Þ|«éÚ­h*W_K|â2¿à1uA­ßRñeúÙ'±KãÓ¤¾Ùë5jÀfŸÕ·h–2>¦åÞò¦ rAlöNaSžµWuº30Lve™ÉÙkóň,³ÃãbƾGûåÀP˜~ÿRµòëËmu=µ2Û¨ÿ¡þÄŸøâOüá¿&Þ©£8././@LongLink0000644000000000000000000000015500000000000007774 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/download.jetbrains.com/resharper/rider-fake.tar.gz.sha256ubuntu-make-18.09+disco1/tests/data/server-content/download.jetbrains.com/resharper/rider-fake.tar.g0000644000000000000000000000012413352651520030371 0ustar 308a9ca382e9c8c55e59c9d0dfd103adf29c16d03a6775635251ad183c8749f6 rider-fake.tar.gz ubuntu-make-18.09+disco1/tests/data/server-content/download.jetbrains.com/ruby/0000755000000000000000000000000013352651520024414 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/download.jetbrains.com/ruby/rubymine-fake.tar.gz0000644000000000000000000000426413352651520030307 0ustar ‹Ÿ CZrubymine-fake.tarí— 4”yÇǸ”)²¢Aá)—ñÌ}³,ãR&šã’KŠæj˘ ‰#]¤¢èõ"¹T¬Þ‘Ê´D.¥äRñªIÉ6¹‡äRG’¼3mÛîûž­Îž£öôî|Îyžß9¿ßÿÌïyþßç{þ¿1ƒ|~@Ä Žæ¿â{Ebq8ˆ@„¸Ž…˜/ðl.›Cf‰…B£0>¼îSõwïñ>~%¸r)‘Bèkp¦ )ÊŒbƧ‚Å)S¶ÿÜôèÁ|X4ùV‹F¡ÐbýqXÀ¹iÿq~ÕŸ@c…R·³?´îSõ¯T½åo5gûÃô`zÀš¹@ü;¿~UÀ:òv: Ùa— °©¬&ÇtîúÀ`ú«h¬r0ÐÌÉáä5~â–0Ãe…PCitK}+Ø@ÿ·°† Ð(À04Þåý%+A}GçýZIƒýÕ }^þÀÿïwq®z|Êÿ -ö? ‹A#hÄ[ÿ#Ñ©ÿ¿¿ùÆ¢Ó™ü?ÿâ¥üž?ðÿœ÷ø÷1ÿÿ2ÿá@ 'žÄþÇ`È/<ÿýMýÿ?ú–B,'™ÿÑ84Jªÿ—àcó?3ä#ÿwþ’ Á¢Ñ’(þ÷Q‚xìÇB$ó?'΃HÈÛ*ê Ÿÿ rP@=ôƒë>U÷2ïãWÂ~gâz%˜–äÌW"8عŠ# ¹æ+ˆïì;Ÿ‹ƒ&ÇÞ‹ãêlj ³è<-”BÁdÝ•N¦E†5Ð-  ‚~ÓŽ=žÁûÔÝ5bn7?,¯ˆ˜ÜÑY·ÏU/]bE^Pžë—BËKpY®™à@ ïJLŠÙ§>´È(IuÁntr öÆÙҺƒóGZáåGaUQŒ‘ΊÉ[Í6³¯[ã&c²&š›ÙÙ“Ý•¶¥B&f¯Œg¤W÷š…ÚÞÿÎ$li ’íSmÁ‰RùûÃ⌿íz]ßõ½•E¢eEè¹ûÇ/è8nv\­œù¢¾|ÜV{åH:Jp¦ÿ\išy¯bUÿƒ_óŒçËT¹µS3Bîë¶{?tܪ Bµ8Ý©1Zœc©dN•Õó¨^ߋڃ7tôMMFÕä'{f•‹š›W²[K9~윎q§†©ò|,éMÛ ê @¦¨¶b%Ý-Š_Ô‘o¬»©a<]!Yñ©Ãi>Ä›‘3xJÐ-»J)á–IVùÀÍæìt¿ÇØY—IâôYÂ÷®õ1Ú¹qÛuŠhÒrÑC u5Ñ«ãδf+j…¦û—W.tÔë OxÀKkÅì>MuÏaÃdò@(½¶Íþ_ÕÓüsºÞ½DwæJ®;oÁ1·×“‹¯AÖ5IÉ4²¾oM‹ƒ(KçT2ö>>°AÓ‰âÇúç­ï_Gm³s;qs(¸rÈ4êÆÖ=ÍÛrUMɯ{£eÆ"Òî ¡NäñÖÇ+Š®æ8󯨟àhœ¿ÉV¸1­‰„jîL䢖ʙ·–õ¾"—<õù«Õz–*ʺ—O ƒgßÄt^'^ú=¯ŽZ{yPî: ²–E|^yEçí0G°'ÚÛxÝy'EŠ)R¤H‘"EŠ)R¤H‘òwã?—*)‚(././@LongLink0000644000000000000000000000015300000000000007772 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/download.jetbrains.com/ruby/rubymine-fake.tar.gz.sha256ubuntu-make-18.09+disco1/tests/data/server-content/download.jetbrains.com/ruby/rubymine-fake.tar.gz.0000644000000000000000000000012713352651520030357 0ustar 3fd2e808de535f0f6f4d06591f1bbcae8df5b38fd486de3a85458ddff9f43707 rubymine-fake.tar.gz ubuntu-make-18.09+disco1/tests/data/server-content/download.jetbrains.com/webstorm/0000755000000000000000000000000013352651520025275 5ustar ././@LongLink0000644000000000000000000000015000000000000007767 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/download.jetbrains.com/webstorm/WebStorm-fake.tar.gzubuntu-make-18.09+disco1/tests/data/server-content/download.jetbrains.com/webstorm/WebStorm-fake.tar0000644000000000000000000002235613352651520030463 0ustar ‹8VízuP\ݶçihœ@7ACwwoÜÝwK°à4 @p‚»» I‚„@w .!¸uO¾ûfÞª¹w^M½¯î«™ù~Uç¬]ëì:kýÛgíõÇÏÈÎZÏÛÃÓ“—_”‹———ÛÚÉû™µ×^./_à? !ØoË+,Èó?Û?ÀÇ+ÀÇ ãåæåââ…ñðñðóñ0žÿ|èÿ>^ÞVž¿S±u²õô°qñúgóþ£çÿö1°·ÿ— J[Séþ=üßÃ;*Êòº¿-â û÷ý“”ÕàoCå­`ì­çaïýÌÊÓ±õ°¶ƒ©¸Y9ØéÚYÙú?°“ºFy}¿Ù=s¼ ƒÞw¹é^‰ó™’áuÜ g?h¥LOR&;'ƒµæ”‚­{;µTpž‚&'› Lud°ÈÞVOìèɰ³5à‘1BHpMhÙMÛ—›Ó…½†5<ï’4,x%.­= 9ŽžÿÜáå€:F¢ƒù1ñhaGYíÄê „èaaâýHe <€! haQÌ¿ýI|UT €gú÷udñ áüJ½E`{ h”ÖÜLNâQ7¯Êt¯Âö§ÒÖÔô4WEÁ4[h7·BÓ3„z…å‘Gñ‹•¨ÍÊ€ Û>jŠ·[íw‰‹ŒG½—‘64dP²Ñ=r…l~ó.îÖ†6ZTƒR- ”‚‘œ.§Îr ‡`È/+œH/qòMŸç'+-<µÈa8¾ËXKÚ‚J¤¥ŽK[Ô±ï[€ê(Ïs…Ý;÷2më¢V¶‹\!" @¡·'WþþPK¡r{½ñò€Ïϵ/᛾)^TAR¬ À4GÁ£Æ¯Ïa²Ée¦£˜:°ê[ÇRã*k?í}Ð)Ù²ÿήkP(éPÆ"2$íi7;¸• ̶0};íRì¶{ã~ö‹êùÝä9œÃEˆþÀ>2 }ý„ʵ^Æ]ÙÆuÕ«Ï,ªÚ#3è Má¤kõ¦Ø>Có2Îݨ­ÔQñzÿêàÃð¡eq÷;Ϩ}Ýþk{pø ²ë û³;çŠÛ¤ÕvAÛmº'ú¬6Çð¼qw9o·=£ÛH¥´îåÀWÌ( x.òqg$Ž3›—{¤9ý e˜Xº7f‹…Ic>xJ×z[…:ŸërœW¸þþ…< ŽÅZ÷âB2Ø}®+ûµÊncïÅÑp¼g·ÄSO¾ºâ¯ºœªY×/]©6+ÉÙ4—¯>4𠾉¹RK„ À¬ÆêRjµ)ÖÞÐ:&‹ÔíÃKÞ,VdvÎË›ßVtÎk\_áº]Là˲ƌè1Ž‹ý®»iTƒÇ»@ ¹ÚûRz»kêÌSAQD\4Årn«Ã"}º„ j>ïgö2D=^Ó"i(,ëàMhõžÝ•'¦[þ"Óïµa³Ò¿ÿµ÷ •_+Ó3‘ë¶Ð½«FÞ†[ %ü8ˆõôúî1~ÈlÍód߯ËÃù³on™ßçÞ^]®i5øÈeJ·uËXñ=z)JytNÚ¯Ž)ïÊÒ‡ñÞ¹‘LCkÑ4QB4ã.€\~ß|çü—?¥ÎÍ…%½>¼×(ãŽQÕK«ê ¿wð Šð¾ñíüÑÒè§c¾ÚQfë9Ðò­íœ,‚ ¹æ¥Ök;ð¹må,Êça ®l‘ïX¸.߆“N2n^g®Ú`†4)qè&[ÈDŠÞC-Ð/?’ã Ä—4ͧìÙ7ô+tb—.‘º íkÛ#ëýpò]g‰žµ*ÅÜž¾´šÅõËhо û.<˾8£ He0-¼´S‡ÀN+·Ø„E$m "48h Q%ý&ö3Í7{lÈB¦²t¿‚ÊÒÓÊúÅkéå#µ” ɾë`âÔ¸û`’ΰ`˜ÎúlVÓÐ6Wóco0ÕBù«XŒ1úóqb‰ùSŸ3XTÞ%R4]+ƒúšÒöбMsa|óM{rê’×µ]¿î½ØSœqи‚¨«; RÌØp“´y¬Ä0ŠÑ[æ0@w<ŽÆk¤‘Pw1Ͳ< GqšßnuH£v»6g[£­à<Ö+˜éWAqHx Íu®ã/£ÞÒ ¬á×9á9aü•~êC~¬©‰Èbæõa2åÌHß›5¤PxT…¿Še •z檽‘äÎÊ93åR—sS >ãmB†àOLj·@åù.ä|ÆTßš¹ÊTxNr¿ ènßϾ«Œ«”‡Ù®Ñôc“⃢9…•¦6`9ß!Á‚;èw'êìo‹G@ø1¹mBW&NéÇ‘˜ÈÓZT õ¨ô㋾¸Æê' ÜW/ã;!‚?9ñ‰›8.\ oÞÉuà?—œÞcÙ¡£ý½ê«Oõe9¶Ý1q4½úª ØR½~…y1;Wû\´eI˜ú‰}æ=•-*5~È´]YFNÈ ·ø‚k¶àÌŒ‚Ïþ4úmþxí—ñPt@oå>ÛÒd9 28«¢Lœ©ê}7\Ÿ.M¼ mOþsò½EÊbóƒÍÐÀÚ÷Î@¦õ )4z¶Ýž9ÅõžncġңkÄö1±b^BUÈÖ_JlðÌZ£…âim Üñ¡¼‡á˜<‚zÑ-×ø-o—2[«ÆÔxvK×U‘Li 7Ñ.î3¹Ú^¯ö‰¤d£h ½Ï¯A„2…÷{ÓŽá1¦,kÙ‘ß¹.Äø—O½/2èÊX®ÒfŠÞ¢ÒMbAaœn\F!*)Ú£é^ýœ[jЪŽkÅ‹Ÿnü¥qª+]*È«h)¨ØW¢¡°8"±Ç¨›ø5öY‚©ÔòÏØêr8ˆ½Ë­U’£À0"w¸`£áÜE²—ÎüŒ‰d‘<¯Ïåù·°‰¥HP½€è;ùŽk=Û2×ã¬àl“Dh|ÝAÉ’Ò‘±1µØIOê—)1ÝvɈ!9lD=öÜ£Aq|ùUU› ™—NK·>Ί‡ò›z]û°Ü^q1ÆÓaݵá²ÕÒ²¤Úi¸¾ddZ]=$aXðWI#Ù$ ¾é¸ªgÙ&p7ÎEˆÐæ 2¨?F³éŒýpæT”ãœç‹£*í›ãqÞ tv%Q·éç6ð^³b¡^ö°ÔÌI (¦ª (oé\¸øeßøn†‡c»íŠêà69þ@|Ãÿx÷nŽÍÐá÷8— M­JmÍ)Òk%1Àq”è6þ$(HŽéåð`hüf•/bŸO>qbï|ð.ªÝöéß]X¾DÔÖ3æˆÇž³¹TaM›«¦w5̕ه X/WÞFLà›H~”9£Uò7>Â%t£:Ž|LÕݸÎ1´Æ”U­8šœigÒÃ~u²ñœƒ£Ä~K#(BwZUg38ëÏ0|¼´¯æ\ȉCtàñÏ/C&CÒˆÞ娪Ûêá¸To󓨰aÌuþ»âFxÏ¥DžÃ¼Ú˜*Cƒb{lÑÀ€Àؼi9…8Vþ¹ƒ*W¤c}‰õuš—SÁ[—M¶ÂªFñË#}:åÙGƒãºG­w9Sp=·Ìk7†wå(²E¯e Б@_ÈR+Ó‹œÀ®9¿\û[Ë£’Ê®^f£Ð«¦F0¡•t¯¥"ÕÍ[ˆb7…ʶgXÂ÷ÛÌ+y 3Å3’˜„üIùS_Ë õ˾–o ±Æ@C~>ÆôQGYNDÍDG2]®¯<åÄIx0,3žÅ¦í…!æø3 Þmg«è‚Ùvm© }ïÅÝuÜÛ9$4Йí²è„7jgW¾;·÷›ø5?&Á ¡æ¾½óÊHd6Ü“i¤«Ù—ˆ·£'Ü2ñðø–2”j¢¸6AD¸ûÆU KÓ5²—qÖ«¶ÿÙ9w˜‰•»‡-jKòÁ=Ÿõ~®ÍÀKEG’˜³À"=¶ãÃÐýmËR‚Wúmu]ÕDöEêQ×ö„/ˆJ{S¨¤Y£ˆš*åÆs*Äò£â$Ár94;ö_ó“ Ç ¿Ê&pQ³igdتž›Ox~)>’Á üè¡Þš°Cß&c˜GÂìÉDR÷R„¿V´]¿VîczñS•áSZÞš½/bqsªF…b­(€'T&æd2±>™y‚>†Æâf@wL™'•ôÅÈ ƒg Óv1´¢e&ÌÁ…P"’xûµïbÛPò<ö´¢æ¸%n¤®¼6•Ǽptݽ'¢õåS;îÈB6/¾å$%è)/Ë;cÚ‚¸¾¯ñ  ÖæX–ûÄÏ!t\__]{¼ÔÄhÒñ̇ßÔè±Ðû¤V ôìwgðaš$ í¸©ÿp=¦0ÿLN'ð„;8N>%Ä¢³Ã¯ØËÓŠ¸[Ð.60v(Íö)¹”K—Üò f”œLk¯IžcÑÞðorVàœä÷ʃ<ßd„ÃŽšè¥rœºU²@ggÐN½{ja¿{rVBlj©9ûõÔ¸ŸœH7•‹jlitžfQD5ß`ò{… ºÈÆe§c܇!@×g×Ü ‰ÀN¹œ’×8Rf;ÏÂmta£XˆH°ç÷wXFƒÃuÆËuñðœð/Z¤eí/ꤱ¶^Y”‘Hï`s¬13>g¸æØ¿Ÿ½â¶ãN ¼¢A9ºOH 7ÅÝuòÆO˜*W\9M) —iåxVV÷+Çñ~D—,DŒžšrŽ˜Ÿ[dÅ´­{ÿZ%¨ Øèïexë úމŒXÂzQ±ÆÄ¥ÍIz{\j¡K`ÏÌ:ê³Ü£ÓEw^ªxí5j«Š”—Ê4Ý@lS[iFððg&óñ«*Šö¨P$Z¢‡‡L`ÝvöÏj­ÉÕ*¸Pú;'=pel_“ôlTœÙ­%^®m~ÉŽ2F»Ëª^nˆŽ‚„»WÖ2`Øå'Ôí “Ñ›M3=È•îÿXjK ô^{a/¦6~~TbȬÃDnW±z}u„¤û|Ëä §¬ð»qÉn·[$0ºYÏ×µm*`Á©*¨!Ô»ø>sªÌN}®ŠàjV)Ãå'íèá#‡šÏÉî7·.Ùmç©gMÌ©/i6ËÿR¸[KÖº5€E‡ÆÍ§ÝN‘¤ÞÝ̈ø??¦8-Ã?€aôD•òÚotŸª‚•~p}¾Z‰c†,ŠåXbÅP‚Ëúka–™-[|c2¥† þ<]=h+H½|Š9”U s uþÖ(<|Ýâ¢÷2±ªG¢ÅÈ£=y8­§Ef(ù:NÇÎ pc>9ºÓj…ó[êrÆbÙxÃkÄO]’bZј˔vÇû¢ÑŒiÉ,ã–eg½u[R;î©¶ºÎÂS™ëœ—@ÿ"Û‡!x¤~ºFÑÎ싩ܰ[(ħ5ê8ðñ!oB7»õ Ÿ!Ó\¿³CLI‡4±Öü¾3Þ5At§=‡9YÚã=’›L·ùŠÞÜð—Ö•‰é¶äµ”eƒ5hõ]î>¹ùš9dhò‹4Å;V<*ãÐþS×ÓÐÖìê9¡#o óÖGœ×—ƒ•â˜Lb|Ó°}$(ñÆôý†¬\—«Á|ÎãóúŒ™¤„Nòîv©’Éb¦Wî…D÷ý°î–Ü*^_|r]Í|hÖ+£‘åðr©ñÔ¦ÿ¥a”üGo¼{é]ATÝ©‘Nš\P©þÂè©6URंg ÿ ^€=]e~Ÿ¶Žr`Ûåpò%³1¡÷ã<@¶lČћKsêæs¬,Ù4XÆ6±ƒ¾‘*nÚq?œ;ß´Ìc®;=§Qv.|DWraV<ËÔæuhu ’ú®ªª²ÆÄüòx׿9Ê‘Ùó]n@£“—I¥þjaíöïr^ÒÒù¥S0*õÝ3BR°¤!Öyƒ‰ž~–F?D[ñµ®ƒ­M§p`;ˆš)BûŸ¼ÿÍ(YN)kq~BË#¨ër…)*éý¶îC¦‰$Üò1v ªÒÈ~I!sZ§í“9Žàe='^Ãhu¹¡’ïAÓ8aZI’×qX¯oè—Çð¬"ë}d ¡É,œ™›—æÜC­]^ÑW  d|`ÿ™lY$ ì‹è¦±‹%ëöWz-êVší°ª×`G}ß4׿òGìMÆÏæ˜Ð”>–Ž¥â¸Ú»{õ͸–ÎΣ7IL§¥9O`äð3"i¢€ X÷²Y°ñ[º^žØ¯bç¥-öO…ÄE´Ôî6ÚÌPO¹:{½Uañ<‚àVµŽ;>[NBô2sZ$ÿš½Ð±÷šâÏ#X 'mšpĈ AQ¦É*Óz•ñiÐåHÍ]>‘Ãò7Ó~’ bÏöXâûÏ”5ïq)¦‰óx¶¦Yo‘`£ö÷•Jq®Z‹lò¬ž³4 =à o¯Lf¥MÎî'öE¬nJÿÐöô Ô_vöUct±pkC‡«Ux{Ž“@ªrN쌓ä?锿ˆ;®¤“6²¿’èálÍsÔ°HØc½sâ¤Mv¼ÿúëŒÖp°Ç>òuṓ×dË«^—Çnmo!=qÉw)w‰Œyñª–²’n¬ÝKH¸ `¢ÒµÉ|ù0ØÜÇù}ò¬l¸H’*…B_/—FŒúb˜Ùé=ª] qÕ‹ã~ÏäØÜ‹{xl‹Ä-kò40¨p¹‚|ˆ’Þv«ÁÁ^|Ö¼˜ýRÈÌþºU‘Ô9ÛVåÚ |\²aøK —aó=ßæBö”7ŽŒZfЪ·àbà[‘¢× >¿ÍÙ ¾‰á˜j@š± c çóô$“½L0?âu5£©W–YNR͹Þ=̲»¿˜§ë»Ô×wÝUCAô6‚km)ÞÍ÷ Q¢U7ÐÚAæƒV³Ðà„ŠgäŽ`gT7X‰vç·(úã!Vбç¢t*Ánë›66 ¹Ê2ñ>¨ÀöšX*‹JEyÏÄGH š*¨¯¸zÕ|å*Q¤F¡ÛÖ\eíÁâ@yž4Ò‚õ™®vl%Y.z#côÁ›< ¡½ê×ãSãc¹‚ñ”KÒ:jË)~®‹bèÐg £wqC:ÊýòžÖ"Ç1“*y†nK÷Kë¹ÓŸ°¼Ã1lf÷$ü0l(ñ»ß{Â-µ÷ì ‘ºŽsŒÖ›Ñä„ t£r0`†Øyzž~uy•ñ‚þ!¿ö!hT܇ð†2óƒù@EmD¨D²œDFå¨U3Fàa7˜­¼|wð»Úð¤µHL«{.ä‹Òør-~®PtEšø;ã§?BV,u®øÕ Åd~$Ïkg·´å™Û× «œêÝ-²ÚC¬Ö§Jt:|²Uˆ/Wd¿HL×Ô@dþV¯Óü…ç´üòð°³²Qd?~ÕÜÞ: >}øÃoŸ+-ÝÛ¤Ššr¯$t ð Ú*ÒŽoú9ž74´'oðtF‰ŒƒwíjïÓš7•ªeš ͬ <2è°» úa.0(÷ÍÛHœ[ûÚ */$FÃ÷wÑÖ…a2˜0m³iÙp8ý=Úr«C²®ö[} OÑ[‘­êI¶ô¡’í_x¸ vèÞ®vûy‹ׯd=^¥n‰Bî–0æ¿“Ãî~Ël™9¢¡e´Ž‰c©I¥›¬=C­ Ú _Ç£œ¬ùbÓod‡ÀuÃX¨›tZ£î/0Û,$‡žò ?Æ} ·5Ú=‚Ê€'0É RG‚Ž]ϱ|ˆ\þL[ñJ¹:yèëÐõ>ÿ›¯ŠadKom²ûøV]›âÞVCqsm"œ“Ÿ²\Ò$oðqH ®X†æ8ì|GMP¼æ(x5! Ù{·Ê.-,Ÿü²¯Ç9Ë .šKè>ˆðü•´¾x: óùXb>ŠÖrÆVìÑû¼ã³wkÏéÄVI`~`ÆJ@ß {+Àêå:1k錿¥¢+Ç@]á¸/A1h_îÍovvlR§îd†*àbÎ|0;EkI,i^“Í|'ï¡åÞ]:YÙ³8Oä‹lÕYòäÁ«Ö-©ÛոЬ å€çS¶ài|Í—®Œ?„{Ày}£þY¦hèý”k­»í®ÐÙ8|žø•E¼ÓjX±@8žå(¿;]7‰kú3!ls™Gæú ïm4œ¾<O‰x~'1™V~ì-ìÖ ÆCþ²Óû¢FÛÎIxIcSöœA<ùœ¿VëÍGƒŸfºrtYcÂÛ»œµBŽðôIY ÷\~Éa!¶nlyz>Ê`½‡R2hòœ³ ¯/TŒ®¹®ì®–=Ÿî) -g à×kÕ1;!¥»µfì‹§e©¤0?Â@ éW Dþl/Ùû>J”7m;V¡ãöiè‘ „JÇèÙp`B¹Räw«ë"¨³Ãìa*)ÙgÔ©OÊ–‹¶¢_æÊaæOgc×BÊï}$Œ@i…QTÔ|>ÄÞ†²A“1sø"ÝÞ·V3›› ód¹Iø›ÈºN#Æ ´X_ŠOž¶LB’AMñ±3ˆ”v}¾¾÷$ œŽ9œj­QÏðIÕôãqb! qøyʧ0~'áï]Bõ•Ž6{ä€Ì2ABj™p$ž¾?<¯•…¦\~pzˆÚt‚a™ËNšÅ5$‡2¼ç‘|t ôuµÇbç½ýad–øþ#k¼òÝ‹×F•J51€íùVâ¾&öËz¯§¶µ»il€dggËÌDä22è“VU?é{!ª–eˆù ¢èpÊëb’3Qß íYs/(Ñ[ð©ÍM¸F' UûLòÇb‹÷í þ’8Çó5“–Øúî\M…g3òv›àj:§@¥ zCeb@[ÚÔë­ÜÓï37ì -•ñÜÓó< ï¦ûS$öÏÇžÄiJá¦5•oWW»vgZߢL»TM3ù=rJÈOŒ4göí­Øö¢–ìùù…›þ@d.YÙZ1Ù `ÝÝàVÚ|¡h ¨.ÿæ>ÏQlnR#)ß&ƨo¾¸½Òص(¨’Ç¢i }/j·‡•¤áAOÑÌF{K¦âsšé´ÅlÙß÷`…Sç¸ö„ÈÁˆ§?tcX­Ô™i®Á€`Ÿ4¹”4¡E 6‡ã^ßQ3ãfŒ¬ R}6m†2ùê¥%!úámHh`«Ïq±áõ9Eʈå®m\¹åÊ5¦=ÆÙ•Pß‹ŸÛeMà6Ävœdå>®Ÿ*-²Íšº¡.äüõMˆ"Pÿʈ¸™x:Çž—CÆPQ/å;õcJêúâSòÑTOM3ÕšÈ÷Ž7Ì]9laѶB æ ³àF¡ri®ÓPAðÀ\feL‹“j͆ d›·þê,¯–M×bWJ £LñJd‹5:&o Ãç–]~§ïê‘ /wu«·Éuß ¦çq½[­b¢DDF}­ÚÌÐ U°\N;r_– £ir u0ÕßÒÁyg½ßñsgOmxDÁc•¼·S-eÝCoùÂ2ôÅMß Û¥¼!ã'Àª²Êƒ”knhö¬ô‹ðáMTúhy‡ÝnRÁZ-Î÷$`ëàÀ;®’l'á&ÒÓë]!¥œG¤' '+¤¢–®+Qª7êÀ8öÓý\ÔŠÑ¡¥¨ÜthnkÓu¶bwT ™aãXA,‰‚ôÈÛ”*qëÛß½aӵˤôCp {X™(®ªn#ÈæzÈô®‡:à²Øùª¼Åm r­¶}÷ÖE`ÎöÚx~_ÖL4 “Áý¥sÝéâlüQºÓ‹´N—’²Ïª´‚b›F$ëS¦³&-TÃBå¾§`—Ñ*•.µÐû½x‚ç«®ƒæŽgÊósœÇÓ›ŸúÏ ™t’;†­‡“ëÁjOu±œöjÂçØlkû¥! 2%…Ñ9rmŒ6Œïö‘†‹ôeó ÖSÛÛ éEîëç*­®Âû§×7%zRž:ԃݣJ’'ôxÈ6ˆèí^?F¥°ë>ñÑw2à}sÍF™¤à&6¬/N„1¶g´ÔvÊ`Vn.¬J¾|k®. ’Êx“¹!?f®éîœrL>ëU—:ÿR­Büyqu¯ïS%*œ7í *šynbKJÉrô(ØÌ ìêNøi#O’´Ö(ä,†Ñ½oA5=˜>Î`/%µ,>w1€éß¼P:‹Ø­ :r-NZú i+7©Ç9ªzi.O'ÄGˆ©[KÈh_[…½oÏĽ!‡›¢ò7%Ȋߣ£"9F£/¥AØ€Ö<›îÊ@ÙBMùYKäç¿FÿPÿõçÆàááügú¯ÓKñò óñòó Âxx…x˜àŸ›Æ?Æÿçú¯Ì¿³•¯§½•‹ÝŸãþÿ¹þï  Àoþù…xyx`{ü—þï_zÚ¿îåˆïåjg÷&ăÿ_Ó_ø×áýÿÿüÿ'õ_H˜ïúÏ+Ì÷WýÿWà×ÿ¿ë¿ÿ„ð/ø¿á_@àoü ñ üñ ÿ¡ÿþ}üUÿÿø{ý§Ç§‡qþøýžÿ±«`ô°?VØÛç ÌËÆÓé‰7ןŸÅÖÉÓÝÊÍÆÀÃú÷¶ßÓÎÛÇÓÝÆÃÖN’A߯ðwŒÓî)ŒW€fcb‚ýw¿ã3yðíüœ¼ÿ}οðþÂÿ³øoK¿è+6././@LongLink0000644000000000000000000000015700000000000007776 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/download.jetbrains.com/webstorm/WebStorm-fake.tar.gz.sha256ubuntu-make-18.09+disco1/tests/data/server-content/download.jetbrains.com/webstorm/WebStorm-fake.tar0000644000000000000000000000012613352651520030452 0ustar 9aa3c7492528f64ee5435c58ba8fbf965dab8afb243287be7c09da68fdd35ba8 WebStorm-fake.tar.gz ubuntu-make-18.09+disco1/tests/data/server-content/download.netbeans.org/0000755000000000000000000000000013352651520023262 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/download.netbeans.org/netbeans/0000755000000000000000000000000013352651520025061 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/download.netbeans.org/netbeans/8.2/0000755000000000000000000000000013352651520025370 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/download.netbeans.org/netbeans/8.2/final/0000755000000000000000000000000013352651520026461 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/download.netbeans.org/netbeans/8.2/final/zip/0000755000000000000000000000000013352651520027263 5ustar ././@LongLink0000644000000000000000000000017600000000000007777 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/download.netbeans.org/netbeans/8.2/final/zip/netbeans-8.2-201609300101.zipubuntu-make-18.09+disco1/tests/data/server-content/download.netbeans.org/netbeans/8.2/final/zip/netb0000644000000000000000000000135313352651520030140 0ustar PK!†bG netbeans/PKB‡bG netbeans/bin/PK QüDðÅ$Ânetbeans/bin/java-fake#!/bin/sh sleep 60 PK û’,E:/ê//netbeans/bin/netbeans#!/bin/sh $(dirname $0)/java-fake -arch i686 PK/†bG netbeans/nb/PK /†bGnetbeans/nb/netbeans.pngPK?!†bG €ýAnetbeans/PK?B‡bG €ýA'netbeans/bin/PK? QüDðÅ$ €ÿRnetbeans/bin/java-fakePK? û’,E:/ê// €ÿšnetbeans/bin/netbeansPK?/†bG €ýAünetbeans/nb/PK? /†bG €´&netbeans/nb/netbeans.pngPKy\ubuntu-make-18.09+disco1/tests/data/server-content/download.springsource.com/0000755000000000000000000000000013352651520024175 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/download.springsource.com/release/0000755000000000000000000000000013352651520025615 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/download.springsource.com/release/STS/0000755000000000000000000000000013352651520026266 5ustar ././@LongLink0000644000000000000000000000014700000000000007775 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/download.springsource.com/release/STS/mock.RELEASE/ubuntu-make-18.09+disco1/tests/data/server-content/download.springsource.com/release/STS/mock.RELEAS0000755000000000000000000000000013352651520030112 5ustar ././@LongLink0000644000000000000000000000015400000000000007773 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/download.springsource.com/release/STS/mock.RELEASE/dist/ubuntu-make-18.09+disco1/tests/data/server-content/download.springsource.com/release/STS/mock.RELEAS0000755000000000000000000000000013352651520030112 5ustar ././@LongLink0000644000000000000000000000016200000000000007772 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/download.springsource.com/release/STS/mock.RELEASE/dist/emock/ubuntu-make-18.09+disco1/tests/data/server-content/download.springsource.com/release/STS/mock.RELEAS0000755000000000000000000000000013352651520030112 5ustar ././@LongLink0000644000000000000000000000025600000000000007776 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/download.springsource.com/release/STS/mock.RELEASE/dist/emock/spring-tool-suite-mock.RELEASE-emock-linux-gtk-x86_64.tar.gzubuntu-make-18.09+disco1/tests/data/server-content/download.springsource.com/release/STS/mock.RELEAS0000644000000000000000000000047013352651520030115 0ustar ‹É®VíÖAOƒ0pÎ|ŠwÐЖöÕ«nžÄ»é¶š¡ØÌâ§4:.ƒ,c,êÿw)’Wòç=¨ÖU0Ýä󥋼Sá5ct³ £y{ýæ I:Öœ“‰=.¤V±ÇôÉvÔ²©Ö¶dÌ+ Wº÷ý÷õ]ÿ¥ª]þÍašP†÷É]r›&C½å/ëóBsÑÿ:ó¶o6x²/î¸_ù›ýùKUç“VB(¡êü‰šþçÔ§Øcoÿ5}Ÿÿš+ô ½þO®æU[Û•c~½ý,±ílÁ*º!L†?g°ÿÕì¥NßšÕ‘{„ŠSèõàÿŸ’Rr#œ¤ñý8ÜÛ|Ó«(././@LongLink0000644000000000000000000000025400000000000007774 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/download.springsource.com/release/STS/mock.RELEASE/dist/emock/spring-tool-suite-mock.RELEASE-emock-linux-gtk.tar.gz.sha1ubuntu-make-18.09+disco1/tests/data/server-content/download.springsource.com/release/STS/mock.RELEAS0000644000000000000000000000005113352651520030110 0ustar 0160f6e0400b2a2ff36e754bff426db8561f957b ubuntu-make-18.09+disco1/tests/data/server-content/download.sublimetext.com/0000755000000000000000000000000013352651520024017 5ustar ././@LongLink0000644000000000000000000000016200000000000007772 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/download.sublimetext.com/sublime_text_3_build_mock_x32.tar.bz2ubuntu-make-18.09+disco1/tests/data/server-content/download.sublimetext.com/sublime_text_3_build_moc0000777000000000000000000000000013352651520037725 2sublime_text_3_build_mock_x64.tar.bz2ustar ././@LongLink0000644000000000000000000000016200000000000007772 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/download.sublimetext.com/sublime_text_3_build_mock_x64.tar.bz2ubuntu-make-18.09+disco1/tests/data/server-content/download.sublimetext.com/sublime_text_3_build_moc0000644000000000000000000000043513352651520030707 0ustar BZh61AY&SY—˜Ë€â§ø»’)„„¼ÁãÈubuntu-make-18.09+disco1/tests/data/server-content/downloads.arduino.cc/0000755000000000000000000000000013352651520023105 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/downloads.arduino.cc/arduino-mock-linux32.tar.xz0000777000000000000000000000000013352651520035213 2arduino-mock-linux64.tar.xzustar ubuntu-make-18.09+disco1/tests/data/server-content/downloads.arduino.cc/arduino-mock-linux64.tar.xz0000644000000000000000000000053013352651520030152 0ustar ý7zXZæÖ´F!t/å£à'ÿ]0œˆ­#ÉÈ=¡4èXÿk„÷õ¥WR?V?ÈdsLz¸§È$('¢-à|ìEXH¼kÊDå¨ ójó”t€CàœÊÃÍâ*„ v‚”ò¥ÙÛûúÿÅù û›( ¢þ1ªwûY .0 «e•m$sÓùˆ]&I$ÝbLŽgÊxFûƒûMÈ;«s¨®`Í£¿¤0py)ÊëNm\daklÀƒœÅ×–L”!Ú¤Q7¢aî·ÿ‰É…]ˆI…B­1ÁßÀckwøF­!›,k4k))ÒÓ7Dµ¶É‚;6æp®rOD^YnÈùT êlý¡Á˜ÆÕÿ:­lS¾…X à3ã›|lÓ_½Üaþðe²b:—¼ñ±€Pæßæé±ÄgûYZubuntu-make-18.09+disco1/tests/data/server-content/downloads.arduino.cc/arduino-mock.sha512sum.txt0000644000000000000000000000141613352651520027767 0ustar 105de251fc74044251dd62bcba2854ab57eb10815a4d9260809fbe2d7292a3e7435a4dd6aeef7ab8baa47ac08238c9904c1322ff1a18e6902890042b55dce9bf arduino-mock-linux32.tar.xz 105de251fc74044251dd62bcba2854ab57eb10815a4d9260809fbe2d7292a3e7435a4dd6aeef7ab8baa47ac08238c9904c1322ff1a18e6902890042b55dce9bf arduino-mock-linux64.tar.xz 7e54ba6d788c43fc2b7990a1f30350542e44a9de7e581a52a309723965a3fa097aa8f692451cc6b460e51ed86ac984d9c725199b896a86f6e1f3495111c37fde arduino-1.8.5-macosx.zip f78622e92fa79e9d27a8e7be8cd0b998b53870260f2c747bda3ed398103bab7473a89ae16e19fbe4e8a4f7035c71c28c5eeaedf86c19173a9d4a4c080ae5d8e4 arduino-1.8.5-windows.exe 522531cb555572e30e34c89c426d0a468a82066c4e2e440124f9a824dee9a7c585787f767e7581bfa1d048c55eaa11861ebabb9051ffcc1fd9929bf7eca0f398 arduino-1.8.5-windows.zip ubuntu-make-18.09+disco1/tests/data/server-content/downloads.tuxfamily.org/0000755000000000000000000000000013352651520023670 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/downloads.tuxfamily.org/godotengine/0000755000000000000000000000000013352651520026172 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/downloads.tuxfamily.org/godotengine/v.mock/0000755000000000000000000000000013352651520027367 5ustar ././@LongLink0000644000000000000000000000017600000000000007777 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/downloads.tuxfamily.org/godotengine/v.mock/Godot_vv.mock-stable_x11.32.zipubuntu-make-18.09+disco1/tests/data/server-content/downloads.tuxfamily.org/godotengine/v.mock/Godot_0000777000000000000000000000000013352651520036156 2Godot_vv.mock-stable_x11.64.zipustar ././@LongLink0000644000000000000000000000017600000000000007777 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/downloads.tuxfamily.org/godotengine/v.mock/Godot_vv.mock-stable_x11.64.zipubuntu-make-18.09+disco1/tests/data/server-content/downloads.tuxfamily.org/godotengine/v.mock/Godot_0000644000000000000000000000040313352651520030522 0ustar PKC—¥L Godot_vv.mock-stable_x11.64UT žâíZêíZêíZux èèSVTÐOÊÌÓ/Îà*ÎIM-P03àJ­È,áPK/ÿåPKC—¥L/ÿå íGodot_vv.mock-stable_x11.64UT žâíZêíZêíZux èèPKi„ubuntu-make-18.09+disco1/tests/data/server-content/eagle-updates.circuits.io/0000755000000000000000000000000013352651520024041 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/eagle-updates.circuits.io/downloads/0000755000000000000000000000000013352651520026033 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/eagle-updates.circuits.io/downloads/latest.html0000644000000000000000000000326513352651520030223 0ustar ' Autodesk EAGLE 8.7.0 Download

EAGLE 8.7.0 Download

ubuntu-make-18.09+disco1/tests/data/server-content/eagle-updates.circuits.io/downloads/mock/0000755000000000000000000000000013352651520026764 5ustar ././@LongLink0000644000000000000000000000021300000000000007767 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/eagle-updates.circuits.io/downloads/mock/Autodesk_EAGLE_mock_English_Linux_64bit.tar.gzubuntu-make-18.09+disco1/tests/data/server-content/eagle-updates.circuits.io/downloads/mock/Autodesk0000644000000000000000000000034113352651520030464 0ustar ‹ºç«Zí”Á‚0 @9ó3ž•u´ë÷ Y8&~¾C åâ0ƽK·lI»½­&Ë­Ùœªý1‰|!¥d"á"0Éqì*RL¨„–‘ o¸4mvv¥ä™-¬©^î›[ž£?‚ü߇>rtþùÿT þ±óO )ÒG1SþÜÿz•ìŠ2iqÜXcj¡el®E»Ìå¾ÍèÿwïÀKŽÙÿ?êÿ ØõÆÐÿaâÿ1µU^më2ÿPwZ㌥)EP¬”óψú øäfèubuntu-make-18.09+disco1/tests/data/server-content/eagle-updates.circuits.io.cc0000644000000000000000000000000013352651520024336 0ustar ubuntu-make-18.09+disco1/tests/data/server-content/forum.unity3d.com/0000755000000000000000000000000013352651520022372 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/forum.unity3d.com/threads/0000755000000000000000000000000013352651520024024 5ustar ././@LongLink0000644000000000000000000000020300000000000007766 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/forum.unity3d.com/threads/unity-on-linux-release-notes-and-known-issues.350256/ubuntu-make-18.09+disco1/tests/data/server-content/forum.unity3d.com/threads/unity-on-linux-release-0000755000000000000000000000000013352651520030357 5ustar ././@LongLink0000644000000000000000000000021200000000000007766 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/forum.unity3d.com/threads/unity-on-linux-release-notes-and-known-issues.350256/page-2/ubuntu-make-18.09+disco1/tests/data/server-content/forum.unity3d.com/threads/unity-on-linux-release-0000755000000000000000000000000013352651520030357 5ustar ././@LongLink0000644000000000000000000000022400000000000007771 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/forum.unity3d.com/threads/unity-on-linux-release-notes-and-known-issues.350256/page-2/index.htmlubuntu-make-18.09+disco1/tests/data/server-content/forum.unity3d.com/threads/unity-on-linux-release-0000644000000000000000000054471113352651520030375 0ustar Unity on Linux: Release Notes and Known Issues | Unity Community
  1. We've introduced thread tags, search within a thread and similar thread search. Read more here.
    Dismiss Notice
  2. We've released our first Timeline Experimental Preview, our new tool for creating cutscenes and more! To check it out click here.
    Dismiss Notice
  3. All Unity Pro perpetual license customers: your special offer to subscribe is ready! Click here.
    Dismiss Notice
  4. Unity 5.5 is now released.
    Dismiss Notice
  5. Check out all the fixes for 5.5 in patch releases 1 & 2.
    Dismiss Notice
  6. Unity 5.6 beta is now available for download.
    Dismiss Notice
  7. Get prepared for the Tizen Mobile App Incentive Program! Read more about the upcoming program here.
    Dismiss Notice

Unity on Linux: Release Notes and Known Issues

Discussion in 'Linux Editor' started by natosha-bard, Aug 26, 2015.

Thread Status:
Not open for further replies.
  1. natosha-bard

    natosha-bard

    Unity Technologies

    Joined:
    Feb 24, 2011
    Messages:
    29
    Hi! This thread will be used to post new builds of Unity for Linux, including release notes and known issues.

    THE LATEST AVAILABLE BUILD WILL BE IN THE LAST POST ON THIS THREAD.

    Today, we're releasing the first public build, so this post contains extra information about system requirements and what you can expect. Future releases will also be posted in this thread.

    Installer Types and Supported Systems

    The Unity Editor for Linux is packaged into two types of installers:

    • A .deb package, which can be installed via the Ubuntu Software Center and is expected to work on installations of Ubuntu 12.04 or newer.
    • A platform-agnostic self-extracting shell script, which is designed for other distributions.
    Unity Technologies is providing official support for Ubuntu 12.04 or newer. People are welcome to use other distributions with the understanding that we do not guarantee support.

    Machines also need a modern graphics card with vendor-supported graphics drivers (provided by NVIDIA, AMD, or Intel).

    We do not explicitly support running the Linux editor inside a virtual machine due to limitations related to GPU virtualization (although it does usually work).

    Supported Target Platforms
    The Unity Editor for Linux supports export to the following platforms:
    • Linux / Windows / Mac Standalone
    • Android (additional dependencies needed, see below)
    • WebGL (additional dependencies needed, see below)
    • Tizen (additional dependencies needed, see below)
    • SamsungTV
    • Legacy WebPlayer
    • iOS project deployment (experimental in 5.5 builds)
    Dependencies and Recommended Packages
    The dependencies for Unity itself are:
    • gconf-service
    • lib32gcc1 (>= 1:4.1.1)
    • lib32stdc++6 (>= 4.6)
    • libasound2 (>= 1.0.23)
    • libc6 (>> 2.15)
    • libc6-i386 (>= 2.15)
    • libcairo2 (>= 1.6.0)
    • libcap2 (>= 2.10)
    • libcups2 (>= 1.4.0)
    • libdbus-1-3 (>= 1.2.14)
    • libexpat1 (>= 1.95.8)
    • libfontconfig1 (>= 2.8.0)
    • libfreetype6 (>= 2.3.9)
    • libgcc1 (>= 1:4.1.1)
    • libgconf-2-4 (>= 2.31.1)
    • libgdk-pixbuf2.0-0 (>= 2.22.0)
    • libgl1-mesa-glx | libgl1
    • libglib2.0-0 (>= 2.31.8)
    • libglu1-mesa | libglu1
    • libgtk2.0-0 (>= 2.24.0)
    • libnspr4 (>= 1.8.0.10)
    • libnss3 (>= 3.14.3)
    • libpango1.0-0 (>= 1.22.0)
    • libstdc++6 (>= 4.6)
    • libx11-6 (>= 2:1.4.99.1)
    • libxcomposite1 (>= 1:0.3-1)
    • libxcursor1 (>> 1.1.2)
    • libxdamage1 (>= 1:1.1)
    • libxext6
    • libxfixes3
    • libxi6 (>= 2:1.2.99.4)
    • libxrandr2 (>= 2:1.2.99.2)
    • libxrender1
    • libxtst6
    • zlib1g (>= 1:1.1.4)
    • debconf (>= 0.5) | debconf-2.0
    • npm
    The Ubuntu Software Center will install these automatically if using the .deb package. If using the self-extracting shell script (or another distribution), you're on your own.

    To export players to certain targets, there are other dependencies:

    For WebGL:

    • ffmpeg | libav-tools
    • nodejs
    • java6-runtime
    • gzip
    For Android and Tizen:
    • java7-jdk
    These recommended packages are included in the Recommends section of the .deb package.

    We're also not currently bundling the dependencies for MonoDevelop (and doing so is a bit complicated), so the easiest way to ensure you can run the bundled MonoDevelop is to first install the upstream MonoDevelop from the Ubuntu Software Center.

    Reporting Bugs

    The 'Report a Bug' link currently directs users to this area of the forum, which is dedicated to feedback and issues with the Linux Editor. This is the primary location for providing feedback and reporting issues with the Linux Editor.

    Crashes will launch the bug reporter, and you should use this to submit a bug in this case (the bug reporter attaches stacktrace and other information we need to investigate crashes). After submitting your bug with the bug reporter, please post on the forum with the case number you receive in your confirmation mail.


    And finally, here is the information for today's release:

    Build #2015082501

    Official Installer for 64-bit Ubuntu Linux:
    http://download.unity3d.com/download_unity/unity-editor-5.1.0f3+2015082501_amd64.deb

    Unsupported Installer for Other 64-bit Distributions:
    http://download.unity3d.com/download_unity/unity-editor-installer-5.1.0f3+2015082501.sh

    Release Notes
    • Initial release
    Known Issues

    The Linux Editor currently has some known issues:

    • The asset store window cannot be docked into the main editor window
    • Drag and drop between separate editor windows (e.g build settings window and main editor window) does not work
    • Drag and drop from outside the application does not work
    • Moving/Dragging undocked editor windows doesn't feel native yet
    • Context menus at the bottom of the screen have unintuitive initial scroll position
    • "Open in Unity" doesn't work when browsing the Asset Store from an external browser
    • Idle CPU usage is higher than it should be.
    • Certain systems may experience "Service unavailable" errors when trying to log in. WORKAROUND: Launch Unity with LD_PRELOAD=/usr/lib/libresolv.so.2 /path/to/Unity (check the path to your local libresolv) (Kudos to spacepluk and the other hardcore investigators!)
     
    Last edited by a moderator: Sep 7, 2016
  2. natosha-bard

    natosha-bard

    Unity Technologies

    Joined:
    Feb 24, 2011
    Messages:
    29
    Hello lovely people! We have prepared a new build for you. Links and release notes below. Happy testing!

    Build #2015090301

    Official Installer for 64-bit Ubuntu Linux:
    http://download.unity3d.com/download_unity/unity-editor-5.1.0f3+2015090301_amd64.deb

    Unsupported Installer for Other 64-bit Distributions:
    http://download.unity3d.com/download_unity/unity-editor-installer-5.1.0f3+2015090301.sh

    Release Notes
    • Fix login autofail for some users (depend on system libpq5, don't ship conflicting libs)
    • Allow mouse capture in game view
    • Fix context menus in Animator window
    • Allow interaction with game view header UI in play mode
    • Set default new-project location to XDG_DOCUMENTS_DIR
     
  3. natosha-bard

    natosha-bard

    Unity Technologies

    Joined:
    Feb 24, 2011
    Messages:
    29
    Hi again lovely people! We have prepared another build for you. Happy testing!

    Build #2015091501

    Official Installer for 64-bit Ubuntu Linux:
    http://download.unity3d.com/download_unity/unity-editor-5.1.0f3+2015091601_amd64.deb

    Unsupported Installer for Other 64-bit Distributions:
    http://download.unity3d.com/download_unity/unity-editor-installer-5.1.0f3+2015091501.sh

    Release Notes
    • Make reported mouse offsets consistent everywhere
    • Fix direction of mouse scroll delta in play mode
    • Report mouse button events when cursor is locked in play mode
    • Support "Open in Unity" for Asset Store packages (opens new Unity instance for now)
    • Fix Asset Store for comma-decimal locales
    • Make popups less prone to inadvertently close
    • Fix shift+key in game view
    • Don't crash on first run if XDG user directories aren't configured
    • Fix interaction with Sprite Editor slice dropdown
    • Fix intermittent crashes when opening/closing child windows
    • Don't double-report IMGUI key events in play mode
    • Fix initialization of fixed-size child windows (color picker)
     
  4. Tak

    Tak

    Unity Technologies

    Joined:
    Mar 8, 2010
    Messages:
    549
    It's been a while, but hopefully it will have been worth it.

    Build #2015101801

    Official Installer for 64-bit Ubuntu Linux:
    http://files.unity3d.com/levi/unity-editor-5.2.2f1+20151018_amd64.deb

    Unsupported Installer for Other 64-bit Distributions:
    http://files.unity3d.com/levi/unity-editor-installer-5.2.2f1+20151018.sh

    Release Notes
    • Update to Unity 5.2.2f1
    • Avoid crash when creating input context fails at startup
    • Make WebGL build output directory layout match the one generated on other platforms
    • Don't leak file handles when communicating with external processes (e.g. audio importer)
    • Known issue: There's a small regression in cursor offset handling in the game view
     
    Last edited: Nov 20, 2015
  5. Tak

    Tak

    Unity Technologies

    Joined:
    Mar 8, 2010
    Messages:
    549
    Some known issues in this one, but we wanted to give everybody a chance to play with it over the winter holidays. Enjoy, and we'll see you next year!

    Build #2015121801

    Official Installer for 64-bit Ubuntu Linux:
    http://download.unity3d.com/download_unity/linux/unity-editor-5.3.0f4+20151218_amd64.deb (sha1sum 282ca0f7bd25dc2d3f0a1f9d493ecffe9bb9fb36)

    Unsupported installer for Other 64-bit Distributions:
    http://download.unity3d.com/download_unity/linux/unity-editor-installer-5.3.0f4+20151218.sh (sha1sum f38ea2b578ac37eacc97440966a42bc17d7b6f81)

    Torrent (Includes both installers):
    http://files.unity3d.com/levi/unity-editor-5.3.0f4+20151218.torrent

    Release Notes
    • Update to Unity 5.3.0f4
    • Update to MonoDevelop 5.9
    • All fixes reported for build #2015101801
    • Keyboard input for web views should behave similarly to Unity 5.1 builds
    • Known issue: Cursor offset in game view is still present
    • Known issue: MonoDevelop's application icon is missing
    • Editor still uses legacy OpenGL rendering backend on Linux
     
    Last edited: Dec 18, 2015
  6. Tak

    Tak

    Unity Technologies

    Joined:
    Mar 8, 2010
    Messages:
    549
    Build #2016010601

    Official Installer for 64-bit Ubuntu Linux:
    http://download.unity3d.com/download_unity/linux/unity-editor-5.3.1f1+20160106_amd64.deb
    (sha1sum
    6636dbd9350a0589fd23bd7643fba99c8fb83685)

    Unsupported installer for Other 64-bit Distributions:
    http://download.unity3d.com/download_unity/linux/unity-editor-installer-5.3.1f1+20160106.sh
    (sha1sum
    4438875861bbddd18a68230c4062e79cd6139c2f)

    Torrent (Includes both installers):
    http://files.unity3d.com/levi/unity-editor-5.3.1f1+20160106.torrent

    Release Notes
    • Update to Unity 5.3.1
    • Force harder to OpenGL legacy mode for now
    • Improve web view integration (focus, docking, resizing)
    • Improve cursor position reporting in game view
    • Fix cursor position offset when game view is letterboxed
    • Fix keypresses (e.g. arrows) in game view changing keyboard focus
    • Fix "Add Resolution" popup for game view
     
    Last edited: Jan 7, 2016
  7. Tak

    Tak

    Unity Technologies

    Joined:
    Mar 8, 2010
    Messages:
    549
    Build #2016020801

    Official Installer for 64-bit Ubuntu Linux:
    http://download.unity3d.com/download_unity/linux/unity-editor-5.3.2f1+20160208_amd64.deb
    (sha1sum
    6e4f92b024a603a289965fd16b9ba3513f461590)

    Unsupported installer for Other 64-bit Distributions:
    http://download.unity3d.com/download_unity/linux/unity-editor-installer-5.3.2f1+20160208.sh
    (sha1sum
    7bae74f50050e326594133c8115c3094b97eb8d5)

    Torrent (Includes both installers):
    http://files.unity3d.com/levi/unity-editor-5.3.2f1+20160208.torrent

    Release Notes
    • Update to Unity 5.3.2
    • Fix "gray webview panel" on first start
    • Fix VR publishing for supported platforms (e.g. GearVR)
    • Fix menu item invocation after play/stop cycle
    • Make file extension filtering case insensitive (e.g. unityPackage)
     
  8. Tak

    Tak

    Unity Technologies

    Joined:
    Mar 8, 2010
    Messages:
    549
    Build #2016022301

    Official Installer for 64-bit Ubuntu Linux:
    http://download.unity3d.com/download_unity/linux/unity-editor-5.3.3f1+20160223_amd64.deb
    (sha1sum
    e31b684d14d890f09073d57ca1f07a96a8814265)

    Unsupported installer for Other 64-bit Distributions:
    http://download.unity3d.com/download_unity/linux/unity-editor-installer-5.3.3f1+20160223.sh
    (sha1sum
    3e6129bcc195303773896ddf667db2f9df4c5fd3)

    Torrent (Includes both installers):
    http://files.unity3d.com/levi/unity-editor-5.3.3f1+20160223.torrent

    Release Notes
    • Update to Unity 5.3.3
    • Fix importing Unity packages from project browser
     
  9. Tak

    Tak

    Unity Technologies

    Joined:
    Mar 8, 2010
    Messages:
    549
    Build #2016031601

    This one's a double feature!
    Yesterday at GDC, we announced public beta access for Unity 5.4, and you won't be left out!

    Official Installers for 64-bit Ubuntu Linux:
    5.3.4f1: http://download.unity3d.com/download_unity/linux/unity-editor-5.3.4f1+20160316_amd64.deb
    (sha1sum
    e855743ec80241f54db3a349b3a68a93365c20dd)
    5.4.0b10: http://download.unity3d.com/download_unity/linux/unity-editor-5.4.0b10+20160316_amd64.deb
    (sha1sum b29f9d8fe9bcbfe5d1759003c10e66aa66e54f8a)

    Unsupported installer for Other 64-bit Distributions:
    5.3.4f1: http://download.unity3d.com/download_unity/linux/unity-editor-installer-5.3.4f1+20160316.sh
    (sha1sum
    98cc96e82c5d8703c954ebcdffc392c5e790b5cd)
    5.4.0b10: http://download.unity3d.com/download_unity/linux/unity-editor-installer-5.4.0b10+20160316.sh
    (sha1sum 8465fee80eff49595a0f172ce77d35398423dd74)

    Torrent (Includes both installers):
    5.3.4f1: http://files.unity3d.com/levi/unity-editor-5.3.4f1+20160316.torrent
    5.4.0b10: http://files.unity3d.com/levi/unity-editor-5.4.0b10+20160316.torrent

    Release Notes: 5.3.4f1
    • Update to Unity 5.3.4 (includes lots of OpenGL Core fixes for linux)

    Release Notes: 5.4.0b10
     
  10. Tak

    Tak

    Unity Technologies

    Joined:
    Mar 8, 2010
    Messages:
    549
    Build #2016031701

    Official Installers for 64-bit Ubuntu Linux:
    5.3.4f1: http://download.unity3d.com/download_unity/linux/unity-editor-5.3.4f1+20160317_amd64.deb
    (sha1sum
    886b5a776c40df30114223fc7075d8b9e23a1548)
    5.4.0b10: http://download.unity3d.com/download_unity/linux/unity-editor-5.4.0b10+20160317_amd64.deb
    (sha1sum 863418e077688a3f4b5e276c75168518a494bc24)

    Unsupported installer for Other 64-bit Distributions:
    5.3.4f1: http://download.unity3d.com/download_unity/linux/unity-editor-installer-5.3.4f1+20160317.sh
    (sha1sum
    7b1961fdbe52ccf3e3d567bc6b7211165a263238)
    5.4.0b10: http://download.unity3d.com/download_unity/linux/unity-editor-installer-5.4.0b10+20160317.sh
    (sha1sum 8c40895ccdb86c18943e0e72d1d8aca57a9a72ac)

    Torrent (Includes both installers):
    5.3.4f1: http://files.unity3d.com/levi/unity-editor-5.3.4f1+20160317.torrent
    5.4.0b10: http://files.unity3d.com/levi/unity-editor-5.4.0b10+20160317.torrent

    Release Notes:
    • Really actually fix "gray welcome window" issue
     
  11. Tak

    Tak

    Unity Technologies

    Joined:
    Mar 8, 2010
    Messages:
    549
    Build #2016040601

    Official Installers for 64-bit Ubuntu Linux:
    5.4.0b13:
    http://download.unity3d.com/download_unity/linux/unity-editor-5.4.0b13+20160406_amd64.deb
    (sha1sum 2751b591ad3624ed044231f8a16a008a6aa2c5eb)

    Unsupported installer for Other 64-bit Distributions:
    5.4.0b13: http://download.unity3d.com/download_unity/linux/unity-editor-installer-5.4.0b13+20160406.sh
    (sha1sum 2ef79bb4923fe706327e95b8f83e9a076819af4b)

    Torrent (Includes both installers):
    5.4.0b13: http://files.unity3d.com/levi/unity-editor-5.4.0b13+20160406.torrent

    Release Notes:
    • 5.4.0b13
    • Fix vertically-flipped mouse position reporting in Linux standalone
     
  12. Tak

    Tak

    Unity Technologies

    Joined:
    Mar 8, 2010
    Messages:
    549
    Build #2016041801

    Official Installers for 64-bit Ubuntu Linux:
    5.4.0b15:
    http://download.unity3d.com/download_unity/linux/unity-editor-5.4.0b15+20160418_amd64.deb
    (sha1sum db2379f936be8d40bcf30cffd3664880d9678d9c)

    Unsupported installer for Other 64-bit Distributions:
    5.4.0b15: http://download.unity3d.com/download_unity/linux/unity-editor-installer-5.4.0b15+20160418.sh
    (sha1sum 1e94a64a42fc4c92fb405b0b4493025c9074f4bc)

    Torrent (Includes both installers):
    5.4.0b15: http://files.unity3d.com/levi/unity-editor-5.4.0b15+20160418.torrent

    Release Notes:
    • 5.4.0b15
     
  13. Tak

    Tak

    Unity Technologies

    Joined:
    Mar 8, 2010
    Messages:
    549
    Build #2016050301

    Official Installers for 64-bit Ubuntu Linux:
    5.3.4f1: http://download.unity3d.com/download_unity/linux/unity-editor-5.3.4f1+20160503_amd64.deb
    (sha1sum 62868041a95a802f4d59626093548dc93872c69f)
    5.4.0b16: http://download.unity3d.com/download_unity/linux/unity-editor-5.4.0b16+20160503_amd64.deb
    (sha1sum b8b0e7963947a002e5fbeb9102e2e0be3a0bf756)

    Unsupported installer for Other 64-bit Distributions:
    5.3.4f1: http://download.unity3d.com/download_unity/linux/unity-editor-installer-5.3.4f1+20160503.sh
    (sha1sum 2a7b0eb5e0d4d7af107fa2f7146c5564230ea778)
    5.4.0b16: http://download.unity3d.com/download_unity/linux/unity-editor-installer-5.4.0b16+20160503.sh
    (sha1sum 96dd447d5ba75f30205eac8dd7c93a76b09546c1)

    Torrent (Includes both installers):
    http://files.unity3d.com/levi/unity-editor-5.4.0b16+20160503.torrent

    Release Notes:
    • Fix crash when closing auxiliary windows
     
    Last edited: May 4, 2016
  14. Tak

    Tak

    Unity Technologies

    Joined:
    Mar 8, 2010
    Messages:
    549
    Build #2016052501

    Official Installers for 64-bit Ubuntu Linux:
    5.3.5f1: http://download.unity3d.com/download_unity/linux/unity-editor-5.3.5f1+20160525_amd64.deb
    (sha1sum db9c7253d12393543099894a9d2ea523ff7a3b60)
    5.4.0b18: http://download.unity3d.com/download_unity/linux/unity-editor-5.4.0b18+20160524_amd64.deb
    (sha1sum a52f4d94233facba1624140a9e5733178c5a4222)

    Unsupported installer for Other 64-bit Distributions:
    5.3.5f1: http://download.unity3d.com/download_unity/linux/unity-editor-installer-5.3.5f1+20160525.sh
    (sha1sum c9c96baf6b2c1351b83ea2984e0dfa4050d6bce2)
    5.4.0b18: http://download.unity3d.com/download_unity/linux/unity-editor-installer-5.4.0b18+20160524.sh
    (sha1sum a4207fdcb8d5cea66c21e81778e6345f2633b520)

    Torrent (Includes both installers):
    http://files.unity3d.com/levi/unity-editor-5.3.5f1+20160525.torrent
    http://files.unity3d.com/levi/unity-editor-5.4.0b18+20160525.torrent

    Release Notes:
    • Update to 5.3.5f1/5.4.0b18
    • 5.4: Fix WebGL deployment
     
  15. Tak

    Tak

    Unity Technologies

    Joined:
    Mar 8, 2010
    Messages:
    549
    Build #2016060901

    Official Installers for 64-bit Ubuntu Linux:
    5.4.0b21:
    http://download.unity3d.com/download_unity/linux/unity-editor-5.4.0b21+20160609_amd64.deb
    (sha1sum 49555ea7bf8075878d2701203ffc343897d0d909)

    Unsupported installer for Other 64-bit Distributions:
    5.4.0b21:
    http://download.unity3d.com/download_unity/linux/unity-editor-installer-5.4.0b21+20160609.sh
    (sha1sum d09b743694da1418dec36ead6a6fc1bf087e246f)

    Torrent (Includes both installers):
    http://files.unity3d.com/levi/unity-editor-5.4.0b21+20160609.torrent

    Release Notes:
    • Update to 5.4.0b21
     
  16. Tak

    Tak

    Unity Technologies

    Joined:
    Mar 8, 2010
    Messages:
    549
    Build #2016062801

    Official Installers for 64-bit Ubuntu Linux:
    5.4.0b23: http://download.unity3d.com/download_unity/linux/unity-editor-5.4.0b23+20160628_amd64.deb
    (sha1sum 7f92d9a98d1990d768d72d3d882ce96da46f1efa)

    Unsupported installer for Other 64-bit Distributions:
    5.4.0b23: http://download.unity3d.com/download_unity/linux/unity-editor-installer-5.4.0b23+20160628.sh
    (sha1sum ce1ce2a5aba1f8ecaaf8108b3af7d1fa11ef7a0e)

    Torrent (Includes both installers): http://files.unity3d.com/levi/unity-editor-5.4.0b23+20160628.torrent


    Release Notes:
    • Update to 5.4.0b23
     
  17. Tak

    Tak

    Unity Technologies

    Joined:
    Mar 8, 2010
    Messages:
    549
    Build #2016071501

    Official Installers for 64-bit Ubuntu Linux:
    5.4.0rc1: http://download.unity3d.com/download_unity/linux/unity-editor-5.4.0f1+20160715_amd64.deb
    (sha1sum 9ca9f8ea0d612c2a00b8484943a4eee5c491852a)

    Unsupported installer for Other 64-bit Distributions:
    5.4.0rc1: http://download.unity3d.com/download_unity/linux/unity-editor-installer-5.4.0f1+20160715.sh
    (sha1sum 01ab531abd3d00e7515aba2ca89ba8d81556defa)

    Torrent (Includes both installers): http://files.unity3d.com/levi/unity-editor-5.4.0f1+20160715.torrent


    Release Notes:
    • Update to 5.4.0rc1
     
  18. Tak

    Tak

    Unity Technologies

    Joined:
    Mar 8, 2010
    Messages:
    549
    Build #2016072001

    Official Installers for 64-bit Ubuntu Linux:
    5.3.6f1: http://download.unity3d.com/download_unity/linux/unity-editor-5.3.6f1+20160720_amd64.deb
    (sha1sum ff4fd5d7de8912e447373c188e052f62a4e45c83)

    Unsupported installer for Other 64-bit Distributions:
    5.3.6f1: http://download.unity3d.com/download_unity/linux/unity-editor-installer-5.3.6f1+20160720.sh
    (sha1sum 7de374693c06bbcf2b882269736c3618c8c09679)

    Torrent (Includes both installers): http://files.unity3d.com/levi/unity-editor-5.3.6f1+20160720.torrent


    Release Notes:
    • Update to 5.3.6f1
    • Fix command-line license activation
     
  19. Tak

    Tak

    Unity Technologies

    Joined:
    Mar 8, 2010
    Messages:
    549
    Build #2016072701

    Official Installers for 64-bit Ubuntu Linux:
    5.4.0f3: http://download.unity3d.com/download_unity/linux/unity-editor-5.4.0f3+20160727_amd64.deb
    (sha1sum 8f0540a95445cb50c592493d0b54f17f05389b85)

    Unsupported installer for Other 64-bit Distributions:
    5.4.0f3: http://download.unity3d.com/download_unity/linux/unity-editor-installer-5.4.0f3+20160727.sh
    (sha1sum 3b294d04358368b74be53a2f028ce8b00cf518f3)

    Torrent (Includes both installers): http://files.unity3d.com/levi/unity-editor-5.4.0f3+20160727.torrent


    Release Notes:
    • Update to 5.4.0 final (5.4.0f3)
    • Fix command-line license activation
    • Remove 16GB memory usage limit
    • Add JDK search heuristic
    • Fix validation of context-aware menus (e.g. "Open Scene Additive")
    • Guard against hypershrinking the main editor window
     
  20. Tak

    Tak

    Unity Technologies

    Joined:
    Mar 8, 2010
    Messages:
    549
    Build #2016081001

    Official Installers for 64-bit Ubuntu Linux:
    5.4.0p1: http://download.unity3d.com/download_unity/linux/unity-editor-5.4.0p1+20160810_amd64.deb
    (sha1sum 1194c7ac7f075bc768b3b999ecc59b29fbc5be8a)

    Unsupported installer for Other 64-bit Distributions:
    5.4.0p1: http://download.unity3d.com/download_unity/linux/unity-editor-installer-5.4.0p1+20160810.sh
    (sha1sum b32060f4472ec949ad2321d70324b3568b587bb7)

    Torrent (Includes both installers): http://files.unity3d.com/levi/unity-editor-5.4.0p1+20160810.torrent


    Release Notes:
    • Update to 5.4.0p1
    • Fix sporadic crashes on displaying context menus
    • Fix occasional crashes when destroying views
    • Fix OpenVR deploy
    • Fix eyedropper tool inside color picker window
    • Fix certificate issue with command-line license activation on first run
    • Plugin importer: Track native plugins without "lib" prefix for compatibility with player loading logic
    • Implement command-line license return
     
  21. Tak

    Tak

    Unity Technologies

    Joined:
    Mar 8, 2010
    Messages:
    549
    This is an important milestone!
    Not only is this the first beta build for Unity 5.5, but the first Linux editor build shipped from a unified codebase with mainline Unity. That may not sound exciting, but it has a lot of exciting implications. It means that, instead of starting with vanilla Unity and piling thousands of custom changes on top, all of our changes now live in the Unity mainline, where they can be constantly punished by our automated test suites across all of our platforms, and where all of our developers across Unity can easily fix, refactor, and extend Linux editor code alongside everything else. (As an example, the window dragging fix mentioned below was contributed by @shawn .) This also means that your bug reports will be easier to track and test, and the fixes easier to verify.
    In addition, your bug reports will now go directly to the main issue tracker instead of being redirected here to the forum. You're still welcome to post here, and we'll still be reading and responding to your posts - but when you encounter a problem in Unity, Help->Report a Bug will now give you the standard reporting tool for describing the problem and uploading your repro case to us.

    Build #2016083001


    Official Installers for 64-bit Ubuntu Linux:
    5.5.0b1: http://download.unity3d.com/download_unity/linux/unity-editor-5.5.0b1+20160830_amd64.deb
    (sha1sum 955eaa6b5ea0a44ee8ce0aa7d9d3e46c36234e5a)

    Unsupported installer for Other 64-bit Distributions:
    5.5.0b1: http://download.unity3d.com/download_unity/linux/unity-editor-installer-5.5.0b1+20160830.sh
    (sha1sum ca023d29f545012a2e9ad640dba56b3da382e64e)

    Torrent (Includes both installers): http://files.unity3d.com/levi/unity-editor-5.5.0b1+20160830.torrent


    Release Notes:
    • 5.5.0b1
    • Unity now uses the OpenGL core rendering backend. This means that your development environment must support OpenGL core profile 3.2 or later.
    • Experimental iOS project deployment support
    • Fix crash on entering play mode in VR-enabled projects
    • Fix moving undocked editor windows by dragging the titlebar
     
  22. Tak

    Tak

    Unity Technologies

    Joined:
    Mar 8, 2010
    Messages:
    549
    Build #20160906

    Official Installers for 64-bit Ubuntu Linux:
    5.5.0b2: http://download.unity3d.com/download_unity/linux/unity-editor-5.5.0b2+20160906_amd64.deb
    (sha1sum 46a41de6524b75a47020fbb88e0ab212d547d26d)

    Unsupported installer for Other 64-bit Distributions:
    5.5.0b2: http://download.unity3d.com/download_unity/linux/unity-editor-installer-5.5.0b2+20160906.sh
    (sha1sum 6451fcd1aaa4e261c1e7c84feb077c4754719958)

    Torrent (Includes both installers): http://files.unity3d.com/levi/unity-editor-5.5.0b2+20160906.torrent


    Release Notes:
    • 5.5.0b2
    • Enable deployment of Android player using il2cpp scripting backend
    • Fix Collab popup (@Ben64 ;) )
    • Fix sporadic ETC compression failures
    • Clear custom cursor when not playing
    • Allow label popups to get keyboard focus
    • Make RevealInFinder more consistent with other platforms
    • Make MoveToTrash freedesktop-compliant
    • Improve update/autoresize of progress bars
    • Fix maximize/restore of undocked editor windows
     
  23. Tak

    Tak

    Unity Technologies

    Joined:
    Mar 8, 2010
    Messages:
    549
    Build #20160913

    Official Installers for 64-bit Ubuntu Linux:
    5.4.1f1: http://download.unity3d.com/download_unity/linux/unity-editor-5.4.1f1+20160913_amd64.deb
    (sha1sum 6c03a744f670c435b9366fff80ce2a21a148782f)

    Unsupported installer for Other 64-bit Distributions:
    5.4.1f1: http://download.unity3d.com/download_unity/linux/unity-editor-installer-5.4.1f1+20160913.sh
    (sha1sum dd55e85526e3b219585acee3186f4f23dc6b8f6b)

    Torrent (Includes both installers): http://files.unity3d.com/levi/unity-editor-5.4.1f1+20160913.torrent


    Release Notes:
    • 5.4.1f1
    • Experimental iOS project deployment support
    • Fix crash on entering play mode in VR-enabled projects
    • Fix crash when building to a different platform than the current one
    • Fix Collab popup
    • Fix moving undocked editor windows by dragging the titlebar
    • Fix maximize/restore of undocked editor windows
    • Improve update/autoresize of progress bars
    • Make MoveToTrash freedesktop-compliant
    • Make RevealInFinder more consistent with other platforms
    • Allow label popups to get keyboard focus
    • Clear custom cursor when not playing
    • Implement project view rename and navigation shortcuts
     
  24. Tak

    Tak

    Unity Technologies

    Joined:
    Mar 8, 2010
    Messages:
    549
    Build #20160927

    Official Installers for 64-bit Ubuntu Linux:
    5.5.0b5: http://download.unity3d.com/download_unity/linux/unity-editor-5.5.0b5+20160927_amd64.deb
    (sha1sum 259595cf465e83fea1cf11d2809fbc1680498e4d)

    Unsupported installer for Other 64-bit Distributions:
    5.5.0b5: http://download.unity3d.com/download_unity/linux/unity-editor-installer-5.5.0b5+20160927.sh
    (sha1sum ce645159e8db3e6228b0b4db7533cab982e50674)

    Torrent (Includes both installers): http://files.unity3d.com/levi/unity-editor-5.5.0b5+20160927.torrent


    Release Notes:
    • 5.5.0b5
    • Fix menu validation crash
    • First pass at update frequency throttling
     
  25. Tak

    Tak

    Unity Technologies

    Joined:
    Mar 8, 2010
    Messages:
    549
    Build #20161111

    Official Installers for 64-bit Ubuntu Linux:
    5.4.2f2: http://download.unity3d.com/download_unity/linux/unity-editor-5.4.2f2+20161111_amd64.deb
    (sha1sum 537d525edea67f5ce32a2870d684cde7786431d9)

    Unsupported installer for Other 64-bit Distributions:
    5.4.2f2: http://download.unity3d.com/download_unity/linux/unity-editor-installer-5.4.2f2+20161111.sh
    (sha1sum 10db15d9d01a64b6ee9f35c6cf1bcd01c388d9a5)

    Torrent (Includes both installers): http://files.unity3d.com/levi/unity-editor-5.4.2f2+20161111.torrent


    Release Notes:
    • 5.4.2f2

    Known Issues:

    • There are dependency issues with the .deb package on Ubuntu 16.10 and newer. We're working on resolving these; meanwhile, you can still use the .sh installer.
     
  26. Tak

    Tak

    Unity Technologies

    Joined:
    Mar 8, 2010
    Messages:
    549
    Build #20161117
    (Upload corrupted)
     
    Last edited: Nov 28, 2016
    Wulfara, asvany, assrussia and 12 others like this.
  27. Tak

    Tak

    Unity Technologies

    Joined:
    Mar 8, 2010
    Messages:
    549
    Build #20161125

    Official Installers for 64-bit Ubuntu Linux:
    5.4.3f1: http://download.unity3d.com/download_unity/linux/unity-editor-5.4.3f1-3+20161125_amd64.deb
    (sha1sum 7f9415234d0793e4201f64d64debcdfce008a7e0)

    Unsupported installer for Other 64-bit Distributions:
    5.4.3f1: http://download.unity3d.com/download_unity/linux/unity-editor-installer-5.4.3f1-3+20161125.sh
    (sha1sum 315b820ec094cd99829d4807b45d7a2b26ec5c9f)

    Torrent (Includes both installers): http://files.unity3d.com/levi/unity-editor-5.4.3f1-3+20161125.torrent


    Release Notes:
    • 5.4.3f1

    Known Issues:

    • There are dependency issues with the .deb package on Ubuntu 16.10 and newer. We're working on resolving these; meanwhile, you can still use the .sh installer.
     
  28. Tak

    Tak

    Unity Technologies

    Joined:
    Mar 8, 2010
    Messages:
    549
    Build #20161125 (5.5)

    Official Installers for 64-bit Ubuntu Linux:
    5.5.0f3: http://download.unity3d.com/download_unity/linux/unity-editor-5.5.0f3+20161125_amd64.deb
    (sha1sum 9511acb2d61fb499ce2d2f8df2888b744d217d20)

    Unsupported installer for Other 64-bit Distributions:
    5.5.0f3: http://download.unity3d.com/download_unity/linux/unity-editor-installer-5.5.0f3+20161125.sh
    (sha1sum c283c3ce99f84465a5b5b69297c5ef87f8da2cc4)

    Torrent (Includes both installers): http://files.unity3d.com/levi/unity-editor-5.5.0f3+20161125.torrent


    Release Notes:
    • 5.5.0f3 final!
    • For those folks experiencing the "menu/dialogs stop rendering" issue, we've added a command line argument -no-throttle-updates that will give you the old behavior, until we get the problem resolved.

    Known Issues:

    • There are dependency issues with the .deb package on Ubuntu 16.10 and newer. We're working on resolving these; meanwhile, you can still use the .sh installer.
    • Some users are experiencing that "native" Gtk UI (menus, dialogs) will stop updating after some time using Unity. For people experiencing this, we recommend that you try the -no-throttle-updates command line option as a temporary workaround.
     
  29. Tak

    Tak

    Unity Technologies

    Joined:
    Mar 8, 2010
    Messages:
    549
    Build #20161213

    Official Installers for 64-bit Ubuntu Linux:
    5.6.0b1: http://beta.unity3d.com/download/2e25f7ab9f17/unity-editor_amd64.deb
    (sha1sum faf9e48a9c1eab80105e2b881d91e05fd83e2a00)

    Unsupported installer for Other 64-bit Distributions:
    5.6.0b1: http://beta.unity3d.com/download/2e25f7ab9f17/unity-editor-installer.sh
    (sha1sum 3e304f8ee7135f6bb628e5c6846ce09ca98db45d)

    Torrent (Includes both installers): http://files.unity3d.com/levi/unity-editor-5.6.0b1+20161213.torrent


    Release Notes:
    • 5.6.0 beta 1 (full release notes)
    • We're testing a fix for the deb package dependencies on Ubuntu 16.10 (and newer)
    • For those folks experiencing the "menu/dialogs stop rendering" issue, we've added a command line argument -no-throttle-updates that will give you the old behavior, until we get the problem resolved.

    Known Issues:

    • Some users are experiencing that "native" Gtk UI (menus, dialogs) will stop updating after some time using Unity. For people experiencing this, we recommend that you try the -no-throttle-updates command line option as a temporary workaround.
     
  30. Tak

    Tak

    Unity Technologies

    Joined:
    Mar 8, 2010
    Messages:
    549
    Build #20161220

    Official Installers:
    5.5.0p1: http://beta.unity3d.com/download/59c25c92588f/public_download.html
    (deb: 81d159fab61c6ff0c12bf05a184a55d8ade5a3c2)
    (sh: b17124b8cdc7a88e968043d999ac3342cbbbca76)

    Torrent (Includes both installers): http://files.unity3d.com/levi/unity-editor-5.5.0p1+20161220.torrent


    Release Notes:
    • 5.5.0p1
    • Refix collab windows
    • Fixup Linux NDK download path
    • Fix splash screen preview
    • Allow audio mixer exposed parameters popup to receive keyboard focus
    • We're testing a fix for the deb package dependencies on Ubuntu 16.10 (and newer)
    • For those folks experiencing the "menu/dialogs stop rendering" issue, we've added a command line argument -no-throttle-updates that will give you the old behavior, until we get the problem resolved.

    Known Issues:

    • Some users are experiencing that "native" Gtk UI (menus, dialogs) will stop updating after some time using Unity. For people experiencing this, we recommend that you try the -no-throttle-updates command line option as a temporary workaround.
     
    slegrand, gururise, R3v1v3R and 15 others like this.
  31. Tak

    Tak

    Unity Technologies

    Joined:
    Mar 8, 2010
    Messages:
    549
    Build #20161229

    Official Installers:
    5.6.0b3: http://beta.unity3d.com/download/b7d937b6f596/public_download.html
    (deb: 5d71b191d9f2099e0f5552c0b11e33003f441503)
    (sh: 5138c028cf3c8e9333e2a223a4ef34dd2b1683ad)

    Torrent (Includes both installers):http://files.unity3d.com/levi/unity-editor-5.6.0b3+20161229.torrent


    Release Notes:
    • 5.6.0b3
    • Fix blender import
    • Add diff tool selection
    • We're testing a fix for the deb package dependencies on Ubuntu 16.10 (and newer)
    • For those folks experiencing the "menu/dialogs stop rendering" issue, we've added a command line argument -no-throttle-updates that will give you the old behavior, until we get the problem resolved.

    Known Issues:

    • Some users are experiencing that "native" Gtk UI (menus, dialogs) will stop updating after some time using Unity. For people experiencing this, we recommend that you try the -no-throttle-updates command line option as a temporary workaround.
     
  32. Tak

    Tak

    Unity Technologies

    Joined:
    Mar 8, 2010
    Messages:
    549
    Build #20170201

    Official Installers:
    5.5.1f1: http://beta.unity3d.com/download/f5287bef00ff/public_download.html
    (deb: 90fdfb1e024f92d8b9e9a042a7dfb669807a2884)
    (sh: 99bfd5cd2332d105edcafe68b2392897ffa54112)

    Torrent (Includes both installers): http://files.unity3d.com/levi/unity-editor-5.5.1f1+20170201.torrent


    Release Notes:
    • 5.5.1f1
    • Fix blender import
    • Fix Gtk update bug
    • Fix launching Unity from PATH
    • Fix batch mode startup crash
    • Make menus more consistent
    • We're testing a fix for the deb package dependencies on Ubuntu 16.10 (and newer)
     
  33. Tak

    Tak

    Unity Technologies

    Joined:
    Mar 8, 2010
    Messages:
    549
    Build #20170203

    Official Installers:
    5.6.0b6: http://beta.unity3d.com/download/35e1927e3b6b/public_download.html
    (deb: 7c7fd9264ca70cfb41e6378fb62bae999bc0505c)
    (sh: 865bc4236d5040405df03d92f4641bc5b4b35634)

    Torrent (Includes both installers): http://files.unity3d.com/levi/unity-editor-5.6.0b6+20170203.torrent


    Release Notes:
    • 5.6.0b6
    • Fix audio in editor
    • Fix bundled npm
    • Fix Gtk update bug
    • Another fix for multiprocess (ETC) texture import
    • Fix crash when registering license if USER isn't set
    • Improve drag & drop
    • We're testing a fix for the deb package dependencies on Ubuntu 16.10 (and newer)
     
  34. Tak

    Tak

    Unity Technologies

    Joined:
    Mar 8, 2010
    Messages:
    549
  35. Tak

    Tak

    Unity Technologies

    Joined:
    Mar 8, 2010
    Messages:
    549
    Build #20170228

    Official Installers:
    5.5.2f1: https://beta.unity3d.com/download/e06241adb51f/public_download.html
    (deb: 498d92705ba6c1ead72c222c90b915ff2868ead4)
    (sh: ef83d577413153873495e6e355cd230796533c91)

    Torrent (Includes both installers): http://files.unity3d.com/levi/unity-editor-5.5.2f1+20170228.torrent


    Release Notes:
    • 5.5.2f1
    • Improve drag & drop
    • Fixes for multiprocess (ETC) texture import
    • Fix crash when registering license if USER isn't set
    • Reduce event "queuing" in play mode
    • Fix webcam texture with loopback source
    • Fix "Manage License" UI regression
    • Fix hang in background lighting computation
     
Thread Status:
Not open for further replies.
ubuntu-make-18.09+disco1/tests/data/server-content/github.com/0000755000000000000000000000000013352651520021126 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/github.com/4ian/0000755000000000000000000000000013352651520021761 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/github.com/4ian/GD/0000755000000000000000000000000013352651520022253 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/github.com/4ian/GD/blob/0000755000000000000000000000000013352651520023171 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/github.com/4ian/GD/blob/master/0000755000000000000000000000000013352651520024464 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/github.com/4ian/GD/blob/master/Binaries/0000755000000000000000000000000013352651520026220 5ustar ././@LongLink0000644000000000000000000000014600000000000007774 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/github.com/4ian/GD/blob/master/Binaries/Packaging/ubuntu-make-18.09+disco1/tests/data/server-content/github.com/4ian/GD/blob/master/Binaries/Packaging0000755000000000000000000000000013352651520030025 5ustar ././@LongLink0000644000000000000000000000017000000000000007771 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/github.com/4ian/GD/blob/master/Binaries/Packaging/linux-extra-files/ubuntu-make-18.09+disco1/tests/data/server-content/github.com/4ian/GD/blob/master/Binaries/Packaging0000755000000000000000000000000013352651520030025 5ustar ././@LongLink0000644000000000000000000000017400000000000007775 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/github.com/4ian/GD/blob/master/Binaries/Packaging/linux-extra-files/usr/ubuntu-make-18.09+disco1/tests/data/server-content/github.com/4ian/GD/blob/master/Binaries/Packaging0000755000000000000000000000000013352651520030025 5ustar ././@LongLink0000644000000000000000000000020200000000000007765 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/github.com/4ian/GD/blob/master/Binaries/Packaging/linux-extra-files/usr/share/ubuntu-make-18.09+disco1/tests/data/server-content/github.com/4ian/GD/blob/master/Binaries/Packaging0000755000000000000000000000000013352651520030025 5ustar ././@LongLink0000644000000000000000000000021000000000000007764 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/github.com/4ian/GD/blob/master/Binaries/Packaging/linux-extra-files/usr/share/icons/ubuntu-make-18.09+disco1/tests/data/server-content/github.com/4ian/GD/blob/master/Binaries/Packaging0000755000000000000000000000000013352651520030025 5ustar ././@LongLink0000644000000000000000000000022000000000000007765 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/github.com/4ian/GD/blob/master/Binaries/Packaging/linux-extra-files/usr/share/icons/hicolor/ubuntu-make-18.09+disco1/tests/data/server-content/github.com/4ian/GD/blob/master/Binaries/Packaging0000755000000000000000000000000013352651520030025 5ustar ././@LongLink0000644000000000000000000000023000000000000007766 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/github.com/4ian/GD/blob/master/Binaries/Packaging/linux-extra-files/usr/share/icons/hicolor/128x128/ubuntu-make-18.09+disco1/tests/data/server-content/github.com/4ian/GD/blob/master/Binaries/Packaging0000755000000000000000000000000013352651520030025 5ustar ././@LongLink0000644000000000000000000000023500000000000007773 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/github.com/4ian/GD/blob/master/Binaries/Packaging/linux-extra-files/usr/share/icons/hicolor/128x128/apps/ubuntu-make-18.09+disco1/tests/data/server-content/github.com/4ian/GD/blob/master/Binaries/Packaging0000755000000000000000000000000013352651520030025 5ustar ././@LongLink0000644000000000000000000000025100000000000007771 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/github.com/4ian/GD/blob/master/Binaries/Packaging/linux-extra-files/usr/share/icons/hicolor/128x128/apps/GDevelop.pngubuntu-make-18.09+disco1/tests/data/server-content/github.com/4ian/GD/blob/master/Binaries/Packaging0000644000000000000000000000000013352651520030015 0ustar ubuntu-make-18.09+disco1/tests/data/server-content/github.com/4ian/GD/releases/0000755000000000000000000000000013352651520024056 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/github.com/4ian/GD/releases/download/0000755000000000000000000000000013352651520025665 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/github.com/4ian/GD/releases/download/vmock/0000755000000000000000000000000013352651520027004 5ustar ././@LongLink0000644000000000000000000000016300000000000007773 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/github.com/4ian/GD/releases/download/vmock/gdevelop-mock.tar.gzubuntu-make-18.09+disco1/tests/data/server-content/github.com/4ian/GD/releases/download/vmock/gdevel0000644000000000000000000000026713352651520030202 0ustar ‹øëZíÑÝ ‚0€á{‹ŽÃý¸v=VÃ$KI‹.? ¤„Ê%¢÷9ùìƒ7Û„s(Êj±/×»XLBµ¼s·©½Sϳ#´5Þxo] ¥m’X!Ý4ëôê&=J)²´È‹P¾}7tÿ£²^ÿî4î÷þþC«ýiû;½tBªq×xíÏûÏg2^凸ÞFuB%­ŠÂ%o¢o/`ÐcÆws(ubuntu-make-18.09+disco1/tests/data/server-content/github.com/JetBrains/0000755000000000000000000000000013352651520023007 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/github.com/JetBrains/kotlin/0000755000000000000000000000000013352651520024307 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/github.com/JetBrains/kotlin/releases/0000755000000000000000000000000013352651520026112 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/github.com/JetBrains/kotlin/releases/download/0000755000000000000000000000000013352651520027721 5ustar ././@LongLink0000644000000000000000000000015600000000000007775 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/github.com/JetBrains/kotlin/releases/download/build-1.0.0/ubuntu-make-18.09+disco1/tests/data/server-content/github.com/JetBrains/kotlin/releases/download/bui0000755000000000000000000000000013352651520030421 5ustar ././@LongLink0000644000000000000000000000020700000000000007772 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/github.com/JetBrains/kotlin/releases/download/build-1.0.0/kotlin-compiler-1.0.0.zipubuntu-make-18.09+disco1/tests/data/server-content/github.com/JetBrains/kotlin/releases/download/bui0000644000000000000000000000502613352651520030426 0ustar PK {¦XHkotlinc/UT šÑÍV£xÎVux èèPK šEYH kotlinc/bin/UT ³xÎV³xÎVux èèPKPPNHáø¢¡…kotlinc/bin/kotlinc-jvmUT h ÀV£xÎVux èèe‘Ao£0…ïüŠ)é!•H+íe{Yš¦*ÛŠH!mÕ£1Œl¯mJòï;¬Ôj…Øóôü½çÙE\Š áX.vt‚¬µ9Zª7«ëÕ’_?à7ú;+H9p‘tÌXøL•ÃzU¢ß $FHþœ' xEëH+¸‰V0áy^ݲÃQ÷Љ#(í¡wÈä ¢R ugZJ" ä›é˜³ cÀûÙBžù@°Þðªúªá'àÆ{ó3އaˆÄi[ÇíIäâçt½ÉòÍ’a'ù‹jÑ9°ø·'Ë1‹#Ã,RLØŠ´Q[ä™×#ë`É“ªàtåa‘]JrÞRÑûoEý#ã¼_\•P&9¤ywIžæ öxK÷Û—=¼%»]’íÓMÛ¬·Ù}ºO·¯ ÉÞá)Íî€\ƒcG~†¤±B,ǾrÄo•>9ƒ’*’œKÕ½¨jýVq0h;rãE:Æ+Ù¥¥Ž¼ðÓΡ¢ /ç%Y%:¾ñËùÐløg^ñÿѾ%%yãW|PKšEYHGÁÔ õkotlinc/bin/kotlincUT ³xÎV³xÎVux èè­Mo‚@†ïüŠWè©áÓ¤'â F‚xhšP™Ôî’ÝmÕßEožL2ßOfÆ™;âÁ®U=±ÃÉtp'ÐÆCç-ÈÁž<*l=emCR+„ž|=¦¹˜0<],Lá™$ë[^í_ë@ú¸ö¾ýE}ß 9‚ c«¨9‹\´I–«4_Ív”?è‹:²\fqÙ2‹’6²cAV9æÍÀÚ[ò¤«)8³÷½´È.%9o©èü›Fý#ãz_ ¸URCçä!ÜÆy’OÙã1Ù}Ëvðo·qºKV9d[Xfé]²K²”W_!NŸ`¤wS@n§Áck~†¤¡…XýÊßìÍȵ¨hOŠëÒU'+„ʼ Õ\´hä†A:Æ+Ù¥¡yéÇÿŠAÀ¹õ°Îv›$ýµÌ¾ÿH6«ígn·xF_ŒWIü6¾!-TCâÙ‰õâ>_ò¬yú6«뒬–¾2W×}MªæŸyxÃOt>¨xãKüPKPPNHKfضkotlinc/bin/kotlinUT h ÀV£xÎVux èèe’Ño›0Æßù+n¤©”@Zi/«&¦™Æ¤UŸ&œFlÏ6#ùï{ÐLj5!ö}úî÷½ø–$ÃRØÖk­,Êã|ÅÏqñ#=ðeY”ñ.‡4ƒmš<ÄEœ&¼úQòqò°ä1q™Õµ]¯ª¶rwýÀ”.KYYmêŠIedU2²Gèå‹U?±‡&øÐƽ÷ÿQn7ÿ#½ñ­üsðRi--òÿ îóÿ߯|ãPþÊèmþ•4:ו5V3’c6±Ï?Ïÿl²I}Ö,;ÎýœnIœ_šNI¤UOŰx*º6„xå’ »kº¶ç”µ®‹$nÖgôS¸Ÿˆ÷ú‹Hò¹ç›â¿="ÀI{´*Ko(ubuntu-make-18.09+disco1/tests/data/server-content/github.com/dbeaver/0000755000000000000000000000000013352651520022536 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/github.com/dbeaver/dbeaver/0000755000000000000000000000000013352651520024146 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/github.com/dbeaver/dbeaver/releases/0000755000000000000000000000000013352651520025751 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/github.com/dbeaver/dbeaver/releases/download/0000755000000000000000000000000013352651520027560 5ustar ././@LongLink0000644000000000000000000000014600000000000007774 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/github.com/dbeaver/dbeaver/releases/download/mock/ubuntu-make-18.09+disco1/tests/data/server-content/github.com/dbeaver/dbeaver/releases/download/mock0000755000000000000000000000000013352651520030432 5ustar ././@LongLink0000644000000000000000000000021200000000000007766 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/github.com/dbeaver/dbeaver/releases/download/mock/dbeaver-ce-mock-linux.gtk.x86.tar.gzubuntu-make-18.09+disco1/tests/data/server-content/github.com/dbeaver/dbeaver/releases/download/mock0000644000000000000000000000046313352651520030437 0ustar ‹qæ[dbeaver-ce-mock-linux.gtk.x86.taríÖMNÃ0`¯s #º€EÉŒ¹ŽKLHC•@Ï-QJ78€xßf,9’-=Í8Í*†}jQ%ÞÛ\Ù[:®ÁšYf㌠Vš”¶ä¥&/ãs¤ëе]|:ùݹý?ª9äÿöayc3Þò÷§óWF¤È5)Îù²FH*p—Oþyþ—õªíëqSUcãN:ª~úN0Ÿ©ÿõfׯ¿ýŒÜâ.Ïõ¯æ¿rVV^©Üÿi…þŸÃ‡ü‹œqvþ[ŸÞMlæ´&No!ÿ9ÍÿÅUÓ}ØF¹ ë÷¹ ÃÝF¶îÖUx~«WR»ù(././@LongLink0000644000000000000000000000021500000000000007771 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/github.com/dbeaver/dbeaver/releases/download/mock/dbeaver-ce-mock-linux.gtk.x86_64.tar.gzubuntu-make-18.09+disco1/tests/data/server-content/github.com/dbeaver/dbeaver/releases/download/mock0000644000000000000000000000047213352651520030437 0ustar ‹;æ[dbeaver-ce-mock-linux.gtk.x86_64.taríÖMNÃ0`¯s #º€EÉøoÌmKLB•´ÇǨ@¥@¼oãȉ䑞fœjÃ>v¥%Þ»¼*ïèxeˆÉ)eÙ RÚÒYÔ`×oC'¥X†¦nâóÉïνÿ£ªCþaæaG8ã-:mEŠœMù«œ¿%g…¤jùäŸçyQ.ê¶ìWEÑ71n$SñÓ5Át†þ?¬7›vùígäç<׿šÿš±J{­sÿ§'ôÿ>ä?Êgç?«tÿRŽ ù´¯ ‡ü§p4ÿgWUݵá)Ê]¿ÿÈyèîWòå–ïØ¸~§WªÙ¾4(ubuntu-make-18.09+disco1/tests/data/server-content/github.com/processing/0000755000000000000000000000000013352651520023302 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/github.com/processing/processing/0000755000000000000000000000000013352651520025456 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/github.com/processing/processing/releases/0000755000000000000000000000000013352651520027261 5ustar ././@LongLink0000644000000000000000000000014700000000000007775 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/github.com/processing/processing/releases/download/ubuntu-make-18.09+disco1/tests/data/server-content/github.com/processing/processing/releases/downloa0000755000000000000000000000000013352651520030645 5ustar ././@LongLink0000644000000000000000000000015400000000000007773 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/github.com/processing/processing/releases/download/mock/ubuntu-make-18.09+disco1/tests/data/server-content/github.com/processing/processing/releases/downloa0000755000000000000000000000000013352651520030645 5ustar ././@LongLink0000644000000000000000000000020700000000000007772 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/github.com/processing/processing/releases/download/mock/processing-mock-linux32.tgzubuntu-make-18.09+disco1/tests/data/server-content/github.com/processing/processing/releases/downloa0000777000000000000000000000000013352651520036004 2processing-mock-linux64.tgzustar ././@LongLink0000644000000000000000000000020700000000000007772 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/github.com/processing/processing/releases/download/mock/processing-mock-linux64.tgzubuntu-make-18.09+disco1/tests/data/server-content/github.com/processing/processing/releases/downloa0000644000000000000000000000052013352651520030644 0ustar ‹DÒØXíÖßNÂ0ð^ó5r¡c_»þ¹÷M T¬Œ­YÅøøn&C„4ÃùÝ,Ù–|KNÏÚØµ ŸRhVŦ]¬‹:4Û²ó2,Ú&•qé ©Í,6+v)ꥆ«°š¯;LH£+%¤•’‘$m+Æéâ‰gئ7×qÎV®µo¾wêù?GóßßÍ1cØj}<c™¨È¡,‰~++‹ü¯áþ®œ‡¦L/“ÉôaºÆm<ŸÒcùêÞ]ñìÖžïÃÌÅ8{rÉOþú³!“ñþ‡ŸeÆWÿíý—j×Óï}ÿ%ƒþ_ÃAÿSí}ä†Pî2Þÿýù/ÇŒ“ûÿpþ«HIAªÿ û?‘b\ç~Ê÷ÿxþùfü*ÿÝùŸ†ÿ¿¶Èÿ:ÆóÏ;ã¬ü•òJ €K|Š$(ubuntu-make-18.09+disco1/tests/data/server-content/github.com/superpowers/0000755000000000000000000000000013352651520023524 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/github.com/superpowers/superpowers-app/0000755000000000000000000000000013352651520026700 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/github.com/superpowers/superpowers-app/releases/0000755000000000000000000000000013352651520030503 5ustar ././@LongLink0000644000000000000000000000015500000000000007774 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/github.com/superpowers/superpowers-app/releases/download/ubuntu-make-18.09+disco1/tests/data/server-content/github.com/superpowers/superpowers-app/releases/d0000755000000000000000000000000013352651520030647 5ustar ././@LongLink0000644000000000000000000000016300000000000007773 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/github.com/superpowers/superpowers-app/releases/download/vmock/ubuntu-make-18.09+disco1/tests/data/server-content/github.com/superpowers/superpowers-app/releases/d0000755000000000000000000000000013352651520030647 5ustar ././@LongLink0000644000000000000000000000022200000000000007767 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/github.com/superpowers/superpowers-app/releases/download/vmock/superpowers-mock-linux-ia32.zipubuntu-make-18.09+disco1/tests/data/server-content/github.com/superpowers/superpowers-app/releases/d0000777000000000000000000000000013352651520036473 2superpowers-mock-linux-x64.zipustar ././@LongLink0000644000000000000000000000022100000000000007766 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/github.com/superpowers/superpowers-app/releases/download/vmock/superpowers-mock-linux-x64.zipubuntu-make-18.09+disco1/tests/data/server-content/github.com/superpowers/superpowers-app/releases/d0000644000000000000000000000307513352651520030656 0ustar PK rGHsuperpowers-mock-linux-x64/UT ²C·Vi÷Wux èèPK Vy?Hý’l&superpowers-mock-linux-x64/SuperpowersUT ä®Vä®Vux èè#!/bin/sh sleep 60 exit 0 PK rGH%superpowers-mock-linux-x64/resources/UT ²C·V„i÷Wux èèPK ìZGI)superpowers-mock-linux-x64/resources/app/UT ‹i÷W‹i÷Wux èèPK ZGI2superpowers-mock-linux-x64/resources/app/renderer/UT ðg÷W’i÷Wux èèPK ZGI9superpowers-mock-linux-x64/resources/app/renderer/images/UT h÷W’i÷Wux èèPK My?HLsuperpowers-mock-linux-x64/resources/app/renderer/images/superpowers-256.pngUT Ò®VÒ®Vux èèPK rGHýAsuperpowers-mock-linux-x64/UT²C·Vux èèPK Vy?Hý’l&ýUsuperpowers-mock-linux-x64/SuperpowersUTä®Vux èèPK rGH%ýAÐsuperpowers-mock-linux-x64/resources/UT²C·Vux èèPK ìZGI)ýA/superpowers-mock-linux-x64/resources/app/UT‹i÷Wux èèPK ZGI2ýA’superpowers-mock-linux-x64/resources/app/renderer/UTðg÷Wux èèPK ZGI9ýAþsuperpowers-mock-linux-x64/resources/app/renderer/images/UTh÷Wux èèPK My?HL´qsuperpowers-mock-linux-x64/resources/app/renderer/images/superpowers-256.pngUTÒ®Vux èèPK0÷ubuntu-make-18.09+disco1/tests/data/server-content/github.com/ubuntu/0000755000000000000000000000000013352651520022450 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/github.com/ubuntu/ubuntu-make/0000755000000000000000000000000013352651520024705 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/github.com/ubuntu/ubuntu-make/releases0000644000000000000000000017201113352651520026435 0ustar Releases · ubuntu/ubuntu-make
  • Unwatch

/ubuntu-make

You can't perform that action at this time.
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.
ubuntu-make-18.09+disco1/tests/data/server-content/go.microsoft.com/0000755000000000000000000000000013352651520022255 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/go.microsoft.com/fwlink/0000755000000000000000000000000013352651520023547 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/go.microsoft.com/fwlink/?LinkID=6208840000777000000000000000000000000013352651520032646 2visual-studio-code-amd64.zipustar ubuntu-make-18.09+disco1/tests/data/server-content/go.microsoft.com/fwlink/?LinkID=6208850000777000000000000000000000000013352651520032425 2visual-studio-code-i386.zipustar ubuntu-make-18.09+disco1/tests/data/server-content/go.microsoft.com/fwlink/?LinkId=7239680000777000000000000000000000000013352651520034533 2visual-studio-code-insiders-amd64.zipustar ubuntu-make-18.09+disco1/tests/data/server-content/go.microsoft.com/fwlink/?LinkId=7239690000777000000000000000000000000013352651520034312 2visual-studio-code-insiders-i386.zipustar ././@LongLink0000644000000000000000000000015000000000000007767 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/go.microsoft.com/fwlink/visual-studio-code-amd64.zipubuntu-make-18.09+disco1/tests/data/server-content/go.microsoft.com/fwlink/visual-studio-code-amd64.0000644000000000000000000000263713352651520030211 0ustar PKƒa1IVSCode-linux-amd64/PKƒa1IVSCode-linux-amd64/bin/PKu¡{JyÔì")VSCode-linux-amd64/bin/codeSVÔOÊÌÓ/ÎàâRÑHÉ,ÊKÌMU@bhjê'秤rPK •ƒ{JÊ}VSCode-linux-amd64/code#! /bin/sh sleep 60 PK}a1IVSCode-linux-amd64/resources/PK}a1I!VSCode-linux-amd64/resources/app/PK}a1I+VSCode-linux-amd64/resources/app/resources/PK}a1I1VSCode-linux-amd64/resources/app/resources/linux/PK iNsG9VSCode-linux-amd64/resources/app/resources/linux/code.pngPK?ƒa1I€ýAVSCode-linux-amd64/PK?ƒa1I€ýA1VSCode-linux-amd64/bin/PK?u¡{JyÔì")$ €ýfVSCode-linux-amd64/bin/code €ìp•%§Ò€ìp•%§Ò€ìp•%§ÒPK? •ƒ{JÊ}$ €ýÁVSCode-linux-amd64/code ‰ïn§Ò‰ïn§Ò‰ïn§ÒPK?}a1I€ýA VSCode-linux-amd64/resources/PK?}a1I!€ýAFVSCode-linux-amd64/resources/app/PK?}a1I+€ýA…VSCode-linux-amd64/resources/app/resources/PK?}a1I1€ýAÎVSCode-linux-amd64/resources/app/resources/linux/PK? iNsG9 €´VSCode-linux-amd64/resources/app/resources/linux/code.pngPK t././@LongLink0000644000000000000000000000014700000000000007775 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/go.microsoft.com/fwlink/visual-studio-code-i386.zipubuntu-make-18.09+disco1/tests/data/server-content/go.microsoft.com/fwlink/visual-studio-code-i386.z0000777000000000000000000000000013352651520035323 2visual-studio-code-amd64.zipustar ././@LongLink0000644000000000000000000000016100000000000007771 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/go.microsoft.com/fwlink/visual-studio-code-insiders-amd64.zipubuntu-make-18.09+disco1/tests/data/server-content/go.microsoft.com/fwlink/visual-studio-code-inside0000644000000000000000000000271613352651520030471 0ustar PKƒa1IVSCode-linux-amd64/PKƒa1IVSCode-linux-amd64/bin/PK˜¡{JñrÓç+2$VSCode-linux-amd64/bin/code-insidersSVÔOÊÌÓ/ÎàâRÑHÉ,ÊKÌMU@bhjê'秤êfæg¦¤sPK Ѓ{Jû—m VSCode-linux-amd64/code-insiders#! /bin/bash sleep 60 PK}a1IVSCode-linux-amd64/resources/PK}a1I!VSCode-linux-amd64/resources/app/PK}a1I+VSCode-linux-amd64/resources/app/resources/PK}a1I1VSCode-linux-amd64/resources/app/resources/linux/PK iNsG9VSCode-linux-amd64/resources/app/resources/linux/code.pngPK?ƒa1I€ýAVSCode-linux-amd64/PK?ƒa1I€ýA1VSCode-linux-amd64/bin/PK?˜¡{JñrÓç+2$$ €ýfVSCode-linux-amd64/bin/code-insiders €¹Ç¼%§Ò€¹Ç¼%§Ò€¹Ç¼%§ÒPK? Ѓ{Jû—m $ €ýÓVSCode-linux-amd64/code-insiders 4€°§Ò4€°§Ò4€°§ÒPK?}a1I€ýA(VSCode-linux-amd64/resources/PK?}a1I!€ýAcVSCode-linux-amd64/resources/app/PK?}a1I+€ýA¢VSCode-linux-amd64/resources/app/resources/PK?}a1I1€ýAëVSCode-linux-amd64/resources/app/resources/linux/PK? iNsG9 €´:VSCode-linux-amd64/resources/app/resources/linux/code.pngPK '‘././@LongLink0000644000000000000000000000016000000000000007770 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/go.microsoft.com/fwlink/visual-studio-code-insiders-i386.zipubuntu-make-18.09+disco1/tests/data/server-content/go.microsoft.com/fwlink/visual-studio-code-inside0000777000000000000000000000000013352651520037453 2visual-studio-code-insiders-amd64.zipustar ubuntu-make-18.09+disco1/tests/data/server-content/godotengine.org/0000755000000000000000000000000013352651520022157 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/godotengine.org/download/0000755000000000000000000000000013352651520023766 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/godotengine.org/download/linux/0000755000000000000000000000000013352651520025125 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/godotengine.org/download/linux/index.html0000644000000000000000000002621713352651520027132 0ustar Godot Engine - Download | Linux

Download

Godot 3.0.2

released Mar 4, 2018

Downloads

Mono version (C# support)


Requirements (version 3.0)

  • OpenGL ES 3.0 compatible hardware
  • For the Mono version, Mono SDK 5.4.x (other versions won't work)

Instructions

  • Extract and run.
Also available on Steam .

Godot development is open. This means you can fix or improve any part of the engine yourself and choose whether to contribute it back or to keep it private. New features are always available to use and test, without the need of having to wait for the next major release. Compiling Godot from source is very easy (it has no common dependencies) and the process (for each platform) is well-documented on the wiki. To obtain the source code (and consulting the documentation), please visit the GitHub project page.

ubuntu-make-18.09+disco1/tests/data/server-content/godotengine.org/themes/0000755000000000000000000000000013352651520023444 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/godotengine.org/themes/godotengine/0000755000000000000000000000000013352651520025746 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/godotengine.org/themes/godotengine/assets/0000755000000000000000000000000013352651520027250 5ustar ././@LongLink0000644000000000000000000000014700000000000007775 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/godotengine.org/themes/godotengine/assets/download/ubuntu-make-18.09+disco1/tests/data/server-content/godotengine.org/themes/godotengine/assets/downloa0000755000000000000000000000000013352651520030634 5ustar ././@LongLink0000644000000000000000000000016500000000000007775 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/godotengine.org/themes/godotengine/assets/download/godot_logo.svgubuntu-make-18.09+disco1/tests/data/server-content/godotengine.org/themes/godotengine/assets/downloa0000644000000000000000000000000013352651520030624 0ustar ubuntu-make-18.09+disco1/tests/data/server-content/golang.org/0000755000000000000000000000000013352651520021124 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/golang.org/dl/0000755000000000000000000000000013352651520021523 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/golang.org/dl/index.html0000644000000000000000000012567113352651520023534 0ustar Downloads - The Go Programming Language

Downloads

After downloading a binary release suitable for your system, please follow the installation instructions.

If you are building from source, follow the source installation instructions.

Stable versions

go1.3.3 â–¾

File name Kind OS Arch SHA1 Checksum
go1.3.3.src.tar.gz Source b54b7deb7b7afe9f5d9a3f5dd830c7dede35393a
go1.3.3.darwin-386-osx10.6.tar.gz Archive OS X 10.6+ 32-bit 04b3e38549183e984f509c07ad40d8bcd577a702
go1.3.3.darwin-386-osx10.8.tar.gz Archive OS X 10.8+ 32-bit 88f35d3327a84107aac4f2f24cb0883e5fdbe0e5
go1.3.3.darwin-386-osx10.6.pkg Installer OS X 10.6+ 32-bit 49756b700670ae4109e555f2e5f9bedbaa3c50da
go1.3.3.darwin-386-osx10.8.pkg Installer OS X 10.8+ 32-bit a89b570a326e5f8c9509f40be9fa90e54b3bf7a7
go1.3.3.darwin-amd64-osx10.6.tar.gz Archive OS X 10.6+ 64-bit dfe68de684f6e8d9c371d01e6d6a522efe3b8942
go1.3.3.darwin-amd64-osx10.8.tar.gz Archive OS X 10.8+ 64-bit be686ec7ba68d588735cc2094ccab8bdd651de9e
go1.3.3.darwin-amd64-osx10.6.pkg Installer OS X 10.6+ 64-bit 9aec7e9eff11100a6db026d1b423d1250925e4c4
go1.3.3.darwin-amd64-osx10.8.pkg Installer OS X 10.8+ 64-bit 6435e50059fe7fa0d60f1b15aab7f255a61816ce
go1.3.3.freebsd-386.tar.gz Archive FreeBSD 32-bit 875a5515dd7d3e5826c7c003bb2450f3129ccbad
go1.3.3.freebsd-amd64.tar.gz Archive FreeBSD 64-bit 8531ae5e745c887f8dad1a3f00ca873cfcace56e
go1.3.3.linux-386.tar.gz Archive Linux 32-bit c26c1bb756f83e63d0dc850c2128367d17b99af09c7e5407e8e7de50e9716d41
go1.3.3.linux-amd64.tar.gz Archive Linux 64-bit c26c1bb756f83e63d0dc850c2128367d17b99af09c7e5407e8e7de50e9716d41
go1.3.3.windows-386.zip Archive Windows 32-bit ba99083b22e0b22b560bb2d28b9b99b405d01b6b
go1.3.3.windows-386.msi Installer Windows 32-bit 6017a0e1667a5a41109f527b405bf6e0c83580f5
go1.3.3.windows-amd64.zip Archive Windows 64-bit 5f0b3b104d3db09edd32ef1d086ba20bafe01ada
go1.3.3.windows-amd64.msi Installer Windows 64-bit 25112a8c4df93dc4009e65eff00bc4ef76f94e46

go1.3.2 â–¾

File name Kind OS Arch SHA1 Checksum
go1.3.2.src.tar.gz Source 67d3a692588c259f9fe9dca5b80109e5b99271df
go1.3.2.darwin-386-osx10.6.tar.gz Archive OS X 10.6+ 32-bit d1652f6e0ed3063b7b43d2bc12981d927bc85deb
go1.3.2.darwin-386-osx10.8.tar.gz Archive OS X 10.8+ 32-bit d040c85698c749fdbe25e8568c4d71648a5e3a75
go1.3.2.darwin-386-osx10.6.pkg Installer OS X 10.6+ 32-bit d20375615cf8e36e3c9a9b6ddeef16eff7a4ea89
go1.3.2.darwin-386-osx10.8.pkg Installer OS X 10.8+ 32-bit f11930cfb032d39ab445f342742865c93c60ec14
go1.3.2.darwin-amd64-osx10.6.tar.gz Archive OS X 10.6+ 64-bit 36ca7e8ac9af12e70b1e01182c7ffc732ff3b876
go1.3.2.darwin-amd64-osx10.8.tar.gz Archive OS X 10.8+ 64-bit 323bf8088614d58fee2b4d2cb07d837063d7d77e
go1.3.2.darwin-amd64-osx10.6.pkg Installer OS X 10.6+ 64-bit e1529241fcef643e5f752c37dc4c86911df91338
go1.3.2.darwin-amd64-osx10.8.pkg Installer OS X 10.8+ 64-bit fd8637658fcb133423e794c44029ce3476b48e0c
go1.3.2.freebsd-386.tar.gz Archive FreeBSD 32-bit fea3ef264120b5c3b4c50a8929d56f47a8366503
go1.3.2.freebsd-amd64.tar.gz Archive FreeBSD 64-bit 95b633f45156fbbe79076638f854e76b9cd01301
go1.3.2.linux-386.tar.gz Archive Linux 32-bit 3cbfd62d401a6ca70779856fa8ad8c4d6c35c8cc
go1.3.2.linux-amd64.tar.gz Archive Linux 64-bit 0e4b6120eee6d45e2e4374dac4fe7607df4cbe42
go1.3.2.windows-386.zip Archive Windows 32-bit 86160c478436253f51241ac1905577d337577ce0
go1.3.2.windows-386.msi Installer Windows 32-bit 589c35f9ad3506c92aa944130f6a950ce9ee558b
go1.3.2.windows-amd64.zip Archive Windows 64-bit 7f7147484b1bc9e52cf034de816146977d0137f6
go1.3.2.windows-amd64.msi Installer Windows 64-bit a697fff05cbd4a4d902f6c33f7c42588bcc474bc

go1.3.1 â–¾

File name Kind OS Arch SHA1 Checksum
go1.3.1.src.tar.gz Source bc296c9c305bacfbd7bff9e1b54f6f66ae421e6e
go1.3.1.darwin-386-osx10.6.tar.gz Archive OS X 10.6+ 32-bit 84f70a4c83be24cea696654a5b55331ea32f8a3f
go1.3.1.darwin-386-osx10.8.tar.gz Archive OS X 10.8+ 32-bit 244dfba1f4239b8e2eb9c3abae5ad63fc32c807a
go1.3.1.darwin-386-osx10.6.pkg Installer OS X 10.6+ 32-bit 16e0df7b90d49c8499f71a551af8b595e2faa961
go1.3.1.darwin-386-osx10.8.pkg Installer OS X 10.8+ 32-bit 13296cd9a980819bf2304d7d24a38a1b39719c13
go1.3.1.darwin-amd64-osx10.6.tar.gz Archive OS X 10.6+ 64-bit 40716361d352c4b40252e79048e8bc084c3f3d1b
go1.3.1.darwin-amd64-osx10.8.tar.gz Archive OS X 10.8+ 64-bit a7271cbdc25173d0f8da66549258ff65cca4bf06
go1.3.1.darwin-amd64-osx10.6.pkg Installer OS X 10.6+ 64-bit 49bf5f14d2683fb99161fcb7025af60ec2d3691f
go1.3.1.darwin-amd64-osx10.8.pkg Installer OS X 10.8+ 64-bit 5d4728e0b3c3fd9fc657cc192c6b9fb3f837823b
go1.3.1.freebsd-386.tar.gz Archive FreeBSD 32-bit 586debe95542b3b56841f6bd2e5257e301a1ffdc
go1.3.1.freebsd-amd64.tar.gz Archive FreeBSD 64-bit 99e23fdd33860d837912e8647ed2a4b3d2b09d3c
go1.3.1.linux-386.tar.gz Archive Linux 32-bit 36f87ce21cdb4cb8920bb706003d8655b4e1fc81
go1.3.1.linux-amd64.tar.gz Archive Linux 64-bit 3af011cc19b21c7180f2604fd85fbc4ddde97143
go1.3.1.windows-386.zip Archive Windows 32-bit 64f99e40e79e93a622e73d7d55a5b8340f07747f
go1.3.1.windows-386.msi Installer Windows 32-bit df37e307c52fbea02070e23ae0a49cb869d54f33
go1.3.1.windows-amd64.zip Archive Windows 64-bit 4548785cfa3bc228d18d2d06e39f58f0e4e014f1
go1.3.1.windows-amd64.msi Installer Windows 64-bit 88c5d9a51a74c2846226a08681fc28cd3469cba0

go1.3 â–¾

File name Kind OS Arch SHA1 Checksum
go1.3.src.tar.gz Source 9f9dfcbcb4fa126b2b66c0830dc733215f2f056e
go1.3.darwin-386-osx10.6.tar.gz Archive OS X 10.6+ 32-bit 159d2797bee603a80b829c4404c1fb2ee089cc00
go1.3.darwin-386-osx10.8.tar.gz Archive OS X 10.8+ 32-bit bade975462b5610781f6a9fe8ac13031b3fb7aa6
go1.3.darwin-386-osx10.6.pkg Installer OS X 10.6+ 32-bit 07e7142540558f432a8750eb6cb25d6b06ed80bb
go1.3.darwin-386-osx10.8.pkg Installer OS X 10.8+ 32-bit c908ecdb177c8a20abd61272c260b15e513f6e73
go1.3.darwin-amd64-osx10.6.tar.gz Archive OS X 10.6+ 64-bit 82ffcfb7962ca7114a1ee0a96cac51c53061ea05
go1.3.darwin-amd64-osx10.8.tar.gz Archive OS X 10.8+ 64-bit 8d768f10cd00e0b152490291d9cd6179a8ccf0a7
go1.3.darwin-amd64-osx10.6.pkg Installer OS X 10.6+ 64-bit 631d6867d7f4b92b314fd87115e1cefadeeac2ab
go1.3.darwin-amd64-osx10.8.pkg Installer OS X 10.8+ 64-bit 4e8f2cafa23797211fd13f3fa4893ce3d5f084c4
go1.3.freebsd-386.tar.gz Archive FreeBSD 32-bit 8afa9574140cdd5fc97883a06a11af766e7f0203
go1.3.freebsd-amd64.tar.gz Archive FreeBSD 64-bit 71214bafabe2b5f52ee68afce96110031b446f0c
go1.3.linux-386.tar.gz Archive Linux 32-bit 22db33b0c4e242ed18a77b03a60582f8014fd8a6
go1.3.linux-amd64.tar.gz Archive Linux 64-bit b6b154933039987056ac307e20c25fa508a06ba6
go1.3.windows-386.zip Archive Windows 32-bit e4e5279ce7d8cafdf210a522a70677d5b9c7589d
go1.3.windows-386.msi Installer Windows 32-bit d457a86ce6701bb96608e4c33778b8471c48a764
go1.3.windows-amd64.zip Archive Windows 64-bit 1e4888e1494aed7f6934acb5c4a1ffb0e9a022b1
go1.3.windows-amd64.msi Installer Windows 64-bit e81a0e4f551722c7682f912e0485ad20a287f2ef

go1.2.2 â–¾

File name Kind OS Arch SHA1 Checksum
go1.2.2.src.tar.gz Source 3ce0ac4db434fc1546fec074841ff40dc48c1167
go1.2.2.darwin-386-osx10.6.tar.gz Archive OS X 10.6+ 32-bit 360ec6cbfdec9257de029f918a881b9944718d7c
go1.2.2.darwin-386-osx10.8.tar.gz Archive OS X 10.8+ 32-bit 4219b464e82e7c23d9dc02c193e7a0a28a09af1a
go1.2.2.darwin-386-osx10.6.pkg Installer OS X 10.6+ 32-bit dff27e94c8ff25301cd958b0b1b629e97ea21f03
go1.2.2.darwin-386-osx10.8.pkg Installer OS X 10.8+ 32-bit f1fb44aa22cba3e81dc33f88393a54e49eae0d8b
go1.2.2.darwin-amd64-osx10.6.tar.gz Archive OS X 10.6+ 64-bit 24c182718fd61b2621692dcdfc34937a6b5ee369
go1.2.2.darwin-amd64-osx10.8.tar.gz Archive OS X 10.8+ 64-bit 19be1eca8fc01b32bb6588a70773b84cdce6bed1
go1.2.2.darwin-amd64-osx10.6.pkg Installer OS X 10.6+ 64-bit 2d4b49f1105a78e1ea31d7f9ea0b43909cc209be
go1.2.2.darwin-amd64-osx10.8.pkg Installer OS X 10.8+ 64-bit 5d78f2a3fe82b01fe5dfcb267e703e754274b253
go1.2.2.freebsd-386.tar.gz Archive FreeBSD 32-bit d226b8e1c3f75d31fa426df63aa776d7e08cddac
go1.2.2.freebsd-amd64.tar.gz Archive FreeBSD 64-bit 858744ab8ff9661d42940486af63d451853914a0
go1.2.2.linux-386.tar.gz Archive Linux 32-bit d16f892173b0589945d141cefb22adce57e3be9c
go1.2.2.linux-amd64.tar.gz Archive Linux 64-bit 6bd151ca49c435462c8bf019477a6244b958ebb5
go1.2.2.windows-386.zip Archive Windows 32-bit 560bb33ec70ab733f31ff15f1a48fe35963983b9
go1.2.2.windows-386.msi Installer Windows 32-bit 60b91a7bf68596b23978acb109d1ff8668b7d18f
go1.2.2.windows-amd64.zip Archive Windows 64-bit 9ee22fe6c4d98124d582046aab465ab69eaab048
go1.2.2.windows-amd64.msi Installer Windows 64-bit c8f5629bc8d91b161840b4a05a3043c6e5fa310b

Unstable versions

go1.4beta1 â–¾

This is an unstable version of Go. Use with caution.

File name Kind OS Arch SHA1 Checksum
go1.4beta1.src.tar.gz Source f2fece0c9f9cdc6e8a85ab56b7f1ffcb57c3e7cd
go1.4beta1.darwin-386-osx10.6.tar.gz Archive OS X 10.6+ 32-bit a360e7c8f1d528901e721d0cc716461f8a636823
go1.4beta1.darwin-386-osx10.8.tar.gz Archive OS X 10.8+ 32-bit d863907870e8e79850a7a725b398502afd1163d8
go1.4beta1.darwin-386-osx10.6.pkg Installer OS X 10.6+ 32-bit ee4d1f74c35eddbdc49e9fb01e86a971e1bb54a7
go1.4beta1.darwin-386-osx10.8.pkg Installer OS X 10.8+ 32-bit c118f624262a1720317105d116651f8fb4b80383
go1.4beta1.darwin-amd64-osx10.6.tar.gz Archive OS X 10.6+ 64-bit ad8798fe744bb119f0e8eeacf97be89763c5f12a
go1.4beta1.darwin-amd64-osx10.8.tar.gz Archive OS X 10.8+ 64-bit e08df216d9761c970e438295129721ec8374654a
go1.4beta1.darwin-amd64-osx10.6.pkg Installer OS X 10.6+ 64-bit 831e95cc381cc1afd6c4bfa886e86790f1c96de6
go1.4beta1.darwin-amd64-osx10.8.pkg Installer OS X 10.8+ 64-bit dc0b5805ba117654dd95c84ce7872406380de3d5
go1.4beta1.freebsd-386.tar.gz Archive FreeBSD 32-bit 65045b7a5d2a991a45b1e86ad11252bc84043651
go1.4beta1.freebsd-amd64.tar.gz Archive FreeBSD 64-bit 42fbd5336437dde85b34d774bfed111fe579db88
go1.4beta1.linux-386.tar.gz Archive Linux 32-bit 122ea6cae37d9b62c69efa3e21cc228e41006b75
go1.4beta1.linux-amd64.tar.gz Archive Linux 64-bit d2712acdaa4469ce2dc57c112a70900667269ca0
go1.4beta1.windows-386.zip Archive Windows 32-bit a6d75ca59b70226087104b514389e48d49854ed4
go1.4beta1.windows-386.msi Installer Windows 32-bit 1f8d11306d733bec975f2d747b26810926348517
go1.4beta1.windows-amd64.zip Archive Windows 64-bit 386deea0a7c384178aedfe48e4ee2558a8cd43d8
go1.4beta1.windows-amd64.msi Installer Windows 64-bit ec3ec78072128d725878404a5ce27bd1c1e7132b

go1.3rc2 â–¾

This is an unstable version of Go. Use with caution.

File name Kind OS Arch SHA1 Checksum
go1.3rc2.src.tar.gz Source 53a5b75c8bb2399c36ed8fe14f64bd2df34ca4d9
go1.3rc2.darwin-386-osx10.6.tar.gz Archive OS X 10.6+ 32-bit 600433eccda28b91b2afe566142bce759d154b49
go1.3rc2.darwin-386-osx10.8.tar.gz Archive OS X 10.8+ 32-bit 36fa30bfdeb8560c5d9ae57f02ec0cdb33613cb5
go1.3rc2.darwin-386-osx10.6.pkg Installer OS X 10.6+ 32-bit c41c4e55017d3d835cf66feaaf18eeaeabaa066a
go1.3rc2.darwin-386-osx10.8.pkg Installer OS X 10.8+ 32-bit 4cbdcccac38eed1ebffbbf1eba594724e5d05a77
go1.3rc2.darwin-amd64-osx10.6.tar.gz Archive OS X 10.6+ 64-bit 84c25957096d4700f342c10f82f1f720bf646f6e
go1.3rc2.darwin-amd64-osx10.8.tar.gz Archive OS X 10.8+ 64-bit 1bd241130b5e7a3eb4876fbb17257b16ea9db67d
go1.3rc2.darwin-amd64-osx10.6.pkg Installer OS X 10.6+ 64-bit 18c8ed409a7ba97a61e00f00982361d7c84f7fdb
go1.3rc2.darwin-amd64-osx10.8.pkg Installer OS X 10.8+ 64-bit 33d2129c26ea0cb5f147fa5f24395c8ed5c4433f
go1.3rc2.freebsd-386.tar.gz Archive FreeBSD 32-bit 3e5394e0f4eb99c32510dda48eb4dc1af9717a41
go1.3rc2.freebsd-amd64.tar.gz Archive FreeBSD 64-bit bbaba53742cf43d96abca710cf49fe8c0ede6673
go1.3rc2.linux-386.tar.gz Archive Linux 32-bit 7462cb654712ef6785ccae5b75ed393de6f49da2
go1.3rc2.linux-amd64.tar.gz Archive Linux 64-bit 3a7d86a3245b4c8bd4dc5b1ff4e0073c2d1b81b5
go1.3rc2.windows-386.zip Archive Windows 32-bit f3f7a995baf77742b813723bc823d584466cb26f
go1.3rc2.windows-386.msi Installer Windows 32-bit a1138a6f7d22768eac73dfb254a1af8531aaeb1b
go1.3rc2.windows-amd64.zip Archive Windows 64-bit 607b6ed4830785d166d83029a76e6975b2e99068
go1.3rc2.windows-amd64.msi Installer Windows 64-bit dba588d51f9b9353c7bdc271cecea065eea06250

go1.3rc1 â–¾

This is an unstable version of Go. Use with caution.

File name Kind OS Arch SHA1 Checksum
go1.3rc1.src.tar.gz Source 6a9dac2e65c07627fe51899e0031e298560b0097
go1.3rc1.darwin-386-osx10.6.tar.gz Archive OS X 10.6+ 32-bit a15031c21871d9ffb567c7d204653b32f0d84737
go1.3rc1.darwin-386-osx10.8.tar.gz Archive OS X 10.8+ 32-bit 7ace88dfe731c38e83cee27f23eb2588419cf249
go1.3rc1.darwin-386-osx10.6.pkg Installer OS X 10.6+ 32-bit 8de0f308c51cec5fcec45fde762967723ef61eb9
go1.3rc1.darwin-386-osx10.8.pkg Installer OS X 10.8+ 32-bit 498e0840c44258e6b29eb5aa34b2fb3c31e79fdd
go1.3rc1.darwin-amd64-osx10.6.tar.gz Archive OS X 10.6+ 64-bit d250f20d84c310aa82053dea16743b223bbf933a
go1.3rc1.darwin-amd64-osx10.8.tar.gz Archive OS X 10.8+ 64-bit e3fb91fcfa2dfa97e451de9048ec5788713bc94e
go1.3rc1.darwin-amd64-osx10.6.pkg Installer OS X 10.6+ 64-bit 02e6537c9a3f0cc80dcf901b40683eeab6d8bebf
go1.3rc1.darwin-amd64-osx10.8.pkg Installer OS X 10.8+ 64-bit 17c42d6e6b5ca99fcd1e6927a79652d7e630a226
go1.3rc1.freebsd-386.tar.gz Archive FreeBSD 32-bit 953a95277ef06da98f0b8d7bb9bd02f4846374ff
go1.3rc1.freebsd-amd64.tar.gz Archive FreeBSD 64-bit 3c0a03ee5a64f6db46298fa3ad26d577ef7b2db5
go1.3rc1.linux-386.tar.gz Archive Linux 32-bit 07c656173c444e4373a799141c1cb28128a345eb
go1.3rc1.linux-amd64.tar.gz Archive Linux 64-bit affaccfd69a694e0aa59466450e4db5260aeb1a3
go1.3rc1.windows-386.zip Archive Windows 32-bit d43c973adede9e8f18118a2924d8b825352db50a
go1.3rc1.windows-386.msi Installer Windows 32-bit 23534cce0db1f8c0cc0cf0f70472df59ac26bbfa
go1.3rc1.windows-amd64.zip Archive Windows 64-bit 312358b64711fd827f9dfb0cef61383f9eb5057b
go1.3rc1.windows-amd64.msi Installer Windows 64-bit d089fbe3c12b8ec8d3e30526b3eb604c9ae84c7d

Older versions

Older releases of Go are available at Google Code.

ubuntu-make-18.09+disco1/tests/data/server-content/golang.org/fake.go.linux-386.tar.gz0000644000000000000000000000036313352651520025243 0ustar ‹ƶXTíÒ»NÃ0`Ï~ŠS— UíÄñ€ú$ˆ¡mÒÄj#'}|Bz ª:üßr|“|¬ß•OXlrd­ù¨Êù¹^0¥3«4ÕV3©Tn #½³ÑÐõë@Ä W¿Ýw_»µÿKU>Ù¸6î¸?ÿq‚ü¿Å9ÿÊG¼ãVþ*K/ùë씿5–‘ŒØÓÕ?Ï>›ò߬»šs·£g‚V+ah)é¯I]6_V^ÐËõuÙr•ÛÚ“˜öôæCSˆÓúÑõ$ùÎñi¤øO?àO{$‡?(ubuntu-make-18.09+disco1/tests/data/server-content/golang.org/fake.go.linux-amd64.tar.gz0000777000000000000000000000000013352651520031746 2fake.go.linux-386.tar.gzustar ubuntu-make-18.09+disco1/tests/data/server-content/localhost/0000755000000000000000000000000013352651520021057 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/localhost/base-framework-fake32.tgz0000644000000000000000000000063413352651520025566 0ustar ‹'zLVí˜Ár‚0†=óéÔC=X7!›ÿyÃøOHÎøO²u¯k »´Úù·ôÈþ‡ É¨¶>+^⇭þµ%ÿFÅ` *ò¯À è¡v+îÿùi¯{E㟕kZ b “Ù‡ûtõr0:Š¢{O“¹Mù?ÑuÖü+MùG @Ç~ Jqþ‡à$ÿa™¦a€Ãþ@œËðùl³tÕ¼(WÓª(–áºv°[ÿGÍ¿Ú5~Hù§¹ÿ‚&ÿ{íÞ¯_¸;­þ¥:úÇI¼ÿÁqÿ¿÷L˜{Ðqÿw>ù{‹ò¿ßÿQsÿ7œÿÇæ÷ó¿Ÿõõù ÷CÐä¿Ïù×q}ÿ+ùþwZî7ë÷ëkÐïaŒnó_ßÿ Áúþ‡þðùÏ0 sK¾é_þ ubuntu-make-18.09+disco1/tests/data/server-content/localhost/index.html0000644000000000000000000017406213352651520023066 0ustar Download Android Studio and SDK Tools | Android Developers
 

Android Studio

The official Android IDE

  • Android Studio IDE
  • Android SDK tools
  • Android 5.0 (Lollipop) Platform
  • Android 5.0 emulator system image with Google APIs
Download Android Studio

To get Android Studio or stand-alone SDK tools, visit developer.android.com/sdk/

Intelligent code editor

At the core of Android Studio is an intelligent code editor capable of advanced code completion, refactoring, and code analysis.

The powerful code editor helps you be a more productive Android app developer.

Code templates and GitHub integration

New project wizards make it easier than ever to start a new project.

Start projects using template code for patterns such as navigation drawer and view pagers, and even import Google code samples from GitHub.

Multi-screen app development

Build apps for Android phones, tablets, Android Wear, Android TV, Android Auto and Google Glass.

With the new Android Project View and module support in Android Studio, it's easier to manage app projects and resources.

Virtual devices for all shapes and sizes

Android Studio comes pre-configured with an optimized emulator image.

The updated and streamlined Virtual Device Manager provides pre-defined device profiles for common Android devices.

Android builds evolved, with Gradle

Create multiple APKs for your Android app with different features using the same project.

Manage app dependencies with Maven.

Build APKs from Android Studio or the command line.

More about Android Studio

Download Android Studio
  • Built on IntelliJ IDEA Community Edition, the popular Java IDE by JetBrains.
  • Flexible Gradle-based build system.
  • Build variants and multiple APK generation.
  • Expanded template support for Google Services and various device types.
  • Rich layout editor with support for theme editing.
  • Lint tools to catch performance, usability, version compatibility, and other problems.
  • ProGuard and app-signing capabilities.
  • Built-in support for Google Cloud Platform, making it easy to integrate Google Cloud Messaging and App Engine.

For more details about features available in Android Studio, read the guide to Android Studio Basics.

If you have been using Eclipse with ADT, be aware that Android Studio is now the official IDE for Android, so you should migrate to Android Studio to receive all the latest IDE updates. For help moving projects, see Migrating to Android Studio.

System Requirements

Windows

  • Microsoft® Windows® 8/7/Vista/2003 (32 or 64-bit)
  • 2 GB RAM minimum, 4 GB RAM recommended
  • 400 MB hard disk space + at least 1 G for Android SDK, emulator system images, and caches
  • 1280 x 800 minimum screen resolution
  • Java Development Kit (JDK) 7
  • Optional for accelerated emulator: Intel® processor with support for Intel® VT-x, Intel® EM64T (Intel® 64), and Execute Disable (XD) Bit functionality

Mac OS X

  • Mac® OS X® 10.8.5 or higher, up to 10.9 (Mavericks)
  • 2 GB RAM minimum, 4 GB RAM recommended
  • 400 MB hard disk space
  • At least 1 GB for Android SDK, emulator system images, and caches
  • 1280 x 800 minimum screen resolution
  • Java Runtime Environment (JRE) 6
  • Java Development Kit (JDK) 7
  • Optional for accelerated emulator: Intel® processor with support for Intel® VT-x, Intel® EM64T (Intel® 64), and Execute Disable (XD) Bit functionality

On Mac OS, run Android Studio with Java Runtime Environment (JRE) 6 for optimized font rendering. You can then configure your project to use Java Development Kit (JDK) 6 or JDK 7.

Linux

  • GNOME or KDE desktop
  • GNU C Library (glibc) 2.11 or later
  • 2 GB RAM minimum, 4 GB RAM recommended
  • 400 MB hard disk space
  • At least 1 GB for Android SDK, emulator system images, and caches
  • 1280 x 800 minimum screen resolution
  • Oracle® Java Development Kit (JDK) 7

Tested on Ubuntu® 12.04, Precise Pangolin (64-bit distribution capable of running 32-bit applications.

Other Download Options

SDK Tools Only

If you prefer to use a different IDE or run the tools from the command line or with build scripts, you can instead download the stand-alone Android SDK Tools. These packages provide the basic SDK tools for app development, without an IDE. Also see the SDK tools release notes.

Platform Package Size SHA-1 Checksum
Windows installer_r24.0.1-windows.exe (Recommended) 92180986 bytes 505d7a95647bccc194b7aa707854422d9c7288d5
android-sdk_r24.0.1-windows.zip 140743633 bytes cc49974e8bfcc865ffe0d887e9a74cf52085c632
Mac OS X android-sdk_r24.0.1-macosx.zip 88535741 bytes 7097c09c72645d7ad33c81a37b1a1363a9df2a54
Linux android-sdk_r24.0.1-linux.tgz 141304203 bytes bc1ccd6b05beb06f59a2011c5a7f2bbab8e87f02

All Android Studio Packages

Select a specific Android Studio package for your platform. Also see the Android Studio release notes.

Platform Package Size SHA-1 Checksum
Windows android-studio-bundle-135.1641136.exe
(Recommended)
868344232 bytes 1931dbaeadb52f5e0a8ba6e2ae60d9df20b2076b
android-studio-ide-135.1641136.exe
(No SDK tools included)
260272840 bytes 464d1c5497ab3d1bdef441365791ab36c89cd5ae
android-studio-ide-135.1641136-windows.zip 246249059 bytes 6d6856aca83f6ff747ca40b10f70edfbbcccd91c
Mac OS X android-studio-ide-1641136.dmg 245729073 bytes 49506ba2cf6b56be4f7d07e6a00c4ec3ba2249d5
Linux android-studio-ide-135.1641136-linux.zip 243917559 bytes 4a582c6e35700f00332783b0b83783f73499aa60
Linux android-studio-ide-135.1641136-linux.zip 243917559 bytes 4f64664ebe496cc6d54f417f25a1707f156d74d2
ubuntu-make-18.09+disco1/tests/data/server-content/maven.apache.org/0000755000000000000000000000000013352651520022203 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/maven.apache.org/download.cgi0000644000000000000000000004054213352651520024503 0ustar Maven – Download Apache Maven

Downloading Apache Maven 3.5.0

Apache Maven 3.5.0 is the latest release and recommended version for all users.

The currently selected download mirror is http://it.apache.contactlab.it/. If you encounter a problem with this mirror, please select another mirror. If all mirrors are failing, there are backup mirrors (at the end of the mirrors list) that should be available. You may also consult the complete list of mirrors.

Other mirrors:

System Requirements

Java Development Kit (JDK) Maven 3.3+ require JDK 1.7 or above to execute - they still allows you to build against 1.3 and other JDK versions by Using Toolchains
Memory No minimum requirement
Disk Approximately 10MB is required for the Maven installation itself. In addition to that, additional disk space will be used for your local Maven repository. The size of your local repository will vary depending on usage but expect at least 500MB.
Operating System No minimum requirement. Start up scripts are included as shell scripts and Windows batch files.

Files

Maven is distributed in several formats for your convenience. Simply pick a ready-made binary distribution archive and follow the installation instructions. Use a source archive if you intend to build Maven yourself.

In order to guard against corrupted downloads/installations, it is highly recommended to verify the signature of the release bundles against the public KEYS used by the Apache Maven developers.

Link Checksum Signature
Binary tar.gz archive apache-maven-3.5.0-bin.tar.gz apache-maven-3.5.0-bin.tar.gz.md5 apache-maven-3.5.0-bin.tar.gz.asc
Binary zip archive apache-maven-3.5.0-bin.zip apache-maven-3.5.0-bin.zip.md5 apache-maven-3.5.0-bin.zip.asc
Source tar.gz archive apache-maven-3.5.0-src.tar.gz apache-maven-3.5.0-src.tar.gz.md5 apache-maven-3.5.0-src.tar.gz.asc
Source zip archive apache-maven-3.5.0-src.zip apache-maven-3.5.0-src.zip.md5 apache-maven-3.5.0-src.zip.asc

Previous Releases

It is strongly recommended to use the latest release version of Apache Maven to take advantage of newest features and bug fixes.

If you still want to use an old version you can find more information in the Maven Releases History and can download files from the archives for versions 3.0.4+ and legacy archives for earlier releases.


ubuntu-make-18.09+disco1/tests/data/server-content/netbeans.org/0000755000000000000000000000000013352651520021454 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/netbeans.org/downloads/0000755000000000000000000000000013352651520023446 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/netbeans.org/downloads/zip.html0000644000000000000000000003362613352651520025150 0ustar
By use of this website, you agree to the NetBeans Policies and Terms of Use. © 2012, Oracle Corporation and/or its affiliates. Sponsored by Oracle logo
ubuntu-make-18.09+disco1/tests/data/server-content/netbeans.org/images_www/0000755000000000000000000000000013352651520023625 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/netbeans.org/images_www/v6/0000755000000000000000000000000013352651520024160 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/netbeans.org/images_www/v6/download/0000755000000000000000000000000013352651520025767 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/netbeans.org/images_www/v6/download/8.2/0000755000000000000000000000000013352651520026276 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/netbeans.org/images_www/v6/download/8.2/final/0000755000000000000000000000000013352651520027367 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/netbeans.org/images_www/v6/download/8.2/final/js/0000755000000000000000000000000013352651520030003 5ustar ././@LongLink0000644000000000000000000000015500000000000007774 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/netbeans.org/images_www/v6/download/8.2/final/js/files.jsubuntu-make-18.09+disco1/tests/data/server-content/netbeans.org/images_www/v6/download/8.2/final/js/0000644000000000000000000002136613352651520030015 0ustar add_file("bundles/netbeans-8.2-cpp-linux-x64.sh", 119728128, "d6a89152b36be513c50764fcbfdd975076727f8333b46d1e60798c9fb79196e5", "en,ja,zh_CN,pt_BR,ru"); add_file("bundles/netbeans-8.2-cpp-linux-x86.sh", 121939968, "5e152971e57af1a94a4888217de4b59b0a2729a19b7a557dcb36e691c6bfa9bc", "en,ja,zh_CN,pt_BR,ru"); add_file("bundles/netbeans-8.2-cpp-macosx.dmg", 153729000, "e1719f1232e390c1d1fdf491b68c2a68c5d9512b38cb65d9f2614dc72af90717", "en,ja,zh_CN,pt_BR,ru"); add_file("bundles/netbeans-8.2-cpp-windows-x64.exe", 114888454, "b592275910f3e18282453898fec620d662f9da8049f91796b7ccbd1e90a861ef", "en,ja,zh_CN,pt_BR,ru"); add_file("bundles/netbeans-8.2-cpp-windows-x86.exe", 111157666, "d67b74d45eeaf51a46333eaba9550edf567d219c661c9de783eb5ff4b29dddf5", "en,ja,zh_CN,pt_BR,ru"); add_file("bundles/netbeans-8.2-html-linux-x64.sh", 121545728, "64a13be8951528d580ceb6409562cf5fed26fadb941c0bd21f7d79ac8ee65b93", "en,ja,zh_CN,pt_BR,ru"); add_file("bundles/netbeans-8.2-html-linux-x86.sh", 123757568, "7f937001f0322baafde0f9f3de428d88379953b1d602d63320592a5f89d6f70b", "en,ja,zh_CN,pt_BR,ru"); add_file("bundles/netbeans-8.2-html-macosx.dmg", 148854864, "084c34512db43a9027c0ee24bb1dc72364fc64ff6fa1b5ddeface07ba1c80c3b", "en,ja,zh_CN,pt_BR,ru"); add_file("bundles/netbeans-8.2-html-windows-x64.exe", 116706475, "1aacd9f89beae4fe2974987d09e278145217b9de56ff2cec21e2dded82e632e3", "en,ja,zh_CN,pt_BR,ru"); add_file("bundles/netbeans-8.2-html-windows-x86.exe", 112975690, "917251eac8ecf88ced1398c2643417405726a82b6a9d2c740c60e2063f4853a8", "en,ja,zh_CN,pt_BR,ru"); add_file("bundles/netbeans-8.2-javaee-linux.sh", 205376512, "dfde5356d1238bda033b2c2e0035bba763094b8f041fc21320ab5a1fcd61a723", "en,ja,zh_CN,pt_BR,ru"); add_file("bundles/netbeans-8.2-javaee-macosx.dmg", 253383489, "5b897c3f1fa657749d5dcddbc3a95a1a15ec35e7cab08aad34befadd7ec3f1e7", "en,ja,zh_CN,pt_BR,ru"); add_file("bundles/netbeans-8.2-javaee-windows.exe", 205734991, "8a9a955334767035f81c1ec98204d3c35e3a84d60fa99ee194e22bad24269048", "en,ja,zh_CN,pt_BR,ru"); add_file("bundles/netbeans-8.2-javase-linux.sh", 98264064, "075b4ba5e89ac81c0c38c977d53ee47e6ac8614680799465eb3de11128aa347b", "en,ja,zh_CN,pt_BR,ru"); add_file("bundles/netbeans-8.2-javase-macosx.dmg", 121538422, "91652f03d8abba0ae9d76a612ed909c9f82e4f138cbd510f5d3679280323011b", "en,ja,zh_CN,pt_BR,ru"); add_file("bundles/netbeans-8.2-javase-windows.exe", 98621786, "7b0646306a7488e617837da1517a86c08b7cf6fbe4dd9d74e8a4564b5ffde004", "en,ja,zh_CN,pt_BR,ru"); add_file("bundles/netbeans-8.2-linux.sh", 223882240, "0442d4eaae5334f91070438512b2e8abf98fc84f07a9352afbc2c4ad437d306c", "en,ja,zh_CN,pt_BR,ru"); add_file("bundles/netbeans-8.2-macosx.dmg", 289710450, "ddcf37e91d960cca6b6a37c95eabf2c6f15330ed708bfd79be796de00da20e5e", "en,ja,zh_CN,pt_BR,ru"); add_file("bundles/netbeans-8.2-php-linux-x64.sh", 121545728, "64a13be8951528d580ceb6409562cf5fed26fadb941c0bd21f7d79ac8ee65b93", "en,ja,zh_CN,pt_BR,ru"); add_file("bundles/netbeans-8.2-php-linux-x86.sh", 123757568, "7f937001f0322baafde0f9f3de428d88379953b1d602d63320592a5f89d6f70b", "en,ja,zh_CN,pt_BR,ru"); add_file("bundles/netbeans-8.2-php-macosx.dmg", 148854864, "084c34512db43a9027c0ee24bb1dc72364fc64ff6fa1b5ddeface07ba1c80c3b", "en,ja,zh_CN,pt_BR,ru"); add_file("bundles/netbeans-8.2-php-windows-x64.exe", 116706475, "1aacd9f89beae4fe2974987d09e278145217b9de56ff2cec21e2dded82e632e3", "en,ja,zh_CN,pt_BR,ru"); add_file("bundles/netbeans-8.2-php-windows-x86.exe", 112975690, "917251eac8ecf88ced1398c2643417405726a82b6a9d2c740c60e2063f4853a8", "en,ja,zh_CN,pt_BR,ru"); add_file("bundles/netbeans-8.2-windows.exe", 230877002, "c6df4acafb3b8583ec76a643b5df086583ad0bec86072166bc94c65c8731d837", "en,ja,zh_CN,pt_BR,ru"); add_file("zip/hg-l10n-201609300101.zip", 421798, "0fb92b106e4f00f9565e7808364645be293808be2d6d9e2c9687665dda6b9119", "en,ja,zh_CN,pt_BR,ru"); add_file("zip/ide-l10n-201609300101.zip", 24858545, "c77f7aa8ec8fbeb74e31182fde96656bfc4c91a11d25828795ee9528aba3f1b1", "en,ja,zh_CN,pt_BR,ru"); add_file("zip/netbeans-8.2-201609300101-cpp.zip", 133372879, "7fbff2e15e973315187cf14537ba4915d38ce24e22bcd4317fd5b296c1d46c64", "en,ja,zh_CN,pt_BR,ru"); add_file("zip/netbeans-8.2-201609300101-html.zip", 128805612, "51ae034b99f16c3bab66ab7dfd07c3554953e78828c2493cde1bb67c95c43e2b", "en,ja,zh_CN,pt_BR,ru"); add_file("zip/netbeans-8.2-201609300101-javaee.zip", 296813596, "5f44f36c6f0c5ae2b322994024bc4beba4c22a9eccbb22e878d5b1151fca15fb", "en,ja,zh_CN,pt_BR,ru"); add_file("zip/netbeans-8.2-201609300101-javase.zip", 195793312, "cf6f94517faa5dbedede4b8a7a6e6d5a65ca931eeae3809245ba7321bf539aea", "en,ja,zh_CN,pt_BR,ru"); add_file("zip/netbeans-8.2-201609300101-php.zip", 128805612, "51ae034b99f16c3bab66ab7dfd07c3554953e78828c2493cde1bb67c95c43e2b", "en,ja,zh_CN,pt_BR,ru"); add_file("zip/netbeans-8.2-201609300101-platform-src.zip", 29983317, "49fb4bc39677fff93994bded90d702447f89f92b402c80a59073bece69a0b270", "en,ja,zh_CN,pt_BR,ru"); add_file("zip/netbeans-8.2-201609300101-src.zip", 217356974, "5a7141176fe655807f04bdde12073116a77c1844e4ca7a071d95930b7cd7d5ac", "en,ja,zh_CN,pt_BR,ru"); add_file("zip/netbeans-8.2-201609300101.zip", 351110790, "e5018c428b5657b669155886f58429af63f69436625e876be9710824bbfd144a", "en,ja,zh_CN,pt_BR,ru"); add_file("zip/stableuc-l10n-201609300101.zip", 7355658, "2ea41b2d226746f3805b98c5d73a8a6d6e7d6f3ddc2f10800ab8eb2e863cc91c", "en,ja,zh_CN,pt_BR,ru"); add_file("zip/testdist-201609300101.zip", 124768148, "27db3792d39b63ced70c3b3822804e805b66bd37611ce7879c9e41ddfb2feae5", "en,ja,zh_CN,pt_BR,ru"); add_file("zip/moduleclusters/netbeans-8.2-201609300101-all-in-one.zip", 343724442, "6de9d9afed88e753265b2dc8a7d73bf0874b5a4b8c710e7f2e592b9a99c7e36a", "en,ja,zh_CN,pt_BR,ru"); add_file("zip/moduleclusters/netbeans-8.2-201609300101-apisupport.zip", 2896220, "eb5e0c7858a56083f404e809dd5964d3db5f749d9cf4d1da17b5ad7f3a62a558", "en,ja,zh_CN,pt_BR,ru"); add_file("zip/moduleclusters/netbeans-8.2-201609300101-cndext.zip", 139909, "6860d4fd8b33fe6cdfbf2b8a2bfb8362a4e828e7ab29d0c2eb16a226305190b3", "en,ja,zh_CN,pt_BR,ru"); add_file("zip/moduleclusters/netbeans-8.2-201609300101-cnd.zip", 20397918, "bfc9a08c380d93547e0547cbf4a828ad8017633661b6ca207a456d790af933c1", "en,ja,zh_CN,pt_BR,ru"); add_file("zip/moduleclusters/netbeans-8.2-201609300101-dlight.zip", 5509292, "7529c5769487bd2d8a32cd3d2882b7b0e3d666908c13c92325b3c483aa9630df", "en,ja,zh_CN,pt_BR,ru"); add_file("zip/moduleclusters/netbeans-8.2-201609300101-enterprise.zip", 90801148, "b485d48003c546660204cff7a73951ee707166f0c4b1a237ce2bd19bbd29db94", "en,ja,zh_CN,pt_BR,ru"); add_file("zip/moduleclusters/netbeans-8.2-201609300101-ergonomics.zip", 2812243, "912285818587f017da70ef5a9ba8de05aeab103c653fa5d5a2377ada579c4a55", "en,ja,zh_CN,pt_BR,ru"); add_file("zip/moduleclusters/netbeans-8.2-201609300101-extide.zip", 2754317, "7788e9e7856cf2319a2e4d268fc9e4150088529bfddb3fafd024b76fe284bc01", "en,ja,zh_CN,pt_BR,ru"); add_file("zip/moduleclusters/netbeans-8.2-201609300101-groovy.zip", 7455645, "ae984fa6aa1d68825caf96b1f2fa8829a1f4c08b0bf5ffdae290e4536c91d7f3", "en,ja,zh_CN,pt_BR,ru"); add_file("zip/moduleclusters/netbeans-8.2-201609300101-harness.zip", 6524065, "b7c41108676257ac43c86c03c822f90f453ce1be3073eb6a99cfd8394e71a5ad", "en,ja,zh_CN,pt_BR,ru"); add_file("zip/moduleclusters/netbeans-8.2-201609300101-ide.zip", 80612796, "cfadcba85779ba7421620abb92ec3d7d2076bedbd50331298dbfaf54f0ddc295", "en,ja,zh_CN,pt_BR,ru"); add_file("zip/moduleclusters/netbeans-8.2-201609300101-javacard.zip", 9321532, "0ceb83a3a1d8c6ba1fb599c9bc4fdf43a5c6bcf8fad0e354edd536f4c0e64bc6", "en,ja,zh_CN,pt_BR,ru"); add_file("zip/moduleclusters/netbeans-8.2-201609300101-java.zip", 76912931, "4e0865c3e503e60b0f52112e28e7189f12fcaf0665768b71a98e4f5274caf8c0", "en,ja,zh_CN,pt_BR,ru"); add_file("zip/moduleclusters/netbeans-8.2-201609300101-mobility.zip", 2058726, "ecdf6c3d6c906df52f93c64901f436bb28416bf9bf746e76bfc9ca67179fc9c4", "en,ja,zh_CN,pt_BR,ru"); add_file("zip/moduleclusters/netbeans-8.2-201609300101-nb-etc.zip", 1991308, "27550ce9074b6f31c4c742b3caf57e6fb70c472f64f7ec67cf6e5d33995d4430", "en,ja,zh_CN,pt_BR,ru"); add_file("zip/moduleclusters/netbeans-8.2-201609300101-php.zip", 6737747, "ba049df89a66c9af87b3ecaa5d208f6b8cab41de81c503ebc575b1a339f67f4c", "en,ja,zh_CN,pt_BR,ru"); add_file("zip/moduleclusters/netbeans-8.2-201609300101-platform.zip", 18792546, "606904ba6319e973532ac0933b4e1f18b08a56ce6d641f5e3b4cf67c5418c666", "en,ja,zh_CN,pt_BR,ru"); add_file("zip/moduleclusters/netbeans-8.2-201609300101-profiler.zip", 5262093, "0e19d5a69d645d7f19d88dfa4cf50e92161bcfec74e7ec95168ee3c84153adc4", "en,ja,zh_CN,pt_BR,ru"); add_file("zip/moduleclusters/netbeans-8.2-201609300101-webcommon.zip", 11308378, "42311440906b5019f919e70182fc87c633cd4b441759b2fd7a9a22904f963cf5", "en,ja,zh_CN,pt_BR,ru"); add_file("zip/moduleclusters/netbeans-8.2-201609300101-websvccommon.zip", 621938, "798ad280d2dea48fb0b6b07c0a637c4e3250d410d4ee711f9175d37bc297198b", "en,ja,zh_CN,pt_BR,ru"); ubuntu-make-18.09+disco1/tests/data/server-content/nodejs.org/0000755000000000000000000000000013352651520021137 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/nodejs.org/dist/0000755000000000000000000000000013352651520022102 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/nodejs.org/dist/latest/0000755000000000000000000000000013352651520023376 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/nodejs.org/dist/latest/SHASUMS256.txt.asc0000644000000000000000000001122013352651520026260 0ustar -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA256 0d7cb85072d99e47305fbdf31541704557038a8811d4ba1d7a76f68cfddedf78 node-v7.7.4-aix-ppc64.tar.gz 901ba252ca9bc3b41c5a5999409308b202143fc5b0b24d9da9575e231214dd70 node-v7.7.4-darwin-x64.tar.gz 44f3bffbe8c102e4b8980ba80f34e2e5f6bada2f1600975df1307e75d96f8b53 node-v7.7.4-darwin-x64.tar.xz 6702f3590b985fb4d6cdd49a0dba9a43d864c5bfaecaa27d8595d9c43d837bdc node-v7.7.4-headers.tar.gz 7ed02ad944f0b2cf102216b1532b8a31d26d4173a1791a38fc2391887377f6d7 node-v7.7.4-headers.tar.xz 3c56a567f42a8a409b505459acae5c3dbd08daa8c8f8da71876a4511f55f57a9 node-v7.7.4-linux-arm64.tar.gz c2a57b7539dd30adbe87af57dccfaa6061955e1aae391c03df297fbfb257bf71 node-v7.7.4-linux-arm64.tar.xz 377b1d9b23cd9931185b7c74aed469e78c80135beb4c8d7cff243ae7ba1ac70f node-v7.7.4-linux-armv6l.tar.gz 8b231ba000b7a447b287d03fffe7613a575f037df8b5f569c37b289cc0ebc995 node-v7.7.4-linux-armv6l.tar.xz 77e36e4b27d571c03215c9a73cd4e443bd2f9158c5b03e15ea787a9352cee4bb node-v7.7.4-linux-armv7l.tar.gz 755d6fde58f820c72a9b3a79c6bde4899d9e8ff201f46b765a1821f6414bbb64 node-v7.7.4-linux-armv7l.tar.xz 986da6138629d0157e66ea648bd59a5ba72d9e23aa2d5d14eb1940392ca3e5e6 node-v7.7.4-linux-ppc64le.tar.gz f8fb7c00ec65353158e8a7d60527864aa874e410f126f87946f0606be3c456b0 node-v7.7.4-linux-ppc64le.tar.xz 4be66527b9662d499d023aea3dbce4a22d1324b90cd45568301afe671c994285 node-v7.7.4-linux-ppc64.tar.gz 3ad5ed233d7b27787858fe93db1e9649bb30ebd81fa07e2be4cf675acfd6bb62 node-v7.7.4-linux-ppc64.tar.xz db245b83e8108b514fa84f3475c56d811fa085024e4d58f7ac444e744d94831f node-v7.7.4-linux-s390x.tar.gz 43388bb03dcbf04185798ace86c410fe22b44390d40be02db2e3bd53cf67eb08 node-v7.7.4-linux-s390x.tar.xz 419dab870cb5c5bff95a08d7ef90a07717457e9a0eba8efff72d6ff6b91a01cb node-v7.7.4-linux-x64.tar.gz 347bfb7290b329045425be1b625fc3d8100922178b1128e0951f610dd3898749 node-mock-linux-x64.tar.xz 6016d16e04519c97377069da8f97055d7b355cc23901468064244b37d7481c1e node-v7.7.4-linux-x86.tar.gz 347bfb7290b329045425be1b625fc3d8100922178b1128e0951f610dd3898749 node-mock-linux-x86.tar.xz 21acb3a63a097f1cd00135d845502de8eb5793e8d7b31d63689f4c223cfa0180 node-v7.7.4.pkg 15958208d0156322e6a626f77a1c961c0d2047f4b6bd601cdd538bb1db93beff node-v7.7.4-sunos-x64.tar.gz e319597cb0e9bf10c3a3b50c1774102dd3974eef7359febdc204ed3b17068748 node-v7.7.4-sunos-x64.tar.xz ddc74e34e9bba547a6cf8f44171fc1de51a5ea82c36c704533259531a8c155d2 node-v7.7.4-sunos-x86.tar.gz 1fae5ea71216f32439634e3b34fd31810ad75aaa37edb8660f84afefc82e2276 node-v7.7.4-sunos-x86.tar.xz d76bad6e843005aa016f285e983493e344fde80eac4258b4bf9ee8654f5d6e43 node-v7.7.4.tar.gz 807c61b1e90a6fd8af3f3b5c1929effa4e1cb4569e7a88357b73197feeba5719 node-v7.7.4.tar.xz 715f5873d08cff372392c2a318c8fae48c0c817c298f36367dda9d16d5ef6a35 node-v7.7.4-win-x64.7z dd573367cda68db3594544b973be2367c0df8fc5345402672079e6be873931cd node-v7.7.4-win-x64.zip f35b623a1236c367c9f316c37d5e1e829e49548a723f00e3c0433541cb8fbe7c node-v7.7.4-win-x86.7z 9709bb87735c4a82ec4d23de001549cd4a1eebbc9cc6f6cf2fdf305ea8b53dd2 node-v7.7.4-win-x86.zip 55738bb03d48318fe505847eb4675debe8bf90adb1a572ad018b10702ea40819 node-v7.7.4-x64.msi 2888f2303bcaa35f05b3dce7cbfee58af77dcea6bed4b9ff549b181c65eb4565 node-v7.7.4-x86.msi 7b2eff667c37db90eff8fe14c8fb86551b9b54afa401ad137202c7a23bcaa149 win-x64/node.exe 327be9c7a75340caf23c69c39b240e3ffe02d5584ea0da64ec784565e7e8cdbe win-x64/node.lib 7922432be1d095c343f203a8d4295bde30f0ec3161ee6844742ee1428f836cba win-x64/node_pdb.7z 5f13c17cf71e5c1d6900bfaf8a09130e15edfea8ee71bdf9132ff762501394ef win-x64/node_pdb.zip 4210e52d42edede4cd2c244eb58f1b4491b9926fd636df4790074f5090d2b486 win-x86/node.exe 2c70bfa4fd0a5ca4707d0afe87dc901febb57bf18ca7bf40e5e8dca59add048d win-x86/node.lib e92eeee20e847ad5a02601d98d79db530e2c62c522980370aef621fd86798e8c win-x86/node_pdb.7z 5381a27c0717817db26dc4825380096fe2b46dd0f649a8409e81165cab3c81cd win-x86/node_pdb.zip -----BEGIN PGP SIGNATURE----- Comment: GPGTools - https://gpgtools.org iQIcBAEBCAAGBQJY0aLsAAoJEHQ0OQvb6bnFPwgP/0bl2IUNQ0lGhcr1RLwkc6WS twKTpiLe0qibnmnwA3w1FsSZiBR+WyRJegAkWKx+ewRuiagEcdi0XJ/VJXDyFgtT R1b4h0XovqZrjJUISaounvHZS8M6AZ/yyQrBUoAqjRLX4Qdt2Z6Iz8qya6C+9pRA 4cZyrNojSSRQYbEhkT4otMkVyHOSMDd3Ul+P1F57q7acK62RSd01u/p/ucHuzbB5 X6TYZF+jRM1NKOhypqadNL7LsRgbUj3XP6X/8dDJ6SMDOojPdvAdy42Br2A3z7N5 aSktcM1iq3N/GQdiuWU0r8b+dLevsIzGi1+2k+/rr6apJToYWncDM81yUKiVpWbs oSNt8kpMBJ7vT/Jv9A7hDSUo28G7tlY2RnPh41TDf9fVsXQFQJTb3JL/cfrD5bH3 h8AWX8MxAVtC213cdE7l/5BunBhMPn6JfHhMbqeLd1auQsfwVHY8DTnMP6ZLlN0l mJNh11tSKSqFjY/K1MQB3nNF27zMSECxFTqoUGpcNlTItpeHqEoA8vJpWZvSzfQE s4HdHzxpak1klLYmTDrWMX33q6JclXnM3yAyOe6n5ZJekvAj93wIq/gAoTeRlxxN riaeSkVbFJZYZtidRXNLcPjXhR6ogxYyLw9vJ3nRmm9GiyETb0sd7c0KiY5GKbTC ao/GTsImOuVfgq032ug9 =WA5+ -----END PGP SIGNATURE----- ubuntu-make-18.09+disco1/tests/data/server-content/nodejs.org/dist/latest/node-mock-linux-x64.tar.xz0000644000000000000000000000061413352651520030177 0ustar ý7zXZæÖ´F!t/å£à'ÿI]7ȰVúø`AK¨ê²ªÊ ½q=žQ«/?C¦y§nÐöÓCÓ—m‘,šs)Àh6ñ²„<Ì®¨L€;²æYmDµs#ú‹¯YÂÇd› fŒ  ã)*ZŽ u–˵“©}¾5·m² óq§à”OéX™\óŠþè»ÕXÝEH‰Xy4ÍÖ²g½&êݽ§ýp³- ¥ŠÓÅ¢Ž5¤mÈýÓµfþnQŒj“xôi¬±™—ܶã Á-ò¥LBZµ1ñ YÇT/¯ÃXW³IaØÕ5êWlæs¿-”ðŒTëN;˹yP”€ƒw•_JFbè­¤Å.»FÉ\µ»nhT’€™žÀ9†ÒKs§&H—óâÆ}ìSîÇžoúÿ·v ÁXÜu@™Ù–F’ô³ûç+s÷Šö)©!Å®Æ=2ºZéU.3¯<·ƒ å€P•ù~±ÄgûYZubuntu-make-18.09+disco1/tests/data/server-content/nodejs.org/dist/latest/node-mock-linux-x86.tar.xz0000777000000000000000000000000013352651520034777 2node-mock-linux-x64.tar.xzustar ubuntu-make-18.09+disco1/tests/data/server-content/nodejs.org/dist/latest-lts0000777000000000000000000000000013352651520025414 2latest/ustar ubuntu-make-18.09+disco1/tests/data/server-content/nodejs.org/en/0000755000000000000000000000000013352651520021541 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/nodejs.org/en/download/0000755000000000000000000000000013352651520023350 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/nodejs.org/en/download/current/0000755000000000000000000000000013352651520025032 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/nodejs.org/en/download/current/index.html0000644000000000000000000003223213352651520027031 0ustar Download | Node.js

Downloads

Latest Current Version: v7.7.4 (includes npm 4.1.2)

Download the Node.js source code or a pre-built installer for your platform, and start developing today.

Windows Installer (.msi) 32-bit 64-bit
Windows Binary (.zip) 32-bit 64-bit
macOS Installer (.pkg) 64-bit
macOS Binaries (.tar.gz) 64-bit
Linux Binaries (x86/x64) 32-bit 64-bit
Linux Binaries (ARM) ARMv6 ARMv7 ARMv8
Source Code node-v7.7.4.tar.gz

Additional Platforms

SunOS Binaries 32-bit 64-bit
Docker Image Official Node.js Docker Image
Linux on Power Systems 64-bit le 64-bit be
Linux on System z 64-bit
AIX on Power Systems 64-bit

Note: Python 2.6 or 2.7 is required to build from source tarballs.

Scroll to top ubuntu-make-18.09+disco1/tests/data/server-content/nodejs.org/en/download/index.html0000644000000000000000000003230513352651520025350 0ustar Download | Node.js

Downloads

Latest LTS Version: v6.10.1 (includes npm 3.10.10)

Download the Node.js source code or a pre-built installer for your platform, and start developing today.

Windows Installer (.msi) 32-bit 64-bit
Windows Binary (.zip) 32-bit 64-bit
macOS Installer (.pkg) 64-bit
macOS Binaries (.tar.gz) 64-bit
Linux Binaries (x86/x64) 32-bit 64-bit
Linux Binaries (ARM) ARMv6 ARMv7 ARMv8
Source Code node-v6.10.1.tar.gz

Additional Platforms

SunOS Binaries 32-bit 64-bit
Docker Image Official Node.js Docker Image
Linux on Power Systems 64-bit le 64-bit be
Linux on System z 64-bit
AIX on Power Systems 64-bit

Note: Python 2.6 or 2.7 is required to build from source tarballs.

Scroll to top ubuntu-make-18.09+disco1/tests/data/server-content/phantomjs.org/0000755000000000000000000000000013352651520021660 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/phantomjs.org/download.html0000644000000000000000000003314713352651520024365 0ustar Download | PhantomJS
Please take a moment to improve this document with anything that could be useful to other developers, we'd love to see it.
ubuntu-make-18.09+disco1/tests/data/server-content/simplefile0000644000000000000000000000001413352651520021136 0ustar foo bar baz ubuntu-make-18.09+disco1/tests/data/server-content/simplefile-with-no-content-length0000644000000000000000000000001413352651520025450 0ustar foo bar baz ubuntu-make-18.09+disco1/tests/data/server-content/spring.io/0000755000000000000000000000000013352651520020777 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/spring.io/tools/0000755000000000000000000000000013352651520022137 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/spring.io/tools/sts/0000755000000000000000000000000013352651520022750 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/spring.io/tools/sts/all0000644000000000000000000003277013352651520023454 0ustar Download STS
Tools

Spring Tool Suite™ Downloads

Use one of the links below to download an all-in-one distribution for your platform.
Or check the list of previous Spring Tool Suite™ versions.

STS 3.8.3.RELEASE

New & Noteworthy

Windows

WIN, 32BIT

WIN, 64BIT

Mac

COCOA, 64BIT

Linux

GTK, 32BIT

GTK, 64BIT

Update Site Archives

You can download archived versions of the update sites, if you want to install STS into an existing Eclipse installation or if you want to update an existing STS installation without accessing the hosted version of the update repository.

Eclipse Archive Size
4.6.2 springsource-tool-suite-3.8.3.RELEASE-e4.6.2-updatesite.zip 161MB
4.5.2 springsource-tool-suite-3.8.3.RELEASE-e4.5.2-updatesite.zip 147MB

Update Sites

If you want to install STS in an existing Eclipse installation, you can use one of the following update sites. Please choose the one that matches the Eclipse version you're running:

Eclipse Update Sites
4.6 http://dist.springsource.com/release/TOOLS/update/e4.6/
4.5 http://dist.springsource.com/release/TOOLS/update/e4.5/

As an alternative, you can also install STS directly from the Eclipse Marketplace.

ubuntu-make-18.09+disco1/tests/data/server-content/static.rust-lang.org/0000755000000000000000000000000013352651520023057 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/static.rust-lang.org/dist/0000755000000000000000000000000013352651520024022 5ustar ././@LongLink0000644000000000000000000000016500000000000007775 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/static.rust-lang.org/dist/rust-fake-i686-unknown-linux-gnu.tar.gzubuntu-make-18.09+disco1/tests/data/server-content/static.rust-lang.org/dist/rust-fake-i686-unknown-0000777000000000000000000000000013352651520037514 2rust-fake-x86_64-unknown-linux-gnu.tar.gzustar ././@LongLink0000644000000000000000000000016700000000000007777 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/static.rust-lang.org/dist/rust-fake-x86_64-unknown-linux-gnu.tar.gzubuntu-make-18.09+disco1/tests/data/server-content/static.rust-lang.org/dist/rust-fake-x86_64-unknow0000644000000000000000000000111013352651520030112 0ustar ‹LÖÿZrust-fake-x86_64-unknown-linux-gnu.tarí˜mš@€ù̯ØÒ~jKÙ×&Íõ4M£€JŽƒ†—œ?¿ ž†zZ]ƒk®™Ç„ÙÀ†ŸefBÝ5m¼¬ªYp;ÀÅlD£`÷0ä h.¤f€R ˜ºá=í±Ï?¯í­¤yZWÉcsjÞ¹ã/ϱo„zç?™×«­wÿJ‚&ÿ>8ð¿ÈËé×€ƒ’[ÿ’ñ?Œ¦¼†»ƒSÞÄ)ÈÿÖ?HîŸÿ•Á!ÿ+ªÿ^8ð_ä‹»æÿÿšsÊÿ^8ðÿúÏÕà ù÷ÁÿÃhÊkœóÏíÁ­ûÐ×Hõßïß Îóf†ù’ý`ч{x`QW]§yÍfíÓïa3[gEQ}©›ˆýüÆÚuV†Ì’%ëŠE£SEìûhþhΰv~fÏU]¤væ«©Éú©JÙ§Í«Slò–A¸ÌÃa„á½ÿ¼ÿ€#õ¿õ1›ª¼0ÿ i÷s´ùŸƒTœò¿þá²k8ûG£ Õ/üå?nÚ4Þ|Õ¿´Œ»ò±¬žË¸ÈËn¯ÊîúõÛÐÇ^ü8îöþ`»ôÝÿ¯æE^d§¿{œ;¾{]|#8ø¿:'\ä_pcçÝûׯwþ'ÿ—ø¿ª6¸¿ÿRHßßÈ¿‹§"áôþK€#éý÷ÂÔþ%7ÿ6ÿ Tà»ÿ#ÿ‡ýÿd “Ûø†ò?AAÜŽ?ÜíÕ‰(ubuntu-make-18.09+disco1/tests/data/server-content/storage.googleapis.com/0000755000000000000000000000000013352651520023440 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/storage.googleapis.com/dart-archive/0000755000000000000000000000000013352651520026011 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/storage.googleapis.com/dart-archive/channels/0000755000000000000000000000000013352651520027604 5ustar ././@LongLink0000644000000000000000000000015000000000000007767 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/storage.googleapis.com/dart-archive/channels/stable/ubuntu-make-18.09+disco1/tests/data/server-content/storage.googleapis.com/dart-archive/channels/stab0000755000000000000000000000000013352651520030456 5ustar ././@LongLink0000644000000000000000000000016000000000000007770 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/storage.googleapis.com/dart-archive/channels/stable/release/ubuntu-make-18.09+disco1/tests/data/server-content/storage.googleapis.com/dart-archive/channels/stab0000755000000000000000000000000013352651520030456 5ustar ././@LongLink0000644000000000000000000000016700000000000007777 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/storage.googleapis.com/dart-archive/channels/stable/release/1.12.1/ubuntu-make-18.09+disco1/tests/data/server-content/storage.googleapis.com/dart-archive/channels/stab0000755000000000000000000000000013352651520030456 5ustar ././@LongLink0000644000000000000000000000017300000000000007774 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/storage.googleapis.com/dart-archive/channels/stable/release/1.12.1/sdk/ubuntu-make-18.09+disco1/tests/data/server-content/storage.googleapis.com/dart-archive/channels/stab0000755000000000000000000000000013352651520030456 5ustar ././@LongLink0000644000000000000000000000023100000000000007767 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/storage.googleapis.com/dart-archive/channels/stable/release/1.12.1/sdk/dartsdk-linux-ia32-release.zipubuntu-make-18.09+disco1/tests/data/server-content/storage.googleapis.com/dart-archive/channels/stab0000777000000000000000000000000013352651520034411 2dartsdk-linux-x64.zipustar ././@LongLink0000644000000000000000000000023000000000000007766 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/storage.googleapis.com/dart-archive/channels/stable/release/1.12.1/sdk/dartsdk-linux-x64-release.zipubuntu-make-18.09+disco1/tests/data/server-content/storage.googleapis.com/dart-archive/channels/stab0000644000000000000000000000051013352651520030454 0ustar PK´uôF dart-sdk/PKÄuôF dart-sdk/bin/PK ÃuôFdart-sdk/bin/dartPK?´uôF €ýAdart-sdk/PK?ÄuôF €ýA'dart-sdk/bin/PK? ÃuôF €ýRdart-sdk/bin/dartPK±ubuntu-make-18.09+disco1/tests/data/server-content/sublimetext.com/0000755000000000000000000000000013352651520022211 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/sublimetext.com/3/0000755000000000000000000000000013352651520022353 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/sublimetext.com/3/index.html0000644000000000000000000007747313352651520024372 0ustar Sublime Text - Download

Sublime Text 3

Download

Sublime Text 3 is currently in beta. The latest build is 3126.

Sublime Text may be downloaded and evaluated for free, however a license must be purchased for continued use. There is currently no enforced time limit for the evaluation.

For notification about new versions, follow sublimehq on twitter.

Even more bleeding-edge versions are available in the dev builds.

Sublime Text 2 is also still available.


Build 3126

Release Date: 23 September 2016
  • Added Indexing Status to the Help menu to give more information about what the indexer is doing
  • Fixed a compatibility issue with some third party syntax definitions that include JavaScript.sublime-syntax
  • Reduced the default number of worker processes used for indexing. This can be manually controlled via the index_workers setting
  • API: Updated OpenSSL to 1.0.2i

Build 3124

Release Date: 22 September 2016
  • Settings now open in a new window, with the default and user settings side-by-side
  • Hovering over a symbol will show a popup indicating where it's defined. This is controlled with the show_definitions setting.
  • Build errors are now shown inline at the location where they occurred. This is controlled with the show_errors_inline setting.
  • Added a menu item and command palette entry to install Package Control
  • Various syntax highlighting improvements
  • Significant improvements to the Scala syntax definition, with thanks to djspiewak and gwenzek
  • Significant improvements to the LaTeX syntax definition, with thanks to randy3k
  • Improved Goto Definition performance when a large number of files are open
  • Minor improvements to file load times
  • Linux and OSX: Improved memory usage
  • Fixed Replace not working as expected in conjunction with regex look behinds
  • Fixed build systems being unable to use "file_patterns" with the exec command
  • Corrected tab overlap on HiDPI Windows and Linux configurations
  • OSX: Fixed a graphical glitch when switching tabs
  • OSX: Fixed crash when entering a surrogate pair via hex input
  • Linux: Improved rendering performance for some systems
  • File encoding of open files is now stored in the session
  • Build Systems may define a cancel command using the "cancel" key
  • Syntax: Added clear_scopes directive, to give more control over the generated scopes
  • Color Schemes: Added popupCss key, for defining default popup style sheets
  • Color Schemes: Added phantomCss key, for defining default phantom style sheets
  • minihtml: HiDPI support was added for Windows and Linux
  • minihtml: Windows style line endings and single quoted attributes are now supported
  • minihtml: Child selectors may now be used in style sheets
  • minihtml: The inherit CSS value has been implemented
  • minihtml: font-family stacks may now be used
  • minihtml: Support for the line-height CSS property was added
  • minihtml: Elements may now be relatively positioned
  • minihtml: Inline elements support padding and background-color set
  • minihtml: CSS variables and the var() function are now supported
  • minihtml: Added the CSS color functions color() (partial), rgb(), rgba(), hsl() and hsla()
  • minihtml: Fixed a stack overflow on Windows with too many unclosed tags
  • API: Added Phantom and PhantomSet
  • API: Added ViewEventListener
  • API: Added View.is_primary()
  • API: Added EventListener.on_hover(view, point, hover_zone)
  • API: Added functions to get and set visibility of the minimap, status bar, tabs and menu
  • API: Modifications to a selection are now constrained to the valid range
  • API: Updated Python 3.3 to commit 8e3b9bf917a7, and SQLite to 3.14.1
  • Packages: Loading packages will no longer abort if a .sublime-package is corrupt
  • Packages: Fixed an edge case when loading third party packages from unicode paths on Windows

Build 3114

Release Date: 12 May 2016
  • New C++, JavaScript and Rust syntax definitions with improved accuracy and performance
  • Many other syntax highlighting improvements
  • OSX: Improved rendering performance, especially on high resolution screens
  • Improved word wrap behavior
  • Improved spell check behavior
  • Improved file indexing behavior with multiple windows open
  • Themes may now be switched on the fly without artifacts
  • HTML: Pressing enter when between a tag pair will increase indentation
  • Some snippets have have been moved into a sub-directories, so custom overrides and key bindings that reference them will need to be updated
  • show_scope_name command shows the scope in a popup
  • Package Development: Added 'Syntax Tests - Regex Compatibility' build variant for evaluating syntax definition performance
  • Package Development: Expanded the set of regexes the new regex engine is able to handle
  • Syntax Definitions: Fixed some cases where pop matches with back references weren't working correctly
  • Fixed some Unicode handling issues in Goto Anything
  • Fixed a scenario where changes to .tmPreferences files weren't being picked up
  • Fixed a 3096 rendering performance regression
  • Fixed a 3096 regression in regular expressions when using \x{nnnn} escapes
  • Fixed a crash that could occur with an invalid result_file_regex settings
  • API: Added window.status_message
  • API: Changes to how plugins are loaded. This should be transparent, but resolves a number of corner cases
  • API: Updated to Python 3.3.6, and now includes the _ssl module on Linux, plus sqlite3 and bz2 on all platforms
  • API: Updated OpenSSL to 1.0.2h

Build 3103

Release Date: 9 February 2016
  • Added new Syntax Definition file format, .sublime-syntax
  • Added a custom regex engine that matches multiple regexps in parallel, for faster file loading and indexing
  • Improved Unicode support, including combining character rendering, character classification in regex searches, and case insensitivity in Goto Anything matching
  • Packages are now on GitHub
  • Incorporates many community provided improvements to the above packages, with significant improvements to HTML, CSS, JavaScript, Go, D and SQL
  • Added Panel Switcher to status bar
  • Better handling of troublesome files during indexing
  • Improved file change detection
  • Added "Profile Events" to the Command Palette, to help identify slow plugins
  • Build Systems may now define a list of file name wildcard patterns to trigger on, via the file_patterns key
  • prompt_open_file and related commands now accept an initial_directory argument
  • Improved indenting behavior when indent_to_bracket is enabled
  • Spell Checker now reads from manually edited user preferences on the fly
  • Stability improvements for Find in Files when using regular expressions that result in significant backtracking
  • Fixed file truncation when using hexadecimal encoding
  • Fixed brackets in strings influencing auto indent
  • Fixed inconsistencies in Goto Anything when selecting symbols
  • Fixed tab completion regression in 3081, where h1..h6 HTML completions were not triggering
  • Fixed Goto Definition command not working when placed in a submenu
  • OSX: Fixed Emoji & Symbols popup failing to insert text in some cases
  • Windows: Added support for inserting characters from outside of the BMP
  • Windows: ctrl+alt+p is no longer bound by default, due to compatibility issues with some keyboard layouts
  • Windows: Updated code signing certificate to no longer use SHA1
  • Linux: Fixed a file permission issue when running without --wait
  • Linux: crash_reporter is statically linked, improving system compatibility
  • API: Added Window.is_sidebar_visible() and Window.set_sidebar_visible()
  • API: Added View.is_auto_complete_visible()
  • API: Added find_output_panel(), destroy_output_panel(), active_panel() and panels()
  • API: Added create_output_panel() now accepts an optional parameter, "unlisted"

Build 3083

Release Date: 26 March 2015
  • Fixed high CPU usage caused by a corrupt index. This was occuring for some users upgrading from 3065
  • Added setting index_workers to control the number of threads used for file indexing. By default the number of threads is based on the number of CPU cores. By setting index_workers to 1 or 2, indexing will be slower, but less intrusive
  • Fixed a crash when showing the Command Palette with an empty .sublime-build file
  • Tab completion no longer completes numbers. Edit/Show Completions can still be used for this

Build 3080

Release Date: 24 March 2015
  • Fixed Redo sometimes restoring the selection to the incorrect location
  • Reworked how Build Systems are selected (More Information)
  • Build Systems may now declare "keyfiles" (e.g., 'Makefile' for the Make build system) to better auto detect which build system to use
  • Improved handling of build systems that generate lots of output
  • New windows always use the automatic build system, rather than the build system of the last used window
  • Command Palette now remembers the last entered string
  • Improved change detection for files that disappear and reappear, as happens with disconnected network drives
  • atomic_save is disabled by default
  • Right clicking on a URL will show an "Open URL" menu item
  • Added Goto Definition to the context menu
  • Improved behavior of Goto Definition when using multiple panes
  • Misspelled words can now be added to the dictionary, in addition to being ignored
  • Fixed Ignored Words not persisting after exiting
  • Fixed a long standing issue with spell checking and non-ascii characters
  • Added spelling_selector setting, to control what text is checked for misspellings
  • Tweaked handling of syntax definitions and unused captures, resolving an issue with spell checking in Markdown links.
  • Goto Anything supports :line:col syntax in addition to :line
  • Added Edit Project to the Command palette
  • Improved quote auto pairing logic
  • Added <current file> option to Find in Files
  • Improved Console Panel scrolling behavior
  • .tmLanguage files may contain a hidden setting, to indicate they shouldn't be displayed to the user
  • Improved some error messages when parsing .tmLanguage files
  • remember_open_files setting is now defaults to false. Note that this change will have no effect if the hot_exit setting is left at its default value of true
  • Added auto_complete_cycle setting
  • Fixed Minimap refusing to draw on very large windows
  • Fixed not being able to click on the selected row of the auto complete popup
  • Fixed sidebar icons sometimes being invisible on startup
  • Transient sheets (e.g., as created by Goto Anything when previewing files) are no longer added to the Recently Closed list
  • Improved scrolling behavior when line_padding_top is > 0
  • Fixed a bug with scrolling tabs, where a 1 pixel line would occasionally appear underneath them
  • Fixed tabset background being set to the wrong color on startup if different colored tabs are used
  • Updated to a never version of leveldb, fixing constant low level CPU usage if the index becomes corrupted
  • Fixed a crash that could occur when directories are being rapidly deleted and recreated
  • Fixed a crash that occurred when dragging rows scrolled out of view in the side bar
  • Fixed a long standing plugin_host crash triggered via modal dialogs
  • Fixed a typo in the "Save Workspace As" dialog
  • Fixed incorrect menu mnemonics
  • Linux: Added sudo save
  • Windows: Popup windows are able to receive scroll wheel input
  • Windows: subl.exe command line helper accepts wildcards
  • Windows: Fixed access denied errors that could occur when saving with atomic_save disabled
  • Windows: Added workaround for broken std::condition_variable in MSVC 2012, fixing a crash in plugin_host
  • Windows: Added more descriptive errors when the Update Installer fails to rename a folder
  • Windows: Fixed incorrect window sizing after making a maximised window full screen
  • OSX: Added work around for performActionForItemAtIndex: taking an excessively long time in Yosemite. This affected any commands that had a corresponding menu item.
  • OSX: Workaround for an OS issue with zero size windows and OpenGL views
  • OSX: subl command line tool no longer uses Distributed Objects, resolving some intermittent failures
  • Posix: Fixed new files not respecting the umask permission flags
  • API: Added View.show_popup() and related functions
  • API: Added sublime.yes_no_cancel_dialog()
  • API: Added sublime.expand_variables()
  • API: Added Window.extract_variables()
  • API: Added Sheet.view()
  • API: Window.show_quick_panel() now accepts the flag sublime.KEEP_OPEN_ON_FOCUS_LOST
  • API: Window.show_quick_panel() will now scroll to the selected item when shown
  • API: Fixed on_post_window_command() not getting called

Build 3065

Release Date: 27 August 2014
  • Added sidebar icons
  • Added sidebar loading indicators
  • Sidebar remembers which folders are expanded
  • Tweaked window closing behavior when pressing ctrl+w / cmd+w
  • Improved quote auto pairing logic
  • Selected group is now stored in the session
  • Added remember_full_screen setting
  • Fixed a lockup when transitioning from a blinking to a solid caret
  • Fixed a crash in plugin_host
  • Fixed a crash triggered by Goto Anything cloning views
  • Windows: Added command line helper, subl.exe
  • OSX: Added 'New Window' entry to dock menu
  • Posix: Using correct permissions for newly created files and folders
  • API: Updated to Python 3.3.3

Build 3059

Release Date: 17 December 2013
  • Added tab scrolling, controlled by the enable_tab_scrolling setting
  • Added image preview when opening images
  • Encoding and line endings can be displayed in the status bar with the show_encoding and show_line_endings settings
  • Added settings caret_extra_top, caret_extra_bottom and caret_extra_width to control the caret size
  • Added index_exclude_patterns setting to control which files get indexed
  • Automatically closing windows when the last tab is dragged out
  • Changed tab close behavior: the neighboring tab is now always selected
  • When the last file is closed, a new transient file is created automatically
  • Ctrl+Tab ordering is stored in the session
  • Added minimap_scroll_to_clicked_text setting
  • Improved error messages when unable to save files
  • Auto complete now works as expected in macros
  • Minor improvements to Python syntax highlighting
  • Vintage: A block caret is now used
  • Vintage: Improved behavior of visual line mode with word wrapped lines
  • Find in Files will no longer block when FIFOs are encountered
  • Linux: Added menu hiding
  • Linux: Fixed incorrect handling of double clicks in the Find panel
  • Linux: Fixed incorrect underscore display in some menus
  • Posix: Fixed new files being created with unexpected permissions
  • Windows: SSE support is no longer required for 32 bit builds
  • API: Window.open_file now accepts an optional group parameter
  • API: Plugins may now call Settings.clear_on_change() within a callback from Settings.add_on_change()
  • API: Calling Settings.add_on_change() from within a settings change callback won't cause the added callback to be run

Build 3047

Release Date: 27 June 2013
  • Beta is now open to non-registered users
  • Windows and Linux: Added High DPI support
  • Improved file change detection
  • Improved rendering performance
  • HTML tag auto completion is better behaved in script tags
  • Fixed a crash on exit that could occur when hot_exit is disabled
  • Linux and OSX: atomic_save is adaptively disabled when it's not possible to preserve file permissions
  • OSX: Fixed context menus not working when the application is in the background
  • Windows: Auto updater supports updating from unicode paths
  • API: Plugins in zip files are able to be overridden via files on disk
  • API: Added support for the termios module on Linux and OS X
  • API: Fixed Selection.contains
  • API: Fixed settings objects getting invalidated too early with cloned views

Build 3033

Release Date: 7 May 2013
  • New auto update system for Windows and OS X
  • Previewing a file from the side bar will no longer add an entry to the OPEN FILES section of the side bar
  • Added Paste from History
  • Added setting 'auto_find_in_selection', for S2 style Find in Selection logic
  • Find panel has a drop down arrow to select previous items
  • Pressing right in the Goto Anything overlay will open the selected file without closing the overlay
  • Fixed several crash bugs
  • Further startup time improvements
  • Improved HTML completions when typing outside of tags
  • Fixed Close Tag not respecting self closing tags
  • PHP: Improved auto indenting for the alternative control syntax
  • Added setting always_prompt_for_file_reload
  • Improved handling of deleted files when restoring sessions
  • Deleting a file via the side bar will first close the corresponding view, if any
  • "Remove all Folders from Project" now prompts to confirm
  • Added telemetry. Telemetry is disabled by default, but can be turned on with the enable_telemetry setting
  • Using Google Breakpad to automatically report crashes
  • Updated syntax highlighting for PHP, Haskell and Pascal
  • Symlinks are followed by default in folders added to the side bar
  • Windows: Fixed erroneous entries in system menu
  • Windows: New style Open Folder dialogs are used on Vista and later
  • API: Significantly improved communication speed with plugin_host
  • API: Added view.close()
  • API: Added view.show_popup_menu()
  • API: Added is_valid() method to view and window, to determine if the handle has been invalidated
  • API: Added on_post_text_command and on_post_window_command
  • API: on_text_command and on_window command are now called when the menu is used
  • API: Added sublime.get_macro()
  • API: view.substr(point) now has the same semantics as S2 for out of bounds addresses
  • API: view.command_history(0, True) now returns the last modifying command, as expected

Build 3021

Release Date: 14 March 2013
  • Linux: Fixed atomic_save working incorrectly with symlinks
  • Windows: Fixed a crash under Windows 7 x64
  • Fixed a crash that could occur on file open

Build 3019

Release Date: 12 March 2013
  • Added Jump Back and Jump Forward commands, available from the Goto menu
  • HTML: Improved completions and auto indent
  • HTML: Tags are closed when </ is entered. This is controlled by the auto_close_tags setting
  • Smarter word navigation
  • File saves are atomic. This can be disabled with the atomic_save setting
  • Find and Replace panels automatically resize when multi line strings are entered
  • Faster loading of large, plain text files
  • Improved console scrolling performance on high resolution displays
  • Improved handling of files with extremely long lines
  • Minimap view rectangle auto hides (controlled by the always_show_minimap_viewport setting)
  • Indexing: Added detection of stuck workers
  • Updated C# package
  • Added invert_selection command
  • CSS: Completions will not be offered when typing in selectors
  • Fixed Reveal in Side Bar
  • Fixed C++ syntax highlighting for nested class forward declarations
  • Exec panel scrolls again
  • OSX: Added support for line numbers sent via apple events
  • Windows: ok_cancel_dialog uses new visual styles
  • Linux: Using the correct version number for the deb files
  • API: Added on_text_command() and on_window_command()
  • API: Added load_resource(), load_binary_resource() and find_resources()
  • API: Added encode_value() and decode_value()
  • API: view.sel() supports negative indices
  • API: Implemented settings.add_on_change() and settings.clear_on_change()
  • API: view.add_regions() will accept package relative paths for the icon
  • API: view.add_regions() can show underlines
  • API: Added on_pre_close() callback
  • API: view.window() will now work even if the view isn't frontmost

Build 3012

Release Date: 10 February 2013
  • Fixed a syntax highlighting regression in 3011

Build 3011

Release Date: 9 February 2013
  • Improved protection against degenerate syntax definitions
  • Linux: Fixed version incompatibilities with libffi
  • OSX: Fixed exec command on 10.7
  • OSX: Fixed incompatibility between Dictionary lookup and gpu_window_buffer
  • Objective-C: Improved symbol indexing
  • API: Plugins may import modules from plugin_loaded()
  • API: sublime.version(), sublime.platform(), sublime.architecture(), and sublime.channel() may now be used before plugin_loaded() is called
  • API: Added view.command_history()

Build 3010

Release Date: 3 February 2013
  • OSX: Buttery smooth scrolling on Retina displays
  • Symbol Indexing: fixed degenerate behavior that could cause an explosion in the number of worker processes
  • Symbol Indexing: less worker processes are used, to be more unobtrusive
  • Symbol Indexing: better handling of binary files
  • OSX: Control+C will cancel the current build
  • API: view.insert() returns the number of characters inserted

Build 3009

Release Date: 1 February 2013
  • Improved symbol indexing for Ruby
  • OSX: Reduced CPU usage when gpu_window_buffer is enabled
  • Symbol Indexing works on Windows XP
  • Can monitor indexing behavior by entering sublime.log_indexing(True) in the console
  • Tweaked brace matching logic
  • Removed undesirable animation during startup
  • API: Added _ssl module on OS X and Windows
  • API: Fixed ctypes regression in 3008 on OS X
  • API: Plugins can define plugin_loaded() and plugin_unloaded() module functions. plugin_loaded() will be called when the API is ready to use.
  • API: Added view.find_by_class()
  • API: Added view.expand_by_class()
  • API: Fixed on_new_async()
  • API: Tweaking handling of show_quick_panel when items is a mixed list of strings and sequences

Build 3008

Release Date: 30 January 2013
  • Fixed Open all with current extension as
  • Fixed the Tools/Macros menu
  • Linux: Restored compatibility with older glibc versions
  • Linux: Added Installed-Size field to the .deb
  • API: urllib.request can be imported on OS X
  • API: Fixed missing _socket module on 32 bit Windows

Build 3007

Release Date: 30 January 2013
  • OSX: Fixed extraneous dock icons
  • Added Symbol Indexing support for Scala
  • Fixed crash that could occur when using Goto Anything
  • Fixed the ignored_packages setting not working correctly with zipped packages
  • Vintage: Fixed 'o' and 'O'
  • API: Fixed on_query_completions not working correctly in some circumstance
  • API: Re-added view.score_selector
  • API: Selection.add() no longer ignores the xpos

Build 3006

Release Date: 29 January 2013
  • Added Goto Definition, and Goto Symbol in Project
  • Significantly improved startup time
  • Significantly improved Replace All performance
  • Improved matching algorithm used for Goto Anything and Autocomplete, now accepts transposed characters
  • UI: Enhanced pane management
  • UI: Previewing files from the sidebar creates a preview tab
  • UI: Improved animation in the side bar
  • Projects: Multiple workspaces can be created for a single project
  • Projects: When adding folders to the sidebar, symlinks are not followed by default. This can be changed by enabling follow_symlinks in the project.
  • Build Systems: Added 'shell_cmd', which supersedes 'cmd', with more intuitive syntax
  • Build Systems: Better PATH handling behavior on OS X when using shell_cmd.
  • Build Systems: 'Make' build system has an improved error message regex
  • Build Systems: Syntax file can be specified for the output
  • Build Systems: Word wrap is enabled by default
  • Find in Files: Improved handling of binary files
  • Find in Files: Line numbers are hidden in the output
  • Find: Find in Selection will no longer be automatically selected
  • Find: Removed Reverse option
  • OSX: Improved performance on Retina displays
  • OSX: 10.7 or later is required
  • OSX: 64 bit only
  • OSX: System version of Python is no longer a dependency
  • OSX: Italic fonts are synthesized when not available in the typeface
  • Linux: .deb files are provided
  • Linux: Starting from the command line will daemonize the process by default
  • API: Upgraded from Python 2.6 to Python 3.3
  • API: Plugins run out-of-process
  • API: Plugin API is now threadsafe
  • API: Some API events are now run asynchronously
  • API: begin_edit() / end_edit() are no longer accessible
  • API: Projects are exposed to the API
  • API: Added window.settings() and window.template_settings()
  • API: show_quick_panel accepts an on_highlighted callback
ubuntu-make-18.09+disco1/tests/data/server-content/swift.org/0000755000000000000000000000000013352651520021011 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/swift.org/builds/0000755000000000000000000000000013352651520022273 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/swift.org/builds/swift-mock-ubuntu14.04.tar.gz0000777000000000000000000000000013352651520034530 2swift-mock-ubuntu15.10.tar.gzustar ././@LongLink0000644000000000000000000000014600000000000007774 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/swift.org/builds/swift-mock-ubuntu14.04.tar.gz.sigubuntu-make-18.09+disco1/tests/data/server-content/swift.org/builds/swift-mock-ubuntu14.04.tar.gz.si0000777000000000000000000000000013352651520035723 2swift-mock-ubuntu15.10.tar.gz.sigustar ubuntu-make-18.09+disco1/tests/data/server-content/swift.org/builds/swift-mock-ubuntu15.10.tar.gz0000644000000000000000000000043213352651520027411 0ustar ‹<²öVí”ÍN„0€9÷)f«'ã´ôç`öî;°‚40P²>¾ÍÆËB6¢Æl¿Ë4™I¦“¯þ`J·­ÛýËvÈ‡Æ 1“1Ãdè»$7M­"j-ÁG¦%~G€q%„Ò©ð…>­x\£ùCï²Î_å9³Æíɺ¥üçÇøOègü¯Õã,ÿŠþQ¨àÿ7˜ó?þÿ)ÿÍKþ™HGÿZÊ”¡æ€•fà*.páþ¯6“æ<ë+BL @¯o(ìv@W¿&ufšxzïÀUECÀSì«è}am{ ‡¶³Oú‘x3”†L'FÈ_˜áÔÿ_³ÇYû_j¿ÿ<ìÿ@ øIÞ ­Ô././@LongLink0000644000000000000000000000014600000000000007774 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/swift.org/builds/swift-mock-ubuntu15.10.tar.gz.sigubuntu-make-18.09+disco1/tests/data/server-content/swift.org/builds/swift-mock-ubuntu15.10.tar.gz.si0000644000000000000000000000032513352651520030024 0ustar -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iF4EABEIAAYFAlaXqx4ACgkQRW999b1nhTFx0QD/bROb8zkxcG4CxtORFM4pWz0+ 12ZJYsDjKeKQ/NLb5KUA/jAgffKldSN8R3aFahLe34H6UTJ63aM6gjVH4NezEEnz =sVIk -----END PGP SIGNATURE----- ubuntu-make-18.09+disco1/tests/data/server-content/swift.org/download/0000755000000000000000000000000013352651520022620 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/swift.org/download/index.html0000644000000000000000000007120613352651520024623 0ustar  Swift.org - Download Swift

Download Swift

Latest Development Snapshots

Development Snapshots are prebuilt binaries that are automatically created from mainline development branches. These snapshots are not official releases. They have gone through automated unit testing, but they have not gone through the full testing that is performed for official releases.

Platform Download Date
Apple Platforms Xcode Swift 2.2 Snapshot Debugging Symbols
Linux Ubuntu 15.10 Swift 2.2 Snapshot Signature
Linux Ubuntu 14.04 Swift 2.2 Snapshot Signature

Swift is covered by the Swift License at swift.org/LICENSE.txt.

Apple Platforms

Xcode includes a release of Swift that is supported by Apple. You can try out a version that is still in development by downloading one of the packages above.

Playgrounds are not currently supported for downloadable Swift packages.

To submit to the App Store you must build your app using the version of Swift that comes included within Xcode.

Requirements for Tools

  • OS X 10.11 (El Capitan)
  • Xcode 7.2 (including prerelease versions)

Supported Target Platforms

  • OS X 10.9.0 or later
  • iOS 7.0 or later
  • watchOS 2.0 or later
  • tvOS 9.0 or later

Installation

  1. Download the latest package release.

  2. Run the package installer, which will install an Xcode toolchain into /Library/Developer/Toolchains/.

    An Xcode toolchain (.xctoolchain) includes a copy of the compiler, lldb, and other related tools needed to provide a cohesive development experience for working in a specific version of Swift.

  3. Quit Xcode if it is already running.

  4. Start Xcode with the custom toolchain you downloaded to enable the open source version of Swift:

    $ xcrun launch-with-toolchain /Library/Developer/Toolchains/swift-latest.xctoolchain
    

    swift-latest.xctoolchain is a symlink to your most recently installed toolchain, such as swift-2.2-SNAPSHOT-2015-12-01-a.xctoolchain. The name of each toolchain indicates the date the toolchain was built from the open source master branch (which tracks bleeding-edge development on Swift).

    Within a running instance of Xcode launched with launch-with-toolchain, Xcode uses the downloaded toolchain for building Swift code, debugging, and even code completion and syntax coloring. If you quit Xcode, you must relaunch it with launch-with-toolchain to continue using the downloaded toolchain; otherwise, Xcode uses its default toolchain the next time you launch it.

  5. To use the Swift tools directly from the command line, add the Swift toolchain to your path as follows:

    $ export PATH=/Library/Developer/Toolchains/swift-latest.xctoolchain/usr/bin:"${PATH}"
    

Code Signing on OS X

The OS X .pkg files are digitally signed by the developer ID of the Swift open source project to allow verification that they have not been tampered with. All binaries in the package are signed as well.

The Swift toolchain installer on OS X should display a lock icon on the right side of the title bar. Clicking the lock brings up detailed information about the signature. The signature should be produced by Developer ID Installer: Swift Open Source (V9AUD2URP3).

If the lock is not displayed or the signature is not produced by the Swift open source developer ID, do not proceed with the installation. Instead, quit the installer and please email swift-infrastructure@swift.org with as much detail as possible, so that we can investigate the problem.

Older Releases

Download Date
Xcode Swift 2.2 Snapshot Debugging Symbols
Xcode Swift 2.2 Snapshot Debugging Symbols
Xcode Swift 2.2 Snapshot Debugging Symbols
Xcode Swift 2.2 Snapshot Debugging Symbols
Xcode Swift 2.2 Snapshot Debugging Symbols
Xcode Swift 2.2 Snapshot Debugging Symbols

Linux

Packages for Linux are tar archives including a copy of the Swift compiler, lldb, and related tools. You can install them anywhere as long as the extracted tools are in your PATH.

Note that nothing prevents Swift from being ported to other Linux distributions beyond the ones mentioned below. These are only the distributions where these binaries have been built and tested.

Requirements

  • Ubuntu 14.04 or 15.10 (64-bit)

Supported Target Platforms

  • Ubuntu 14.04 or 15.10 (64-bit)

Older Releases

Download Date
Ubuntu 15.10 Swift 2.2 Snapshot Signature
Ubuntu 15.10 Swift 2.2 Snapshot Signature
Ubuntu 15.10 Swift 2.2 Snapshot Signature
Ubuntu 15.10 Swift 2.2 Snapshot Signature
Ubuntu 15.10 Swift 2.2 Snapshot Signature
Ubuntu 15.10 Swift 2.2 Snapshot Signature
Download Date
Ubuntu 14.04 Swift 2.2 Snapshot Signature
Ubuntu 14.04 Swift 2.2 Snapshot Signature
Ubuntu 14.04 Swift 2.2 Snapshot Signature
Ubuntu 14.04 Swift 2.2 Snapshot Signature
Ubuntu 14.04 Swift 2.2 Snapshot Signature
Ubuntu 14.04 Swift 2.2 Snapshot Signature

Installation

  1. Install required dependencies:

    $ sudo apt-get install clang libicu-dev
    
  2. Download the latest binary release above.

    The swift-<VERSION>-<PLATFORM>.tar.gz file is the toolchain itself. The .sig file is the digital signature.

  3. If you are downloading Swift packages for the first time, import the PGP keys into your keyring:

    $ gpg --keyserver hkp://pool.sks-keyservers.net \
          --recv-keys \
          '7463 A81A 4B2E EA1B 551F  FBCF D441 C977 412B 37AD' \
          '1BE1 E29A 084C B305 F397  D62A 9F59 7F4D 21A5 6D5F'
    

    or:

    $ wget -q -O - https://swift.org/keys/all-keys.asc | gpg --import -
    

    Skip this step if you have imported the keys in the past.

  4. Verify the PGP signature.

    The .tar.gz archives for Linux are signed using GnuPG with one of the keys of the Swift open source project. Everyone is strongly encouraged to verify the signatures before using the software.

    First, refresh the keys to download new key revocation certificates, if any are available:

    $ gpg --keyserver hkp://pool.sks-keyservers.net --refresh-keys Swift
    

    Then, use the signature file to verify that the archive is intact:

    $ gpg --verify swift-<VERSION>-<PLATFORM>.tar.gz.sig
    ...
    gpg: Good signature from "Swift Automatic Signing Key #1 <swift-infrastructure@swift.org>"
    

    If gpg fails to verify because you don’t have the public key (gpg: Can't check signature: No public key), please follow the instructions in Active Signing Keys below to import the keys into your keyring.

    You might see a warning:

    gpg: WARNING: This key is not certified with a trusted signature!
    gpg:          There is no indication that the signature belongs to the owner.
    

    This warning means that there is no path in the Web of Trust between this key and you. The warning is harmless as long as you have followed the steps above to retrieve the key from a trusted source.

    If gpg fails to verify and reports “BAD signatureâ€, do not use the downloaded toolchain. Instead, please email swift-infrastructure@swift.org with as much detail as possible, so that we can investigate the problem.

  5. Extract the archive with the following command:

    $ tar xzf swift-<VERSION>-<PLATFORM>.tar.gz
    

    This creates a usr/ directory in the location of the archive.

  6. Add the Swift toolchain to your path as follows:

    $ export PATH=/path/to/usr/bin:"${PATH}"
    

    You can now execute the swift command to run the REPL or build Swift projects.

Active Signing Keys

The Swift project uses one set of keys for snapshot builds, and separate keys for every official release. We are using 4096-bit RSA keys.

The following keys are being used to sign toolchain packages:

  • Swift Automatic Signing Key #1 <swift-infrastructure@swift.org>

    Download
    https://swift.org/keys/automatic-signing-key-1.asc
    Fingerprint
    7463 A81A 4B2E EA1B 551F FBCF D441 C977 412B 37AD
    Long ID
    D441C977412B37AD

    To import the key, run:

    $ gpg --keyserver hkp://pool.sks-keyservers.net \
          --recv-keys \
          '7463 A81A 4B2E EA1B 551F  FBCF D441 C977 412B 37AD'
    

    Or:

    $ wget -q -O - https://swift.org/keys/automatic-signing-key-1.asc | gpg --import -
    
  • Swift 2.2 Release Signing Key <swift-infrastructure@swift.org>

    Download
    https://swift.org/keys/release-key-swift-2.2.asc
    Fingerprint
    1BE1 E29A 084C B305 F397 D62A 9F59 7F4D 21A5 6D5F
    Long ID
    9F597F4D21A56D5F

    To import the key, run:

    $ gpg --keyserver hkp://pool.sks-keyservers.net \
          --recv-keys \
          '1BE1 E29A 084C B305 F397  D62A 9F59 7F4D 21A5 6D5F'
    

    Or:

    $ wget -q -O - https://swift.org/keys/release-key-swift-2.2.asc | gpg --import -
    

Swift and the Swift logo are trademarks of Apple Inc.

ubuntu-make-18.09+disco1/tests/data/server-content/swift.org/keys/0000755000000000000000000000000013352651520021764 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/swift.org/keys/all-keys.asc0000644000000000000000000001020613352651520024174 0ustar -----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v1 mQMuBFaXW+IRCACzauJ23sc/ca4OEjdDEkOkfaXHN1vR24Twjh8St0WiPjxJDd2W XsczwBuSBr2Fp5r+OLJ1FVwyXj1Rwb/yAGn9SUMXRxP4JLkwuBk2WHQqj3fv9ekI 91iWngezQKmpIs0K0srHRn+RbZoN2CtA+x10yotqhghjStVHvArWoUlYwwhpb+/k IqjH7UGIr8hMWivLiqFD8ZjLlxu/Eohw7QKaEo5M7B/aPNM1+YCWOVTH0v7kaCnH LoO2ELaMf4FFLPmk2At5ffqddpfwGF8KLC3YChExMME5Ko56somO1TeGzAA1TVO1 zuQxwCLXhNO856PK4tYzWZAENeRqAMMXY3v7AQCb7+PoeHTTmJPYwA0b1cEtEoLR 9WfWyEekXwkbLqiDAwf/Yzj1+57NGzeo/18LEJdwpe03i0/8Rtw1tXstHeskCr0x J2BpsKdUZQuMj/YxIujFiIKU+rt7DQbTUANACwWetSldJwe7EpO4rxXIJjajSD9l V5JQo02SiFemlbgZZX+zZp4cJXpcpji2wUY7PZeAzKyqDq83O1Fw2wiBLf6Hj7EA f0sTY2q3HMAcwRLjrwf06ZjpdDlwPyqoyK2iWVygcyRS6jSB8lZC/76UEYdt5IjF kEV8/cuyOlNc6nyFNf1wKBpXfuQ2MxzSZCVdJc017DHKNM4qFgreFFrWCU3ePQGR e9wuXETshGaeuYGypEB252jDG2sN6yjFv9R706uKTAf8CyIkWLF0AbHTVOk123Lw SWBqMTs5KbESdRMFKH4FXO05gpxo+iUZNoucQ7kQkfH1MkkK2+1HhyEUZtzktPaJ /OqQRbXjg/XUpHQjRcV9Vbh0nyguBAWp+Ao7zQ+ZhgZrC+mbjiF7YXXvQpcwXRom 9KXVeCeVMt/syh65MU9aYQZ+0HyUCVSNHsfshMWul/SFLL1FTFjkaqHDOY0f+xOa duYkSB7ryml8fcClzp+iUnrGm6I8MWo9pOXH6nMZ4qhhL6+szH2JcpmOEtZJ+ZG7 aeBUhw1s5NP+lhmPOata4jTuu5b6huKpGR6ztjsZ2uMLXRbgXMVeBJI3KHf+RUeu wLQZIDx1YnVudHUtbWFrZUB1YnVudHUuY29tPoh6BBMRCAAiBQJWl1viAhsjBgsJ CAcDAgYVCAIJCgsEFgIDAQIeAQIXgAAKCRDqEPHixeB24v2/AQCF7SWqcmhpLgaI OWq/2o3bg9AJIpj0TY3wdcCWAY1DMAD+M8o54KR3Ry2lP6TgEAYp8I7UwDsSwzsh rpyOv/lO9xs= =Ul87 -----END PGP PUBLIC KEY BLOCK----- -----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v1 mQMuBFaXXNgRCACd6Z5MSnPFIowD8V8lyLJogsD4NDSksXhWV0YsWGrdEG67RHCl X5YxBOfVQaBJQWxCcv5IxAZjetn6HdCmEruSiwcW0NXlJ/oFlrGEk9qkVHgTpibC mBYcEJ9Pb1awGJorGgZ9QnM0B5C0oTgK3ySItw8lQVd/4bAkda3+JGaJ2GWnN5mZ UmHXR61Q7K2Yrn3/D4SCaPB2qxqtwWtP93n8QLg9c/xf9L5CUi34i12UI/bCpTDO rc5meDPzNCTzayoj0op+TlI6C0N0V//Q5fKUtmC4zT3WUSkknzqgflMXc0YZy8MN V7dN4ATDNQt/oNb2TEBEnOJfNBmXPLr7E/wzAQD5ghRe0iJ8BXYz3ruHm6WGlTs+ E/CU8Jv7VBBIwkPWEwf/Qffretyi0FIk/UZhbGE70LQg4Fu8WllPa8R0SlwXP3// XQUjD4MMXLtwXj+ZwiLOE+PIYGgGp1ZBJdybJq8jsnahlTQ4W4Gd8KUgz8UadcIT 3U/5PFs3qzsHkbyYM2FSmVi9qhAkvyWT+WKLw3/xWnIH3+ngcV5IiU9MsaC6XsEw 1OhX3yDl2znZLHeIiJ1j1htJieBYgttG3MIFblQnber8hY0cAhxYpmhfigo5uyKi o1U651br6+1ORx8PiMGWk5DnmtnRRYKv7tThjV2OK08jfzo4+t4SYDR8W1pBzcpK Z1f+mtd0PBYs+dD56KD1Q7+BqSARK/KeUSNNkZ44FAf/R7zGwdTFAcwwBjZ9Hjg9 +oWdJvhHc4kX3nw7bfaR4T8tGBrQ54xl/vbIrF9MQDd85WZCpRYI8URgeHQiJFW6 wxV7YQk3oCrI6H5hzSmIs8+xyinZyCo1IOftToSCnsHsmkfAL946rPqDsKHwHMNj hF9xQxngKTmiSSCdkJH/ezwdO7t1+hvd6uK5bbnKSnCxzGp0ejHJ4f+X+IxFBSiU W9afBq9qpuRpunuAGnACUEbAKjKdulQcf2F/bkfQjIZvC0haLRNQWhcJ53Hn86B2 tAN8h5HDIHGmXxL7uiIrB0o35mdtyd2cRjOlZEHoRSoS2REUoYOLjren0K1e//Cx 67QZIDx1YnVudHUtbWFrZUB1YnVudHUuY29tPoh6BBMRCAAiBQJWl1zYAhsjBgsJ CAcDAgYVCAIJCgsEFgIDAQIeAQIXgAAKCRBFhvcjsVa140SDAQDDBM8DRk57wd8z D4uzk+CjFBQP1skJBltT1tyEjhDW3QEAg0avQhGMFvsXfVOXPYgQLUu3+owNM85o tvXGXsYk7Sg= =a4tv -----END PGP PUBLIC KEY BLOCK----- -----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v1 mQMuBFaXqicRCACYFRlvi0qk7KyhajJUwFWhhrMgY+Cc3JLLr28PLbfEHoxLWPRT 1MFMVggu/GLFSaaJdczO0kJaXXhL+Gv5wr/eBeCKhHGJEg69rssQtBWtxF+I7bu1 Z37GvzKUa2UqWQqkQuSun3NTp2HtrB4u6H1TecDMQpGSQPYJ7tEOyRakku/75oQ3 cHGqhF4y4og9wUjkkMeeKn710N3CTuOGL+Ofk+LIEG6Fd6MAD3lFjv6cNUFwWH0b tW9xrt2x+H1wyb/ju+OFGW5kq12r4HACz0zBk/CMNxufFwUHykjC75d76F1aZEwT QO00/FHZx27FzcduXEXoTqvQ+AVUewrjWAo3AQCRT2Xg52cCODF2uW0qguOfijoA Ja3n+bfEpnd+zjvGZwf+O7G2TMx67XbS9O9Yo8Omz66qL4oFIydRZw1h4qiWmFjT FaBdc+M2Uxv6DJyj944ixyPGkSpuPNkuKIxplEfXncf0C7oK+hb+yyJwe8LsOx07 EOiaoi9hMggOAG4FuSuCJSPc60SXEIyqtDEDt0rhRWOfZAXdHI7LZQf3q+guJneN iVkOTvc3+YU5aH8RX3o4GuKBGTXUnuybRaew5yO/lIRfVUTnZocF3RmSCgtCyI3w /83y3kfb+Oegvpiy19WAmA4PIjcPFYuq24EbVxEYkQx9EFx0dyKG+sPuAFiYbLzS paRApa93NXEJ+ajJerTGrh/BUndf6is9tgYVuuTbPwgAlphh1XLE8FD2EiQ431XM 42DYFyxCHIGgpcrsS3tbRtwXJcZ1dx+uQeJ2xfWn+8/1aoh5Fcs6T9/GdMrr6z5h +FlVk4JXUzCiQfPnjLkrD91DMV1esu/KePio/wkY2r039AoZMEdhV6q0YQCxfr2z e8giUGJfHm6doOuX/S92J9iwulHkBt3k6acd+DNCnOkblVtOcrqmDKZ5/4CJwanR Icu/U3FgtZQFGeoDFWOuMucUZFkRwoItjN3QKzltsHvFVQufvdywnpRaoDUizOmM wOSrTH6yEDQaGdiARAiLQOovXpJbU/U5TG+ELVGKC+8gz5PwghHfeGeWM1T1zLJo 3bQZIDx1YnVudHUtbWFrZUB1YnVudHUuY29tPoh6BBMRCAAiBQJWl6onAhsjBgsJ CAcDAgYVCAIJCgsEFgIDAQIeAQIXgAAKCRBFb331vWeFMbGDAP9V78C0Ean34cbs d9lmXaAZr5GZ/eeoFuXEglsLLJb1WAD/ff3JnfJ7m3r4mLP2jU4qIklC6XXi1VFd kIySjmCogXU= =GZp4 -----END PGP PUBLIC KEY BLOCK----- ubuntu-make-18.09+disco1/tests/data/server-content/twinery.org/0000755000000000000000000000000013352651520021356 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/twinery.org/homepage/0000755000000000000000000000000013352651520023143 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/twinery.org/homepage/img/0000755000000000000000000000000013352651520023717 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/twinery.org/homepage/img/logo.svg0000644000000000000000000000000013352651520025366 0ustar ubuntu-make-18.09+disco1/tests/data/server-content/twinery.org/index.html0000644000000000000000000002304113352651520023353 0ustar Twine / An open-source tool for telling interactive, nonlinear stories

Twine is an open-source tool for telling interactive, nonlinear stories.

You don't need to write any code to create a simple story with Twine, but you can extend your stories with variables, conditional logic, images, CSS, and JavaScript when you're ready.

Twine publishes directly to HTML, so you can post your work nearly anywhere. Anything you create with it is completely free to use any way you like, including for commercial purposes.

Twine was originally created by Chris Klimas in 2009 and is now maintained by a whole bunch of people at several different repositories.

Editing a story in Twine 1.4.
A bird's-eye view of a story map in Twine 1.4.
The story list in Twine 2.0.
Editing a story in Twine 2.0.

Twine has been used to create hundreds of works. Here's a sample:

Refresh Works

To have your work listed here, add it to the IFDB.

A new tool has emerged that empowers just about anyone to create a game. It's called Twine. It's extremely easy to use, and it has already given rise to a lively and diverse development scene.

Carolyn Petit, Gamespot

Although plenty of independent games venture where mainstream games fear to tread, Twine represents something even more radical: the transformation of video games into something that is not only consumed by the masses but also created by them.

Laura Hudson, The New York Times Magazine

The simple beauty of Twine is this: if you can type words and occasionally put brackets around some of those words, you can make a Twine game.

Kitty Horrorshow

If you're interested in making interactive fiction then there's no better place to start than Twine. It's possibly the simplest game making tool available, it will take you mere minutes to get started, and it has a wonderfully simple visual editor.

Richard Perrin

And aside from being free, it's really not programming at all — if you can write a story, you can make a Twine game.

Anna Anthropy

Twine is the closest we've come to a blank page. It binds itself and it can bind itself along an infinite number of spines extending in any direction.

Porpentine

@twinethreads is the official Twitter account for Twine, with news, interesting links, and new works.

If you have a link you'd like us to share, tweet at us to let us know!

ubuntu-make-18.09+disco1/tests/data/server-content/www.apache.org/0000755000000000000000000000000013352651520021721 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/www.apache.org/dist/0000755000000000000000000000000013352651520022664 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/www.apache.org/dist/maven/0000755000000000000000000000000013352651520023772 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/www.apache.org/dist/maven/maven-3/0000755000000000000000000000000013352651520025240 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/www.apache.org/dist/maven/maven-3/index.html0000644000000000000000000000205213352651520027234 0ustar Index of /dist/maven/maven-3

Index of /dist/maven/maven-3

Icon  Name                    Last modified      Size  Description
[PARENTDIR] Parent Directory - [DIR] 3.0.5/ 2017-10-04 12:47 - [DIR] 3.1.1/ 2017-10-04 12:47 - [DIR] 3.2.5/ 2017-10-04 12:47 - [DIR] 3.3.9/ 2017-10-04 12:47 - [DIR] mock/ 2018-03-08 01:40 -
ubuntu-make-18.09+disco1/tests/data/server-content/www.apache.org/dist/maven/maven-3/mock/0000755000000000000000000000000013352651520026171 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/www.apache.org/dist/maven/maven-3/mock/binaries/0000755000000000000000000000000013352651520027765 5ustar ././@LongLink0000644000000000000000000000020000000000000007763 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/www.apache.org/dist/maven/maven-3/mock/binaries/apache-maven-mock-bin.tar.gzubuntu-make-18.09+disco1/tests/data/server-content/www.apache.org/dist/maven/maven-3/mock/binaries/a0000644000000000000000000000024713352651520030133 0ustar ‹ÏÊYíÑ[ à @Q—âB4:¸¤ Í£ô‘õ×|JI-þîùPa„/±=¥jˆs«ajÏõ¡ëaU9& A–iƒ˜÷ù¢¬³Þ9/ÏçV¼³J›‚Øô¸ÝãUkuŒ}×§ióÝÞýŸŠ«ýËîøª¿4¹¿QZÊ~cý?ú—ßñC+ôv=fH:(././@LongLink0000644000000000000000000000020500000000000007770 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/www.apache.org/dist/maven/maven-3/mock/binaries/apache-maven-mock-bin.tar.gz.sha1ubuntu-make-18.09+disco1/tests/data/server-content/www.apache.org/dist/maven/maven-3/mock/binaries/a0000644000000000000000000000005113352651520030124 0ustar 4818d1570e1c9d2c5b727ef64806fd03d797b59e ubuntu-make-18.09+disco1/tests/data/server-content/www.arduino.cc/0000755000000000000000000000000013352651520021737 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/www.arduino.cc/en/0000755000000000000000000000000013352651520022341 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/www.arduino.cc/en/Main/0000755000000000000000000000000013352651520023225 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/www.arduino.cc/en/Main/Software0000644000000000000000000007714313352651520024756 0ustar Arduino - Software

Download the Arduino IDE
ARDUINO 1.8.5
The open-source Arduino Software (IDE) makes it easy to write code and upload it to the board. It runs on Windows, Mac OS X, and Linux. The environment is written in Java and based on Processing and other open-source software.
This software can be used with any Arduino board.
Refer to the Getting Started page for Installation instructions.
HOURLY BUILDS

Download a preview of the incoming release with the most updated features and bugfixes.
Windows
Mac OS X (Mac OSX Lion or later)
Linux 32 bit , Linux 64 bit , Linux ARM

LAST UPDATE
14 April 2015, 08:41:16 CET
BETA BUILDS

Download the Beta Version of the Arduino IDE with experimental features. This version should NOT be used in production.

Windows
Mac OX (Mac OSX Mountain Lion or later)
Linux 32 bit, Linux 64 bit, Linux Arm

BETA
Previous Releases

Download the previous version of the current release the classic Arduino 1.0.x, or the Arduino 1.5.x Beta version.

All the Arduino 00xx versions are also available for download. The Arduino IDE can be used on Windows, Linux (both 32 and 64 bits), and Mac OS X.

Source Code

Active development of the Arduino software is hosted by GitHub. See the instructions for building the code.

The source code archives of the latest release are available here. The archives are PGP-signed so they can be verified using this gpg key.

Other Software
Easy Installation Procedure (recommended): Download the Upgrade Image then please follow the steps in the Yún sysupgrade tutorial.
Advanced Installation Procedure: This procedure is only recommended to advanced users who wish to completely re-flash the Yún including its U-Boot bootloader. These instructions on reflashing the base images are for reference only. Following them will void your Yún's warranty.

Packages List
The list of available packages for the Yún is available here.
See the list of changes.
Terms of Use

By downloading the software from this page, you agree to the specified terms.

THE ARDUINO SOFTWARE IS PROVIDED TO YOU "AS IS" AND WE MAKE NO EXPRESS OR IMPLIED WARRANTIES WHATSOEVER WITH RESPECT TO ITS FUNCTIONALITY, OPERABILITY, OR USE, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR INFRINGEMENT. WE EXPRESSLY DISCLAIM ANY LIABILITY WHATSOEVER FOR ANY DIRECT, INDIRECT, CONSEQUENTIAL, INCIDENTAL OR SPECIAL DAMAGES, INCLUDING, WITHOUT LIMITATION, LOST REVENUES, LOST PROFITS, LOSSES RESULTING FROM BUSINESS INTERRUPTION OR LOSS OF DATA, REGARDLESS OF THE FORM OF ACTION OR LEGAL THEORY UNDER WHICH THE LIABILITY MAY BE ASSERTED, EVEN IF ADVISED OF THE POSSIBILITY OR LIKELIHOOD OF SUCH DAMAGES.

Share

ubuntu-make-18.09+disco1/tests/data/server-content/www.blender.org/0000755000000000000000000000000013352651520022113 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/www.blender.org/download/0000755000000000000000000000000013352651520023722 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/www.blender.org/download/index.html0000644000000000000000000010427713352651520025732 0ustar Download — blender.org

Fully Featured

Whether you are an animator, modeler, VFX, game developer, 3D Printing, you name it. Blender's got you covered.

Check out the features

Free & Open Source

Free to Use. Free to Share. Free to Change. Free to Sell Your Work.
Blender is Free Software.

Learn more about the license

Be Part of It

Blender's main strength is its huge community. Made by hundreds of contributors from around the world.

Get involved

New in Blender 2.79b

Blender 2.79b features a new Denoiser, PBR Shader, Shadow Catcher, Filmic Color Management, AMD OpenCL improvements and much more.

All of that plus over a massive 900 bug fixes! (since 2.78)

But wait, there's more. Check out what's new in 2.79b

Go Experimental

Blender evolves every day. Experimental builds have the latest features and while there might be cool bug fixes too, they are unstable and can mess up your files.

These builds use the latest snippets of magic code developers write. Give the upcoming Blender 2.8x a try! Although it is absolutely not recommended for use on production environments.

With great power comes great responsibility.

Latest Experimental Builds
Artistic freedom starts with Blender The Free and Open Source 3D Creation Suite blender.org
ubuntu-make-18.09+disco1/tests/data/server-content/www.eclipse.org/0000755000000000000000000000000013352651520022124 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/www.eclipse.org/downloads/0000755000000000000000000000000013352651520024116 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/www.eclipse.org/downloads/eclipse-packages/0000755000000000000000000000000013352651520027316 5ustar ././@LongLink0000644000000000000000000000015100000000000007770 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/www.eclipse.org/downloads/eclipse-packages/index.htmlubuntu-make-18.09+disco1/tests/data/server-content/www.eclipse.org/downloads/eclipse-packages/index.0000644000000000000000000017256113352651520030442 0ustar Eclipse Packages | The Eclipse Foundation - home to a global community, the Eclipse IDE, Jakarta EE and over 350 open source projects... Skip to main content
ubuntu-make-18.09+disco1/tests/data/server-content/www.eclipse.org/downloads/images/0000755000000000000000000000000013352651520025363 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/www.eclipse.org/downloads/images/cdt.png0000644000000000000000000000000013352651520026631 0ustar ubuntu-make-18.09+disco1/tests/data/server-content/www.eclipse.org/downloads/images/java.png0000644000000000000000000000000013352651520027000 0ustar ubuntu-make-18.09+disco1/tests/data/server-content/www.eclipse.org/downloads/images/javaee.png0000644000000000000000000000000013352651520027312 0ustar ubuntu-make-18.09+disco1/tests/data/server-content/www.eclipse.org/downloads/images/javascript.png0000644000000000000000000000000013352651520030225 0ustar ubuntu-make-18.09+disco1/tests/data/server-content/www.eclipse.org/downloads/images/php.png0000644000000000000000000000000013352651520026646 0ustar ubuntu-make-18.09+disco1/tests/data/server-content/www.eclipse.org/technology/0000755000000000000000000000000013352651520024277 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/www.eclipse.org/technology/epp/0000755000000000000000000000000013352651520025063 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/www.eclipse.org/technology/epp/downloads/0000755000000000000000000000000013352651520027055 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/www.eclipse.org/technology/epp/downloads/release/0000755000000000000000000000000013352651520030475 5ustar ././@LongLink0000644000000000000000000000015500000000000007774 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/www.eclipse.org/technology/epp/downloads/release/version/ubuntu-make-18.09+disco1/tests/data/server-content/www.eclipse.org/technology/epp/downloads/release/0000755000000000000000000000000013352651520030475 5ustar ././@LongLink0000644000000000000000000000017300000000000007774 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/www.eclipse.org/technology/epp/downloads/release/version/point_release/ubuntu-make-18.09+disco1/tests/data/server-content/www.eclipse.org/technology/epp/downloads/release/0000755000000000000000000000000013352651520030475 5ustar ././@LongLink0000644000000000000000000000023600000000000007774 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/www.eclipse.org/technology/epp/downloads/release/version/point_release/eclipse-cpp-linux-gtk-x86_64.tar.gzubuntu-make-18.09+disco1/tests/data/server-content/www.eclipse.org/technology/epp/downloads/release/0000644000000000000000000000041413352651520030476 0ustar ‹ûÐŽTíÓÑJÃ0à\÷)"îÂ]Ìædɉo#±,nëJ£²Ç7ÕU† ½1“ÁÿÝh 'ðçÍ.ö)Ô¢ •9çÆIΪó9¤2ÖQþNšÙ iK^jò–^ý ¥hc;šmúí¿¹ó+NùÇæÐÝû}‰cÀÌ<—¿ÖZ9²ùY-¤*q™Ÿÿgþ§YdÇlÿ™¾úÏÚ²â1‘ÿÜÞÔO±«Ó¦ªwm:¿r¡–õ‹÷«g¿ rå‡f#üȦªþûÂð§¦þÇ]`ÇlÿµÉý_³5D†ÌØÿ ý¿„³þ§]½d…Š\¡†/½÷(././@LongLink0000644000000000000000000000024500000000000007774 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/www.eclipse.org/technology/epp/downloads/release/version/point_release/eclipse-cpp-linux-gtk-x86_64.tar.gz.sha512ubuntu-make-18.09+disco1/tests/data/server-content/www.eclipse.org/technology/epp/downloads/release/0000644000000000000000000000024713352651520030502 0ustar 13a5b68a87392f935c3e20b6735b035489f114235180c8caa5616b95de51dc628e8b42d1fe3c88233a3f11bfa9722db9c49dbf995ad603877cd9c466263267a7 eclipse-java-linux-gtk-x86_64.tar.gz ././@LongLink0000644000000000000000000000022700000000000007774 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/www.eclipse.org/technology/epp/downloads/release/version/point_release/eclipse-cpp-linux-gtk.tar.gzubuntu-make-18.09+disco1/tests/data/server-content/www.eclipse.org/technology/epp/downloads/release/0000644000000000000000000000041213352651520030474 0ustar ‹TÐŽTíÔÑJÃ0à\÷)2Ü…»˜ÍÉ’_'¶‘Åm]itøø6ºÊ¤7f2ø¿›máþü Í>ö)Ô¢ 5rÎåIΪË9¤2ÖÑøœ4³Ò–<Ôä-½úAJÑÆv86»ôÛwsïoT8ç›c÷ðÞJìÈ3ó\þZkå(ß2c„T%óòÿÌÿ<‹ì˜í¿u_ýgÍÊꜿ¶„ü¯ánQ?Å®NÛªZÞ·qèü!È¥ZÕ/þä×Ï~äÚÍVF~äªúïã›úÿw³ý×fìÿ†­!2drÿ þÿ×qÑÿ´¡—¬Pr€ô—Mµ(././@LongLink0000644000000000000000000000023600000000000007774 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/www.eclipse.org/technology/epp/downloads/release/version/point_release/eclipse-cpp-linux-gtk.tar.gz.sha512ubuntu-make-18.09+disco1/tests/data/server-content/www.eclipse.org/technology/epp/downloads/release/0000644000000000000000000000024013352651520030473 0ustar c58b4e12d671ea45d6c73c39adbb34a9763e42b888d52d1bf31420a894e160ba2f8ed52a0bc95e6b2b55e671cb54ead2e39dd5728738151ad2b2acc665c5621b eclipse-java-linux-gtk.tar.gz ././@LongLink0000644000000000000000000000023700000000000007775 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/www.eclipse.org/technology/epp/downloads/release/version/point_release/eclipse-java-linux-gtk-x86_64.tar.gzubuntu-make-18.09+disco1/tests/data/server-content/www.eclipse.org/technology/epp/downloads/release/0000644000000000000000000000041413352651520030476 0ustar ‹ûÐŽTíÓÑJÃ0à\÷)"îÂ]Ìædɉo#±,nëJ£²Ç7ÕU† ½1“ÁÿÝh 'ðçÍ.ö)Ô¢ •9çÆIΪó9¤2ÖQþNšÙ iK^jò–^ý ¥hc;šmúí¿¹ó+NùÇæÐÝû}‰cÀÌ<—¿ÖZ9²ùY-¤*q™Ÿÿgþ§YdÇlÿ™¾úÏÚ²â1‘ÿÜÞÔO±«Ó¦ªwm:¿r¡–õ‹÷«g¿ rå‡f#üȦªþûÂð§¦þÇ]`ÇlÿµÉý_³5D†ÌØÿ ý¿„³þ§]½d…Š\¡†/½÷(././@LongLink0000644000000000000000000000024600000000000007775 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/www.eclipse.org/technology/epp/downloads/release/version/point_release/eclipse-java-linux-gtk-x86_64.tar.gz.sha512ubuntu-make-18.09+disco1/tests/data/server-content/www.eclipse.org/technology/epp/downloads/release/0000644000000000000000000000024713352651520030502 0ustar 13a5b68a87392f935c3e20b6735b035489f114235180c8caa5616b95de51dc628e8b42d1fe3c88233a3f11bfa9722db9c49dbf995ad603877cd9c466263267a7 eclipse-java-linux-gtk-x86_64.tar.gz ././@LongLink0000644000000000000000000000023000000000000007766 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/www.eclipse.org/technology/epp/downloads/release/version/point_release/eclipse-java-linux-gtk.tar.gzubuntu-make-18.09+disco1/tests/data/server-content/www.eclipse.org/technology/epp/downloads/release/0000644000000000000000000000041213352651520030474 0ustar ‹TÐŽTíÔÑJÃ0à\÷)2Ü…»˜ÍÉ’_'¶‘Åm]itøø6ºÊ¤7f2ø¿›máþü Í>ö)Ô¢ 5rÎåIΪË9¤2ÖÑøœ4³Ò–<Ôä-½úAJÑÆv86»ôÛwsïoT8ç›c÷ðÞJìÈ3ó\þZkå(ß2c„T%óòÿÌÿ<‹ì˜í¿u_ýgÍÊꜿ¶„ü¯ánQ?Å®NÛªZÞ·qèü!È¥ZÕ/þä×Ï~äÚÍVF~äªúïã›úÿw³ý×fìÿ†­!2drÿ þÿ×qÑÿ´¡—¬Pr€ô—Mµ(././@LongLink0000644000000000000000000000023700000000000007775 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/www.eclipse.org/technology/epp/downloads/release/version/point_release/eclipse-java-linux-gtk.tar.gz.sha512ubuntu-make-18.09+disco1/tests/data/server-content/www.eclipse.org/technology/epp/downloads/release/0000644000000000000000000000024013352651520030473 0ustar c58b4e12d671ea45d6c73c39adbb34a9763e42b888d52d1bf31420a894e160ba2f8ed52a0bc95e6b2b55e671cb54ead2e39dd5728738151ad2b2acc665c5621b eclipse-java-linux-gtk.tar.gz ././@LongLink0000644000000000000000000000024500000000000007774 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/www.eclipse.org/technology/epp/downloads/release/version/point_release/eclipse-javascript-linux-gtk-x86_64.tar.gzubuntu-make-18.09+disco1/tests/data/server-content/www.eclipse.org/technology/epp/downloads/release/0000777000000000000000000000000013352651520037042 2eclipse-java-linux-gtk-x86_64.tar.gzustar ././@LongLink0000644000000000000000000000025400000000000007774 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/www.eclipse.org/technology/epp/downloads/release/version/point_release/eclipse-javascript-linux-gtk-x86_64.tar.gz.sha512ubuntu-make-18.09+disco1/tests/data/server-content/www.eclipse.org/technology/epp/downloads/release/0000644000000000000000000000025513352651520030501 0ustar 13a5b68a87392f935c3e20b6735b035489f114235180c8caa5616b95de51dc628e8b42d1fe3c88233a3f11bfa9722db9c49dbf995ad603877cd9c466263267a7 eclipse-javascript-linux-gtk-x86_64.tar.gz ././@LongLink0000644000000000000000000000023600000000000007774 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/www.eclipse.org/technology/epp/downloads/release/version/point_release/eclipse-javascript-linux-gtk.tar.gzubuntu-make-18.09+disco1/tests/data/server-content/www.eclipse.org/technology/epp/downloads/release/0000777000000000000000000000000013352651520036106 2eclipse-java-linux-gtk.tar.gzustar ././@LongLink0000644000000000000000000000024500000000000007774 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/www.eclipse.org/technology/epp/downloads/release/version/point_release/eclipse-javascript-linux-gtk.tar.gz.sha512ubuntu-make-18.09+disco1/tests/data/server-content/www.eclipse.org/technology/epp/downloads/release/0000644000000000000000000000024613352651520030501 0ustar c58b4e12d671ea45d6c73c39adbb34a9763e42b888d52d1bf31420a894e160ba2f8ed52a0bc95e6b2b55e671cb54ead2e39dd5728738151ad2b2acc665c5621b eclipse-javascript-linux-gtk.tar.gz ././@LongLink0000644000000000000000000000023600000000000007774 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/www.eclipse.org/technology/epp/downloads/release/version/point_release/eclipse-jee-linux-gtk-x86_64.tar.gzubuntu-make-18.09+disco1/tests/data/server-content/www.eclipse.org/technology/epp/downloads/release/0000777000000000000000000000000013352651520037042 2eclipse-java-linux-gtk-x86_64.tar.gzustar ././@LongLink0000644000000000000000000000024500000000000007774 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/www.eclipse.org/technology/epp/downloads/release/version/point_release/eclipse-jee-linux-gtk-x86_64.tar.gz.sha512ubuntu-make-18.09+disco1/tests/data/server-content/www.eclipse.org/technology/epp/downloads/release/0000644000000000000000000000024613352651520030501 0ustar 13a5b68a87392f935c3e20b6735b035489f114235180c8caa5616b95de51dc628e8b42d1fe3c88233a3f11bfa9722db9c49dbf995ad603877cd9c466263267a7 eclipse-jee-linux-gtk-x86_64.tar.gz ././@LongLink0000644000000000000000000000022700000000000007774 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/www.eclipse.org/technology/epp/downloads/release/version/point_release/eclipse-jee-linux-gtk.tar.gzubuntu-make-18.09+disco1/tests/data/server-content/www.eclipse.org/technology/epp/downloads/release/0000777000000000000000000000000013352651520036106 2eclipse-java-linux-gtk.tar.gzustar ././@LongLink0000644000000000000000000000023600000000000007774 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/www.eclipse.org/technology/epp/downloads/release/version/point_release/eclipse-jee-linux-gtk.tar.gz.sha512ubuntu-make-18.09+disco1/tests/data/server-content/www.eclipse.org/technology/epp/downloads/release/0000644000000000000000000000023713352651520030501 0ustar c58b4e12d671ea45d6c73c39adbb34a9763e42b888d52d1bf31420a894e160ba2f8ed52a0bc95e6b2b55e671cb54ead2e39dd5728738151ad2b2acc665c5621b eclipse-jee-linux-gtk.tar.gz ././@LongLink0000644000000000000000000000023600000000000007774 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/www.eclipse.org/technology/epp/downloads/release/version/point_release/eclipse-php-linux-gtk-x86_64.tar.gzubuntu-make-18.09+disco1/tests/data/server-content/www.eclipse.org/technology/epp/downloads/release/0000644000000000000000000000041413352651520030476 0ustar ‹ûÐŽTíÓÑJÃ0à\÷)"îÂ]Ìædɉo#±,nëJ£²Ç7ÕU† ½1“ÁÿÝh 'ðçÍ.ö)Ô¢ •9çÆIΪó9¤2ÖQþNšÙ iK^jò–^ý ¥hc;šmúí¿¹ó+NùÇæÐÝû}‰cÀÌ<—¿ÖZ9²ùY-¤*q™Ÿÿgþ§YdÇlÿ™¾úÏÚ²â1‘ÿÜÞÔO±«Ó¦ªwm:¿r¡–õ‹÷«g¿ rå‡f#üȦªþûÂð§¦þÇ]`ÇlÿµÉý_³5D†ÌØÿ ý¿„³þ§]½d…Š\¡†/½÷(././@LongLink0000644000000000000000000000024500000000000007774 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/www.eclipse.org/technology/epp/downloads/release/version/point_release/eclipse-php-linux-gtk-x86_64.tar.gz.sha512ubuntu-make-18.09+disco1/tests/data/server-content/www.eclipse.org/technology/epp/downloads/release/0000644000000000000000000000024713352651520030502 0ustar 13a5b68a87392f935c3e20b6735b035489f114235180c8caa5616b95de51dc628e8b42d1fe3c88233a3f11bfa9722db9c49dbf995ad603877cd9c466263267a7 eclipse-java-linux-gtk-x86_64.tar.gz ././@LongLink0000644000000000000000000000022700000000000007774 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/www.eclipse.org/technology/epp/downloads/release/version/point_release/eclipse-php-linux-gtk.tar.gzubuntu-make-18.09+disco1/tests/data/server-content/www.eclipse.org/technology/epp/downloads/release/0000644000000000000000000000041213352651520030474 0ustar ‹TÐŽTíÔÑJÃ0à\÷)2Ü…»˜ÍÉ’_'¶‘Åm]itøø6ºÊ¤7f2ø¿›máþü Í>ö)Ô¢ 5rÎåIΪË9¤2ÖÑøœ4³Ò–<Ôä-½úAJÑÆv86»ôÛwsïoT8ç›c÷ðÞJìÈ3ó\þZkå(ß2c„T%óòÿÌÿ<‹ì˜í¿u_ýgÍÊꜿ¶„ü¯ánQ?Å®NÛªZÞ·qèü!È¥ZÕ/þä×Ï~äÚÍVF~äªúïã›úÿw³ý×fìÿ†­!2drÿ þÿ×qÑÿ´¡—¬Pr€ô—Mµ(././@LongLink0000644000000000000000000000023600000000000007774 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/www.eclipse.org/technology/epp/downloads/release/version/point_release/eclipse-php-linux-gtk.tar.gz.sha512ubuntu-make-18.09+disco1/tests/data/server-content/www.eclipse.org/technology/epp/downloads/release/0000644000000000000000000000024013352651520030473 0ustar c58b4e12d671ea45d6c73c39adbb34a9763e42b888d52d1bf31420a894e160ba2f8ed52a0bc95e6b2b55e671cb54ead2e39dd5728738151ad2b2acc665c5621b eclipse-java-linux-gtk.tar.gz ubuntu-make-18.09+disco1/tests/data/server-content/www.mozilla.org/0000755000000000000000000000000013352651520022147 5ustar ././@LongLink0000644000000000000000000000017000000000000007771 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/www.mozilla.org/?product=firefox-aurora-latest-l10n&os=linux&lang=bgubuntu-make-18.09+disco1/tests/data/server-content/www.mozilla.org/?product=firefox-aurora-latest-l10000644000000000000000000000052413352651520030425 0ustar ‹’é`ZíÖÑjƒ0Æq¯} ÇîÛœ˜s²×±ml­µl¿8Z6Æf•jÆàûÝj!¢)}ãÊúm,HÖr?’eõu¼IH3³a£XEÄÊ&/¹¨›KÛM–%'_œüÀÿî=ÿ§Êkÿßv¾®ŠÆ»vîÍ0º¿(cŒ ý £ ?ößìWEYÎ6GXÄŒ:ÿZÂïÄšB5Û  ÿGÿMS¿¶®Yä;0êüç:W$ÆHúç$„óÃ÷þÛCSŸÜ¼Û`B-šû÷¿É úÇðK¿­«Ùî“úsþ÷@¡ ƒýw®,.ÇîÑ}0½¿%‹óŨþבôËê\í'Ï1îþgDX4…¿ ·?¶¸ÿÅpë™ãîù׿³?õ÷ÿ\…k úGðü´ÞøjÝÒ´=:wÎD¥½&xÜ;n]Sr(././@LongLink0000644000000000000000000000017200000000000007773 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/www.mozilla.org/?product=firefox-aurora-latest-l10n&os=linux64&lang=bgubuntu-make-18.09+disco1/tests/data/server-content/www.mozilla.org/?product=firefox-aurora-latest-l10000777000000000000000000000000013352651520042237 2?product=firefox-aurora-latest-l10n&os=linux&lang=bgustar ././@LongLink0000644000000000000000000000017200000000000007773 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/www.mozilla.org/?product=firefox-aurora-latest-ssl&os=linux&lang=en-USubuntu-make-18.09+disco1/tests/data/server-content/www.mozilla.org/?product=firefox-aurora-latest-ss0000644000000000000000000000053013352651520030533 0ustar ‹ê`ZíÖÑNƒ0†aŽwýÛþíîÃxŒ×dƒXôò-ºEctƒ jL¾ç¤ #)ÉKKK߸²~Í’‰ÀZîG²,¾Žg IfÖ¬›D±°IÊs>ÔÙ±íò&M“½Ï÷þÂ}×þÿ§ÊSÿ/:_Wyã];õË0¼¿5’mè¯É*ôáÇþ®zxz\æe9Í}`cô õ/M¸Nýï$ÓLú¿÷_7õKëšY¾ƒÖ¿’JÑ–Ã}¤È0Ö ßûÛ¦Þ»i_ƒýeøôû¿Výcø¥¿/êj²sÀ¨þ¬>öþ1\ì¿qe~Üu·¾ãû[²XÿQ êI®–‡êyôÃÎÚ6’ÂÆ/dØ,Î1œûŸÆY渺þ¥þìOýù_ £Ð?†û»lí«¬Ý.íιCjÄ⯟ n÷<àÔ(././@LongLink0000644000000000000000000000017400000000000007775 Lustar ubuntu-make-18.09+disco1/tests/data/server-content/www.mozilla.org/?product=firefox-aurora-latest-ssl&os=linux64&lang=en-USubuntu-make-18.09+disco1/tests/data/server-content/www.mozilla.org/?product=firefox-aurora-latest-ss0000777000000000000000000000000013352651520042736 2?product=firefox-aurora-latest-ssl&os=linux&lang=en-USustar ubuntu-make-18.09+disco1/tests/data/server-content/www.mozilla.org/en-US/0000755000000000000000000000000013352651520023076 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/www.mozilla.org/en-US/firefox/0000755000000000000000000000000013352651520024540 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/www.mozilla.org/en-US/firefox/developer/0000755000000000000000000000000013352651520026525 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/www.mozilla.org/en-US/firefox/developer/all0000644000000000000000000042023613352651520027227 0ustar Mozilla Firefox Web Browser — Download Developer Edition in your language — Mozilla
Mozilla

Firefox Developer Edition

Download Developer Edition in your language

Download Firefox Developer Edition in your language to experience the newest features and innovations in an unstable environment even before they go to Beta. Give us feedback that will determine what makes it to Final Release and help shape the future of Firefox.

Check the system requirements
Release notes

Fully localized versions

Language Windows Windows 64-bit Mac OS X Linux Linux 64-bit
Acholi Acholi Download Download Download Download Download
Afrikaans Afrikaans Download Download Download Download Download
Albanian Shqip Download Download Download Download Download
Arabic عربي Download Download Download Download Download
Aragonese aragonés Download Download Download Download Download
Armenian Õ€Õ¡ÕµÕ¥Ö€Õ¥Õ¶ Download Download Download Download Download
Assamese অসমীয়া Download Download Download Download Download
Asturian Asturianu Download Download Download Download Download
Azerbaijani Azərbaycanca Download Download Download Download Download
Basque Euskara Download Download Download Download Download
Belarusian БеларуÑÐºÐ°Ñ Download Download Download Download Download
Bengali (Bangladesh) বাংলা (বাংলাদেশ) Download Download Download Download Download
Bengali (India) বাংলা (ভারত) Download Download Download Download Download
Bodo बर' Download Download Download Download Download
Bosnian Bosanski Download Download Download Download Download
Breton Brezhoneg Download Download Download Download Download
Bulgarian БългарÑки Download Download Download Download Download
Burmese မြန်မာဘာသာ Download Download Download Download Download
Catalan Català Download Download Download Download Download
Chinese (Simplified) 中文 (简体) Download Download Download Download Download
Chinese (Traditional) 正體中文 (ç¹é«”) Download Download Download Download Download
Croatian Hrvatski Download Download Download Download Download
Czech Čeština Download Download Download Download Download
Danish Dansk Download Download Download Download Download
Dutch Nederlands Download Download Download Download Download
English (British) English (British) Download Download Download Download Download
English (South African) English (South African) Download Download Download Download Download
English (US) English (US) Download Download Download Download Download
Esperanto Esperanto Download Download Download Download Download
Estonian Eesti keel Download Download Download Download Download
Finnish suomi Download Download Download Download Download
French Français Download Download Download Download Download
Frisian Frysk Download Download Download Download Download
Fulah Pulaar-Fulfulde Download Download Download Download Download
Gaelic (Scotland) Gàidhlig Download Download Download Download Download
Galician Galego Download Download Download Download Download
German Deutsch Download Download Download Download Download
Greek Ελληνικά Download Download Download Download Download
Gujarati (India) ગà«àªœàª°àª¾àª¤à«€ (ભારત) Download Download Download Download Download
Hebrew עברית Download Download Download Download Download
Hindi (India) हिनà¥à¤¦à¥€ (भारत) Download Download Download Download Download
Hungarian magyar Download Download Download Download Download
Icelandic íslenska Download Download Download Download Download
Indonesian Bahasa Indonesia Download Download Download Download Download
Irish Gaeilge Download Download Download Download Download
Italian Italiano Download Download Download Download Download
Japanese 日本語 Download Download Download Download Download
Kannada ಕನà³à²¨à²¡ Download Download Download Download Download
Kashmiri كشمیری Download Download Download Download Download
Kazakh Қазақ Download Download Download Download Download
Khmer ážáŸ’មែរ Download Download Download Download Download
Konkani कोंकनी Download Download Download Download Download
Korean 한국어 Download Download Download Download Download
Latvian Latviešu Download Download Download Download Download
Ligurian Ligure Download Download Download Download Download
Lithuanian lietuvių kalba Download Download Download Download Download
Lower Sorbian Dolnoserbšćina Download Download Download Download Download
Macedonian МакедонÑки Download Download Download Download Download
Maithili मैथिली মৈথিলী Download Download Download Download Download
Malay Melayu Download Download Download Download Download
Malayalam മലയാളം Download Download Download Download Download
Marathi मराठी Download Download Download Download Download
Norwegian (Bokmål) Norsk bokmål Download Download Download Download Download
Norwegian (Nynorsk) Norsk nynorsk Download Download Download Download Download
Occitan (Lengadocian) occitan (lengadocian) Download Download Download Download Download
Oriya ଓଡ଼ିଆ Download Download Download Download Download
Persian ÙØ§Ø±Ø³ÛŒ Download Download Download Download Download
Polish Polski Download Download Download Download Download
Portuguese (Brazilian) Português (do Brasil) Download Download Download Download Download
Portuguese (Portugal) Português (Europeu) Download Download Download Download Download
Punjabi (India) ਪੰਜਾਬੀ (ਭਾਰਤ) Download Download Download Download Download
Romanian română Download Download Download Download Download
Romansh rumantsch Download Download Download Download Download
Russian РуÑÑкий Download Download Download Download Download
Santali संताली Download Download Download Download Download
Serbian СрпÑки Download Download Download Download Download
Sinhala සිංහල Download Download Download Download Download
Slovak slovenÄina Download Download Download Download Download
Slovenian SlovenÅ¡Äina Download Download Download Download Download
Songhai Soŋay Download Download Download Download Download
Spanish (Argentina) Español (de Argentina) Download Download Download Download Download
Spanish (Chile) Español (de Chile) Download Download Download Download Download
Spanish (Mexico) Español (de México) Download Download Download Download Download
Spanish (Spain) Español (de España) Download Download Download Download Download
Swedish Svenska Download Download Download Download Download
Tamil தமிழ௠Download Download Download Download Download
Telugu తెలà±à°—à± Download Download Download Download Download
Thai ไทย Download Download Download Download Download
Turkish Türkçe Download Download Download Download Download
Ukrainian УкраїнÑька Download Download Download Download Download
Upper Sorbian Hornjoserbsce Download Download Download Download Download
Uzbek Oʻzbek tili Download Download Download Download Download
Vietnamese Tiếng Việt Download Download Download Download Download
Welsh Cymraeg Download Download Download Download Download
Xhosa isiXhosa Download Download Download Download Download

No matching languages found.

ubuntu-make-18.09+disco1/tests/data/server-content/www.rust-lang.org/0000755000000000000000000000000013352651520022414 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/www.rust-lang.org/en-US/0000755000000000000000000000000013352651520023343 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/www.rust-lang.org/en-US/downloads.html0000644000000000000000000000000013352651520026211 0ustar ubuntu-make-18.09+disco1/tests/data/server-content/www.rust-lang.org/en-US/other-installers.html0000644000000000000000000010302413352651520027530 0ustar Other Installation Methods · The Rust Programming Language

Other Rust Installation Methods

Which installer should you use?

Rust runs on many platforms, and there are many ways to install Rust. If you want to install Rust in the most straightforward, recommended way, then follow the instructions on the main installation page.

That page describes installation via rustup, a tool that manages multiple Rust toolchains in a consistent way across all platforms Rust supports. Why might one not want to install using those instructions?

  • Offline installation. rustup downloads components from the internet on demand. If you need to install Rust without access to the internet, rustup is not suitable.
  • Preference for the system package manager. On Linux in particular, but also on macOS with Homebrew, and Windows with Chocolatey, developers sometimes prefer to install Rust with their platform’s package manager.
  • Preference against curl | sh. On Unix, we usually install rustup by running a shell script via curl. Some have concerns about the security of this arrangement and would prefer to download and run the installer themselves.
  • Validating signatures. Although rustup performs its downloads over HTTPS, the only way to verify the signatures of Rust installers today is to do so manually with the standalone installers.
  • GUI installation and integration with “Add/Remove Programs†on Windows. rustup runs in the console and does not register its installation like typical Windows programs. If you prefer a more typical GUI installation on Windows there are standalone .msi installers. In the future rustup will also have a GUI installer on Windows.

Rust’s platform support is defined in three tiers, which correspond closely with the installation methods available: in general, the Rust project provides binary builds for all tier 1 and tier 2 platforms, and they are all installable via rustup. Some tier 2 platforms though have only the standard library available, not the compiler itself; that is, they are cross-compilation targets only; Rust code can run on those platforms, but they do not run the compiler itself. Such targets can be installed with the rustup target add command.

Other ways to install rustup

The way to install rustup differs by platform:

  • On Unix, run curl https://sh.rustup.rs -sSf | sh in your shell. This downloads and runs rustup-init.sh, which in turn downloads and runs the correct version of the rustup-init executable for your platform.
  • On Windows, download and run rustup-init.exe.

rustup-init can be configured interactively, and all options can additionally be controlled by command-line arguments, which can be passed through the shell script. Pass --help to rustup-init as follows to display the arguments rustup-init accepts:

curl https://sh.rustup.rs -sSf | sh -s -- --help

If you prefer not to use the shell script, you may directly download rustup-init for the platform of your choice:

Standalone installers

The official Rust standalone installers contain a single release of Rust, and are suitable for offline installation. They come in three forms: tarballs (extension .tar.gz), that work in any Unix-like environment, Windows installers (.msi), and Mac installers (.pkg). These installers come with rustc, cargo, rustdoc, the standard library, and the standard documentation, but do not provide access to additional cross-targets like rustup does.

The most common reasons to use these are:

  • Offline installation
  • Prefering a more platform-integrated, graphical installer on Windows

Each of these binaries is signed with the Rust signing key, which is available on keybase.io, by the Rust build infrastructure, with GPG. In the tables below, the .asc files are the signatures.

Past releases can be found in the archives.

Stable (1.14.0)

aarch64-unknown-linux-gnu .tar.gz .asc
arm-unknown-linux-gnueabi .tar.gz .asc
arm-unknown-linux-gnueabihf .tar.gz .asc
i686-apple-darwin .tar.gz .asc
i686-apple-darwin .pkg .asc
i686-pc-windows-gnu .tar.gz .asc
i686-pc-windows-gnu .msi .asc
i686-pc-windows-msvc .tar.gz .asc
i686-pc-windows-msvc .msi .asc
i686-unknown-linux-gnu .tar.gz .asc
mips-unknown-linux-gnu .tar.gz .asc
mipsel-unknown-linux-gnu .tar.gz .asc
mips64-unknown-linux-gnuabi64 .tar.gz .asc
powerpc-unknown-linux-gnu .tar.gz .asc
powerpc64-unknown-linux-gnu .tar.gz .asc
powerpc64le-unknown-linux-gnu .tar.gz .asc
s390x-unknown-linux-gnu .tar.gz .asc
x86_64-apple-darwin .tar.gz .asc
x86_64-apple-darwin .pkg .asc
x86_64-pc-windows-gnu .tar.gz .asc
x86_64-pc-windows-gnu .msi .asc
x86_64-pc-windows-msvc .tar.gz .asc
x86_64-pc-windows-msvc .msi .asc
x86_64-unknown-freebsd .tar.gz .asc
x86_64-unknown-linux-gnu .tar.gz .asc
x86_64-unknown-netbsd .tar.gz .asc

Beta (1.15)

aarch64-unknown-linux-gnu .tar.gz .asc
arm-unknown-linux-gnueabi .tar.gz .asc
arm-unknown-linux-gnueabihf .tar.gz .asc
i686-apple-darwin .tar.gz .asc
i686-apple-darwin .pkg .asc
i686-pc-windows-gnu .tar.gz .asc
i686-pc-windows-gnu .msi .asc
i686-pc-windows-msvc .tar.gz .asc
i686-pc-windows-msvc .msi .asc
i686-unknown-linux-gnu .tar.gz .asc
mips-unknown-linux-gnu .tar.gz .asc
mipsel-unknown-linux-gnu .tar.gz .asc
mips64-unknown-linux-gnuabi64 .tar.gz .asc
powerpc-unknown-linux-gnu .tar.gz .asc
powerpc64-unknown-linux-gnu .tar.gz .asc
powerpc64le-unknown-linux-gnu .tar.gz .asc
s390x-unknown-linux-gnu .tar.gz .asc
x86_64-apple-darwin .tar.gz .asc
x86_64-apple-darwin .pkg .asc
x86_64-pc-windows-gnu .tar.gz .asc
x86_64-pc-windows-gnu .msi .asc
x86_64-pc-windows-msvc .tar.gz .asc
x86_64-pc-windows-msvc .msi .asc
x86_64-unknown-freebsd .tar.gz .asc
x86_64-unknown-linux-gnu .tar.gz .asc
x86_64-unknown-netbsd .tar.gz .asc

Nightly (1.16)

aarch64-unknown-linux-gnu .tar.gz .asc
arm-unknown-linux-gnueabi .tar.gz .asc
arm-unknown-linux-gnueabihf .tar.gz .asc
i686-apple-darwin .tar.gz .asc
i686-apple-darwin .pkg .asc
i686-pc-windows-gnu .tar.gz .asc
i686-pc-windows-gnu .msi .asc
i686-pc-windows-msvc .tar.gz .asc
i686-pc-windows-msvc .msi .asc
i686-unknown-linux-gnu .tar.gz .asc
mips-unknown-linux-gnu .tar.gz .asc
mipsel-unknown-linux-gnu .tar.gz .asc
mips64-unknown-linux-gnuabi64 .tar.gz .asc
powerpc-unknown-linux-gnu .tar.gz .asc
powerpc64-unknown-linux-gnu .tar.gz .asc
powerpc64le-unknown-linux-gnu .tar.gz .asc
s390x-unknown-linux-gnu .tar.gz .asc
x86_64-apple-darwin .tar.gz .asc
x86_64-apple-darwin .pkg .asc
x86_64-pc-windows-gnu .tar.gz .asc
x86_64-pc-windows-gnu .msi .asc
x86_64-pc-windows-msvc .tar.gz .asc
x86_64-pc-windows-msvc .msi .asc
x86_64-unknown-freebsd .tar.gz .asc
x86_64-unknown-linux-gnu .tar.gz .asc
x86_64-unknown-netbsd .tar.gz .asc

Source code

Stable .tar.gz .asc
Beta .tar.gz .asc
Nightly .tar.gz .asc
ubuntu-make-18.09+disco1/tests/data/server-content/www.scala-lang.org/0000755000000000000000000000000013352651520022502 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/www.scala-lang.org/download/0000755000000000000000000000000013352651520024311 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/www.scala-lang.org/download/index.html0000644000000000000000000003460613352651520026317 0ustar Download | The Scala Programming Language

Download

Choose one of three ways to get started with Scala!
1

Download Scala 2.11.7 binaries for your system (All downloads).

Need help installing?

~ or ~
2

Get started with Typesafe Activator
Typesafe Activator is a browser-based or command-line
tool that helps developers get started with Scala.

~ or ~

Release Notes

For important changes, please consult the release notes.

Software Requirements

The Scala software distribution can be installed on any platform with a Java runtime, version 1.6 or later.

Additional information

You can find the links to prior versions or the latest development version below. To see a detailed list of changes for each version of Scala please refer to the changelog. Note that the different major releases of Scala (e.g. Scala 2.9.3 and Scala 2.10.1) are not binary compatible.

License

The Scala distribution is released under the 3-clause BSD license.
ubuntu-make-18.09+disco1/tests/data/server-content/www.scala-lang.org/fake-scala.tgz0000644000000000000000000000037413352651520025223 0ustar ‹:ÂUíÒÁNƒ0ÇñžûÿUOÆI[(=,{³C7AÈ têãÛÕ‰Ñ,&Cãöû\ZZJ¾6®qóÒm‹„MEÖšý¨¬‘ãñSÚmÓܤ–I¥­É™ÉN4²¼ë‰Ø“»ï]ë¿}ïÐþ?5|ô_×í4wà'ýó\…þ©ÑýçþññØß8Ô_ezÔ?¬«,ÌÉcä+gÞÿb»¯ÝPq^—tKâòJÐrI"ñIU4Mw¯… Õ‚|U´œ‚bSu$âö5=w}s'ÞÖ_jO’—53ÅÿúNÛ+/¶4.(ubuntu-make-18.09+disco1/tests/data/server-content/www.stencyl.com/0000755000000000000000000000000013352651520022150 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/www.stencyl.com/download/0000755000000000000000000000000013352651520023757 5ustar ubuntu-make-18.09+disco1/tests/data/server-content/www.stencyl.com/download/index.html0000644000000000000000000005013713352651520025762 0ustar Download Stencyl

Download Stencyl 3.1

Build 7305 - May 23rd, 2014



Mac (10.8 and above)



Download

Windows



Download


Having trouble with the newly released 3.1? Let us know.




What's New in Stencyl 3.1?

Summary
Full Changelist

New to Stencyl? Start Here.

Follow our crash course for beginners. You'll be creating games in no time.


Want to publish to iPhone, iPad, Android & Desktop?

Stencyl is free to use for Flash publishing. Publish to iOS, Android, Windows, Mac & Linux by upgrading today.





Are you upgrading from 3.0 or later?

Uninstall your prior copy and install the new version to the same location. There is no upgrade process for games, but as always, you should back them up.


Are you upgrading an existing game from 2.0-2.2?

Read our upgrade guide and be sure to back your games up before opening them in 3.0 (or above).


Can't even run a blank game? (The game shows "Compiling" forever)

See this, then post a question on the forums.


Minimum Requirements

  • Mac OS X 10.8 (Mountain Lion) or later. Stencyl does not work on 10.7 and below.
  • Windows XP or later. Preferably not Vista.
  • Ubuntu 10 or later.

Recommended Requirements

  • Mac OS X 10.9 (Mavericks) or later. You will not be able to publish iPhone or Mac apps with 10.8 or below, starting with Stencyl 3.2.
  • Windows 7 or later. Preferably not Vista.
  • Ubuntu 12 or later.

Where did the sample games go?

They're now available on our Developer Center, so we can update them separately from a release.


Major Known Issues

  • On Mac, you must install Stencyl to a path with *no* spaces or () in it, or games will fail to run.
  • On Mac, project names must contain no spaces or () in it, or they'll fail to run.
  • Games may not auto-start on an iOS Device. You must tap the icon to launch the app when directed.





ubuntu-make-18.09+disco1/tests/data/server-content/www.stencyl.com/lin0000644000000000000000000000052613352651520022660 0ustar ‹ë-Uí—Ánƒ0 @9ó™ÖÃzhq'ù}AÑJGC`êþ~PµˆÃ:ŠD˜¦æ]|É&'ŽklL•Dþ¥i#U†±‡PÆ¥@ ‚)hD„ÇšzšªÖ®-%Ë3W¦Õ­÷Æž_¾£ÿwõ¿wfSä¶9%o¹÷o¸Ï+ŸQE…hý+*ø_‚üÏžc’ä­Éƒÿ%x­M¿ ¯9Fý+Þùg ¨ ÝþRD¼VuáÁý??÷ûjÇiFV/Yî¬>²‚u¼Mnœ{ý©ãø¯KÌÀ/†gË1Úÿ ¯óEŠÝù¯XèÿEôUs$Bc?™®uRÖ;ãüÝï›ÿcRa7ÿ£aþ_„³Ï9&ùçÝýŸ#ÿ‹0èÿ<-í†Ã‰ÃöhßgÌÑ®‡”8¥ÿ¥’2œÿ@ à“oDϼrubuntu-make-18.09+disco1/tests/data/spring.io.crt0000644000000000000000000000240113352651520016530 0ustar -----BEGIN CERTIFICATE----- MIIDhTCCAm2gAwIBAgIJANd9J6BAtBP4MA0GCSqGSIb3DQEBCwUAMFkxCzAJBgNV BAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX aWRnaXRzIFB0eSBMdGQxEjAQBgNVBAMMCXNwcmluZy5pbzAeFw0xNjAxMzEyMTMz MTBaFw0yNTEyMDkyMTMzMTBaMFkxCzAJBgNVBAYTAkFVMRMwEQYDVQQIDApTb21l LVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQxEjAQBgNV BAMMCXNwcmluZy5pbzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAK0G m+lnjqwqdTaTEzAF4MHZ8TCef84rR3jAvtlI0zoGKoPpE3M7Y8GRrKGsur4HdH2Q U08W2pm1Ve+MHg90K+M83p375Byou/vl1dLvxyBNq5mW2s6jwc6S+sgt0A9jGm7D nJFwdesDey0hRULgvZn3WmzhtI8CmjZ8DwG8ompWw35KupHqpeOrCoYkhZzgFENu pefEaZ97TGOwe/vWjRLyb576N0RpbLnNH2ePQnbMhPJ1eRBhRPL9NNm9GIkHUN5L MkJpkuCi/LYnwopJowNiED79X06vBISy1SNQpNZSEN1/926CI2oeH3dspQ0s1RKT tISlzWp0DZdjnXSKwyMCAwEAAaNQME4wHQYDVR0OBBYEFKiq4jCdiGRESUkCrCzQ PcjDLikeMB8GA1UdIwQYMBaAFKiq4jCdiGRESUkCrCzQPcjDLikeMAwGA1UdEwQF MAMBAf8wDQYJKoZIhvcNAQELBQADggEBAJG0neIXxTai+LWapryH8EpUai/rzuY3 qAhgyKOaylwmDQtKRkOmK3jEHRe8f3IIRG9chO7v+sQhTQIE+wTcqo4b+U7WL3dN 0MzhB1+xrLdf+mL6igAV+91MQzN4HG7/vzYoN86BRzQvPSaQF3TPJRAbrMdLwldM r19VLvjVKxVtSMrlj8tat04yPBQnnR+WFWpY6UDdNPCIXWvkUL9BW4GaNQkyXlbo 7nTGSmOQxEthAUiFZ2CZr4WLsbW+1+zkeg7lfutbnmM9hL5cC1TH2QZ2pGblpOcx KlGv2hyLzTjwPa05IAVJ51LK9u/6OGLG8Mt2NXnqBVLIfhyTWbBESak= -----END CERTIFICATE----- ubuntu-make-18.09+disco1/tests/data/spring.io.pem0000644000000000000000000000565113352651520016533 0ustar -----BEGIN PRIVATE KEY----- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCtBpvpZ46sKnU2 kxMwBeDB2fEwnn/OK0d4wL7ZSNM6BiqD6RNzO2PBkayhrLq+B3R9kFNPFtqZtVXv jB4PdCvjPN6d++QcqLv75dXS78cgTauZltrOo8HOkvrILdAPYxpuw5yRcHXrA3st IUVC4L2Z91ps4bSPApo2fA8BvKJqVsN+SrqR6qXjqwqGJIWc4BRDbqXnxGmfe0xj sHv71o0S8m+e+jdEaWy5zR9nj0J2zITydXkQYUTy/TTZvRiJB1DeSzJCaZLgovy2 J8KKSaMDYhA+/V9OrwSEstUjUKTWUhDdf/dugiNqHh93bKUNLNUSk7SEpc1qdA2X Y510isMjAgMBAAECggEBAJlq6MfWON1TcEcJtdO5AocgNgoEIBKwsVjSnuaO+ivS 19PK0KI2IMe74TQhshtZBONpG1VfUElGToJu3SCaw2djy4iNlsAKpVQ/gI7eaNOt yuAOsMjUzr3Z+V+Rr5BVMVTRQXx8GTJfDdMAUydvmu5wMs+kebLsfcydx7ikh+Z8 vrBurG0wM5Uiup3htqQmNB/sETBLpzrdOGQTjTXwTWnJRDG5yjaJP75AKcbTitAS oj0htsW03nKhmm7jBwzV44KGhesaggF9k5OPy8C8OZ5CGu1P80o6r9MRWdd50TTR x/y56DhHG7AL+E7DX5OzrMr6XHPd/qCDQOVCF2eN6cECgYEA2oUrg7ahHO20eQoy kyoesOAUJPAKjBuRLdU5JbOqN4WzWlp/Ttx6L07/AWnMCFS1k2XkfurqqOZojOuh 8Gj8XRQ29VIHy3oGyo+Dysv+7RkUE7JWaUKeeBgRgxGXQMbBjTl3+nciHYBr+aA8 /FMD/JvZVWR6HI9X/MWT48uySfMCgYEAyrPcyQnXVXbSIuwvdlkBnknK1mn5E5ye RRJrCAjniGzjz7FEn9IQW9fm3eWG4gsxTefdZO/MQCdmmMp1q9AoxEwDTTSciuWD 2MS121ozTG3ntGQTAZju2wJ2deG93SDUWHlaDqqipGycAShct2bAEsDv2yoHL2m/ 2orV4ZDJPhECgYB1yMQcucr76dCWUX3TPyfN1OpmwpAc1xsY5k5oWQBN7x4ufIsU edjOOTlQjLMyZl589bYFByC3K4J9OuFN0Xj9vtCkyLN05PBWLKcwH2boa9UbjMvw 7ry2JNsDl+68NqXLNofKFH7qAfexVMKqiyCh/2tVENSVIlqd3+2IIpqWKwKBgE2i DVFB36Lv2xNc+eCNvjztbi4ocCi+ty8lGrD9GA/8BFQrRGkhfvpt+hHKMpqoRr3b q8NYxBVeAcFK6T5gfvyPUERlff8EYDbJQA0+wp7nCPLh0RWviOuASfZj+t+SD0HD WGZ9m8T1g9o9pyTmyXFlS3fY5N+X1M7SlY/KcAjBAoGAQNixliS1YPOw2CYN2cv1 XP4lGPdVeFYU+4DZvFU+kWbFxr/4W+pCPZviiwLDh75wWn8Zq/PNx1BYM/532VSE kciBOUqSgDTX2UCH5VBzf0pOAc+CEco6hI1Nteq0/y1NdrSs1jhNc34Zmb1l28m9 IWsQTbxlnNDpg82xNXnXHVc= -----END PRIVATE KEY----- -----BEGIN CERTIFICATE----- MIIDhTCCAm2gAwIBAgIJANd9J6BAtBP4MA0GCSqGSIb3DQEBCwUAMFkxCzAJBgNV BAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX aWRnaXRzIFB0eSBMdGQxEjAQBgNVBAMMCXNwcmluZy5pbzAeFw0xNjAxMzEyMTMz MTBaFw0yNTEyMDkyMTMzMTBaMFkxCzAJBgNVBAYTAkFVMRMwEQYDVQQIDApTb21l LVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQxEjAQBgNV BAMMCXNwcmluZy5pbzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAK0G m+lnjqwqdTaTEzAF4MHZ8TCef84rR3jAvtlI0zoGKoPpE3M7Y8GRrKGsur4HdH2Q U08W2pm1Ve+MHg90K+M83p375Byou/vl1dLvxyBNq5mW2s6jwc6S+sgt0A9jGm7D nJFwdesDey0hRULgvZn3WmzhtI8CmjZ8DwG8ompWw35KupHqpeOrCoYkhZzgFENu pefEaZ97TGOwe/vWjRLyb576N0RpbLnNH2ePQnbMhPJ1eRBhRPL9NNm9GIkHUN5L MkJpkuCi/LYnwopJowNiED79X06vBISy1SNQpNZSEN1/926CI2oeH3dspQ0s1RKT tISlzWp0DZdjnXSKwyMCAwEAAaNQME4wHQYDVR0OBBYEFKiq4jCdiGRESUkCrCzQ PcjDLikeMB8GA1UdIwQYMBaAFKiq4jCdiGRESUkCrCzQPcjDLikeMAwGA1UdEwQF MAMBAf8wDQYJKoZIhvcNAQELBQADggEBAJG0neIXxTai+LWapryH8EpUai/rzuY3 qAhgyKOaylwmDQtKRkOmK3jEHRe8f3IIRG9chO7v+sQhTQIE+wTcqo4b+U7WL3dN 0MzhB1+xrLdf+mL6igAV+91MQzN4HG7/vzYoN86BRzQvPSaQF3TPJRAbrMdLwldM r19VLvjVKxVtSMrlj8tat04yPBQnnR+WFWpY6UDdNPCIXWvkUL9BW4GaNQkyXlbo 7nTGSmOQxEthAUiFZ2CZr4WLsbW+1+zkeg7lfutbnmM9hL5cC1TH2QZ2pGblpOcx KlGv2hyLzTjwPa05IAVJ51LK9u/6OGLG8Mt2NXnqBVLIfhyTWbBESak= -----END CERTIFICATE----- ubuntu-make-18.09+disco1/tests/data/static.rust-lang.org.crt0000644000000000000000000000243613352651520020620 0ustar -----BEGIN CERTIFICATE----- MIIDmzCCAoOgAwIBAgIJAKbUz32xIfD5MA0GCSqGSIb3DQEBCwUAMGQxCzAJBgNV BAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX aWRnaXRzIFB0eSBMdGQxHTAbBgNVBAMMFHN0YXRpYy5ydXN0LWxhbmcub3JnMB4X DTE3MDIyMzExNDMxMVoXDTI3MDEwMjExNDMxMVowZDELMAkGA1UEBhMCQVUxEzAR BgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0IFdpZGdpdHMgUHR5 IEx0ZDEdMBsGA1UEAwwUc3RhdGljLnJ1c3QtbGFuZy5vcmcwggEiMA0GCSqGSIb3 DQEBAQUAA4IBDwAwggEKAoIBAQC0h4G6acgOIIcW1elqxDQOms7eVDNsloWsH02i 0WjcLA/wv7BC0n7VFtBrw/BdLqRKxu/Rn6NLwYmidnisT6hFOVTROkAZLfc/hITB en52UMN1XYAmkSjalLh2u8nUaozmVlC4NWhlDq9WXWWE6iQ8DM+WnEzl9LyQ1vHk 9RPR5yovXyGxs4BN7hRMwmNlOIgeD8y1tN+DcP6vIbuXenIPeWQ+3/pVXG7O3OyJ F+e5MQhriHz9uIPeyjZWuQabkf7IVBwiYAzmFxaMWi/gpUMQyjqx+Ef6aZOhhVcA xSWZJGl5pXIucdVJhtRa8k6DCzI7lz8HBbeIRD5L/Xkx5uzxAgMBAAGjUDBOMB0G A1UdDgQWBBRfWv1yWtu887u55eMRSicrKaJ2zjAfBgNVHSMEGDAWgBRfWv1yWtu8 87u55eMRSicrKaJ2zjAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQCq rCSRhhKAKvMNXo7SoOoJPwKjO7+84fwSyZrdRBUc7adA5HISt+Rd9jR/DxTmfBdl FzCYyVV7QBWyTdoI3X5x7O4Z0bOPG5ssMBurCrY6D/YOFW0NvAtZQmiwrTJKOra8 f7Fv42BoIH99Fs66Uygdol358HuCwzfw3MJW8ASidRbYsA7oThWPE8ibVIXMQU4P dVTAbb8NB7JkqKHAD5fILmkPsU9IrLxXrCN1MU56uwzmRMn2Jp4w8C6b6x9gbmZj /V/WAcwAGXL4tZ2fXGx+GEqu7ITuv37SDB0TFZXIEksWr9ZGNsu1/3EpnMfFs5X9 I22I4fG7RgIO0Ek1Eu1w -----END CERTIFICATE----- ubuntu-make-18.09+disco1/tests/data/static.rust-lang.org.pem0000644000000000000000000000570613352651520020614 0ustar -----BEGIN PRIVATE KEY----- MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQC0h4G6acgOIIcW 1elqxDQOms7eVDNsloWsH02i0WjcLA/wv7BC0n7VFtBrw/BdLqRKxu/Rn6NLwYmi dnisT6hFOVTROkAZLfc/hITBen52UMN1XYAmkSjalLh2u8nUaozmVlC4NWhlDq9W XWWE6iQ8DM+WnEzl9LyQ1vHk9RPR5yovXyGxs4BN7hRMwmNlOIgeD8y1tN+DcP6v IbuXenIPeWQ+3/pVXG7O3OyJF+e5MQhriHz9uIPeyjZWuQabkf7IVBwiYAzmFxaM Wi/gpUMQyjqx+Ef6aZOhhVcAxSWZJGl5pXIucdVJhtRa8k6DCzI7lz8HBbeIRD5L /Xkx5uzxAgMBAAECggEAVC2naSPwG95A/33pZFZuq6y172e1vtmFJRhHnDcnPRry p+DKMK50Y6pKryVjTB/2jcOricR1YVqyceXqKPbP0M+F5DXUM6mCU8TYHlue4k6Q hYZ+vf0L3rhgN0UjPIAeiT0QUITe09iAG7ZbIxoGoVWb6m+hT8zJrIP9sTQx9Lqb +/R7Zy/xBg1toQgQftlxxk8Pr1UhUCF2zv3i/LxIXRAOoSF4XM9j5poClEHxT/Wg /v0ZeNT8i1cVuB7vMA9p6rmlGXZrr5IcezdkQudtK4uaaZBFyHKfBmdreoNj0es/ YjWNFldVgWxaG146ake8HbKqp+7Tkn7YrXFwSZv+AQKBgQDgqQN7Yqia/Evn4fh9 9Cm3G28UIbns2bXgV6A6jDqbCz2KgBxqTA1WFT6ywSWfWa5Uma6JAAMIdRI9hT32 daR1m4ztREJOTc4HRMrFtX3TlhCHAwboZMXjHQGLTzbc7PeoYoLYnyJyDRmkL3V2 I0UVdbejMOxJH7zBTsIspK3foQKBgQDNtoGnd7PpxGokDYThUhzksucsct3ZLWGO 2CQSqysn2p7a93f2WoUdjOjU9XBWrqabjdgbMnTfqR7k6Yjf4w5EEeYwTsCODIEn OjDy8PXCAPj3ln4KgfU4oXrGPZUZo+F7dHds3j7LKoRlpOVrionVuNLUmpVZ/YPR S5diRf9LUQKBgA6nl72NsvfhK0Zl/CKjMbFrDbTfelRT40ROEvqeuRfyBMKrFq9s ZJZP7nYUmVKqs+960uLG6Gu9z0HKFj+kbuTpD6lOgZDADId22k9JRnrt2Agmj2XL ZQkqlDY1JZwFrSYDvwtIXiPYbOrD2cKqDFCZDDCN+WvPsS1e6NWmrFzhAoGAN6cC WI4XzExo8qv9oP+X9X8471t8DT8rv3tV9v77w+JvS4nbmHhQvvfaHZLw+2JwjHDJ YEI8QC3+v6s2bmt89olpHvSPP16+qiAiEfeCZSPiNwktvCYAc3usPWl3puIhJEcT 8A4IKuqrutvrfTaTp5BC6WWQtjHRsZOjtuB8+qECgYB4KATv21HzMaZeXR6NSfDj 6IjZAz7v05+rj+m61qE44bYlGJwn/MJwmyAzaNOXuRU8iJSgWTFNRpjD4FOFsNIx QdSk/l9vh6HmcFrUh7/XXGB8Ly9ue0WEC/TBuVI8iyFWkHXJL85hLxRlui8yUTPj cmz23ndUoH53mebDh87mgw== -----END PRIVATE KEY----- -----BEGIN CERTIFICATE----- MIIDmzCCAoOgAwIBAgIJAKbUz32xIfD5MA0GCSqGSIb3DQEBCwUAMGQxCzAJBgNV BAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX aWRnaXRzIFB0eSBMdGQxHTAbBgNVBAMMFHN0YXRpYy5ydXN0LWxhbmcub3JnMB4X DTE3MDIyMzExNDMxMVoXDTI3MDEwMjExNDMxMVowZDELMAkGA1UEBhMCQVUxEzAR BgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0IFdpZGdpdHMgUHR5 IEx0ZDEdMBsGA1UEAwwUc3RhdGljLnJ1c3QtbGFuZy5vcmcwggEiMA0GCSqGSIb3 DQEBAQUAA4IBDwAwggEKAoIBAQC0h4G6acgOIIcW1elqxDQOms7eVDNsloWsH02i 0WjcLA/wv7BC0n7VFtBrw/BdLqRKxu/Rn6NLwYmidnisT6hFOVTROkAZLfc/hITB en52UMN1XYAmkSjalLh2u8nUaozmVlC4NWhlDq9WXWWE6iQ8DM+WnEzl9LyQ1vHk 9RPR5yovXyGxs4BN7hRMwmNlOIgeD8y1tN+DcP6vIbuXenIPeWQ+3/pVXG7O3OyJ F+e5MQhriHz9uIPeyjZWuQabkf7IVBwiYAzmFxaMWi/gpUMQyjqx+Ef6aZOhhVcA xSWZJGl5pXIucdVJhtRa8k6DCzI7lz8HBbeIRD5L/Xkx5uzxAgMBAAGjUDBOMB0G A1UdDgQWBBRfWv1yWtu887u55eMRSicrKaJ2zjAfBgNVHSMEGDAWgBRfWv1yWtu8 87u55eMRSicrKaJ2zjAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQCq rCSRhhKAKvMNXo7SoOoJPwKjO7+84fwSyZrdRBUc7adA5HISt+Rd9jR/DxTmfBdl FzCYyVV7QBWyTdoI3X5x7O4Z0bOPG5ssMBurCrY6D/YOFW0NvAtZQmiwrTJKOra8 f7Fv42BoIH99Fs66Uygdol358HuCwzfw3MJW8ASidRbYsA7oThWPE8ibVIXMQU4P dVTAbb8NB7JkqKHAD5fILmkPsU9IrLxXrCN1MU56uwzmRMn2Jp4w8C6b6x9gbmZj /V/WAcwAGXL4tZ2fXGx+GEqu7ITuv37SDB0TFZXIEksWr9ZGNsu1/3EpnMfFs5X9 I22I4fG7RgIO0Ek1Eu1w -----END CERTIFICATE----- ubuntu-make-18.09+disco1/tests/data/storage.googleapis.com.crt0000644000000000000000000000244613352651520021202 0ustar -----BEGIN CERTIFICATE----- MIIDnzCCAoegAwIBAgIJANR5WAxHskyBMA0GCSqGSIb3DQEBCwUAMGYxCzAJBgNV BAYTAkZSMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX aWRnaXRzIFB0eSBMdGQxHzAdBgNVBAMMFnN0b3JhZ2UuZ29vZ2xlYXBpcy5jb20w HhcNMTUwOTMwMTQyMzA2WhcNMjUwODA4MTQyMzA2WjBmMQswCQYDVQQGEwJGUjET MBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0cyBQ dHkgTHRkMR8wHQYDVQQDDBZzdG9yYWdlLmdvb2dsZWFwaXMuY29tMIIBIjANBgkq hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2QSwjmoXclIlhWX0rbJByhCsprxmWu8p 1sicZa3jP5XRMrjHCyKwZDsjMmNVQCSuhJCpUUiZKS7JjKGDefbh+gQoCm2b2wzC aB0fAvaVL57mhzPDINwD+d/rc9ckxiCsim5v6667ZVQFlHE49FY6G2LvnUBOhJhi bz10cftuHQ6WGdTsfF63c8zNfII61A5sKju3PW2aDT4UBIoE2yGqX/oltzJKwObn tydvQrOOpBjp1/mDVNadhMYesP/71Awd/EVCUcVWpFaSX0tkkb+zyWI26HTfNHMB cP+g3kaqbbFfQB4p/zqwZW85/5Kvqllzj44mtkGZFDoi9gv8z1fFiQIDAQABo1Aw TjAdBgNVHQ4EFgQU20v78UMwwLEe2B7OnXlWjeYeBKkwHwYDVR0jBBgwFoAU20v7 8UMwwLEe2B7OnXlWjeYeBKkwDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQsFAAOC AQEAiIA9TlycwXcIPGSw72QMmlZesazTKPCImLWNWWh/WPU4y0lXcPXB4aKo1G3N jksK4wBITBpXuFU4aZolqxS6NoZEdyjHd4V9oPDGl4ZtwVas35P6ehnhHzhu1Tld QKynp+4e2V3tv4tcc4nnxDN4SXBNlMKIfJ6CaTbo0GlzJHNHBWlIIDdG2TjM3axP o996KFvAQkdq3WqWzmoNXOGS1Bkd52fJgtqr+mWNNGc2Yiox3teidQ98hKg6Wubs fkUS8A+H0d+ViAVY30IThuiS5MEiGQxNoZH/XVdn+SzSs9eyOZFScGSBaBruJynR kj7ar0lcF+c/ksbVXVA5LkqMKQ== -----END CERTIFICATE----- ubuntu-make-18.09+disco1/tests/data/storage.googleapis.com.pem0000644000000000000000000000572213352651520021173 0ustar -----BEGIN PRIVATE KEY----- MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDZBLCOahdyUiWF ZfStskHKEKymvGZa7ynWyJxlreM/ldEyuMcLIrBkOyMyY1VAJK6EkKlRSJkpLsmM oYN59uH6BCgKbZvbDMJoHR8C9pUvnuaHM8Mg3AP53+tz1yTGIKyKbm/rrrtlVAWU cTj0VjobYu+dQE6EmGJvPXRx+24dDpYZ1Ox8XrdzzM18gjrUDmwqO7c9bZoNPhQE igTbIapf+iW3MkrA5ue3J29Cs46kGOnX+YNU1p2Exh6w//vUDB38RUJRxVakVpJf S2SRv7PJYjbodN80cwFw/6DeRqptsV9AHin/OrBlbzn/kq+qWXOPjia2QZkUOiL2 C/zPV8WJAgMBAAECggEBAJ2Fy+nzlAVFHzsO4GVb6GkVZVy5j8odo07l2q/rYfH7 exfIC6JHkaWPT2L5ux2OAqbyohQAEDxWW7GaYuaajzh839uB6Ak937bWvHXYKj2g p1AoAFDPooszP6Kb3XN6sALjWpXGBPvt2wb+kAq6s/7A95A650NToM+B2g4KJMkt QH4yr5kQ2uDr0mNSNMmr3hKRuVjk87N6jA/8oERRwj3hzoB5qIr0D2hcF636NJxd rU/F7cX3tNMdp9OHfyqG9ZveGPI/npB/27GsPg1/ZdIvhH/lsvDEGkmx5qdduXQa 3aMjfXN30vJv7St1oxC36I4X3XYPs9nPz+Fu08IiVAECgYEA+fPep18WLMXWNGHo QC/aecJ1qshc8DK12zRtSSS9daEFGLRlTx01hOf+hhTLwfxKhpxwt06MJPUfmkK9 vJOx+4avbmuMgos/w14MC6jPiZ5BIbaZzhzm5/Vo7QAjPFSM7L5xDV372ZQrmC84 5kBA9LMkVvOSmXRb1IdjQJFTAkkCgYEA3kTVvrpTOtGTFhboE0+iQlcoEYt+ZpUA UaP4GCbKSne/lqiVax7D+46CNkOgQQieXU4YER0GfK3RGg2AlUfU7g9m8HkzG+Mc JWRVL+SoSuE2QAYzF/IQiJzbOrNq7MJWHAvxilU1SkAIfbT/VLrbTPEZA/Y7hZhh DBe4zFayqUECgYEAz4TcR6NXWsbKB+V9mMTiI5MCdE8zciz39U16qm55ac7M12z2 a4+5nmWqWJGtdZnMGiSKJHZvPkPRABcHRihtbYGt5wQdvUh1IPPVFl0KKZydQKtE 2O3/+3cxrQsfNfiQpAGdBNcRwNwWsZwLJocUJtUQh6xj+0my8CmTisjc3RkCgYAJ XSsIGv9wpe2la5ehYKR8WQGmI5NSrQpTZi4IjnHNS1g196o71hL5oRpZQOYad0t8 sNKQvgFM9WGu0EzPfTQ6R0nV7bU6gonoBV8VYnO4m95WOiyi4J7TspAF3BMwIEvS aKpnYomZNDNnYF21ax3cEvgz04bUbQQBp2owqaJjQQKBgQDRgvhjtknvb43SoVBg snEZ27iVuMV5rtLca4rY9sSMaziiAx+xk4OWWyrtgq10GC0BgjjbxuRrpiFPf5X0 CVgqEHyiBcPEM/uTJFanL14vV+Ve5NXXF89AZsw2h3rd4jp1btOKoJfqZFkKQ6nb YCxWJ3ue//bLmESPTval4xPCSQ== -----END PRIVATE KEY----- -----BEGIN CERTIFICATE----- MIIDnzCCAoegAwIBAgIJANR5WAxHskyBMA0GCSqGSIb3DQEBCwUAMGYxCzAJBgNV BAYTAkZSMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX aWRnaXRzIFB0eSBMdGQxHzAdBgNVBAMMFnN0b3JhZ2UuZ29vZ2xlYXBpcy5jb20w HhcNMTUwOTMwMTQyMzA2WhcNMjUwODA4MTQyMzA2WjBmMQswCQYDVQQGEwJGUjET MBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0cyBQ dHkgTHRkMR8wHQYDVQQDDBZzdG9yYWdlLmdvb2dsZWFwaXMuY29tMIIBIjANBgkq hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2QSwjmoXclIlhWX0rbJByhCsprxmWu8p 1sicZa3jP5XRMrjHCyKwZDsjMmNVQCSuhJCpUUiZKS7JjKGDefbh+gQoCm2b2wzC aB0fAvaVL57mhzPDINwD+d/rc9ckxiCsim5v6667ZVQFlHE49FY6G2LvnUBOhJhi bz10cftuHQ6WGdTsfF63c8zNfII61A5sKju3PW2aDT4UBIoE2yGqX/oltzJKwObn tydvQrOOpBjp1/mDVNadhMYesP/71Awd/EVCUcVWpFaSX0tkkb+zyWI26HTfNHMB cP+g3kaqbbFfQB4p/zqwZW85/5Kvqllzj44mtkGZFDoi9gv8z1fFiQIDAQABo1Aw TjAdBgNVHQ4EFgQU20v78UMwwLEe2B7OnXlWjeYeBKkwHwYDVR0jBBgwFoAU20v7 8UMwwLEe2B7OnXlWjeYeBKkwDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQsFAAOC AQEAiIA9TlycwXcIPGSw72QMmlZesazTKPCImLWNWWh/WPU4y0lXcPXB4aKo1G3N jksK4wBITBpXuFU4aZolqxS6NoZEdyjHd4V9oPDGl4ZtwVas35P6ehnhHzhu1Tld QKynp+4e2V3tv4tcc4nnxDN4SXBNlMKIfJ6CaTbo0GlzJHNHBWlIIDdG2TjM3axP o996KFvAQkdq3WqWzmoNXOGS1Bkd52fJgtqr+mWNNGc2Yiox3teidQ98hKg6Wubs fkUS8A+H0d+ViAVY30IThuiS5MEiGQxNoZH/XVdn+SzSs9eyOZFScGSBaBruJynR kj7ar0lcF+c/ksbVXVA5LkqMKQ== -----END CERTIFICATE----- ubuntu-make-18.09+disco1/tests/data/sublimetext.com.crt0000644000000000000000000000242213352651520017745 0ustar -----BEGIN CERTIFICATE----- MIIDkTCCAnmgAwIBAgIJAKNVhjJ4JVJsMA0GCSqGSIb3DQEBCwUAMF8xCzAJBgNV BAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX aWRnaXRzIFB0eSBMdGQxGDAWBgNVBAMMD3N1YmxpbWV0ZXh0LmNvbTAeFw0xNjA0 MTQxOTUwMTFaFw0yNjAyMjExOTUwMTFaMF8xCzAJBgNVBAYTAkFVMRMwEQYDVQQI DApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQx GDAWBgNVBAMMD3N1YmxpbWV0ZXh0LmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEP ADCCAQoCggEBAL0DrlB6ZFJME/Vt8REKCe9bFx4Wr0kVIO3yP3JZkB56mkfYILH0 LZKFpV/A3ZXO22EmQj63RDnOCwfjB0fTVV+YOlJF6q1O+u5NPT/P53lxB5nbnorg hc/OYVMvHaUDqccLNTTMEnEc7bQrcbGYTxAXWI+wLvKDcqgVTUbxz6ghX3PB2TiY OXVJ9mnN+9GcA6XV6HwWsTb5TnkBefAkl6aQrHhsJ2GR40N8+8NWgG4Z2C2o9tyu PBRKp6AM8787IPMKF49MgdJ5xVGRSUi4Mbj3RR+xP5JJUMfI9VWmkcWvyCbRsNKh DkhthluiZXN0dj+M5757N5EBulsLViG9znECAwEAAaNQME4wHQYDVR0OBBYEFGRx UCvrqmTwehwfmKdtkJTR7MOTMB8GA1UdIwQYMBaAFGRxUCvrqmTwehwfmKdtkJTR 7MOTMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBADMNb/vweUJ6KXte 6fbgMqzDvdxy+0oDs/NdzWXGLeC5Y1XnO3qhZ8LBeLkDbsKFB5juzbxaQerUFR9e kQZCVlkr85VHwGYXw5FStUkxSsMS5JdXeSdps2JvXBjBNVX75LVNfLp0tZmJNQgu OyTTG/u7lJ4KN4PsRkj37IvaCwV2i5FvB2wbeX7N4KbM/uvmJjkILUh4m4D7iGtj PIDxCdb8P6EnFREBDDRzuZjVaOkNknA6x7V96N6YGtg7ypCLlmNqabcuRY8/eO5C G5nTAKU8l9JuLE+yzgYt2vrXf/8/uKmD9QaKdkzsSup7fNImUW1QismyHOwqpC9z TBbfEG0= -----END CERTIFICATE----- ubuntu-make-18.09+disco1/tests/data/sublimetext.com.pem0000644000000000000000000000567213352651520017750 0ustar -----BEGIN PRIVATE KEY----- MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC9A65QemRSTBP1 bfERCgnvWxceFq9JFSDt8j9yWZAeeppH2CCx9C2ShaVfwN2VztthJkI+t0Q5zgsH 4wdH01VfmDpSReqtTvruTT0/z+d5cQeZ256K4IXPzmFTLx2lA6nHCzU0zBJxHO20 K3GxmE8QF1iPsC7yg3KoFU1G8c+oIV9zwdk4mDl1SfZpzfvRnAOl1eh8FrE2+U55 AXnwJJemkKx4bCdhkeNDfPvDVoBuGdgtqPbcrjwUSqegDPO/OyDzChePTIHSecVR kUlIuDG490UfsT+SSVDHyPVVppHFr8gm0bDSoQ5IbYZbomVzdHY/jOe+ezeRAbpb C1Yhvc5xAgMBAAECggEAIDrLc2+bQak1UglALN6gWQ8YPwoxM24F4m0HQpFhEMFp I00ILi/rwWtGirBRWGUgZU1nyFfpq02l9d9Rc37mtNk5QKQpYwnvocjL4+CooL2U RTj8rMOiLZAMamnDTUr1nTodBXaywlTjd3Bc/6JwANdqQ34QU0v0thKDzdAXz5wu C3UPkITz/CriECDZekjbHTsqY4r8UAwmC+OMknvwhx2ipr77BoYeg8l2PmzqR59F bnUkvpRhWvHKVyKXcLioiecf10VINX2dxA+M2nOwLYc4yMaJ2bJMtZNDWmQVnlbt SdFIThwL6WY1wFIEdmV64ZPC+HyIq1gZU0MI4q6YLQKBgQDpWgAiprXOvIt3DjVI 7ts5/aOkOyfQsAeZkTLqQG7uJ1xRdiJFQnWyqIPucjygrt1khbQFE8q/qz1g2AzM 4wMWvdM2p/tfA4skN3/+3JoLMMECBgFUcPesNBpzQCF8tx0ryatx3rXw+vOEMHes edHhula4tGSccdBQR7RvjqEP2wKBgQDPXA0DHbRnzz46kGEQR5xPAQ0YXjlmp4JY 7YsQHAIbU6zQBAPhfc9DUtXRgYCrkpNF3l+rZNhmXXrXGug+ys5tQBqARHWMlL/G p+iJ8mqmVRgtJ35Uo+piz2GbUGJUhqsV2jFOy93ffGPUbnoJNp5EXOyW/dIhKTWR fg+VdoMCowKBgElaIjrCPtpKyGhXTgasFrum8F66vaxK+UibrO6X7IbuVoXA5crx tj+/2yEEReyYqz1jDhCehRg1AulDYNqy7ZCjgRZoPYtDeOSckZ6Sx9WGsNUrABYE IMa/5iSeXyhuAzx1e3Ai+vxSVmQSPDw6WvBi+8m54vqOiFYEBEMhCZ4LAoGBAIAI FRy0bZyfMIwWc2gK3y9EteIy43xHt0rTOMb0lDRtQMmbgQ3skVm/PrhCHsFRGk/M kwOPm7HwzBUezwFeVYDNUM+b9Xycp6CwMftiy4jyB6BxvyXho6no5Bpy0pPgJqiy dTly1QbVlgonQICJ0cTiH07HX8QL3sB7toGRkCjDAoGBALm9HcVMtJvAecNrlTqO EpyggYwdocnxsBCXwAzHbiV96sAo2RtDzvX1ykWBE1WCAIsYZCNlzO7Rhgtivs9F h7edvxBn3qWWwXwfZao/JQfyJx+ZTsBU2gOZF3RhbVmHx+Q2TkB5HFRF/TI7fZIR Hh60phxnQAzb5kDBAEUbfjvm -----END PRIVATE KEY----- -----BEGIN CERTIFICATE----- MIIDkTCCAnmgAwIBAgIJAKNVhjJ4JVJsMA0GCSqGSIb3DQEBCwUAMF8xCzAJBgNV BAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX aWRnaXRzIFB0eSBMdGQxGDAWBgNVBAMMD3N1YmxpbWV0ZXh0LmNvbTAeFw0xNjA0 MTQxOTUwMTFaFw0yNjAyMjExOTUwMTFaMF8xCzAJBgNVBAYTAkFVMRMwEQYDVQQI DApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQx GDAWBgNVBAMMD3N1YmxpbWV0ZXh0LmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEP ADCCAQoCggEBAL0DrlB6ZFJME/Vt8REKCe9bFx4Wr0kVIO3yP3JZkB56mkfYILH0 LZKFpV/A3ZXO22EmQj63RDnOCwfjB0fTVV+YOlJF6q1O+u5NPT/P53lxB5nbnorg hc/OYVMvHaUDqccLNTTMEnEc7bQrcbGYTxAXWI+wLvKDcqgVTUbxz6ghX3PB2TiY OXVJ9mnN+9GcA6XV6HwWsTb5TnkBefAkl6aQrHhsJ2GR40N8+8NWgG4Z2C2o9tyu PBRKp6AM8787IPMKF49MgdJ5xVGRSUi4Mbj3RR+xP5JJUMfI9VWmkcWvyCbRsNKh DkhthluiZXN0dj+M5757N5EBulsLViG9znECAwEAAaNQME4wHQYDVR0OBBYEFGRx UCvrqmTwehwfmKdtkJTR7MOTMB8GA1UdIwQYMBaAFGRxUCvrqmTwehwfmKdtkJTR 7MOTMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBADMNb/vweUJ6KXte 6fbgMqzDvdxy+0oDs/NdzWXGLeC5Y1XnO3qhZ8LBeLkDbsKFB5juzbxaQerUFR9e kQZCVlkr85VHwGYXw5FStUkxSsMS5JdXeSdps2JvXBjBNVX75LVNfLp0tZmJNQgu OyTTG/u7lJ4KN4PsRkj37IvaCwV2i5FvB2wbeX7N4KbM/uvmJjkILUh4m4D7iGtj PIDxCdb8P6EnFREBDDRzuZjVaOkNknA6x7V96N6YGtg7ypCLlmNqabcuRY8/eO5C G5nTAKU8l9JuLE+yzgYt2vrXf/8/uKmD9QaKdkzsSup7fNImUW1QismyHOwqpC9z TBbfEG0= -----END CERTIFICATE----- ubuntu-make-18.09+disco1/tests/data/swift.org.crt0000644000000000000000000000240513352651520016546 0ustar -----BEGIN CERTIFICATE----- MIIDiTCCAnGgAwIBAgIJALgNuEPn0NBYMA0GCSqGSIb3DQEBCwUAMFsxCzAJBgNV BAYTAkZSMRMwEQYDVQQIDApTb21lLVN0YXRlMSMwIQYDVQQKDBpNb2NrIGNlcnRp ZmljYXRlIGZvciBzd2lmdDESMBAGA1UEAwwJc3dpZnQub3JnMB4XDTE2MDExMTA5 MTMzM1oXDTI1MTExOTA5MTMzM1owWzELMAkGA1UEBhMCRlIxEzARBgNVBAgMClNv bWUtU3RhdGUxIzAhBgNVBAoMGk1vY2sgY2VydGlmaWNhdGUgZm9yIHN3aWZ0MRIw EAYDVQQDDAlzd2lmdC5vcmcwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB AQDFuYqdj9M/XqfKFKKIHmevbzHpdMVXpRy07FwaDdIlaJ18jepDZlbpYtmp7twV ab74IQelt4YrzuspXXoYif4JCfo1IJHM6eL0vVOyh9Agv6Op+7xu1ZKUDahkbbJe l6QwyGgl+v30vYyraDXOFbxWVNcVlkHRCLUfPo98aVKlcbzTQn3vlu4NHrR6SaQI hxgZlZtE27sVSZHnYuBAXnWVRvu+A9MT2pXV6TcJbhpnn0sKuQCEv77iOo28rr0r BoBG+mxxsCH3htI1M3qe0f9qSQke9xy6b13Rhh4VqtvdS/8JkM0o4cwcVkr8twE2 jOTaASa16ZT4YhzNPv/YV531AgMBAAGjUDBOMB0GA1UdDgQWBBRzuTe5u+FcqtKb HqQNRdS13sKQuDAfBgNVHSMEGDAWgBRzuTe5u+FcqtKbHqQNRdS13sKQuDAMBgNV HRMEBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQDDhkOjx++RxFFQn1ogPj53uw30 y23SvFwB2LPL+KiPNmDnZh25EhExrlI/3V6C3yFLMhs/y/DzXoWVjDHanSrBeHs/ kTKTVPOfSDjp1n8fnBHOZcpMVsFzUeU7e424OiJR8VmzxNtPNqnSx5l3Z4MPGaer ejO08r3qgrUBbj4SJk0+iIRaHCyOlYZQzXJ5uO0HlqIA+XvcBNOI0VHle/owYZPv yFg3wjb8sq8XdJ6OR57gSP8R7JFMxQtvJhmJJ5UgzUS2F/kVVDSQVBgmEqef3pva z4HZqBpg+rwZppywQtH7WTQ0iA57BbB2pCTV2FZM1KPmtIr60mfFN98KM0zO -----END CERTIFICATE----- ubuntu-make-18.09+disco1/tests/data/swift.org.pem0000644000000000000000000000565513352651520016551 0ustar -----BEGIN PRIVATE KEY----- MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDFuYqdj9M/XqfK FKKIHmevbzHpdMVXpRy07FwaDdIlaJ18jepDZlbpYtmp7twVab74IQelt4Yrzusp XXoYif4JCfo1IJHM6eL0vVOyh9Agv6Op+7xu1ZKUDahkbbJel6QwyGgl+v30vYyr aDXOFbxWVNcVlkHRCLUfPo98aVKlcbzTQn3vlu4NHrR6SaQIhxgZlZtE27sVSZHn YuBAXnWVRvu+A9MT2pXV6TcJbhpnn0sKuQCEv77iOo28rr0rBoBG+mxxsCH3htI1 M3qe0f9qSQke9xy6b13Rhh4VqtvdS/8JkM0o4cwcVkr8twE2jOTaASa16ZT4YhzN Pv/YV531AgMBAAECggEADAgiWzwpSq3j3/Qpf8b54D8P9njYmWC+wnOvlxZIN2aK Ts4D913+4+zT+fdDBTqOGGNKJ9dnHrtUrAu4Jk4fW0V0KE93D9UbrnDm6vJAw/1l ZC6hZM0yQjgiixnxxLfNkfpf/A+t7HqsWLHatFO2RjqbbADcuG+jNeeEq7ltAgwy PSaZIS08WQm6i6wXANWZ9BwYEgbaIELnrLjTl6fDy2tLmlaNDLC603u7iVF4/puG G+0r9SVGqXctKKAy19dwl/4lBuMcXpEap7mzDXMEIzQL30Czby/69prGtBxU9oS8 lMUnJDuq5m0vlf315Srvi52RSKir6bfiktmZ+vy/gQKBgQD52c6lZBrjdV2D8EhW HSFbpSzoESodF0ByUAvM+guoE1G5wuYldxfZ0mfYEgisFGScj5CHs1a2uaZteWQ4 TnBo7fWn/V8DWcimLArAvY419ap7QH7iwkt/WeRrLQBylaNt9yAUHe3kFnIEOjJC mYsCaQ8Lqeb2drRdm/gaMYAFiQKBgQDKl1ACJ/ZsRr0bppgdEua2cG0NtKlkBOb6 IGxd9sQS41UYiTp5yx8z6WhFOM7QqbpAGupXSgNc+TcBuEqNltrgsSv84KpEQPRF qNjy8AZRJQI9i378m72JT3a7957JpIAOBb9M2n/m3IvRd/S0JEWgSZajP8CXrVe1 xe+Kt50mDQKBgQC7yhNhiC4VjB8vjagw4VAzO6DXBB+tIc7UnIliFQYx2+NvRagJ vMt2coiOhG90Nxev/M/aztZ8HGmUmsrS71HZ7BDZpLyHHjKLg0rJty9uKylp3f4A nZx1KbFfRMGzXfkqK7Y2qJAnAR/NQZiJKjKrKx+d2qO311yVhychONdKUQKBgFST lvNPe7D4VzqT8i0xFuBTTzPJmG4JHeSOZK9VtcWs4nm70I3IHt6tMrqzXKQAN6FL m0mVvJGz+SLerUEvGXF0hcisgmi8NT5fnzLMwdZefPD0q68J1bbdVdRjLAdChbNU 8uhCz+KxcC2ixqXt/qNMFXdRxjWMSHG6kKZ4wUKBAoGBAME/bHER0mXGA+51F7XG bod4IoZZXMwry5Sg7Q7TvGlC5HC2omzISo+3MpYozzDsgddjxb80+8zAGo0ffE6s tKN7Jv2gDO7YsTA+52a2B2WgvbiFQ0QNdf663GkojV84tZ2dSqtYq9sutFTLCkPR xwgHSfN5eF6ViFf3YMAHZaV2 -----END PRIVATE KEY----- -----BEGIN CERTIFICATE----- MIIDiTCCAnGgAwIBAgIJALgNuEPn0NBYMA0GCSqGSIb3DQEBCwUAMFsxCzAJBgNV BAYTAkZSMRMwEQYDVQQIDApTb21lLVN0YXRlMSMwIQYDVQQKDBpNb2NrIGNlcnRp ZmljYXRlIGZvciBzd2lmdDESMBAGA1UEAwwJc3dpZnQub3JnMB4XDTE2MDExMTA5 MTMzM1oXDTI1MTExOTA5MTMzM1owWzELMAkGA1UEBhMCRlIxEzARBgNVBAgMClNv bWUtU3RhdGUxIzAhBgNVBAoMGk1vY2sgY2VydGlmaWNhdGUgZm9yIHN3aWZ0MRIw EAYDVQQDDAlzd2lmdC5vcmcwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB AQDFuYqdj9M/XqfKFKKIHmevbzHpdMVXpRy07FwaDdIlaJ18jepDZlbpYtmp7twV ab74IQelt4YrzuspXXoYif4JCfo1IJHM6eL0vVOyh9Agv6Op+7xu1ZKUDahkbbJe l6QwyGgl+v30vYyraDXOFbxWVNcVlkHRCLUfPo98aVKlcbzTQn3vlu4NHrR6SaQI hxgZlZtE27sVSZHnYuBAXnWVRvu+A9MT2pXV6TcJbhpnn0sKuQCEv77iOo28rr0r BoBG+mxxsCH3htI1M3qe0f9qSQke9xy6b13Rhh4VqtvdS/8JkM0o4cwcVkr8twE2 jOTaASa16ZT4YhzNPv/YV531AgMBAAGjUDBOMB0GA1UdDgQWBBRzuTe5u+FcqtKb HqQNRdS13sKQuDAfBgNVHSMEGDAWgBRzuTe5u+FcqtKbHqQNRdS13sKQuDAMBgNV HRMEBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQDDhkOjx++RxFFQn1ogPj53uw30 y23SvFwB2LPL+KiPNmDnZh25EhExrlI/3V6C3yFLMhs/y/DzXoWVjDHanSrBeHs/ kTKTVPOfSDjp1n8fnBHOZcpMVsFzUeU7e424OiJR8VmzxNtPNqnSx5l3Z4MPGaer ejO08r3qgrUBbj4SJk0+iIRaHCyOlYZQzXJ5uO0HlqIA+XvcBNOI0VHle/owYZPv yFg3wjb8sq8XdJ6OR57gSP8R7JFMxQtvJhmJJ5UgzUS2F/kVVDSQVBgmEqef3pva z4HZqBpg+rwZppywQtH7WTQ0iA57BbB2pCTV2FZM1KPmtIr60mfFN98KM0zO -----END CERTIFICATE----- ubuntu-make-18.09+disco1/tests/data/testframeworks/0000755000000000000000000000000013415340675017177 5ustar ubuntu-make-18.09+disco1/tests/data/testframeworks/__init__.py0000644000000000000000000000000013352651520021270 0ustar ubuntu-make-18.09+disco1/tests/data/testframeworks/anotherothercategory.py0000644000000000000000000000345013352651520024005 0ustar # -*- coding: utf-8 -*- # Copyright (C) 2014 Canonical # # Authors: # Didier Roche # # 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; version 3. # # 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 """Framework with another category module without any framework""" import umake.frameworks class CCategory(umake.frameworks.BaseCategory): def __init__(self): super().__init__(name="Category/C", description="Category C description") class FrameworkA(umake.frameworks.BaseFramework): def __init__(self, **kwargs): super().__init__(name="Framework A", description="Description for framework A (not installed)", **kwargs) def setup(self, install_path=None, auto_accept_license=False): super().setup() def remove(self): super().remove() @property def is_installed(self): return False class FrameworkB(umake.frameworks.BaseFramework): def __init__(self, **kwargs): super().__init__(name="Framework/B", description="Description for framework B (installed)", **kwargs) def setup(self, install_path=None, auto_accept_license=False): super().setup() def remove(self): super().remove() @property def is_installed(self): return True ubuntu-make-18.09+disco1/tests/data/testframeworks/baseinstallerfake.py0000644000000000000000000001171213352651520023224 0ustar # -*- coding: utf-8 -*- # Copyright (C) 2015 Canonical # # Authors: # Didier Roche # # 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; version 3. # # 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 """Base category module""" from contextlib import suppress from gettext import gettext as _ import logging import os import platform import re import umake.frameworks.baseinstaller from umake.tools import create_launcher, get_application_desktop_file, ChecksumType logger = logging.getLogger(__name__) _supported_archs = ['i386', 'amd64'] class BaseCategory(umake.frameworks.BaseCategory): def __init__(self): super().__init__(name="Base", description=_("Base category"), logo_path=None) def parse_license(self, tag, line, license_txt, in_license): """Parse Android download page for license""" if line.startswith(tag): in_license = True if in_license: if line.startswith(''): in_license = False else: license_txt.write(line) return in_license def parse_download_link(self, tag, line, in_download): """Parse Android download links, expect to find a md5sum and a url""" url, md5sum = (None, None) if tag in line: in_download = True if in_download: p = re.search(r'href="(.*)"', line) with suppress(AttributeError): url = p.group(1) p = re.search(r'(\w+)', line) with suppress(AttributeError): # ensure the size can match a md5 or sha1 checksum if len(p.group(1)) > 15: md5sum = p.group(1) if "" in line: in_download = False if url is None and md5sum is None: return (None, in_download) return ((url, md5sum), in_download) class BaseFramework(umake.frameworks.baseinstaller.BaseInstaller): def __init__(self, **kwargs): super().__init__(name="Base Framework", description=_("Base Framework (default)"), is_category_default=True, only_on_archs=_supported_archs, expect_license=True, packages_requirements=["jayatana"], download_page="http://localhost:8765/index.html", checksum_type=ChecksumType.sha1, dir_to_decompress_in_tarball="base-framework-*", desktop_filename="base-framework.desktop", required_files_path=[os.path.join("bin", "studio.sh")], **kwargs) arch = platform.machine() self.tag = 'id="linux-bundle64"' if arch == 'i686': self.tag = 'id="linux-bundle32"' def parse_license(self, line, license_txt, in_license): """Parse download page for license""" if line.startswith('

'): in_license = True if in_license: if line.startswith(''): in_license = False else: license_txt.write(line) return in_license def parse_download_link(self, line, in_download): """Parse download links, expect to find a md5sum and a url""" url, md5sum = (None, None) if self.tag in line: in_download = True if in_download: p = re.search(r'href="(.*)"', line) with suppress(AttributeError): url = p.group(1) p = re.search(r'(\w+)', line) with suppress(AttributeError): # ensure the size can match a md5 or sha1 checksum if len(p.group(1)) > 15: md5sum = p.group(1) if "" in line: in_download = False if url is None and md5sum is None: return (None, in_download) return ((url, md5sum), in_download) def post_install(self): """Create the launcher""" create_launcher(self.desktop_filename, get_application_desktop_file(name=_("Base Framework"), icon_path=os.path.join(self.install_path, "bin", "studio.png"), try_exec=os.path.join(self.install_path, "bin", "studio.sh"), exec=self.exec_link_name, comment=_("Base Framework developer environment"), categories="Development;IDE;", extra="StartupWMClass=jetbrains-base-framework")) ubuntu-make-18.09+disco1/tests/data/testframeworks/category_f.py0000644000000000000000000000434313352651520021671 0ustar # -*- coding: utf-8 -*- # Copyright (C) 2014 Canonical # # Authors: # Didier Roche # # 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; version 3. # # 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 """Framework with package requirements""" import umake.frameworks class CategoryF(umake.frameworks.BaseCategory): def __init__(self): super().__init__(name="Category F", description="Category F to test installed state") class FrameworkA(umake.frameworks.BaseFramework): def __init__(self, **kwargs): super().__init__(name="Framework A", description="Description for framework A (impossible path)", install_path_dir="/foo/bar/baz", **kwargs) def setup(self, install_path=None, auto_accept_license=False): super().setup() def remove(self): super().remove() class FrameworkB(umake.frameworks.BaseFramework): def __init__(self, **kwargs): super().__init__(name="Framework B", description="Description for framework B (good install dir, " "no package req)", install_path_dir="/", **kwargs) def setup(self, install_path=None, auto_accept_license=False): super().setup() def remove(self): super().remove() class FrameworkC(umake.frameworks.BaseFramework): def __init__(self, **kwargs): super().__init__(name="Framework C", description="Description for framework C (good install dir, package req.)", install_path_dir="/", packages_requirements=["foo", "bar"], **kwargs) def setup(self, install_path=None, auto_accept_license=False): super().setup() def remove(self): super().remove() ubuntu-make-18.09+disco1/tests/data/testframeworks/category_g.py0000644000000000000000000000346513352651520021676 0ustar # -*- coding: utf-8 -*- # Copyright (C) 2014 Canonical # # Authors: # Didier Roche # # 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; version 3. # # 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 """Framework with package requirements on Category""" import umake.frameworks class CategoryG(umake.frameworks.BaseCategory): def __init__(self): super().__init__(name="Category G", description="Category G to test installed state", packages_requirements=["baz"]) class FrameworkA(umake.frameworks.BaseFramework): def __init__(self, **kwargs): super().__init__(name="Framework A", description="Description for framework A (with add req.)", install_path_dir="/", packages_requirements=["buz", "biz"], **kwargs) def setup(self, install_path=None, auto_accept_license=False): super().setup() def remove(self): super().remove() class FrameworkB(umake.frameworks.BaseFramework): def __init__(self, **kwargs): super().__init__(name="Framework B", description="Description for framework B (with no req.)", install_path_dir="/", **kwargs) def setup(self, install_path=None, auto_accept_license=False): super().setup() def remove(self): super().remove() ubuntu-make-18.09+disco1/tests/data/testframeworks/emptycategory.py0000644000000000000000000000170713352651520022444 0ustar # -*- coding: utf-8 -*- # Copyright (C) 2014 Canonical # # Authors: # Didier Roche # # 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; version 3. # # 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 """Framework with an empty category""" import umake.frameworks class EmptyCategory(umake.frameworks.BaseCategory): def __init__(self): super().__init__(name="Empty category", description="Category which has no frameworks") ubuntu-make-18.09+disco1/tests/data/testframeworks/framework_for_removal.py0000644000000000000000000000445313352651520024141 0ustar # -*- coding: utf-8 -*- # Copyright (C) 2014 Canonical # # Authors: # Didier Roche # # 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; version 3. # # 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 """Framework only marked for removal""" import umake.frameworks class RCategory(umake.frameworks.BaseCategory): def __init__(self): super().__init__(name="Category R", description="Only containing one framework for removal") class FrameworkRuninstalled(umake.frameworks.BaseFramework): def __init__(self, **kwargs): super().__init__(name="Framework R uninstalled", description="For removal", only_for_removal=True, **kwargs) def setup(self, install_path=None, auto_accept_license=False): super().setup() def remove(self): super().remove() class FrameworkRinstalled(umake.frameworks.BaseFramework): def __init__(self, **kwargs): super().__init__(name="Framework R installed", description="For removal", only_for_removal=True, **kwargs) def setup(self, install_path=None, auto_accept_license=False): super().setup() def remove(self): super().remove() @property def is_installed(self): return True class FrameworkRinstallednotinstallable(umake.frameworks.BaseFramework): def __init__(self, **kwargs): super().__init__(name="Framework R installed not installable", description="For removal without only for removal", **kwargs) def setup(self, install_path=None, auto_accept_license=False): print("here") super().setup() def remove(self): super().remove() @property def is_installed(self): return True @property def is_installable(self): return False ubuntu-make-18.09+disco1/tests/data/testframeworks/is_installable.py0000644000000000000000000000520313352651520022530 0ustar # -*- coding: utf-8 -*- # Copyright (C) 2014 Canonical # # Authors: # Didier Roche # # 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; version 3. # # 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 """Framework with another category module without any framework""" import umake.frameworks class ECategory(umake.frameworks.BaseCategory): def __init__(self): super().__init__(name="Category E", description="Category E description") class FrameworkA(umake.frameworks.BaseFramework): def __init__(self, **kwargs): super().__init__(name="Framework A", description="Description for framework A (installable chained to parent)", **kwargs) def setup(self, install_path=None, auto_accept_license=False): super().setup() def remove(self): super().remove() @property def is_installable(self): return super().is_installable class FrameworkB(umake.frameworks.BaseFramework): def __init__(self, **kwargs): super().__init__(name="Framework B", description="Description for framework B (installable forced to True even " "with archs restrictions)", only_on_archs=["archswhichdontexist"], only_ubuntu_version=["versionwhichdontexist"], **kwargs) def setup(self, install_path=None, auto_accept_license=False): super().setup() def remove(self): super().remove() @property def is_installable(self): """overridden to say True""" return True class FrameworkC(umake.frameworks.BaseFramework): def __init__(self, **kwargs): super().__init__(name="Framework C", description="Description for framework C (installable forced to False " "even with no restriction", **kwargs) def setup(self, install_path=None, auto_accept_license=False): super().setup() def remove(self): super().remove() @property def is_installable(self): """overridden to say False""" return False ubuntu-make-18.09+disco1/tests/data/testframeworks/oneframeworkcategory.py0000644000000000000000000000252713352651520024006 0ustar # -*- coding: utf-8 -*- # Copyright (C) 2014 Canonical # # Authors: # Didier Roche # # 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; version 3. # # 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 """One framework with category module""" import umake.frameworks class OneFrameworkCategory(umake.frameworks.BaseCategory): def __init__(self): super().__init__(name="One framework category", description="Category with one framework") class FrameworkA(umake.frameworks.BaseFramework): def __init__(self, **kwargs): super().__init__(name="Framework A", description="Description for framework A", install_path_dir="custom/frameworka", **kwargs) def setup(self, install_path=None, auto_accept_license=False): super().setup() def remove(self): super().remove() ubuntu-make-18.09+disco1/tests/data/testframeworks/othercategory.py0000644000000000000000000000341313352651520022423 0ustar # -*- coding: utf-8 -*- # Copyright (C) 2014 Canonical # # Authors: # Didier Roche # # 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; version 3. # # 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 """Framework with another category module without any framework""" import umake.frameworks class BCategory(umake.frameworks.BaseCategory): def __init__(self): super().__init__(name="Category/B", description="Category B description") class FrameworkA(umake.frameworks.BaseFramework): def __init__(self, **kwargs): super().__init__(name="Framework A", description="Description for framework A", **kwargs) def setup(self, install_path=None, auto_accept_license=False): super().setup() def remove(self): super().remove() @property def is_installed(self): return True class FrameworkB(umake.frameworks.BaseFramework): def __init__(self, **kwargs): super().__init__(name="Framework/B", description="Description for framework B", **kwargs) def setup(self, install_path=None, auto_accept_license=False): super().setup() def remove(self): super().remove() @property def is_installed(self): return True ubuntu-make-18.09+disco1/tests/data/testframeworks/restrictions.py0000644000000000000000000000440313352651520022274 0ustar # -*- coding: utf-8 -*- # Copyright (C) 2014 Canonical # # Authors: # Didier Roche # # 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; version 3. # # 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 """Framework with another category module without any framework""" import umake.frameworks class DCategory(umake.frameworks.BaseCategory): def __init__(self): super().__init__(name="Category D", description="Category D description (with restricted frameworks)") class FrameworkA(umake.frameworks.BaseFramework): def __init__(self, **kwargs): super().__init__(name="Framework A", description="Description for framework A (restricted arch)", only_on_archs=["foo", "baz"], **kwargs) def setup(self, install_path=None, auto_accept_license=False): super().setup() def remove(self): super().remove() class FrameworkB(umake.frameworks.BaseFramework): def __init__(self, **kwargs): super().__init__(name="Framework B", description="Description for framework B (restricted version)", only_ubuntu_version=["9.10", "10.04"], **kwargs) def setup(self, install_path=None, auto_accept_license=False): super().setup() def remove(self): super().remove() class FrameworkC(umake.frameworks.BaseFramework): def __init__(self, **kwargs): super().__init__(name="Framework C", description="Description for framework C (restricted version and arch)", only_on_archs=["foo", "bar", "baz"], only_ubuntu_version=["9.10", "10.04", "10.10.10"], **kwargs) def setup(self, install_path=None, auto_accept_license=False): super().setup() def remove(self): super().remove() ubuntu-make-18.09+disco1/tests/data/testframeworks/uninstantiableframework.py0000644000000000000000000000301613352651520024501 0ustar # -*- coding: utf-8 -*- # Copyright (C) 2014 Canonical # # Authors: # Didier Roche # # 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; version 3. # # 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 """Framework with another category module without any framework""" import umake.frameworks class Uninstantiable(umake.frameworks.BaseFramework): def __new__(cls, *args, **kwargs): "This class is not meant to be instantiated, so __new__ returns None." if cls == Uninstantiable: return None return super().__new__(cls) def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) def setup(self, install_path=None, auto_accept_license=False): super().setup() def remove(self): super().remove() class InheritedFromUninstantiable(Uninstantiable): def __init__(self, **kwargs): super().__init__(name="Inherited From Uninstantiable", description="Framework Inheriting Uninstantiable", **kwargs) ubuntu-make-18.09+disco1/tests/data/testframeworks/withcategory.py0000644000000000000000000000330413352651520022254 0ustar # -*- coding: utf-8 -*- # Copyright (C) 2014 Canonical # # Authors: # Didier Roche # # 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; version 3. # # 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 """Framework with category module""" import umake.frameworks class ACategory(umake.frameworks.BaseCategory): def __init__(self): super().__init__(name="Category A", description="Category A description") class FrameworkA(umake.frameworks.BaseFramework): def __init__(self, **kwargs): super().__init__(name="Framework A", description="Description for framework A", is_category_default=True, install_path_dir="custom/frameworka", **kwargs) def setup(self, install_path=None, auto_accept_license=False): super().setup() def remove(self): super().remove() class FrameworkB(umake.frameworks.BaseFramework): def __init__(self, **kwargs): super().__init__(name="Framework/B", description="Description for framework B", expect_license=True, **kwargs) def setup(self, install_path=None, auto_accept_license=False): super().setup() def remove(self): super().remove() ubuntu-make-18.09+disco1/tests/data/testframeworks/withoutcategory.py0000644000000000000000000000305213352651520023004 0ustar # -*- coding: utf-8 -*- # Copyright (C) 2014 Canonical # # Authors: # Didier Roche # # 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; version 3. # # 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 """Framework with category module""" import umake.frameworks class FrameworkFreeA(umake.frameworks.BaseFramework): def __init__(self, **kwargs): super().__init__(name="Framework Free A", description="Description for framework A in no category", install_path_dir="custom/frameworka", **kwargs) def setup(self, install_path=None, auto_accept_license=False): super().setup() def remove(self): super().remove() class FrameworkFreeB(umake.frameworks.BaseFramework): def __init__(self, **kwargs): super().__init__(name="Framework Free / B", description="Description for framework B in no category", **kwargs) def setup(self, install_path=None, auto_accept_license=False): super().setup() def remove(self): super().remove() ubuntu-make-18.09+disco1/tests/data/twinery.org.crt0000644000000000000000000000240513352651520017113 0ustar -----BEGIN CERTIFICATE----- MIIDiTCCAnGgAwIBAgIJAI5/rhL/uo9NMA0GCSqGSIb3DQEBCwUAMFsxCzAJBgNV BAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX aWRnaXRzIFB0eSBMdGQxFDASBgNVBAMMC3R3aW5lcnkub3JnMB4XDTE4MDEwNDEy MzAxOVoXDTI3MTExMzEyMzAxOVowWzELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNv bWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDEUMBIG A1UEAwwLdHdpbmVyeS5vcmcwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB AQCoViiBs/RCKRC5DYI8mbECxihUXnQCbTTjjUw3qJWgna8l3ligN1lwbU/jdCAd /w0TLQ9LfXA1cjazpJQf8K2LCMAC4xlw4NTF6AcAbaRe9twDrjf9JUFw3/S8uxjz NTrXZH6arxVACnU6YZmrrwbkiRiiH/8pobz+Gqv75EQYW6fUhvQqRyKC4ikM8Jik j7U7NFga1HVKIn98YJW4OjwttqecjAkUSvN+aU2JDc4pRBEM1gF2Yhqt96zNIRhe nSs4kUSahMrH5k7cIJyBYFPY5t3DIh6XC3saVomJ+r0Y2RY4VdrBSzqoSYgZNOjq aKoXWtT+XhqZqexxraqykt7jAgMBAAGjUDBOMB0GA1UdDgQWBBThgOodBRYangnF IvTrRISP086JODAfBgNVHSMEGDAWgBThgOodBRYangnFIvTrRISP086JODAMBgNV HRMEBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQAz+9oOTejJAQXeWe1+F77A/AWK L7K/tTMy1GKECMuWap0/d7Ttn48+UDfTUThMbn7VY8CV/61hTb4Vgsy0yhGe2r0+ hJijGIz1wweZMU1eGBSTjbMxlsNPck1P0fco7Wp1hnykleQ3qJo1M5OB2/SXUk1c +mh9o+mgJ+6byfpdULMRi7gvjKmTqNhKMBF9cBlJYBWRyt6TjP7TqXwvzZ7yrN75 6QONM4H+nciFL6874vk390Ul887GcYRsrFO2LLxk65lnODouh5BFNoRCzU2vlv30 r7oGFIgdsaio7ixSiO7bZTO0rej4s/SEh8Lca4oRaXXzkyqvJ7EyBM707HEw -----END CERTIFICATE----- ubuntu-make-18.09+disco1/tests/data/twinery.org.pem0000644000000000000000000000565513352651520017116 0ustar -----BEGIN PRIVATE KEY----- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCoViiBs/RCKRC5 DYI8mbECxihUXnQCbTTjjUw3qJWgna8l3ligN1lwbU/jdCAd/w0TLQ9LfXA1cjaz pJQf8K2LCMAC4xlw4NTF6AcAbaRe9twDrjf9JUFw3/S8uxjzNTrXZH6arxVACnU6 YZmrrwbkiRiiH/8pobz+Gqv75EQYW6fUhvQqRyKC4ikM8Jikj7U7NFga1HVKIn98 YJW4OjwttqecjAkUSvN+aU2JDc4pRBEM1gF2Yhqt96zNIRhenSs4kUSahMrH5k7c IJyBYFPY5t3DIh6XC3saVomJ+r0Y2RY4VdrBSzqoSYgZNOjqaKoXWtT+XhqZqexx raqykt7jAgMBAAECggEAMtUBmlkK80ePQzIvF7mZWCsaVo/HHEx54hTy5QPFWyEC mL7RqF/OZEK+EwMoB6bS/e1nZvZUAe+hURHroNF+tjNIOBb3wbxCxBhStPBm6D5H Jd1gDtNHNZyLPMqKuDZktFImYPNpyVLfH2gFjXBm9m/nvl1HIf0zItBPCttdLLVT UxVgzNNjcT2TOkQTfIVRTiIOQpKIm7w6nu9c5SBTImCyf7CILzFZB/cXKl2l5zTt /LYkCKRug0Va8AK7bjZt8o3rAG+BT7vxw/1pQjFaWVQKHS4fpY9sPk0p04Jjtne5 yxmCzdJe2RV5uEZKS+iyi7YRIF20er76HHHmPU+xMQKBgQDQEn8ueUcElg5V0MYA +jGJAS0I1E1ajmhzxnLo0Hm/Vko3g8lOOIuxiX9Q+9FWYhaVL5zze/sIk+tdTUPc qrajJQ6FW1RwoFZQu7/+sNrHKIcjXH7/IsSmULpyWZGlZtv584WEujswKj0bj7Js +B6+NJVhf9FygE5PBaONKdZLzQKBgQDPHIvSmUYSBBlI0uC0ygzcQ7Z7Rmn7yY6n hUOY7RDQ1nFQ99atuBodsYrrYUUNxVR7nC4MrKb8EB118/RepKNXPmG9liMOsl+e gXVgEGQQjEcoQxYjNa3oCiQsf6cQsubHoceXuW64+lTui6GMczHAXUqgqR+YwFcu BrM6wOEFbwKBgAWsa3Fd9zTFzrBCWBPQvqcItCyodU+B0JFPmPSGMrun47At1MBg RFbb8+/GXgfn9susl6//8nFibymFINOUiBRcv0+dlOjZRmE/LVYJhn2lukGZlRDp 5sjOLLdPf+wtqNPg8wQSe+itTitBONFF1rjDAEu/S3u+yePXuITx3hkFAoGALo5w L+scgThCpsggkwNIWMsv3g46DMuGMcoXI+1Gdmt+FYFg1LQpyrr6S2cWKr5M+2xk PZ0h/E9zD+zC5fOEdDwlpIR3ZPpb3DmltO56T+34oOhTtZ5/dUWyU/5uA6bzkbSg NU8NwK8lIGpq6jOK338ZI3xhCelSr5n5+B8bdikCgYEAxn9K3FvkQ/kyoAgEk2NW 97uLo9jFDU8Q3kp1w06de1DKr8zYsb+9WadB4tq4u2RzcM5v31NuOaDaaOMpR2zK qbWwondJXeb2xEBIFV2QmdLysq9uiil9m+yQ2KSI6PQhNzUx929RWUhjKsR38bNq frKHOGuvBDFOFN+wqb9MmeA= -----END PRIVATE KEY----- -----BEGIN CERTIFICATE----- MIIDiTCCAnGgAwIBAgIJAI5/rhL/uo9NMA0GCSqGSIb3DQEBCwUAMFsxCzAJBgNV BAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX aWRnaXRzIFB0eSBMdGQxFDASBgNVBAMMC3R3aW5lcnkub3JnMB4XDTE4MDEwNDEy MzAxOVoXDTI3MTExMzEyMzAxOVowWzELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNv bWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDEUMBIG A1UEAwwLdHdpbmVyeS5vcmcwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB AQCoViiBs/RCKRC5DYI8mbECxihUXnQCbTTjjUw3qJWgna8l3ligN1lwbU/jdCAd /w0TLQ9LfXA1cjazpJQf8K2LCMAC4xlw4NTF6AcAbaRe9twDrjf9JUFw3/S8uxjz NTrXZH6arxVACnU6YZmrrwbkiRiiH/8pobz+Gqv75EQYW6fUhvQqRyKC4ikM8Jik j7U7NFga1HVKIn98YJW4OjwttqecjAkUSvN+aU2JDc4pRBEM1gF2Yhqt96zNIRhe nSs4kUSahMrH5k7cIJyBYFPY5t3DIh6XC3saVomJ+r0Y2RY4VdrBSzqoSYgZNOjq aKoXWtT+XhqZqexxraqykt7jAgMBAAGjUDBOMB0GA1UdDgQWBBThgOodBRYangnF IvTrRISP086JODAfBgNVHSMEGDAWgBThgOodBRYangnFIvTrRISP086JODAMBgNV HRMEBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQAz+9oOTejJAQXeWe1+F77A/AWK L7K/tTMy1GKECMuWap0/d7Ttn48+UDfTUThMbn7VY8CV/61hTb4Vgsy0yhGe2r0+ hJijGIz1wweZMU1eGBSTjbMxlsNPck1P0fco7Wp1hnykleQ3qJo1M5OB2/SXUk1c +mh9o+mgJ+6byfpdULMRi7gvjKmTqNhKMBF9cBlJYBWRyt6TjP7TqXwvzZ7yrN75 6QONM4H+nciFL6874vk390Ul887GcYRsrFO2LLxk65lnODouh5BFNoRCzU2vlv30 r7oGFIgdsaio7ixSiO7bZTO0rej4s/SEh8Lca4oRaXXzkyqvJ7EyBM707HEw -----END CERTIFICATE----- ubuntu-make-18.09+disco1/tests/data/www.apache.org.crt0000644000000000000000000000241613352651520017460 0ustar -----BEGIN CERTIFICATE----- MIIDjzCCAnegAwIBAgIJAPPPzo3q+8BcMA0GCSqGSIb3DQEBCwUAMF4xCzAJBgNV BAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX aWRnaXRzIFB0eSBMdGQxFzAVBgNVBAMMDnd3dy5hcGFjaGUub3JnMB4XDTE3MDgx MjE3MDYyMFoXDTI3MDYyMTE3MDYyMFowXjELMAkGA1UEBhMCQVUxEzARBgNVBAgM ClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDEX MBUGA1UEAwwOd3d3LmFwYWNoZS5vcmcwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw ggEKAoIBAQC9WRronl+yozsVFN1QaSnlTKwrFGt96ZpzzbWZnYI3USRF+G0DEUBG 5gZMl7xoKxsbwEx5p+CBpsFT9yYLjq/OvfzeUNinr1mfig/51sOcWT4rtUwmuJjr XJtTtoConaypfhr5ShlEBXvIELiJnfXh3wFQvAXBGFXzZ1ETiK18r1Rla6fWdMPM ObnowuLZ5PsVmmpl0pYaUzPi7Br7c+DesNfR8C3+Q0cy+M8DBfFdI5FENd+rNoq6 NrbRgNMmRVEyNpQt7eD1IImynY6Jt7//KgtET3oT+Mf+hliisIYmL332jVs3sotH 44ElVUieelBXRbs7QReXRTijoJ0CO2uRAgMBAAGjUDBOMB0GA1UdDgQWBBQ1XHV5 PbuZBzcvw5OGQhnUPwk06jAfBgNVHSMEGDAWgBQ1XHV5PbuZBzcvw5OGQhnUPwk0 6jAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQA8vnjok+dMpndpUBgG t2K4pmqKg6fyEkJL71bXCOJbtVCJmu8seGFsXX2SQrljuA0JnlwNt/DNDODo+znx qUR3OyKRjEEIHi36VuFUaQdwftQJdSH5lQQIaHR+XBDXVUboQd2cMwe7dcS4lhj1 MnH4KGhqu6svI/P76B7MySXttRh+vCIfg4m9NqjQzSUAhg2H+Ar3GNBSh4a8fv8g QC9+52724ce2EtFE2Q8qLlyhqbIHBJdih3V1vC/XlKVvuzHZpCs0tpjf2Md9/xBH MJOS8S7Hrs3eY5HCmdwZsgkbwDzceu0osGGlB3IxDdIswIXJ38olO3b4iyCx2YaR 9TU6 -----END CERTIFICATE----- ubuntu-make-18.09+disco1/tests/data/www.apache.org.pem0000644000000000000000000000566613352651520017463 0ustar -----BEGIN PRIVATE KEY----- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC9WRronl+yozsV FN1QaSnlTKwrFGt96ZpzzbWZnYI3USRF+G0DEUBG5gZMl7xoKxsbwEx5p+CBpsFT 9yYLjq/OvfzeUNinr1mfig/51sOcWT4rtUwmuJjrXJtTtoConaypfhr5ShlEBXvI ELiJnfXh3wFQvAXBGFXzZ1ETiK18r1Rla6fWdMPMObnowuLZ5PsVmmpl0pYaUzPi 7Br7c+DesNfR8C3+Q0cy+M8DBfFdI5FENd+rNoq6NrbRgNMmRVEyNpQt7eD1IImy nY6Jt7//KgtET3oT+Mf+hliisIYmL332jVs3sotH44ElVUieelBXRbs7QReXRTij oJ0CO2uRAgMBAAECggEBALRq6PbpoSnn2u4VeWObMO5qBkruJBZPtnnNctIygNcQ m82IDuczUtm7aBknI8DmAeiJbNUmnwcqy1+kST4N8Xq/EOkMg8QTkwQvW1Wly7F4 X4LqNutWTW9GSEKVzTXdN54wqKcMcdKcnvtc41lNh/J2uRwibCE3fP52XYyNWTFJ gqS9GQhmNmSmVJ08tdfMnNWipRLlDfnJq1ifFu/SL/pvLIGNQrROwcw84Wv34W04 2BnXQpzZQUoz7MMJUelaSNMJo5Va/Jrd3C2LyCRh06ttjlgIrrG9jiHxLKSyipJU bGqCYR3aVZWjgPRzNGBWgpYpH37oAfv7pMj1SxfUjlkCgYEA6F87jvT64qaDHwBl lRD2hMaEVRlHZzpukewdswmmyo/7YvUjBO0hLvQM2SJDcLaYp/lZfCY0N+qPuKWD PlHifPYJqz5lQcFjJ2HFX8+yKbD43KbHdsYmNBIwvYZ83P+OodYxOsxqcSVgjSFy SJJFDmrEvUuF3+CXxAPjhny8t4sCgYEA0JnvuiR1HupqIIeotu+hGed8GfuJRObt 6ubl9KMX7/lkguNerTzpCW8lXRe+5b2hUGBvb/1r3qYT9oKMRjr/LTj1oQ71W7lo VKZ+BLryzYVoba80TjNtvvqHpHt0MuAjAlJ2EfBDzMSzi/X2yhVMFHk78M9BvIGI Wf/EFvv07NMCgYBYR6XW39dYuC3kX0A4a6NcOhcYRWxNGXPcWDnIRQhquFym8b6G JpiOwAUJkOzSK2y/lAmdEt6Px7smSSsdR/qlwstVlXTekFvdIFXd2ogzMpq5KVtq Ekl9StPdjPRu+V/0t+0oC3T821hdBbHnRDqcCZAI4mJP9YFy5I9SDp2blQKBgFnw 1WT7zSfcSI/oDf16SorhvSdyxdfYfeKXVbTqESsd65FnuW2WYp/3tTNzRpLF9WSz f7jYmobwMpFJ7nNlgpqcAYRE79NxmKNO+ezOMlwc1k7ciP/iusHqQUvREuPQsieR KGlJn+INOaDyF0tAbYIyV37Xze8aJpEvbvu9/PeTAoGAPJs6Pn64B9g0PDeEWeid bpHYK4WN6ZEhIP+G9AInMaMClyGEBCplbTSbFHEquqqR21etrfxdyP+PcqoSAaOO anvnccdlA0PBujxrr4NVsOvagCAzURAvJ5DMhzES+DDEBadgImfAfi0f03kwaxth LBKZpxfpwUimf3nnEfARnUY= -----END PRIVATE KEY----- -----BEGIN CERTIFICATE----- MIIDjzCCAnegAwIBAgIJAPPPzo3q+8BcMA0GCSqGSIb3DQEBCwUAMF4xCzAJBgNV BAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX aWRnaXRzIFB0eSBMdGQxFzAVBgNVBAMMDnd3dy5hcGFjaGUub3JnMB4XDTE3MDgx MjE3MDYyMFoXDTI3MDYyMTE3MDYyMFowXjELMAkGA1UEBhMCQVUxEzARBgNVBAgM ClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDEX MBUGA1UEAwwOd3d3LmFwYWNoZS5vcmcwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw ggEKAoIBAQC9WRronl+yozsVFN1QaSnlTKwrFGt96ZpzzbWZnYI3USRF+G0DEUBG 5gZMl7xoKxsbwEx5p+CBpsFT9yYLjq/OvfzeUNinr1mfig/51sOcWT4rtUwmuJjr XJtTtoConaypfhr5ShlEBXvIELiJnfXh3wFQvAXBGFXzZ1ETiK18r1Rla6fWdMPM ObnowuLZ5PsVmmpl0pYaUzPi7Br7c+DesNfR8C3+Q0cy+M8DBfFdI5FENd+rNoq6 NrbRgNMmRVEyNpQt7eD1IImynY6Jt7//KgtET3oT+Mf+hliisIYmL332jVs3sotH 44ElVUieelBXRbs7QReXRTijoJ0CO2uRAgMBAAGjUDBOMB0GA1UdDgQWBBQ1XHV5 PbuZBzcvw5OGQhnUPwk06jAfBgNVHSMEGDAWgBQ1XHV5PbuZBzcvw5OGQhnUPwk0 6jAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQA8vnjok+dMpndpUBgG t2K4pmqKg6fyEkJL71bXCOJbtVCJmu8seGFsXX2SQrljuA0JnlwNt/DNDODo+znx qUR3OyKRjEEIHi36VuFUaQdwftQJdSH5lQQIaHR+XBDXVUboQd2cMwe7dcS4lhj1 MnH4KGhqu6svI/P76B7MySXttRh+vCIfg4m9NqjQzSUAhg2H+Ar3GNBSh4a8fv8g QC9+52724ce2EtFE2Q8qLlyhqbIHBJdih3V1vC/XlKVvuzHZpCs0tpjf2Md9/xBH MJOS8S7Hrs3eY5HCmdwZsgkbwDzceu0osGGlB3IxDdIswIXJ38olO3b4iyCx2YaR 9TU6 -----END CERTIFICATE----- ubuntu-make-18.09+disco1/tests/data/www.arduino.cc.crt0000644000000000000000000000242213352651520017473 0ustar -----BEGIN CERTIFICATE----- MIIDkjCCAnqgAwIBAgIJAI0UNyAUg+54MA0GCSqGSIb3DQEBCwUAMF4xCzAJBgNV BAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX aWRnaXRzIFB0eSBMdGQxFzAVBgNVBAMMDnd3dy5hcmR1aW5vLmNjMB4XDTE4MDUx ODA3NDA0MFoXDTI4MDMyNjA3NDA0MFowXjELMAkGA1UEBhMCQVUxEzARBgNVBAgM ClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDEX MBUGA1UEAwwOd3d3LmFyZHVpbm8uY2MwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw ggEKAoIBAQC/zTNTRcNW1qYRw4h9Hhd8KkzdTTgGYJ+q+st2iyr1Qw4oloSIGswX Aq1J783NPgs8YUoGTm76Of82297S0QLrvM8fcTbICdyXQxHGR/haDRAeOMCAOeFs G2dfZ6Y0tzBs4MlEDLlz1AVreocCXaUEi7ndHT02cdM7CYhc/hzvfLWh79oCnvqN lSlTV//XmKbmATwQcJuU7uJVd05qZqujxOjnEYywrFAxaqDwhjJTa1O6J2RFT2zy Lh/rPIKSbogdFIbLwjhghhn48fT5KQgpim+RM06Yr7qnLaAdWCKVKhcGiWxU3q4K W4SkT5O83zb/dF7ioBptTDmBq5iYp4FvAgMBAAGjUzBRMB0GA1UdDgQWBBT3rsch R5kTAMhfMFe3zxquc+AG4DAfBgNVHSMEGDAWgBT3rschR5kTAMhfMFe3zxquc+AG 4DAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQAPEBYh5vPgF0u5 RO2CckQRiIxhOsUhbS8ioX63E+EzurbI8gZVL2OUxc7EqlCTuvJXpfXrLdmijafT 2gaiy9jwi5C4v/CM7TATWbyueLVVazdiFR0N2Cqmd0Ez2A6vNoSZmbJgMEM5kKS0 NtL2Tygt3DKQhgpmM3bJBPPvwYl1sw5X2gBFQVoE7DDCqQDP9k5CVavOvDNe9V8I W4wD+2FegBhMLfzOnJCdXmnsLJc5QAK0n5t9zL9moQQmNrY9W9yAMOLtk8NSANg4 GsCdpjljH0osB6iKyNNiMuDskWVilfJGd7i7dght6JVWzgOm9QZ6zuFlUqtnkyEL WM+h0c4z -----END CERTIFICATE----- ubuntu-make-18.09+disco1/tests/data/www.arduino.cc.key0000644000000000000000000000325013352651520017473 0ustar -----BEGIN PRIVATE KEY----- MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQC/zTNTRcNW1qYR w4h9Hhd8KkzdTTgGYJ+q+st2iyr1Qw4oloSIGswXAq1J783NPgs8YUoGTm76Of82 297S0QLrvM8fcTbICdyXQxHGR/haDRAeOMCAOeFsG2dfZ6Y0tzBs4MlEDLlz1AVr eocCXaUEi7ndHT02cdM7CYhc/hzvfLWh79oCnvqNlSlTV//XmKbmATwQcJuU7uJV d05qZqujxOjnEYywrFAxaqDwhjJTa1O6J2RFT2zyLh/rPIKSbogdFIbLwjhghhn4 8fT5KQgpim+RM06Yr7qnLaAdWCKVKhcGiWxU3q4KW4SkT5O83zb/dF7ioBptTDmB q5iYp4FvAgMBAAECggEAJWD0M7JQ00eZrbSRkPCgWw5TVH2MAZIrC8M8i6mrgYjD 5Z0PzwaJ56IZ62LUlL8WqXm8V2ZJsnJDDoni7urUyuRM6S/DIVDqsH/douq7t7D8 ByfAPD0LdWoRx0IH3hYlVdKo5p4kNjKHq96BGTDuy+f/HNxp5YZhSAwfix/qu7EX sUZmjgcmD1zTG0hpZirVSPDrK1IIH3TSi+Qser13bwuJf5kwONpRaQwRu01UJLh2 qHl/Ye47fejMDhoexaSR9G2nciyD2iF49DDo9xz8JFmgR7J2R3JTRbthSJaemO1J kISou0wdLiBq+25+0+hU6KkCqSe5aQHx4+P/DaneQQKBgQDnegbtiBDaiEwahlbQ warc2s/1maIua2zgJivYhzO/GZZeaGVRic4Oq73I8e3GlM6qyfU5TgXeeZvgSFi1 VQJlZKeNpau8LI+ihlRxTptnUptQ2UV2OwMCjVCyJPiQorDl44pfjmvkACC9blag lCeExJj7KKyrHlGtfYwgiG8tWQKBgQDUHyD4QYQue2f0vdxzLtvXRvWK2VFdLWrg vL/yqYOJbshOdfXBZ5lXBZr9NV+/fJ2N5n3bM/KeLrlVtOK97mH2H3V5bs7EjF6h /Mzf8peBOUYY/98iK0/7XfV7pAff4wB6YX0PgIS9Kr+vzXls+juRf5vnfcWF5z6j T3MxecrkBwKBgFfa3spEvHDVDl1643R0LQ+KFSgYWY/YwggJNNcH6cH8SjAm212p OgYjdPLRr/eQ/yefY22OiXe5HEpx6wlX7ILjQxzl5lqTZyi+Z0piFWWP2tdCv7Ry DWBollom4hizRwTZ6ej+u0BcNBDx0fs8gAtKOu4IsBB6f3Gjlw25+shxAoGAZSfX HCx6MYRuJbto5pDhC79uFuHduDaRckzwqHMIJEDtSuVb5fhWmrY0nC2Y1INDy0iw mhkiySZ1AZc6TeLhWnLUHa2m8voRouQge2d/soMyl3dl3DCVesTq7SRjEPR65OGa twrNwjwhn1+4WSzXvWICYhmLWXjWWSDpSR3QkH8CgYBXhe7Jk+gNkCgJyqxBHXRn WO47EIY/9gDMbdL2X0GdE/n7aU7zWgG9/wT4wjATDOzao84UhKRNIx8NpMwWWCgS Zf6vZgPler7w2pXp/a53bOZv7BLqPGXNhnC5+52KudbDa6J5ODx7BJzsRQsH1pmY JxVXngz+bYqRcNSL2cnoZg== -----END PRIVATE KEY----- ubuntu-make-18.09+disco1/tests/data/www.arduino.cc.pem0000644000000000000000000000567213352651520017476 0ustar -----BEGIN PRIVATE KEY----- MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQC/zTNTRcNW1qYR w4h9Hhd8KkzdTTgGYJ+q+st2iyr1Qw4oloSIGswXAq1J783NPgs8YUoGTm76Of82 297S0QLrvM8fcTbICdyXQxHGR/haDRAeOMCAOeFsG2dfZ6Y0tzBs4MlEDLlz1AVr eocCXaUEi7ndHT02cdM7CYhc/hzvfLWh79oCnvqNlSlTV//XmKbmATwQcJuU7uJV d05qZqujxOjnEYywrFAxaqDwhjJTa1O6J2RFT2zyLh/rPIKSbogdFIbLwjhghhn4 8fT5KQgpim+RM06Yr7qnLaAdWCKVKhcGiWxU3q4KW4SkT5O83zb/dF7ioBptTDmB q5iYp4FvAgMBAAECggEAJWD0M7JQ00eZrbSRkPCgWw5TVH2MAZIrC8M8i6mrgYjD 5Z0PzwaJ56IZ62LUlL8WqXm8V2ZJsnJDDoni7urUyuRM6S/DIVDqsH/douq7t7D8 ByfAPD0LdWoRx0IH3hYlVdKo5p4kNjKHq96BGTDuy+f/HNxp5YZhSAwfix/qu7EX sUZmjgcmD1zTG0hpZirVSPDrK1IIH3TSi+Qser13bwuJf5kwONpRaQwRu01UJLh2 qHl/Ye47fejMDhoexaSR9G2nciyD2iF49DDo9xz8JFmgR7J2R3JTRbthSJaemO1J kISou0wdLiBq+25+0+hU6KkCqSe5aQHx4+P/DaneQQKBgQDnegbtiBDaiEwahlbQ warc2s/1maIua2zgJivYhzO/GZZeaGVRic4Oq73I8e3GlM6qyfU5TgXeeZvgSFi1 VQJlZKeNpau8LI+ihlRxTptnUptQ2UV2OwMCjVCyJPiQorDl44pfjmvkACC9blag lCeExJj7KKyrHlGtfYwgiG8tWQKBgQDUHyD4QYQue2f0vdxzLtvXRvWK2VFdLWrg vL/yqYOJbshOdfXBZ5lXBZr9NV+/fJ2N5n3bM/KeLrlVtOK97mH2H3V5bs7EjF6h /Mzf8peBOUYY/98iK0/7XfV7pAff4wB6YX0PgIS9Kr+vzXls+juRf5vnfcWF5z6j T3MxecrkBwKBgFfa3spEvHDVDl1643R0LQ+KFSgYWY/YwggJNNcH6cH8SjAm212p OgYjdPLRr/eQ/yefY22OiXe5HEpx6wlX7ILjQxzl5lqTZyi+Z0piFWWP2tdCv7Ry DWBollom4hizRwTZ6ej+u0BcNBDx0fs8gAtKOu4IsBB6f3Gjlw25+shxAoGAZSfX HCx6MYRuJbto5pDhC79uFuHduDaRckzwqHMIJEDtSuVb5fhWmrY0nC2Y1INDy0iw mhkiySZ1AZc6TeLhWnLUHa2m8voRouQge2d/soMyl3dl3DCVesTq7SRjEPR65OGa twrNwjwhn1+4WSzXvWICYhmLWXjWWSDpSR3QkH8CgYBXhe7Jk+gNkCgJyqxBHXRn WO47EIY/9gDMbdL2X0GdE/n7aU7zWgG9/wT4wjATDOzao84UhKRNIx8NpMwWWCgS Zf6vZgPler7w2pXp/a53bOZv7BLqPGXNhnC5+52KudbDa6J5ODx7BJzsRQsH1pmY JxVXngz+bYqRcNSL2cnoZg== -----END PRIVATE KEY----- -----BEGIN CERTIFICATE----- MIIDkjCCAnqgAwIBAgIJAI0UNyAUg+54MA0GCSqGSIb3DQEBCwUAMF4xCzAJBgNV BAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX aWRnaXRzIFB0eSBMdGQxFzAVBgNVBAMMDnd3dy5hcmR1aW5vLmNjMB4XDTE4MDUx ODA3NDA0MFoXDTI4MDMyNjA3NDA0MFowXjELMAkGA1UEBhMCQVUxEzARBgNVBAgM ClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDEX MBUGA1UEAwwOd3d3LmFyZHVpbm8uY2MwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw ggEKAoIBAQC/zTNTRcNW1qYRw4h9Hhd8KkzdTTgGYJ+q+st2iyr1Qw4oloSIGswX Aq1J783NPgs8YUoGTm76Of82297S0QLrvM8fcTbICdyXQxHGR/haDRAeOMCAOeFs G2dfZ6Y0tzBs4MlEDLlz1AVreocCXaUEi7ndHT02cdM7CYhc/hzvfLWh79oCnvqN lSlTV//XmKbmATwQcJuU7uJVd05qZqujxOjnEYywrFAxaqDwhjJTa1O6J2RFT2zy Lh/rPIKSbogdFIbLwjhghhn48fT5KQgpim+RM06Yr7qnLaAdWCKVKhcGiWxU3q4K W4SkT5O83zb/dF7ioBptTDmBq5iYp4FvAgMBAAGjUzBRMB0GA1UdDgQWBBT3rsch R5kTAMhfMFe3zxquc+AG4DAfBgNVHSMEGDAWgBT3rschR5kTAMhfMFe3zxquc+AG 4DAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQAPEBYh5vPgF0u5 RO2CckQRiIxhOsUhbS8ioX63E+EzurbI8gZVL2OUxc7EqlCTuvJXpfXrLdmijafT 2gaiy9jwi5C4v/CM7TATWbyueLVVazdiFR0N2Cqmd0Ez2A6vNoSZmbJgMEM5kKS0 NtL2Tygt3DKQhgpmM3bJBPPvwYl1sw5X2gBFQVoE7DDCqQDP9k5CVavOvDNe9V8I W4wD+2FegBhMLfzOnJCdXmnsLJc5QAK0n5t9zL9moQQmNrY9W9yAMOLtk8NSANg4 GsCdpjljH0osB6iKyNNiMuDskWVilfJGd7i7dght6JVWzgOm9QZ6zuFlUqtnkyEL WM+h0c4z -----END CERTIFICATE----- ubuntu-make-18.09+disco1/tests/data/www.blender.com.crt0000644000000000000000000000240513352651520017637 0ustar -----BEGIN CERTIFICATE----- MIIDiTCCAnGgAwIBAgIJANrPzZYEx9M8MA0GCSqGSIb3DQEBCwUAMFsxCzAJBgNV BAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX aWRnaXRzIFB0eSBMdGQxFDASBgNVBAMMC2JsZW5kZXIuY29tMB4XDTE3MDYyMjE3 MDcyNloXDTI3MDUwMTE3MDcyNlowWzELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNv bWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDEUMBIG A1UEAwwLYmxlbmRlci5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB AQDm5VpxcMXQz8BoEll2fQeYf/gfUQtR7UbprkQRohvGUFlYmxeMFcrxyHjza0Z2 GMKwq7+E7362NrQLkhDo/R5cWbIsEArF8DB6SvUylyYJwL8XrBXcq+3CCVgC8WVd sRMiKKr6ea35nDuZkztMJrZ2+s6LkGPoeRqmkqWDVkEvY4PKmxN9dcuwoidfvUv7 Ip+LiihlscCwuhMHRZItGK0WHsEwvOijuYtfebQHu765Qz5D9XoJCHTQjId96pFL 5AdoPFToBnUPmKnr6xeUd+C04vgjtqPJV6+VWPB79bWGKS8oLo8hxb9KIoRZ072V Yt3buNlXsr1A+UNKygAWtJgzAgMBAAGjUDBOMB0GA1UdDgQWBBRFk6E2lrygvtF6 eUCe4p0Ao4GoXTAfBgNVHSMEGDAWgBRFk6E2lrygvtF6eUCe4p0Ao4GoXTAMBgNV HRMEBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQC2uQCmCtniEHcteNwm+l5rJCoK MaqvwwgaclitN84eeb3XnOL2UYlWiX7ElNepQfpGJ0Nskn3Sbrz/9NQuQ6lpCQGS 9BHFgKjGbYJDNP7XQjXzcUASdG3bBT85i+S1jpMGtEJl6oVC4BXgXC6XAu95Yx+Y SnZ442u6TTvW40JBMTCtukAwfQCZDTsgB2hWUMwRMuCzNS2aefMnH5UjbCmwB5zS C6j8JDpCq4x+9dKbatouV2t1b66IcaULdyTSigVMim7gRBOFWu9SdjeBW6+r9dcJ 6PaQEgpsfKG8+OgUYtxB/o4q53fPr+QnlFXKEsDuZkCRb6sXe12diYeBIbAh -----END CERTIFICATE----- ubuntu-make-18.09+disco1/tests/data/www.blender.com.pem0000644000000000000000000000565513352651520017642 0ustar -----BEGIN PRIVATE KEY----- MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDm5VpxcMXQz8Bo Ell2fQeYf/gfUQtR7UbprkQRohvGUFlYmxeMFcrxyHjza0Z2GMKwq7+E7362NrQL khDo/R5cWbIsEArF8DB6SvUylyYJwL8XrBXcq+3CCVgC8WVdsRMiKKr6ea35nDuZ kztMJrZ2+s6LkGPoeRqmkqWDVkEvY4PKmxN9dcuwoidfvUv7Ip+LiihlscCwuhMH RZItGK0WHsEwvOijuYtfebQHu765Qz5D9XoJCHTQjId96pFL5AdoPFToBnUPmKnr 6xeUd+C04vgjtqPJV6+VWPB79bWGKS8oLo8hxb9KIoRZ072VYt3buNlXsr1A+UNK ygAWtJgzAgMBAAECggEAGhMikJcEr90WRGp2EexytCUXdynm1lyuWmtkon0lF9Mx E9GH6jj3zzAtgIfH0ERhkCQFH9UQATHSSVA4eqdDC3jRpyo0nT/Pqa/XWtw43ncW 3WyAl4gO9I+rkcGDCf6aQ4xGKr0dCYg8Ls6yrpnclzkhpB8tOS6b9N2wtVFDUT97 wk4DaBGUf+40UNNgq6bF8UJi1lr3R8fywVdZZxLqv3RlxUc7KE7SeZsutqm6kPtl 5lqbS6UFxRL1wA4WQjSBKjpH19/50Qjr/aOtipigtL9IZZuEhL6yvqwJHzuSQGsv kCUs1DtYW0wQUjxsQRgzgY0KMbf4Fu0zUn8pZVKekQKBgQD/rHaarO58MDohG/e+ pErKDnjXRRG8L99v07JYAxoLUI5xblhjjixnzKkCu0+CK5iEDbnNTF1/jlmzDXSs zYTpN/AYmZidOPdgbAxxW30NqSJJf537EuIzba6mF7dqNboRjhEkUhIHiRX0rXTl a4szXxukaTmdpxyO7pMzkMEUqQKBgQDnMMtX/GOYFpJI6yDaMnBsk4FQ0zg50K3/ ejRAjG0v/hz7IQfWoOoxf5hVo/06w8RLHhs91UAPlANYDa1mBdV4yfckVIXtqg17 xhlF4VK0+Wue3y3KA4SMm2BGeUABxsBDo7STeZoIHm1kQKqUUJFBNCEbYMCpeuTk y+w6DYIzewKBgQCr8iW1snWVCa4eVDvSd5VgvEjipa3evOdswpeffz6Fu4CAorBJ C/WrPUWw853uMjmZHc4GVsROo8KJm5QLHxCy9A7BzJKJsiUUMLZRijDY/hV0DqKF l1aPNcWOKEcO4+EmK0A2CAfeD4C3k+wY2rG8M8tYT/gSoa+gJKzUshZYOQKBgAwv OChU9vLHDcKmEb8uNVqjk4cs+qOhaeozCJn2TLLg06ownXckV/Nv5BlvYSM9uhSz a4AgwxWPGXYEkoTz/cI18r6Jbd2OvtMtJ5vVOkSreI6Q+JrTAKNgdPyB22u8i9mE wTmciQ+wetdzyQm0DVPAaZZFzSGhhnrAfJy6pYgNAoGBAJL9FBIdQ03JEvcIAdh6 iBizt0fbuVpLPmYYNZaKtwv+YVq3I8M9ucGlrFd91kpqvR/rfm+Ct9pSrnsmnDvz 97/khwychAk/DBbFJlbW5/YQWwL3SIVGj6O0jnB+e2DBzGG21LW3PgXsCtt+cQnR tBJkLaPQdT2u23diwPReqW4t -----END PRIVATE KEY----- -----BEGIN CERTIFICATE----- MIIDiTCCAnGgAwIBAgIJANrPzZYEx9M8MA0GCSqGSIb3DQEBCwUAMFsxCzAJBgNV BAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX aWRnaXRzIFB0eSBMdGQxFDASBgNVBAMMC2JsZW5kZXIuY29tMB4XDTE3MDYyMjE3 MDcyNloXDTI3MDUwMTE3MDcyNlowWzELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNv bWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDEUMBIG A1UEAwwLYmxlbmRlci5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB AQDm5VpxcMXQz8BoEll2fQeYf/gfUQtR7UbprkQRohvGUFlYmxeMFcrxyHjza0Z2 GMKwq7+E7362NrQLkhDo/R5cWbIsEArF8DB6SvUylyYJwL8XrBXcq+3CCVgC8WVd sRMiKKr6ea35nDuZkztMJrZ2+s6LkGPoeRqmkqWDVkEvY4PKmxN9dcuwoidfvUv7 Ip+LiihlscCwuhMHRZItGK0WHsEwvOijuYtfebQHu765Qz5D9XoJCHTQjId96pFL 5AdoPFToBnUPmKnr6xeUd+C04vgjtqPJV6+VWPB79bWGKS8oLo8hxb9KIoRZ072V Yt3buNlXsr1A+UNKygAWtJgzAgMBAAGjUDBOMB0GA1UdDgQWBBRFk6E2lrygvtF6 eUCe4p0Ao4GoXTAfBgNVHSMEGDAWgBRFk6E2lrygvtF6eUCe4p0Ao4GoXTAMBgNV HRMEBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQC2uQCmCtniEHcteNwm+l5rJCoK MaqvwwgaclitN84eeb3XnOL2UYlWiX7ElNepQfpGJ0Nskn3Sbrz/9NQuQ6lpCQGS 9BHFgKjGbYJDNP7XQjXzcUASdG3bBT85i+S1jpMGtEJl6oVC4BXgXC6XAu95Yx+Y SnZ442u6TTvW40JBMTCtukAwfQCZDTsgB2hWUMwRMuCzNS2aefMnH5UjbCmwB5zS C6j8JDpCq4x+9dKbatouV2t1b66IcaULdyTSigVMim7gRBOFWu9SdjeBW6+r9dcJ 6PaQEgpsfKG8+OgUYtxB/o4q53fPr+QnlFXKEsDuZkCRb6sXe12diYeBIbAh -----END CERTIFICATE----- ubuntu-make-18.09+disco1/tests/data/www.blender.org.crt0000644000000000000000000000242213352651520017647 0ustar -----BEGIN CERTIFICATE----- MIIDkTCCAnmgAwIBAgIJAMU2H6O+8UF7MA0GCSqGSIb3DQEBCwUAMF8xCzAJBgNV BAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX aWRnaXRzIFB0eSBMdGQxGDAWBgNVBAMMD3d3dy5ibGVuZGVyLm9yZzAeFw0xNzA2 MjQxNzQxNTRaFw0yNzA1MDMxNzQxNTRaMF8xCzAJBgNVBAYTAkFVMRMwEQYDVQQI DApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQx GDAWBgNVBAMMD3d3dy5ibGVuZGVyLm9yZzCCASIwDQYJKoZIhvcNAQEBBQADggEP ADCCAQoCggEBAPchk8uXjjCK27wlRYHCYJocv+wQifdKEIRyVME762/ezl2RMuTV feBTYLacmbhRJ4aCdLqCaE7TnLtlkNAjJ2kKc2+1tmuVDE4SDxAbKccDMYIIyazF qiiAe2IpoKsY0uUmmxs0kJ/7yicsgjLfU5DJCYlf1661NDpX4YFQ9fVkhI905Yfo rK3mO3KIG0+Xf+LfBUdwFwp1X8eF2my0yY1yMe2Opzzz2dR7+iYWITg7PxbJPa5Q KhpIKE10JYMxVdJmiKim/41bNvYiv/ZV1Aom2rxxWoxUkF/j8wUYOi7miP23xeu+ hThOBZB4Z/N8AkKlJiqneOw8RmBBu/14/esCAwEAAaNQME4wHQYDVR0OBBYEFP1F U0/RDXjje4WIGwbErxafFlR+MB8GA1UdIwQYMBaAFP1FU0/RDXjje4WIGwbErxaf FlR+MAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBACOZN3h8IHYSVLdL 8g1z+YZdybIvKM/Nq28oJkDdahbFPTDMFfJKZa1rnlfAXbHaTuCeDd/Ukjs5SuTP ryccamGADI0t6wY4BGGtK2MWH9FGQhHHS9kdoG87bW2ZfcEerjZPwX7EnAPWdUzj Yw1zz4aOima16znrzf0iEGZua+1nhoc6tjeIx2B4wiRsqTF5EAzPeNlCDqeXHQVM cWiji7pALNwG2CkdmoXUtuztLYB4jMZHRvKAj8Fnm9339Nk+OcvAgramOAm8kX4W 7FVGvvSL5P3e3WlvvnA6+e1Z2yRxIdSSTGeSd/rQeuOGpPW9XWmrHNX5Wqn+65rW fM5llf4= -----END CERTIFICATE----- ubuntu-make-18.09+disco1/tests/data/www.blender.org.pem0000644000000000000000000000567613352651520017656 0ustar -----BEGIN PRIVATE KEY----- MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQD3IZPLl44witu8 JUWBwmCaHL/sEIn3ShCEclTBO+tv3s5dkTLk1X3gU2C2nJm4USeGgnS6gmhO05y7 ZZDQIydpCnNvtbZrlQxOEg8QGynHAzGCCMmsxaoogHtiKaCrGNLlJpsbNJCf+8on LIIy31OQyQmJX9eutTQ6V+GBUPX1ZISPdOWH6Kyt5jtyiBtPl3/i3wVHcBcKdV/H hdpstMmNcjHtjqc889nUe/omFiE4Oz8WyT2uUCoaSChNdCWDMVXSZoiopv+NWzb2 Ir/2VdQKJtq8cVqMVJBf4/MFGDou5oj9t8XrvoU4TgWQeGfzfAJCpSYqp3jsPEZg Qbv9eP3rAgMBAAECggEBAJgJmUKUr86fbwX2LCfjbMkDTPOvTSHM+BJzwD7NXVAK 1AzualAsI+/he8t81nl1vApdsfCYkBGG0JLdrlTOe818t34PXfYb0WEqbQfsniwo g8nLHD/lr4SRXtcKYyU/9Wcy9BOtqBg0sK6fDE695Exb0jkotKlwI3yNWlfTdi4L /pUfHuJ+uro6Zv5XDLIq6YEn79uhmjbBhVmnXQZsnzrRfrNZC+qTvSa8w9rSyirj nwpEGpsS1aT3QvrgxeFJJ/huElqNMgrvIaL+or9pmLKqpwbiu+UFktD4hUBybw3h fcemAeTt3vd9e8aPWSrgGXmOZ73X9iL6SElup+KmBPECgYEA/+UXTeEhcJZnGqtG 8GRQ2T+3/m2TrAIDSApgbkrlMuAer5IwsDUroYo4F9sxALtp9C9ca642gyJX4Hub tMxLnfogt2rTzPP+YQvH3+xbOyiERf+TtwwTca0YAvWuZYAUy8ZNqttY8EgTbU+b roRHTEdqQjOGHHAJVYytHU2qaUkCgYEA9zuQkkaoXnru41zR5RMdR9Jjj7780ePx 4r1WpqsPnIWjWWKtQQ9djWM5nP+LBExmDWK/c6XQ2IoM/iJro53ucMdtdtKWTBDH xjmx5RLfRnIoNi+bTUp3R/DAZ+eXmaT+TRX3pg1RoFvNpPIKWKSttV4fRNRlE83r QtYwxIvLQZMCgYEA46UsDC5hj0Vdx83jN+wmOH6E8qUMoBLSVH5WtweNyqqy4cIN 6lQC0pyhtida+qm/YmnXsDu1ZwdgYeXU6QxtoMZp4IH6lfPhsvfGAiDEMGak9Zie ElN94Lz6BXgGg2lkFrv9UCf+gRO9pJsThjdLLkLB9s7bWeUZiK+zOcRj+3ECgYEA 6gd7acvy00TBX33cvmBipjsUvdyHi9OfhAfAv5JL+9lQ8GsFIAIAh7c2sVQA7ze2 ntMr8bgzwtajR+mjRMVaEW3mQ8VCOozj3tN8fyBnNFMZl3lnJDnqQbI3H+RNUEar 5qJ1w7z12LsuJgZsHs78FCQdq1T2vVF+cs04asT9yXsCgYABJ+V60lp17h4awRjO dIR5K0ESmFUwM392o8mMn7cB+uBLBuk5ADcGyA6RgkRhPT/9R/JFmgpyqsMGWW0z +T4sEfj5/4VLSlK6mF6a8d8qKTytjDFCqxoxaOwe8wm/FePZCUMQDinll6k2wouq o+ZJftLgF+332qZAUItLgQbYeQ== -----END PRIVATE KEY----- -----BEGIN CERTIFICATE----- MIIDkTCCAnmgAwIBAgIJAMU2H6O+8UF7MA0GCSqGSIb3DQEBCwUAMF8xCzAJBgNV BAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX aWRnaXRzIFB0eSBMdGQxGDAWBgNVBAMMD3d3dy5ibGVuZGVyLm9yZzAeFw0xNzA2 MjQxNzQxNTRaFw0yNzA1MDMxNzQxNTRaMF8xCzAJBgNVBAYTAkFVMRMwEQYDVQQI DApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQx GDAWBgNVBAMMD3d3dy5ibGVuZGVyLm9yZzCCASIwDQYJKoZIhvcNAQEBBQADggEP ADCCAQoCggEBAPchk8uXjjCK27wlRYHCYJocv+wQifdKEIRyVME762/ezl2RMuTV feBTYLacmbhRJ4aCdLqCaE7TnLtlkNAjJ2kKc2+1tmuVDE4SDxAbKccDMYIIyazF qiiAe2IpoKsY0uUmmxs0kJ/7yicsgjLfU5DJCYlf1661NDpX4YFQ9fVkhI905Yfo rK3mO3KIG0+Xf+LfBUdwFwp1X8eF2my0yY1yMe2Opzzz2dR7+iYWITg7PxbJPa5Q KhpIKE10JYMxVdJmiKim/41bNvYiv/ZV1Aom2rxxWoxUkF/j8wUYOi7miP23xeu+ hThOBZB4Z/N8AkKlJiqneOw8RmBBu/14/esCAwEAAaNQME4wHQYDVR0OBBYEFP1F U0/RDXjje4WIGwbErxafFlR+MB8GA1UdIwQYMBaAFP1FU0/RDXjje4WIGwbErxaf FlR+MAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBACOZN3h8IHYSVLdL 8g1z+YZdybIvKM/Nq28oJkDdahbFPTDMFfJKZa1rnlfAXbHaTuCeDd/Ukjs5SuTP ryccamGADI0t6wY4BGGtK2MWH9FGQhHHS9kdoG87bW2ZfcEerjZPwX7EnAPWdUzj Yw1zz4aOima16znrzf0iEGZua+1nhoc6tjeIx2B4wiRsqTF5EAzPeNlCDqeXHQVM cWiji7pALNwG2CkdmoXUtuztLYB4jMZHRvKAj8Fnm9339Nk+OcvAgramOAm8kX4W 7FVGvvSL5P3e3WlvvnA6+e1Z2yRxIdSSTGeSd/rQeuOGpPW9XWmrHNX5Wqn+65rW fM5llf4= -----END CERTIFICATE----- ubuntu-make-18.09+disco1/tests/data/www.eclipse.org.crt0000644000000000000000000000236513352651520017666 0ustar -----BEGIN CERTIFICATE----- MIIDfTCCAmWgAwIBAgIJAM20ZMP9aWmfMA0GCSqGSIb3DQEBCwUAMFUxCzAJBgNV BAYTAkZSMRMwEQYDVQQIDApTb21lLVN0YXRlMRcwFQYDVQQKDA5FY2xpcHNlIHNl cnZlcjEYMBYGA1UEAwwPd3d3LmVjbGlwc2Uub3JnMB4XDTE0MTAyMzEzNDA1N1oX DTI0MDgzMTEzNDA1N1owVTELMAkGA1UEBhMCRlIxEzARBgNVBAgMClNvbWUtU3Rh dGUxFzAVBgNVBAoMDkVjbGlwc2Ugc2VydmVyMRgwFgYDVQQDDA93d3cuZWNsaXBz ZS5vcmcwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCgEa3kHNJD/cha wLdb0a8neaxMJpapWgY5O/CkevkT3b9W6/PWk+mQhpbvpxFDl5FfCLJ1Mh98HHI2 48HuHl4xYiOjfFhrnGopa8XmH+K7Va8zccDtgcpzYoj/YuV7y+x9m1vz0aJu8k1J LgV31s/zT+5MCpHoqheiwDSOAMV9WphAQzlN9uyo1h7bm3+37M+0vb4HRS9AoRMZ OIallN0Br2o4y1ab4K0k5rCqbHdkNMJ+yzzpcsB5tuQSd2xIkhQKxWSRSnGv1GBL h6E63tX9/nzwWlusQnm51f7Dt6OGT8ajs2HIlPVWKG/fI+cYru90oAClG50vgKDR m1SyjEwnAgMBAAGjUDBOMB0GA1UdDgQWBBTmUq4DtfLPIe9T8TwZoLM8waKw7jAf BgNVHSMEGDAWgBTmUq4DtfLPIe9T8TwZoLM8waKw7jAMBgNVHRMEBTADAQH/MA0G CSqGSIb3DQEBCwUAA4IBAQA+rB/ZJ3qNVGK9TgTZ7HoJbyavy0swtX61w3zeoKPt 303xXLW+VopIJPvWgIokVRgkTRV3TELZf4zd9HL1dOndDXhOFJSvyn5ZDZ3H3r2+ Lll+wnHlSEP4XYGoVbjcFx4BwYSIx0Q5KwClkSET/iRr++KOISEbqJ99grv6mPl5 ZcT7wybh/+sRK1JTuvMAeBWRdTIrHbEAbAK6PzghAxQG8fTSYBc5rZ5utP9naXaa rNQT6Wgr+KAW9NQP3LD0fwhzZWa7NZHT6k4v65QVSP53C/JAUoAzA7TwG8VzrU5G gthhvU3VeSKRGCa8DrFkK7JkOvK37NitkOPfVoBUd5Vw -----END CERTIFICATE----- ubuntu-make-18.09+disco1/tests/data/www.eclipse.org.pem0000644000000000000000000000563513352651520017662 0ustar -----BEGIN PRIVATE KEY----- MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCgEa3kHNJD/cha wLdb0a8neaxMJpapWgY5O/CkevkT3b9W6/PWk+mQhpbvpxFDl5FfCLJ1Mh98HHI2 48HuHl4xYiOjfFhrnGopa8XmH+K7Va8zccDtgcpzYoj/YuV7y+x9m1vz0aJu8k1J LgV31s/zT+5MCpHoqheiwDSOAMV9WphAQzlN9uyo1h7bm3+37M+0vb4HRS9AoRMZ OIallN0Br2o4y1ab4K0k5rCqbHdkNMJ+yzzpcsB5tuQSd2xIkhQKxWSRSnGv1GBL h6E63tX9/nzwWlusQnm51f7Dt6OGT8ajs2HIlPVWKG/fI+cYru90oAClG50vgKDR m1SyjEwnAgMBAAECggEBAJhN+h1w5wjWswrXECCHtZdkCHM0zGo7RGy1AdYfRFyI xATa4dqsRrLDvV4uoxijYSkBx3wHwzl+f5aGxAHkV0+5x5tJN4C9Ba5/43+Bm2UQ tHHIrP/QXWfIu/30hdJzSISDjMzEDUBvwOX+qilK9fbXeTBVZlvxbCfpppfvV/pa 9bZb2Bter3J/FezNjSYnZyj7GqfG5kwHD+inAc8EtxGLA6qEAatTZeIKzB/Wvtxj Mlh8gMENx4tiNb2AUZ6gXcy1pT/FNdMYTsG/eY8PZln8oqC1lK5V39Y1a942e9jc 8GSpZbR9vrh+Fo4mrmYcKpLnM1rnoB1XZQ5omcuXbCECgYEA0rGSfb/sGn0vVaiu Lc4Fz6UJbBt5iaC0W9zPP2r+2JNowjXWcdeMqX6CQjUjJ1J8uU9eD7SDawivnWj3 TNnrFU1JlhIrviAbySOUb6ypOOQwVgZUeA962nl2N1hpmTnlsYQE6pK8bnsRp0i0 YduNX7eCWWAGpXtQQgkVL3zUTCkCgYEAwn1JHL1IesmyOtfS4cHhoAUN156ogUwF ypb0X3/bbgj/SuNjU3+gEIjnscygtEA/mVdNWNTxIzye7i9utBDals4nTYBZgf4Q QZe0SVCgJjq+DGNiQvA/O/OTIMsrxuRGgkDSEMhqnS36/pBBkkYpFnzTzCjuh4Jv NGrIzHGT388CgYAFE4gvBW+/16JLUwwXSG51aUmH1EWiXj/aMsC/i2lmeG6+tyNa jNHzx3uF8tfM+7zLjjD6+eNsscHhbgT/UgTK95i9R+TL6OQifXv3ENbm6wCLIg3o 8p6IIwMJJFUu/ukc1Mx1hmGJ2+c5+5N1BCAs3TQDyT9/vy/Y13UuNri6uQKBgQCU bck+hbaq/wNmpQ/r+2uWFEVcKVmwU7SXyFz4BTwR3gv3u1Iyh1RBSjqJFwIOjnn7 LQV6pgjiO4GPheOWyMYKEYstOqcU7jC53m1ZBo8yneIs0ixLqc6YkmvWuzfNsqmc /ptS86FqE41aef2RBLqWzu1VAmgIQyNbfaOBY6zXQQKBgF0/wNhHqPHIlycK5zh7 j2vwc0oRyQ+Ok+csAW7RW14RxpOz3M3so85fvnhkLrKGeun72VOSexMgGIGYzYBj Ego23PQzhK1KdDnDVx3M1Z75dYeOaera89pZG9Mu+/ehgSRZ8kYzQ2rkHfKhBg0W jH16B82QvFjSzLT4y6GsNL/G -----END PRIVATE KEY----- -----BEGIN CERTIFICATE----- MIIDfTCCAmWgAwIBAgIJAM20ZMP9aWmfMA0GCSqGSIb3DQEBCwUAMFUxCzAJBgNV BAYTAkZSMRMwEQYDVQQIDApTb21lLVN0YXRlMRcwFQYDVQQKDA5FY2xpcHNlIHNl cnZlcjEYMBYGA1UEAwwPd3d3LmVjbGlwc2Uub3JnMB4XDTE0MTAyMzEzNDA1N1oX DTI0MDgzMTEzNDA1N1owVTELMAkGA1UEBhMCRlIxEzARBgNVBAgMClNvbWUtU3Rh dGUxFzAVBgNVBAoMDkVjbGlwc2Ugc2VydmVyMRgwFgYDVQQDDA93d3cuZWNsaXBz ZS5vcmcwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCgEa3kHNJD/cha wLdb0a8neaxMJpapWgY5O/CkevkT3b9W6/PWk+mQhpbvpxFDl5FfCLJ1Mh98HHI2 48HuHl4xYiOjfFhrnGopa8XmH+K7Va8zccDtgcpzYoj/YuV7y+x9m1vz0aJu8k1J LgV31s/zT+5MCpHoqheiwDSOAMV9WphAQzlN9uyo1h7bm3+37M+0vb4HRS9AoRMZ OIallN0Br2o4y1ab4K0k5rCqbHdkNMJ+yzzpcsB5tuQSd2xIkhQKxWSRSnGv1GBL h6E63tX9/nzwWlusQnm51f7Dt6OGT8ajs2HIlPVWKG/fI+cYru90oAClG50vgKDR m1SyjEwnAgMBAAGjUDBOMB0GA1UdDgQWBBTmUq4DtfLPIe9T8TwZoLM8waKw7jAf BgNVHSMEGDAWgBTmUq4DtfLPIe9T8TwZoLM8waKw7jAMBgNVHRMEBTADAQH/MA0G CSqGSIb3DQEBCwUAA4IBAQA+rB/ZJ3qNVGK9TgTZ7HoJbyavy0swtX61w3zeoKPt 303xXLW+VopIJPvWgIokVRgkTRV3TELZf4zd9HL1dOndDXhOFJSvyn5ZDZ3H3r2+ Lll+wnHlSEP4XYGoVbjcFx4BwYSIx0Q5KwClkSET/iRr++KOISEbqJ99grv6mPl5 ZcT7wybh/+sRK1JTuvMAeBWRdTIrHbEAbAK6PzghAxQG8fTSYBc5rZ5utP9naXaa rNQT6Wgr+KAW9NQP3LD0fwhzZWa7NZHT6k4v65QVSP53C/JAUoAzA7TwG8VzrU5G gthhvU3VeSKRGCa8DrFkK7JkOvK37NitkOPfVoBUd5Vw -----END CERTIFICATE----- ubuntu-make-18.09+disco1/tests/data/www.mozilla.org.crt0000644000000000000000000000212713352651520017705 0ustar -----BEGIN CERTIFICATE----- MIIDBzCCAe+gAwIBAgIJAKTsk2YD8MVzMA0GCSqGSIb3DQEBCwUAMBoxGDAWBgNV BAMMD3d3dy5tb3ppbGxhLm9yZzAeFw0xNTA3MjYwNzQ1MzdaFw0yNTA2MDMwNzQ1 MzdaMBoxGDAWBgNVBAMMD3d3dy5tb3ppbGxhLm9yZzCCASIwDQYJKoZIhvcNAQEB BQADggEPADCCAQoCggEBAPj7Pu2WuyNGp2x8pWT7ZOIx8dHNvFvAhjjsj7RTRN9M HWTWCWRM10WSeylFZKd/tiS5rY2X0cpwC7KsLDFw0bDeOtChKsxY8jTR1bjo/Eb4 pIpkPALdjCH1bbuJ1cvf+G01Tf21UeNCEpT2bKMxhWSNj5kT3NAKoxhDFyGwLHYR PGOkAaK0s+aggD7w1kK1rD8g44IpslW2j4HMts3j5LGwYGS+kodRMvj/zmvUugAI /2I5SNPEvYIObEUeAftuU0RXgUWZENprWWp8yX4gL8bwM00cH5w4pxZX/Xtiys5e CFQDQGzwKPvw4sWr43pu/NnFVM0j9vzKYTc7DzBckjMCAwEAAaNQME4wHQYDVR0O BBYEFLKyZ+S5wc3fVfutG+Qqr1KqJpQ7MB8GA1UdIwQYMBaAFLKyZ+S5wc3fVfut G+Qqr1KqJpQ7MAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBANz9HVL/ 3LMVMNMUGefSEjO75bIcnp/cfv6CfX6bbuRavOmqPR5D21ZPAlWX1zYXOGPJ+rId INYlvM3d+xL3O9FBDedUx3ps6cYyaTpGSptJZ+4VUVI2jdGOASqI3W3StrQQQ2bD 6QDWvMNIe2yelNL5/JMZSVRl7WQEWStqTv9TvysAJzLvo3Sq3rgRyGI0M0e+wPzq /cTinJLPRR7uQim3+3oUv82nQzSL8swkt8zUd2wdGUxs8Tm6DgjnqhTVAWGUOheZ m+szCY3Wz6YBTF3LtPKdOctrvJ1OWoAkeMxROyzG27YURpTY2iCXvey0dGjlBOWd o/RqkNtalg7bO9c= -----END CERTIFICATE----- ubuntu-make-18.09+disco1/tests/data/www.mozilla.org.pem0000644000000000000000000000537713352651520017710 0ustar -----BEGIN PRIVATE KEY----- MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQD4+z7tlrsjRqds fKVk+2TiMfHRzbxbwIY47I+0U0TfTB1k1glkTNdFknspRWSnf7Ykua2Nl9HKcAuy rCwxcNGw3jrQoSrMWPI00dW46PxG+KSKZDwC3Ywh9W27idXL3/htNU39tVHjQhKU 9myjMYVkjY+ZE9zQCqMYQxchsCx2ETxjpAGitLPmoIA+8NZCtaw/IOOCKbJVto+B zLbN4+SxsGBkvpKHUTL4/85r1LoACP9iOUjTxL2CDmxFHgH7blNEV4FFmRDaa1lq fMl+IC/G8DNNHB+cOKcWV/17YsrOXghUA0Bs8Cj78OLFq+N6bvzZxVTNI/b8ymE3 Ow8wXJIzAgMBAAECggEARoLgz2hglxzrTU3/iRmo+GYslb4uGc3sNTLJf8gVOSfV Kzlyb3VTgeB6ALYmS0lfzAbJn8/fGfWhWnhoC5hnyi8lePArrrOB5HOIk1VoHLFN 5+N7G1Si2vsmmHXwlkxXjpYKAE/ZYQLVQFqJaa4cmN1+TVvSrRhWGAjoBCJgdQ7d i4tLx/MNjrDNahOGQW/HPhEGY1llkBGhwesh9/tUoZ869RK4bEtqc84IRvWe1ft5 A3KNgDEpolq+8T0fatgaVFhTGcwbSFUBaApgm+rlPi2vaCNAUE0fMsaN3CaXZg1V 7IjU9ObJycUyDsh608wzRZoekWZG2BDwWzvseqKwAQKBgQD9SOTJWYQpJC02YAHr RPpvf0+WL1SrRc9g2xk8ws/UlPF1UR3i5n9eMUc9RTkHQpLO3Scerr1H18actqF5 wvuBw6vTM+jD8tVaRp8doUDV06KQako+9hA58Hu+MP9BkDZH8ywykaQLwWOj2Ont lCZdW19WkHGMnHhcXi1HiKCzIwKBgQD7porQvNjaLw1iN6M3gIRi9VTFigHs4+L2 xIl9+QThzzr+N6HS8776v+E6WdZSW/7Pbmas+cra6cdZ/AC3VpRKtdH6LYGqMfRR RwOCuklEMpnOuRKkywxn2k4dRF5pSgHZLhk9jo5W0i33JVRdrM60bzTxRzkkqULl V49wZG9dsQKBgCIfONs7WQel3QVvR7LnVwnAT/t+otx0Ci0VN0AtSoxsCF9yryEL RmttHhjOA5HL0TVXK9cBWXSdSB+CpxxdPT7NGo/YdWo4g6+mxfba634jBcqI1znG Modrs2/679hoUje9Nd4WKtB+nCrNpS4hgE2haqWhzfpQdhKTiWwSpvubAoGAJmnh vsNVBtkv3dJIY+yGSOTSL+VFLfgLaUfPBR/CEwYjJzMuzJjQik5H/zQ/dwr79oYP vk/TG1+cQqwpH9Njh5QBnYLczDIb7Vw9uPLexD5FJD00D1u/ZQr56ZXKI6Bcb96N k8vzBmXHBnb4TeRXGUvwdPQ+UM5Vm9Sl3K44IcECgYASkhydtcdZ4tNgVcQule6t MFyWGhhsNH98AuDyqMiylMcbS4E73d7gMD3jdgy2QyMLcZ3pyjO8ZdYU/1VuhjmB hQrUlMwn97c8O/AmtMeKpBc/3WUt5JGAWo/8CIR5J+RY0bzUnSGLxi3zanFjKe57 A35F5r+3kUWLH89Gr6nqsA== -----END PRIVATE KEY----- -----BEGIN CERTIFICATE----- MIIDBzCCAe+gAwIBAgIJAKTsk2YD8MVzMA0GCSqGSIb3DQEBCwUAMBoxGDAWBgNV BAMMD3d3dy5tb3ppbGxhLm9yZzAeFw0xNTA3MjYwNzQ1MzdaFw0yNTA2MDMwNzQ1 MzdaMBoxGDAWBgNVBAMMD3d3dy5tb3ppbGxhLm9yZzCCASIwDQYJKoZIhvcNAQEB BQADggEPADCCAQoCggEBAPj7Pu2WuyNGp2x8pWT7ZOIx8dHNvFvAhjjsj7RTRN9M HWTWCWRM10WSeylFZKd/tiS5rY2X0cpwC7KsLDFw0bDeOtChKsxY8jTR1bjo/Eb4 pIpkPALdjCH1bbuJ1cvf+G01Tf21UeNCEpT2bKMxhWSNj5kT3NAKoxhDFyGwLHYR PGOkAaK0s+aggD7w1kK1rD8g44IpslW2j4HMts3j5LGwYGS+kodRMvj/zmvUugAI /2I5SNPEvYIObEUeAftuU0RXgUWZENprWWp8yX4gL8bwM00cH5w4pxZX/Xtiys5e CFQDQGzwKPvw4sWr43pu/NnFVM0j9vzKYTc7DzBckjMCAwEAAaNQME4wHQYDVR0O BBYEFLKyZ+S5wc3fVfutG+Qqr1KqJpQ7MB8GA1UdIwQYMBaAFLKyZ+S5wc3fVfut G+Qqr1KqJpQ7MAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBANz9HVL/ 3LMVMNMUGefSEjO75bIcnp/cfv6CfX6bbuRavOmqPR5D21ZPAlWX1zYXOGPJ+rId INYlvM3d+xL3O9FBDedUx3ps6cYyaTpGSptJZ+4VUVI2jdGOASqI3W3StrQQQ2bD 6QDWvMNIe2yelNL5/JMZSVRl7WQEWStqTv9TvysAJzLvo3Sq3rgRyGI0M0e+wPzq /cTinJLPRR7uQim3+3oUv82nQzSL8swkt8zUd2wdGUxs8Tm6DgjnqhTVAWGUOheZ m+szCY3Wz6YBTF3LtPKdOctrvJ1OWoAkeMxROyzG27YURpTY2iCXvey0dGjlBOWd o/RqkNtalg7bO9c= -----END CERTIFICATE----- ubuntu-make-18.09+disco1/tests/data/www.rust-lang.org.crt0000644000000000000000000000242613352651520020154 0ustar -----BEGIN CERTIFICATE----- MIIDlTCCAn2gAwIBAgIJAO2Bl4dLamtDMA0GCSqGSIb3DQEBCwUAMGExCzAJBgNV BAYTAkZSMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX aWRnaXRzIFB0eSBMdGQxGjAYBgNVBAMMEXd3dy5ydXN0LWxhbmcub3JnMB4XDTE1 MTEwNjA4NTAxMFoXDTI1MDkxNDA4NTAxMFowYTELMAkGA1UEBhMCRlIxEzARBgNV BAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0IFdpZGdpdHMgUHR5IEx0 ZDEaMBgGA1UEAwwRd3d3LnJ1c3QtbGFuZy5vcmcwggEiMA0GCSqGSIb3DQEBAQUA A4IBDwAwggEKAoIBAQDVplHGBWABxRoizmlVbeSPoF7ma8lTzwGZ4Rd5beOzSEhh 5MdTNJa/eCEsH9lxHUKfR42FltzZg9Aggx9Bo+GaT3Alrt3BYasw8rc23Yt12Qfg bjBB6qVfndW9acaJU6DWRErDTLocgW+d77uXPKJySqWLlXCZ5XuxTvWYeiqqI7af mr90cQ89yEoYosluKRAiYcE+WFPq8YWDpg8LbgOSRmj06+P6ap0Jh+yB1//awOGd LIj7HzJ1mJBKcJWapItwhI7TQmrI4vuFFsQVofawW2rj2Cp38Cj1JJnaksFzW9+V BOoqLfV8VvgEPRrdrbpSVtYGAyppaIXaNketwQeXAgMBAAGjUDBOMB0GA1UdDgQW BBSZ0A9gOD5XYyFFBey1+vZt+QNg/TAfBgNVHSMEGDAWgBSZ0A9gOD5XYyFFBey1 +vZt+QNg/TAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQDFlTnebTgQ 12xZuGDBs1akL6IIopJBfAtAZ4VKb4Hs096WRW4FRoTITZekvttj5PpC60rwCktO wzyvBAaTyyAEFTdJwYDkjQyOn1f/s09dwSJGGRE7m+32gWhJ5wHyYioaq2g/6HZK LEw/URV/ZbC3b6WGajNjKeze9WzR9j7lPwMY1bTyD7PrATI0X/0/Kpb0vB7thoUj FPSmCdOhAvtbwHk14ZYR+cuZF3eKjuwOPQvBgImKSshUa+xny5iypcrGoRSz8TR0 L8JtHyryhBvAOlE1ZxsQ1KGNLkWhSq+IXu62Sn3ypWvzcK12oJleCVVfs4SeyNPa g08xyaMtt/iS -----END CERTIFICATE----- ubuntu-make-18.09+disco1/tests/data/www.rust-lang.org.pem0000644000000000000000000000567613352651520020157 0ustar -----BEGIN PRIVATE KEY----- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDVplHGBWABxRoi zmlVbeSPoF7ma8lTzwGZ4Rd5beOzSEhh5MdTNJa/eCEsH9lxHUKfR42FltzZg9Ag gx9Bo+GaT3Alrt3BYasw8rc23Yt12QfgbjBB6qVfndW9acaJU6DWRErDTLocgW+d 77uXPKJySqWLlXCZ5XuxTvWYeiqqI7afmr90cQ89yEoYosluKRAiYcE+WFPq8YWD pg8LbgOSRmj06+P6ap0Jh+yB1//awOGdLIj7HzJ1mJBKcJWapItwhI7TQmrI4vuF FsQVofawW2rj2Cp38Cj1JJnaksFzW9+VBOoqLfV8VvgEPRrdrbpSVtYGAyppaIXa NketwQeXAgMBAAECggEAD4OnVoDXaul8L2Dbx0dWnJNhsMvM79gNXrY4tSmkqkUq dGlfjAw6kibQCds6N/uO9fAFN9kvql/nAiVjZKnY3RK9qw7arYtBGinV4hcOZH1h FAwMVw0J+zqD5eBDeX9oI4cMAsiUjzNa/pYFAkN17GS9RriQV6yRYdvA+9SLOpWB U3skYIDC9R+N1pmijjtfbMKAepSCS2u5p9XxcApFSnEhNyAwdND9dI4HJQGeuh43 ATluonmGojCHzRGqjbn7KKqoRkzF6ndBfUxEkns9hCaEPiLKvSgVUmkwmEQkBsSo 9gS64bN2hQ36M9cZTak+h/uxmoEAycwPC1+kFabhIQKBgQDz/iBV/1WcreVHYsrP /XR9od6ysJ/0XwcHCymRdCxXuWq0FWyCfRciyp85Hk7DyJrqwC2T4NDqyUG2Qitk SBqeBt4f9y3zME9ZKIR1Tw9tHTxpNuFHzr+lvU1+BPdESIZZcM/LnnXDsH49fn4b f7UtZWl+jEQKAVE2PHPLq/3KUQKBgQDgKezkBD4QuBik4ypgaCf58D5ZwGTJMwyY NQ07evoprxemcVynNGmt6Uxy467nakOY+J82vCjjXWqYGpanwMkIU/tEeScDmxiB P84vpKOkxdiSEwHrbpCdVbi3Kdx0dTFPIPFYguEC6jZ5xAWeqRcKaXIEWuQDQvt0 cOnWClFRZwKBgQCDIXMThPToDfWJlijV+6vd0V80vgRZe7D1MiSXDc6/HuGgA1uc DcqfYjKMqiM+ydOokrxsG4lshdmRMKLNdIsJnztGBrxlVPNwQXxe56ysweezzFDr HMyXMNQzBEw4IJpD+4NSNcmo8HQIbLEt6kbfLP+ziYMPtYGGGptJPRha4QKBgDNX JtxqZFSr9Wj+ZlxCPrWt4nnn6K10NbQ+olM3LUiSw5XpbNEW3gVo44uEvjBeVDEa 8Ew2+B5q7Nj9bffp3aE8qtXZ8aePxCMGHBEpYhmA/sMl+1CSuChw06ePvOAnXy3C W8Rr5WEnh2aIEMlv7MkDsYtxzbs5giH/Im9VWZ6NAoGAMj2B9J0qfSMHhxraB4cP 1F1KFhfjdatV+33e9ZO3FPqBMwQf/rVpGQ9aR26vEMSDDL7JCbDYyWgty2y+vSK6 7guTleSeiKFtQwIauWfzTaNoVSGjgt4tXJ4TxTWrC3CLjNTOXDme3FaQUwH9I2WJ 2A5fT/pWPxJHnCBxLhwrCug= -----END PRIVATE KEY----- -----BEGIN CERTIFICATE----- MIIDlTCCAn2gAwIBAgIJAO2Bl4dLamtDMA0GCSqGSIb3DQEBCwUAMGExCzAJBgNV BAYTAkZSMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX aWRnaXRzIFB0eSBMdGQxGjAYBgNVBAMMEXd3dy5ydXN0LWxhbmcub3JnMB4XDTE1 MTEwNjA4NTAxMFoXDTI1MDkxNDA4NTAxMFowYTELMAkGA1UEBhMCRlIxEzARBgNV BAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0IFdpZGdpdHMgUHR5IEx0 ZDEaMBgGA1UEAwwRd3d3LnJ1c3QtbGFuZy5vcmcwggEiMA0GCSqGSIb3DQEBAQUA A4IBDwAwggEKAoIBAQDVplHGBWABxRoizmlVbeSPoF7ma8lTzwGZ4Rd5beOzSEhh 5MdTNJa/eCEsH9lxHUKfR42FltzZg9Aggx9Bo+GaT3Alrt3BYasw8rc23Yt12Qfg bjBB6qVfndW9acaJU6DWRErDTLocgW+d77uXPKJySqWLlXCZ5XuxTvWYeiqqI7af mr90cQ89yEoYosluKRAiYcE+WFPq8YWDpg8LbgOSRmj06+P6ap0Jh+yB1//awOGd LIj7HzJ1mJBKcJWapItwhI7TQmrI4vuFFsQVofawW2rj2Cp38Cj1JJnaksFzW9+V BOoqLfV8VvgEPRrdrbpSVtYGAyppaIXaNketwQeXAgMBAAGjUDBOMB0GA1UdDgQW BBSZ0A9gOD5XYyFFBey1+vZt+QNg/TAfBgNVHSMEGDAWgBSZ0A9gOD5XYyFFBey1 +vZt+QNg/TAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQDFlTnebTgQ 12xZuGDBs1akL6IIopJBfAtAZ4VKb4Hs096WRW4FRoTITZekvttj5PpC60rwCktO wzyvBAaTyyAEFTdJwYDkjQyOn1f/s09dwSJGGRE7m+32gWhJ5wHyYioaq2g/6HZK LEw/URV/ZbC3b6WGajNjKeze9WzR9j7lPwMY1bTyD7PrATI0X/0/Kpb0vB7thoUj FPSmCdOhAvtbwHk14ZYR+cuZF3eKjuwOPQvBgImKSshUa+xny5iypcrGoRSz8TR0 L8JtHyryhBvAOlE1ZxsQ1KGNLkWhSq+IXu62Sn3ypWvzcK12oJleCVVfs4SeyNPa g08xyaMtt/iS -----END CERTIFICATE----- ubuntu-make-18.09+disco1/tests/jenkins/0000755000000000000000000000000013352651520014641 5ustar ubuntu-make-18.09+disco1/tests/jenkins/branch-setup.xml0000644000000000000000000001221613352651520017760 0ustar Setup ubuntu make trusty job using an ubuntu make branch false 100 branch git branch to test if not master, name the branch can take github url like: "https://github.com/ubuntu/ubuntu-make/tree/test_set_c", or "<repo> <branch>" like "https://github.com/ubuntu/ubuntu-make.git test_set_c" rebaseontrunk Rebase on trunk true true false false false false label ps-trusty-desktop-amd64-1 ps-trusty-desktop-i386-1 #!/bin/bash -eu CONFIG_PATH=/tmp/config # cleanup rm -rf ~/ubuntu-make* rm -rf ${CONFIG_PATH} # enable localhost ssh connection without pass ssh-keygen -t rsa -N "" -f ~/.ssh/id_rsa cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys # add ppa for external content assets like jayatana sudo add-apt-repository -y ppa:ubuntu-desktop/ubuntu-make # add test packages sudo add-apt-repository -y ppa:ubuntu-desktop/ubuntu-make-builddeps sudo apt update sudo apt upgrade -y # install VCS and stats tools sudo apt install -y git sloccount # split branch name if github url given instead of "<repo> <branch>" repo=${branch%/tree/*} if [ "$repo" != "$branch" ]; then branch="${repo}.git ${branch##*/tree/}" fi # merge with trunk or clone from given branch cd ~ if [ "$rebaseontrunk" = true ]; then git config --global user.email "test@ubuntu.com" git config --global user.name "Ubuntu desktop" git clone https://github.com/ubuntu/ubuntu-make cd ubuntu-make git pull --no-edit $branch else git clone $branch ubuntu-make cd ubuntu-make fi UBUNTU_MAKE_VERSION=$(git rev-parse HEAD) # install deps from debian/control sudo apt install -y $(tests/daily_runs/get_binary_depends ubuntu-make) # install test packages sudo tests/daily_runs/install_build_tests_depends sudo addgroup $(whoami) docker # ensure docker is using the CI proxy sudo bash -c 'echo export http_proxy="http://squid.internal:3128" >> /etc/default/docker.io' sudo restart docker # config save mkdir ${CONFIG_PATH} cd ${CONFIG_PATH} echo -e "{\n 'target': 'trunk',\n 'version': '${UBUNTU_MAKE_VERSION}',\n 'date': {\n 'timestamp': '$(date +%s)',\n 'utc': '$(date -u)' },\n 'arch': '$(arch)'\n}" > ubuntu-make-version dpkg -l > packages_list target=branch tests, UNSTABLE_OR_BETTER false ps-trusty-desktop-revert-snapshot-daily FAILED true false ubuntu-make-18.09+disco1/tests/jenkins/ps-trusty-desktop-revert-snapshot-daily.xml0000644000000000000000000001021413352651520025264 0ustar false 100 true false false false false #!/bin/bash set -ex ssh ubuntu@10.100.0.103 /usr/bin/virsh snapshot-revert ps-trusty-desktop-amd64-1 24022015 ssh ubuntu@10.100.0.103 /usr/bin/virsh snapshot-revert ps-trusty-desktop-i386-1 24022015-i386 both_started=false # start the domain until it's started and kept running (virsh will return in error if domain already started) while [ "$both_started" == false ]; do echo "trying to start both vms" both_started=true # virsh returns false is domain is already started, and so, true if just started it ssh ubuntu@10.100.0.103 /usr/bin/virsh start ps-trusty-desktop-amd64-1 && both_started=false ssh ubuntu@10.100.0.103 /usr/bin/virsh start ps-trusty-desktop-i386-1 && both_started=false sleep 60 done # trying to start the jenkins slave, and ensure they are kept running for at least one loop both_were_started=false while true; do amd64_started=true i386_started=true ssh ubuntu@ps-trusty-desktop-amd64-1 /usr/bin/sudo status jenkins-slave | grep running || amd64_started=false ssh ubuntu@ps-trusty-desktop-i386-1 /usr/bin/sudo status jenkins-slave | grep running || i386_started=false if [ "$amd64_started" = true ] && [ "$i386_started" = true ]; then if [ "$both_were_started" = true ]; then break; fi both_were_started=true fi if [ "$both_were_started" = false ]; then ssh ubuntu@ps-trusty-desktop-amd64-1 /usr/bin/sudo start jenkins-slave || true ssh ubuntu@ps-trusty-desktop-i386-1 /usr/bin/sudo start jenkins-slave || true both_were_started=false fi # Let the service restarts if they do. sleep 60 done ps-trusty-desktop-update-daily ALWAYS false false #!/bin/bash set -ex # reboot the slaves and wait for them to boot up ssh ubuntu@ps-trusty-desktop-amd64-1 /usr/bin/sudo reboot ssh ubuntu@ps-trusty-desktop-i386-1 /usr/bin/sudo reboot sleep 150 # trying to start the jenkins slave, and ensure they are kept running for at least one loop both_were_started=false while true; do amd64_started=true i386_started=true ssh ubuntu@ps-trusty-desktop-amd64-1 /usr/bin/sudo status jenkins-slave | grep running || amd64_started=false ssh ubuntu@ps-trusty-desktop-i386-1 /usr/bin/sudo status jenkins-slave | grep running || i386_started=false if [ "$amd64_started" = true ] && [ "$i386_started" = true ]; then if [ "$both_were_started" = true ]; then break; fi both_were_started=true fi if [ "$both_were_started" = false ]; then ssh ubuntu@ps-trusty-desktop-amd64-1 /usr/bin/sudo start jenkins-slave || true ssh ubuntu@ps-trusty-desktop-i386-1 /usr/bin/sudo start jenkins-slave || true both_were_started=false fi # Let the service restarts if they do. sleep 60 done ubuntu-make-18.09+disco1/tests/jenkins/ps-trusty-desktop-update-daily.xml0000644000000000000000000000313713352651520023410 0ustar false 100 true false false false false label ps-trusty-desktop-amd64-1 ps-trusty-desktop-i386-1 #!/bin/bash set -ex sudo apt-get update || sudo apt-get update || sudo apt-get update sudo apt-get dist-upgrade -y --force-yes || sudo apt-get dist-upgrade -y --force-yes || sudo apt-get dist-upgrade -y --force-yes sudo apt-get install -f -y --force-yes || sudo apt-get install -f -y --force-yes || sudo apt-get install -f -y --force-yes sudo apt-get dist-upgrade -y --force-yes || sudo apt-get dist-upgrade -y --force-yes || sudo apt-get dist-upgrade -y --force-yes false ubuntu-make-18.09+disco1/tests/jenkins/system-setup.xml0000644000000000000000000001007713352651520020052 0ustar Setup udtc trusty job using system ubuntu make false 100 true false false false 02 3,9,15,21 * * * false label ps-trusty-desktop-amd64-1 ps-trusty-desktop-i386-1 #!/bin/bash -eu CONFIG_PATH=/tmp/config # cleanup rm -rf ~/ubuntu-make* rm -rf ${CONFIG_PATH} # enable localhost ssh connection without pass ssh-keygen -t rsa -N "" -f ~/.ssh/id_rsa cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys # add ppa for external content assets like jayatana and Ubuntu Make source package sudo add-apt-repository -y ppa:ubuntu-desktop/ubuntu-make sudo sed -i 's/# deb-src/deb-src/' /etc/apt/sources.list.d/ubuntu-desktop-ubuntu-make-trusty.list # add test packages sudo add-apt-repository -y ppa:ubuntu-desktop/ubuntu-make-builddeps sudo apt update sudo apt upgrade -y # install source and stats tools sudo apt install -y dpkg-dev sloccount # install latest system version sudo apt install -y ubuntu-make cd ~ apt-get source ubuntu-make mv ubuntu-make-* ubuntu-make cd ubuntu-make mv umake umakelocal # get umake dir out of the way for coverage report UBUNTU_MAKE_VERSION=$(dpkg-parsechangelog --show-field Version) # install test packages sudo tests/daily_runs/install_build_tests_depends sudo addgroup $(whoami) docker # ensure docker is using the CI proxy sudo bash -c 'echo export http_proxy="http://squid.internal:3128" >> /etc/default/docker.io' sudo restart docker # config save mkdir ${CONFIG_PATH} cd ${CONFIG_PATH} echo -e "{\n 'version': '${UBUNTU_MAKE_VERSION}',\n 'date': {\n 'timestamp': '$(date +%s)',\n 'utc': '$(date -u)' },\n 'arch': '$(arch)'\n}" > ubuntu-make-version dpkg -l > packages_list target=system tests, UNSTABLE_OR_BETTER false ps-trusty-desktop-revert-snapshot-daily FAILED true false ubuntu-make-18.09+disco1/tests/jenkins/tests-collect.xml0000644000000000000000000000572413352651520020160 0ustar Collect ubuntu make trusty tests coverage report false 100 true false false false false label ps-trusty-desktop-amd64-1 ps-trusty-desktop-i386-1 #!/bin/bash -eu # remove old artefacts. rm -rf * .* 2>/dev/null || true TESTS_RESULT_DIR=~/jenkins/workspace/tests/label/*/type for test_type in `ls $TESTS_RESULT_DIR`; do coverage_file=${TESTS_RESULT_DIR}/${test_type}/.coverage config_dir=${TESTS_RESULT_DIR}/${test_type}/config if [ -f ${coverage_file} ]; then cp ${coverage_file} .coverage.${test_type} fi # all configs are identicals if [ ! -d config ] && [ -d ${config_dir} ]; then cp -a ${config_dir} . fi done python3-coverage combine python3-coverage html -d html-coverage python3-coverage xml # print on stdout as well python3-coverage report echo Stats: cd ~/ubuntu-make mv umakelocal umake 2>/dev/null || true # for the stats in case of system tests sloccount umake/ tests/ | head -n -17 | tail -n 9 ** false true true ps-trusty-desktop-revert-snapshot-daily ALWAYS true false ubuntu-make-18.09+disco1/tests/jenkins/tests.xml0000644000000000000000000001136213352651520016530 0ustar Tests execution for ubuntu make on trusty using latest available ubuntu make test. false 100 target Test target (system or trunk). This depends on which setup job previously executed and is just a tag here. true false false false false type pep8 small medium large label ps-trusty-desktop-amd64-1 ps-trusty-desktop-i386-1 #!/bin/bash -eu RESULT_DIR=$PWD # remove old artefacts. rm -rf * .* 2>/dev/null || true echo "Testing $type tests on ubuntu make $target" ADDITIONAL_OPTS="" if [ "$target" == "system" ]; then ADDITIONAL_OPTS="--system " fi TEST_ENV="DISPLAY=:0" # set proxy for all tests but small ones (proxy doesn't know about localhost and try to interfere) if [ "$type" != small ]; then TEST_ENV="http_proxy=http://squid.internal:3128 https_proxy=http://squid.internal:3128 $TEST_ENV" fi # we skip medium on non amd64, containers are 64 bits if [ "$type" == medium ] && [ "$(arch)" != x86_64 ]; then echo '<?xml version="1.0" encoding="UTF-8"?><testsuite name="nosetests" tests="1" errors="0" failures="0" skip="0"><testcase classname="ignore" name="medium._test_not_supported" time="0.0">{}</testcase></testsuite>' > ${RESULT_DIR}/nosetests.xml exit 0 fi # We need a pseudo tty (even if we have no input) for medium tests to pass. That's why we "ssh -t -t" # sudo su is used because tests: # 1. are better run as non root (hence su whoami) # 2. need to be able to gain sudo priviledge when installing packages ssh -o StrictHostKeyChecking=no -t -t 127.0.0.1 "sudo su $(whoami) -c 'cd ~/ubuntu-make && $TEST_ENV dbus-launch eatmydata ./runtests --coverage --publish ${ADDITIONAL_OPTS} $type'" || true # copy artefacts cd ~/ubuntu-make cp nosetests.* ${RESULT_DIR} cp .coverage ${RESULT_DIR} cp -a *coverage* ${RESULT_DIR} cp *.log ${RESULT_DIR} cp -a /tmp/config ${RESULT_DIR} ** false **/nosetests.xml false true true tests-collect, ALWAYS true false ubuntu-make-18.09+disco1/tests/jenkins/trunk-setup.xml0000644000000000000000000000744613352651520017677 0ustar Setup ubuntu make trusty job using ubuntu make trunk false 100 true false false false 2 */6 * * * false label ps-trusty-desktop-amd64-1 ps-trusty-desktop-i386-1 #!/bin/bash -eu CONFIG_PATH=/tmp/config # cleanup rm -rf ~/ubuntu-make* rm -rf ${CONFIG_PATH} # add ppa for external content assets like jayatana sudo add-apt-repository -y ppa:ubuntu-desktop/ubuntu-make # add test packages sudo add-apt-repository -y ppa:ubuntu-desktop/ubuntu-make-builddeps sudo apt update sudo apt upgrade -y # install VCS and stats tools sudo apt install -y git sloccount # clone from trunk cd ~ git clone https://github.com/ubuntu/ubuntu-make cd ubuntu-make UBUNTU_MAKE_VERSION=$(git rev-parse HEAD) # install deps from debian/control sudo apt install -y $(tests/daily_runs/get_binary_depends ubuntu-make) # install test packages sudo tests/daily_runs/install_build_tests_depends sudo addgroup $(whoami) docker # ensure docker is using the CI proxy sudo bash -c 'echo export http_proxy="http://squid.internal:3128" >> /etc/default/docker.io' sudo restart docker # config save mkdir ${CONFIG_PATH} cd ${CONFIG_PATH} echo -e "{\n 'target': 'trunk',\n 'version': '${UBUNTU_MAKE_VERSION}',\n 'date': {\n 'timestamp': '$(date +%s)',\n 'utc': '$(date -u)' },\n 'arch': &apoapos;$(arch)'\n}" > ubuntu-make-version dpkg -l > packages_list target=trunk tests, UNSTABLE_OR_BETTER false ps-trusty-desktop-revert-snapshot-daily FAILED true false ubuntu-make-18.09+disco1/tests/large/0000755000000000000000000000000013352651520014272 5ustar ubuntu-make-18.09+disco1/tests/large/__init__.py0000644000000000000000000002343413352651520016411 0ustar # -*- coding: utf-8 -*- # Copyright (C) 2014 Canonical # # Authors: # Didier Roche # # 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; version 3. # # 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 """Basic large tests class""" from contextlib import suppress from nose.tools import nottest import os import pexpect import shutil import signal import stat import subprocess from time import sleep from umake.tools import get_icon_path, get_launcher_path, launcher_exists_and_is_pinned, remove_framework_envs_from_user from ..tools import LoggedTestCase, get_path_from_desktop_file, is_in_group, INSTALL_DIR, swap_file_and_restore, \ spawn_process from umake.settings import DEFAULT_BINARY_LINK_PATH class LargeFrameworkTests(LoggedTestCase): """Large framework base utilities""" in_container = False def setUp(self): super().setUp() self.installed_path = "" self.framework_name_for_profile = "" self.conf_path = os.path.expanduser("~/.config/umake") self.install_base_path = os.path.expanduser("~/{}".format(INSTALL_DIR)) self.binary_dir = DEFAULT_BINARY_LINK_PATH self.desktop_filename = "" self.child = None self.additional_dirs = [] self.original_env = os.environ.copy() # we want to standardize on bash environment for running large tests os.environ["SHELL"] = "/bin/bash" def tearDown(self): # don't remove on machine paths if running within a container if not self.in_container: with suppress(FileNotFoundError): shutil.rmtree(self.installed_path) # TODO: need to be finer grain in the future with suppress(FileNotFoundError): os.remove(self.conf_path) if self.desktop_filename: with suppress(FileNotFoundError): os.remove(get_launcher_path(self.desktop_filename)) os.remove(self.exec_link) remove_framework_envs_from_user(self.framework_name_for_profile) for dir in self.additional_dirs: with suppress(OSError): shutil.rmtree(dir) # restore original environment. Do not use the dict copy which erases the object and doesn't have the magical # _Environ which setenv() for subprocess os.environ.clear() os.environ.update(self.original_env) super().tearDown() def _pid_for(self, process_grep): """Return pid matching the process_grep elements""" for pid in os.listdir('/proc'): if not pid.isdigit(): continue # ignore processes that are closed in between with suppress(IOError): cmdline = open(os.path.join('/proc', pid, 'cmdline'), 'r').read() for process_elem in process_grep: if process_elem not in cmdline: break # we found it else: return int(pid) raise BaseException("The process that we can find with {} isn't started".format(process_grep)) def check_and_kill_process(self, process_grep, wait_before=0, send_sigkill=False): """Check a process matching process_grep exists and kill it""" sleep(wait_before) pid = self._pid_for(process_grep) if send_sigkill: os.kill(pid, signal.SIGKILL) else: os.kill(pid, signal.SIGTERM) @property def exec_link(self): return os.path.join(self.binary_dir, self.desktop_filename.split('.')[0]) @property def exec_path(self): return self._get_path_from_desktop_file("TryExec") def _get_path_from_desktop_file(self, key, abspath_transform=None): """get the path referred as key in the desktop filename exists""" path = get_path_from_desktop_file(self.desktop_filename, key) if not path.startswith("/") and abspath_transform: path = abspath_transform(path) return path def assert_exec_exists(self): """Assert that the exec path exists""" self.assertTrue(self.path_exists(self.exec_path)) def assert_icon_exists(self): """Assert that the icon path exists""" self.assertTrue(self.path_exists(self._get_path_from_desktop_file('Icon', get_icon_path))) def assert_exec_link_exists(self): """Assert that the link to the binary exists""" self.assertTrue(self.is_in_path(self.exec_link)) def assert_for_warn(self, content, expect_warn=False): """assert if there is any warn""" if not expect_warn: # We need to remove the first expected message, which is "Logging level set to " # (can be WARNING or ERROR) content = content.replace("Logging level set to WARNING", "").replace("Logging level set to ERROR", "") self.assertNotIn("WARNING", content) self.assertNotIn("ERROR", content) else: for warn_tag in ("WARNING", "ERROR"): if warn_tag in content: break else: # nothing found: raise BaseException("We didn't find an expected WARNING or ERROR in {}".format(content)) def return_and_wait_expect(self, expect_query, timeout=-1): """run the expect query and return the result""" output = "" continue_expect = True while continue_expect: try: result = self.child.expect(expect_query, timeout=timeout) continue_expect = False except pexpect.TIMEOUT: # stalled during timeout period if output == self.child.before: print(self.child.before) raise output = self.child.before # print the whole process output before getting the pexpect exception except: print(self.child.before) raise return result def expect_and_no_warn(self, expect_query, timeout=-1, expect_warn=False): """run the expect query and check that there is no warning or error It doesn't fail on the given timeout if stdout is progressing""" self.return_and_wait_expect(expect_query, timeout) self.assert_for_warn(self.child.before, expect_warn) def wait_and_no_warn(self, expect_warn=False): """run wait and check that there is no warning or error""" self.expect_and_no_warn(pexpect.EOF, expect_warn=expect_warn) def accept_default_and_wait(self, expect_warn=False): """accept default and wait for exiting""" self.child.sendline("") self.wait_and_no_warn(expect_warn) def close_and_check_status(self, exit_status=0): """exit child process and check its exit status""" self.child.close() self.assertEqual(exit_status, self.child.exitstatus) def wait_and_close(self, expect_warn=False, exit_status=0): """wait for exiting and check exit status""" self.wait_and_no_warn(expect_warn) self.close_and_check_status(exit_status) def command(self, commands_to_run): """passthrough, return args""" return commands_to_run def command_as_list(self, commands_input): """passthrough, return args""" return commands_input def get_launcher_path(self, desktop_filename): """passthrough getting the launcher path from umake tools""" return get_launcher_path(desktop_filename) def launcher_exists_and_is_pinned(self, desktop_filename): """passthrough to in process method""" return launcher_exists_and_is_pinned(desktop_filename) def path_exists(self, path): """passthrough to os.path.exists""" return os.path.exists(path) def remove_path(self, path): """Remove targeted path""" try: os.remove(path) except OSError: shutil.rmtree(path) def is_in_path(self, filename): """check that we have a directory in path""" return_code = subprocess.call(["bash", "-l", "which", filename], stdin=subprocess.DEVNULL, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) if return_code == 0: return True elif return_code == 1: return False raise BaseException("Unknown return code for looking if {} is in path".format(filename)) def is_in_group(self, group): """return if current user is in a group""" return is_in_group(group) def get_file_perms(self, path): """return unix file perms string for path""" return stat.filemode(os.stat(path).st_mode) def create_file(self, path, content): """passthrough to create a file on the disk""" open(path, 'w').write(content) @nottest def bad_download_page_test(self, command, content_file_path): """Helper for running a test to confirm failure on a significantly changed download page.""" with swap_file_and_restore(content_file_path): with open(content_file_path, "w") as newfile: newfile.write("foo") self.child = spawn_process(command) self.expect_and_no_warn("Choose installation path: {}".format(self.installed_path)) self.child.sendline("") self.wait_and_close(expect_warn=True, exit_status=1) ubuntu-make-18.09+disco1/tests/large/test_android.py0000644000000000000000000001656613352651520017341 0ustar # -*- coding: utf-8 -*- # Copyright (C) 2014 Canonical # # Authors: # Didier Roche # # 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; version 3. # # 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 """Tests for android""" from . import LargeFrameworkTests import os import subprocess from ..tools import UMAKE, spawn_process class AndroidStudioTests(LargeFrameworkTests): """This will test the Android Studio base""" TIMEOUT_INSTALL_PROGRESS = 120 TIMEOUT_START = 60 TIMEOUT_STOP = 60 def setUp(self): super().setUp() self.installed_path = os.path.join(self.install_base_path, "android", "android-studio") self.desktop_filename = "android-studio.desktop" def test_default_android_studio_install(self): """Install android studio from scratch test case""" self.child = spawn_process(self.command('{} android android-studio'.format(UMAKE))) self.expect_and_no_warn("Choose installation path: {}".format(self.installed_path)) self.child.sendline("") self.expect_and_no_warn("\[I Accept.*\]") # ensure we have a license question self.child.sendline("a") self.expect_and_no_warn("Installation done", timeout=self.TIMEOUT_INSTALL_PROGRESS) self.wait_and_close() # we have an installed launcher, added to the launcher self.assertTrue(self.launcher_exists_and_is_pinned(self.desktop_filename)) self.assert_exec_exists() self.assert_icon_exists() self.assert_exec_link_exists() # launch it, send SIGTERM and check that it exits fine proc = subprocess.Popen(self.command_as_list(self.exec_path), stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) self.check_and_kill_process(["java", self.installed_path], wait_before=self.TIMEOUT_START) self.assertEqual(proc.wait(self.TIMEOUT_STOP), 143) # ensure that it's detected as installed: self.child = spawn_process(self.command('{} android android-studio'.format(UMAKE))) self.expect_and_no_warn("Android Studio is already installed.*\[.*\] ") self.child.sendline() self.wait_and_close() class AndroidSDKTests(LargeFrameworkTests): """This will test the Android SDK installation""" TIMEOUT_INSTALL_PROGRESS = 120 def setUp(self): super().setUp() self.installed_path = os.path.join(self.install_base_path, "android", "android-sdk") @property def exec_path(self): return os.path.join(self.installed_path, "tools", "bin", "sdkmanager") def test_default_android_sdk_install(self): """Install android sdk from scratch test case""" self.child = spawn_process(self.command('{} android android-sdk'.format(UMAKE))) self.expect_and_no_warn("Choose installation path: {}".format(self.installed_path)) self.child.sendline("") self.expect_and_no_warn("\[I Accept.*\]") # ensure we have a license question self.child.sendline("a") self.expect_and_no_warn("Installation done", timeout=self.TIMEOUT_INSTALL_PROGRESS) self.wait_and_close() # we have an installed sdk exec self.assert_exec_exists() self.assertTrue(self.is_in_path(self.exec_path)) # launch it, send SIGTERM and check that it exits fine self.assertEqual(subprocess.check_call(self.command_as_list([self.exec_path, "--list"]), stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL), 0) # ensure that it's detected as installed: self.child = spawn_process(self.command('{} android android-sdk'.format(UMAKE))) self.expect_and_no_warn("Android SDK is already installed.*\[.*\] ") self.child.sendline() self.wait_and_close() class AndroidPlatformToolsTests(LargeFrameworkTests): """This will test the Android Platform Tools installation""" TIMEOUT_INSTALL_PROGRESS = 120 def setUp(self): super().setUp() self.installed_path = os.path.join(self.install_base_path, "android", "android-platform-tools") @property def exec_path(self): return os.path.join(self.installed_path, "platform-tools", "adb") def test_default_android_platform_tools_install(self): """Install android sdk from scratch test case""" self.child = spawn_process(self.command('{} android android-platform-tools'.format(UMAKE))) self.expect_and_no_warn("Choose installation path: {}".format(self.installed_path)) self.child.sendline("") self.expect_and_no_warn("\[I Accept.*\]") # ensure we have a license question self.child.sendline("a") self.expect_and_no_warn("Installation done", timeout=self.TIMEOUT_INSTALL_PROGRESS) self.wait_and_close() # we have an installed sdk exec self.assert_exec_exists() self.assertTrue(self.is_in_path(self.exec_path)) # launch it, send SIGTERM and check that it exits fine self.assertEqual(subprocess.check_call(self.command_as_list([self.exec_path, "devices"]), stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL), 0) # ensure that it's detected as installed: self.child = spawn_process(self.command('{} android android-platform-tools'.format(UMAKE))) self.expect_and_no_warn("Android Platform Tools is already installed.*\[.*\] ") self.child.sendline() self.wait_and_close() class AndroidNDKTests(LargeFrameworkTests): """This will test the Android NDK installation""" TIMEOUT_INSTALL_PROGRESS = 120 def setUp(self): super().setUp() self.installed_path = os.path.join(self.install_base_path, "android", "android-ndk") @property def exec_path(self): return os.path.join(self.installed_path, "ndk-build") def test_default_android_ndk_install(self): """Install android ndk from scratch test case""" self.child = spawn_process(self.command('{} android android-ndk'.format(UMAKE))) self.expect_and_no_warn("Choose installation path: {}".format(self.installed_path)) self.child.sendline("") self.expect_and_no_warn("\[I Accept.*\]") # ensure we have a license question self.child.sendline("a") self.expect_and_no_warn("Installation done", timeout=self.TIMEOUT_INSTALL_PROGRESS) self.wait_and_close() # we have an installed ndk exec self.assert_exec_exists() self.assertTrue(self.is_in_path(self.exec_path)) # ensure that it's detected as installed: self.child = spawn_process(self.command('{} android android-ndk'.format(UMAKE))) self.expect_and_no_warn("Android NDK is already installed.*\[.*\] ") self.child.sendline() self.wait_and_close() ubuntu-make-18.09+disco1/tests/large/test_baseinstaller.py0000644000000000000000000006765013352651520020551 0ustar # -*- coding: utf-8 -*- # Copyright (C) 2014 Canonical # # Authors: # Didier Roche # # 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; version 3. # # 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 """Tests for large base installer framework""" from . import LargeFrameworkTests import os import pexpect import platform import shutil import subprocess import tempfile from ..tools import UMAKE, spawn_process, get_data_dir, swap_file_and_restore from ..tools.local_server import LocalHttp class BaseInstallerTests(LargeFrameworkTests): """This will test the base installer framework via a fake one""" TIMEOUT_INSTALL_PROGRESS = 120 TIMEOUT_START = 1 TIMEOUT_STOP = 1 server = None TEST_URL_FAKE_DATA = "http://localhost:8765/base-framework-fake64.tgz" TEST_CHECKSUM_FAKE_DATA = "4a582c6e35700f00332783b0b83783f73499aa60" JAVAEXEC = "java-fake64" @classmethod def setUpClass(cls): super().setUpClass() cls.proxy_env = {"http_proxy": None, "https_proxy": None} for key in cls.proxy_env: cls.proxy_env[key] = os.environ.pop(key, None) cls.download_page_file_path = os.path.join(get_data_dir(), "server-content", "localhost", "index.html") if not cls.in_container: server_dir = os.path.join(get_data_dir(), "server-content", "localhost") cls.server = LocalHttp(server_dir, port=8765) framework_dir = os.path.expanduser(os.path.join('~', '.umake', 'frameworks')) cls.testframework = (os.path.join(framework_dir, 'baseinstallerfake.py')) os.makedirs(framework_dir, exist_ok=True) shutil.copy(os.path.join(get_data_dir(), "testframeworks", "baseinstallerfake.py"), cls.testframework) if platform.machine() != "x86_64": cls.TEST_URL_FAKE_DATA = "http://localhost:8765/base-framework-fake32.tgz" cls.TEST_CHECKSUM_FAKE_DATA = "4f64664ebe496cc6d54f417f25a1707f156d74d2" cls.JAVAEXEC = "java-fake32" @classmethod def tearDownClass(cls): super().tearDownClass() for key, value in cls.proxy_env.items(): if value: os.environ[key] = value if not cls.in_container: os.remove(cls.testframework) cls.server.stop() def setUp(self): super().setUp() self.installed_path = os.path.join(self.install_base_path, "base", "base-framework") self.desktop_filename = "base-framework.desktop" self.required_files_path = [os.path.join("bin", "studio.sh")] @property def arch_option(self): """we return the expected arch call on command line""" return platform.machine() def test_default_install(self): """Install base installer from scratch test case""" self.child = spawn_process(self.command('{} base base-framework'.format(UMAKE))) self.expect_and_no_warn("Choose installation path: {}".format(self.installed_path)) self.child.sendline("") self.expect_and_no_warn("\[I Accept.*\]") # ensure we have a license question self.child.sendline("a") self.expect_and_no_warn("Installation done", timeout=self.TIMEOUT_INSTALL_PROGRESS) self.wait_and_close() # we have an installed launcher, added to the launcher self.assertTrue(self.launcher_exists_and_is_pinned(self.desktop_filename)) self.assert_exec_exists() self.assert_icon_exists() self.assert_exec_link_exists() # launch it, send SIGTERM and check that it exits fine proc = subprocess.Popen(self.command_as_list(self.exec_path), stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) self.check_and_kill_process([self.JAVAEXEC, self.installed_path], wait_before=self.TIMEOUT_START) self.assertEqual(proc.wait(self.TIMEOUT_STOP), 143) # ensure that it's detected as installed: self.child = spawn_process(self.command('{} base base-framework'.format(UMAKE))) self.expect_and_no_warn("Base Framework is already installed.*\[.*\] ") self.child.sendline() self.wait_and_close() def test_no_license_accept(self): """We don't accept the license (default)""" self.child = spawn_process(self.command('{} base base-framework'.format(UMAKE))) self.expect_and_no_warn("Choose installation path: {}".format(self.installed_path)) self.child.sendline("") self.expect_and_no_warn("\[I Accept.*\]") # ensure we have a license question self.accept_default_and_wait() self.close_and_check_status() self.assertFalse(self.launcher_exists_and_is_pinned(self.desktop_filename)) def test_doesnt_accept_wrong_path(self): """We don't accept a wrong path""" self.child = spawn_process(self.command('{} base base-framework'.format(UMAKE))) self.expect_and_no_warn("Choose installation path: {}".format(self.installed_path)) self.child.sendline(chr(127) * 100) self.expect_and_no_warn("Choose installation path: {}".format(self.installed_path)) self.child.sendline(chr(127) * 100 + "/") self.expect_and_no_warn("Choose installation path: {}".format(self.installed_path), expect_warn=True) self.child.sendcontrol('C') self.wait_and_no_warn() self.assertFalse(self.launcher_exists_and_is_pinned(self.desktop_filename)) def test_reinstall(self): """Reinstall once installed""" for loop in ("install", "reinstall"): self.child = spawn_process(self.command('{} base base-framework'.format(UMAKE))) if loop == "reinstall": # we only have one question, not the one about existing dir. self.expect_and_no_warn("Base Framework is already installed.*\[.*\] ") self.child.sendline("y") self.expect_and_no_warn("Choose installation path: {}".format(self.installed_path)) self.child.sendline("") self.expect_and_no_warn("\[.*\] ") self.child.sendline("a") self.expect_and_no_warn("Installation done", timeout=self.TIMEOUT_INSTALL_PROGRESS) self.wait_and_close() # we have an installed launcher, added to the launcher self.assertTrue(self.launcher_exists_and_is_pinned(self.desktop_filename)) self.assert_exec_exists() # launch it, send SIGTERM and check that it exits fine proc = subprocess.Popen(self.command_as_list(self.exec_path), stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) self.check_and_kill_process([self.JAVAEXEC, self.installed_path], wait_before=self.TIMEOUT_START) def test_reinstall_other_path(self): """Reinstall Base Framework on another path once installed should remove the first version""" original_install_path = self.installed_path for loop in ("install", "reinstall"): if loop == "reinstall": self.installed_path = "/tmp/foo" self.child = spawn_process(self.command('{} base base-framework {}'.format(UMAKE, self.installed_path))) self.expect_and_no_warn("Base Framework is already installed.*\[.*\] ") self.child.sendline("y") else: self.child = spawn_process(self.command('{} base base-framework'.format(UMAKE))) self.expect_and_no_warn("Choose installation path: {}".format(self.installed_path)) self.child.sendline("") self.expect_and_no_warn("\[.*\] ") self.child.sendline("a") self.expect_and_no_warn("Installation done", timeout=self.TIMEOUT_INSTALL_PROGRESS) self.wait_and_close() # we have an installed launcher, added to the launcher self.assertTrue(self.launcher_exists_and_is_pinned(self.desktop_filename)) self.assert_exec_exists() # ensure that version first isn't installed anymore self.assertFalse(self.path_exists(original_install_path)) def test_reinstall_other_non_empty_path(self): """Reinstall Base Framework on another path (non empty) once installed should remove the first version""" original_install_path = self.installed_path if not self.in_container: self.reinstalled_path = tempfile.mkdtemp() else: # we still give a path for the container self.reinstalled_path = os.path.join(tempfile.gettempdir(), "tmptests") self.create_file(os.path.join(self.reinstalled_path, "bar"), "foo") for loop in ("install", "reinstall"): if loop == "reinstall": self.installed_path = self.reinstalled_path self.child = spawn_process(self.command('{} base base-framework {}'.format(UMAKE, self.installed_path))) self.expect_and_no_warn("Base Framework is already installed.*\[.*\] ") self.child.sendline("y") self.expect_and_no_warn("{} isn't an empty directory.*there\? \[.*\] ".format(self.installed_path)) self.child.sendline("y") else: self.child = spawn_process(self.command('{} base base-framework'.format(UMAKE))) self.expect_and_no_warn("Choose installation path: {}".format(self.installed_path)) self.child.sendline("") self.expect_and_no_warn("\[.*\] ") self.child.sendline("a") self.expect_and_no_warn("Installation done", timeout=self.TIMEOUT_INSTALL_PROGRESS) self.wait_and_close() # we have an installed launcher, added to the launcher self.assertTrue(self.launcher_exists_and_is_pinned(self.desktop_filename)) self.assert_exec_exists() # ensure that version first isn't installed anymore self.assertFalse(self.path_exists(original_install_path)) def test_reinstall_previous_install_removed(self): """Detect that removing Base Framework content, but still having a launcher, doesn't trigger a reinstall question""" for loop in ("install", "reinstall"): if loop == "reinstall": # remove code (but not laucher) self.remove_path(self.installed_path) self.child = spawn_process(self.command('{} base base-framework'.format(UMAKE))) self.expect_and_no_warn("Choose installation path: {}".format(self.installed_path)) self.child.sendline("") self.expect_and_no_warn("\[.*\] ") self.child.sendline("a") self.expect_and_no_warn("Installation done", timeout=self.TIMEOUT_INSTALL_PROGRESS) self.wait_and_close() # we have an installed launcher, added to the launcher self.assertTrue(self.launcher_exists_and_is_pinned(self.desktop_filename)) self.assert_exec_exists() def test_reinstall_previous_launcher_removed(self): """Detect that removing Base Framework launcher, but still having the code, doesn't trigger a reinstall question. However, we do have a dir isn't empty one.""" for loop in ("install", "reinstall"): if loop == "reinstall": # remove launcher, but not code self.remove_path(self.get_launcher_path(self.desktop_filename)) self.child = spawn_process(self.command('{} base base-framework'.format(UMAKE))) self.expect_and_no_warn("Choose installation path: {}".format(self.installed_path)) self.child.sendline("") if loop == "reinstall": self.expect_and_no_warn("{} isn't an empty directory.*there\? \[.*\] ".format(self.installed_path)) self.child.sendline("y") self.expect_and_no_warn("\[.*\] ") self.child.sendline("a") self.expect_and_no_warn("Installation done", timeout=self.TIMEOUT_INSTALL_PROGRESS) self.wait_and_close() # we have an installed launcher, added to the launcher self.assertTrue(self.launcher_exists_and_is_pinned(self.desktop_filename)) self.assert_exec_exists() def test_xdg_data_install_path(self): """Install in path specified by XDG_DATA_HOME""" xdg_data_path = "/tmp/foo" self.installed_path = "{}/umake/base/base-framework".format(xdg_data_path) cmd = "XDG_DATA_HOME={} {} base base-framework".format(xdg_data_path, UMAKE) if not self.in_container: cmd = 'bash -c "{}"'.format(cmd) self.child = spawn_process(self.command(cmd)) self.expect_and_no_warn("Choose installation path: {}".format(self.installed_path)) self.child.sendline("") self.expect_and_no_warn("\[I Accept.*\]") self.accept_default_and_wait() self.close_and_check_status() self.assertFalse(self.launcher_exists_and_is_pinned(self.desktop_filename)) def test_custom_install_path(self): """We install Base Framework in a custom path""" # We skip the existing directory prompt self.installed_path = "/tmp/foo" self.child = spawn_process(self.command('{} base base-framework {}'.format(UMAKE, self.installed_path))) self.expect_and_no_warn("\[I Accept.*\]") # ensure we have a license as the first question self.child.sendline("a") self.expect_and_no_warn("Installation done", timeout=self.TIMEOUT_INSTALL_PROGRESS) self.wait_and_close() # we have an installed launcher, added to the launcher self.assertTrue(self.launcher_exists_and_is_pinned(self.desktop_filename)) self.assert_exec_exists() self.assert_icon_exists() # launch it, send SIGTERM and check that it exits fine proc = subprocess.Popen(self.command_as_list(self.exec_path), stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) self.check_and_kill_process([self.JAVAEXEC, self.installed_path], wait_before=self.TIMEOUT_START) self.assertEqual(proc.wait(self.TIMEOUT_STOP), 143) def test_start_install_on_empty_dir(self): """We try to install on an existing empty dir""" if not self.in_container: self.installed_path = tempfile.mkdtemp() else: # we still give a path for the container self.installed_path = os.path.join(tempfile.gettempdir(), "tmptests") self.child = spawn_process(self.command('{} base base-framework {}'.format(UMAKE, self.installed_path))) self.expect_and_no_warn("\[I Accept.*\]") # ensure we have a license as the first question self.accept_default_and_wait() self.close_and_check_status() self.assertFalse(self.launcher_exists_and_is_pinned(self.desktop_filename)) def test_start_install_on_existing_dir_refuse(self): """We prompt if we try to install on an existing directory which isn't empty. Refusing doesn't install""" if not self.in_container: self.installed_path = tempfile.mkdtemp() else: # we still give a path for the container self.installed_path = os.path.join(tempfile.gettempdir(), "tmptests") self.create_file(os.path.join(self.installed_path, "bar"), "foo") self.child = spawn_process(self.command('{} base base-framework {}'.format(UMAKE, self.installed_path))) self.expect_and_no_warn("{} isn't an empty directory.*there\? \[.*\] ".format(self.installed_path)) self.accept_default_and_wait() self.close_and_check_status() self.assertFalse(self.launcher_exists_and_is_pinned(self.desktop_filename)) def test_start_install_on_existing_dir_accept(self): """We prompt if we try to install on an existing directory which isn't empty. Accepting install""" if not self.in_container: self.installed_path = tempfile.mkdtemp() else: # we still give a path for the container self.installed_path = os.path.join(tempfile.gettempdir(), "tmptests") self.create_file(os.path.join(self.installed_path, "bar"), "foo") self.child = spawn_process(self.command('{} base base-framework {}'.format(UMAKE, self.installed_path))) self.expect_and_no_warn("{} isn't an empty directory.*there\? \[.*\] ".format(self.installed_path)) self.child.sendline("y") self.expect_and_no_warn("\[I Accept.*\]") # ensure we have a license question self.child.sendline("a") self.expect_and_no_warn("Installation done", timeout=self.TIMEOUT_INSTALL_PROGRESS) self.wait_and_close() # we have an installed launcher, added to the launcher self.assertTrue(self.launcher_exists_and_is_pinned(self.desktop_filename)) self.assert_exec_exists() self.assert_icon_exists() # launch it, send SIGTERM and check that it exits fine proc = subprocess.Popen(self.command_as_list(self.exec_path), stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) self.check_and_kill_process([self.JAVAEXEC, self.installed_path], wait_before=self.TIMEOUT_START) self.assertEqual(proc.wait(self.TIMEOUT_STOP), 143) def test_is_default_framework(self): """Base Framework is chosen as the default framework""" self.child = spawn_process(self.command('{} base'.format(UMAKE))) # we ensure it thanks to installed_path being the base framework one self.expect_and_no_warn("Choose installation path: {}".format(self.installed_path)) self.child.sendcontrol('C') self.wait_and_no_warn() def test_is_default_framework_with_options(self): """Base Framework options are sucked in as the default framework""" self.child = spawn_process(self.command('{} base /tmp/foo'.format(UMAKE))) self.expect_and_no_warn("\[I Accept.*\]") # ensure we have a license as the first question self.accept_default_and_wait() self.close_and_check_status() def test_not_default_framework_with_path_without_path_separator(self): """Base Framework isn't selected for default framework with path without separator""" self.child = spawn_process(self.command('{} base foo'.format(UMAKE))) self.expect_and_no_warn("error: argument framework: invalid choice") self.accept_default_and_wait() self.close_and_check_status(exit_status=2) def test_is_default_framework_with_user_path(self): """Base Framework isn't selected for default framework with path without separator""" self.installed_path = "/tmp/foo" self.child = spawn_process(self.command('{} base {}'.format(UMAKE, self.installed_path))) self.expect_and_no_warn("\[I Accept.*\]") # ensure we have a license as the first question self.child.sendline("a") self.expect_and_no_warn("Installation done", timeout=self.TIMEOUT_INSTALL_PROGRESS) self.wait_and_close() # we have an installed launcher, added to the launcher self.assertTrue(self.launcher_exists_and_is_pinned(self.desktop_filename)) self.assert_exec_exists() self.assert_icon_exists() # launch it, send SIGTERM and check that it exits fine proc = subprocess.Popen(self.command_as_list(self.exec_path), stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) self.check_and_kill_process([self.JAVAEXEC, self.installed_path], wait_before=self.TIMEOUT_START) self.assertEqual(proc.wait(self.TIMEOUT_STOP), 143) def test_removal(self): """Remove Base Framework with default path""" self.child = spawn_process(self.command('{} base base-framework'.format(UMAKE))) self.expect_and_no_warn("Choose installation path: {}".format(self.installed_path)) self.child.sendline("") self.expect_and_no_warn("\[.*\] ") self.child.sendline("a") self.expect_and_no_warn("Installation done", timeout=self.TIMEOUT_INSTALL_PROGRESS) self.wait_and_close() self.assertTrue(self.launcher_exists_and_is_pinned(self.desktop_filename)) self.assertTrue(self.path_exists(self.installed_path)) # now, remove it self.child = spawn_process(self.command('{} base base-framework --remove'.format(UMAKE))) self.wait_and_close() self.assertFalse(self.launcher_exists_and_is_pinned(self.desktop_filename)) self.assertFalse(self.path_exists(self.installed_path)) self.assertFalse(self.path_exists(self.exec_link)) def test_removal_non_default_path(self): """Remove Base Framework with non default path""" self.installed_path = "/tmp/foo" self.child = spawn_process(self.command('{} base base-framework {}'.format(UMAKE, self.installed_path))) self.expect_and_no_warn("\[.*\] ") self.child.sendline("a") self.expect_and_no_warn("Installation done", timeout=self.TIMEOUT_INSTALL_PROGRESS) self.wait_and_close() self.assertTrue(self.launcher_exists_and_is_pinned(self.desktop_filename)) self.assertTrue(self.path_exists(self.installed_path)) # now, remove it self.child = spawn_process(self.command('{} base base-framework --remove'.format(UMAKE))) self.wait_and_close() self.assertFalse(self.launcher_exists_and_is_pinned(self.desktop_filename)) self.assertFalse(self.path_exists(self.installed_path)) def test_removal_global_option(self): """Remove Base Framework via global option (before category) should delete it""" self.child = spawn_process(self.command('{} base base-framework'.format(UMAKE))) self.expect_and_no_warn("Choose installation path: {}".format(self.installed_path)) self.child.sendline("") self.expect_and_no_warn("\[.*\] ") self.child.sendline("a") self.expect_and_no_warn("Installation done", timeout=self.TIMEOUT_INSTALL_PROGRESS) self.wait_and_close() self.assertTrue(self.launcher_exists_and_is_pinned(self.desktop_filename)) self.assertTrue(self.path_exists(self.installed_path)) # now, remove it self.child = spawn_process(self.command('{} --remove base base-framework'.format(UMAKE))) self.wait_and_close() self.assertFalse(self.launcher_exists_and_is_pinned(self.desktop_filename)) self.assertFalse(self.path_exists(self.installed_path)) def test_automated_install(self): """Install Base Framework automatically with no interactive options""" self.child = spawn_process(self.command('{} base base-framework {} --accept-license'.format(UMAKE, self.installed_path))) self.expect_and_no_warn("Installation done", timeout=self.TIMEOUT_INSTALL_PROGRESS) self.wait_and_close() # we have an installed launcher, added to the launcher self.assertTrue(self.launcher_exists_and_is_pinned(self.desktop_filename)) self.assert_exec_exists() def test_try_removing_uninstalled_framework(self): """Trying to remove an uninstalled framework will fail""" self.child = spawn_process(self.command('{} base base-framework --remove'.format(UMAKE))) self.wait_and_close(expect_warn=True, exit_status=2) # additional test with fake md5sum def test_install_with_wrong_md5sum(self): """Install requires a md5sum, and a wrong one is rejected""" with swap_file_and_restore(self.download_page_file_path) as content: with open(self.download_page_file_path, "w") as newfile: newfile.write(content.replace(self.TEST_CHECKSUM_FAKE_DATA, "c8362a0c2ffc07b1b19c4b9001c8532de5a4b8c3")) self.child = spawn_process(self.command('{} base base-framework'.format(UMAKE))) self.expect_and_no_warn("Choose installation path: {}".format(self.installed_path)) self.child.sendline("") self.expect_and_no_warn("\[I Accept.*\]") # ensure we have a license question self.child.sendline("a") self.expect_and_no_warn([pexpect.EOF, "Corrupted download? Aborting."], timeout=self.TIMEOUT_INSTALL_PROGRESS, expect_warn=True) self.wait_and_close(exit_status=1) # we have nothing installed self.assertFalse(self.launcher_exists_and_is_pinned(self.desktop_filename)) def test_install_with_no_license_in_download_page(self): """Installing should fail if not even license i dowload page""" umake_command = self.command("{} base base-framework".format(UMAKE)) self.bad_download_page_test(umake_command, self.download_page_file_path) self.assertFalse(self.launcher_exists_and_is_pinned(self.desktop_filename)) def test_install_with_no_download_links(self): """Installing should fail if no valid download links are found""" with swap_file_and_restore(self.download_page_file_path) as content: with open(self.download_page_file_path, "w") as newfile: newfile.write(content.replace('id="linux-bundle', "")) self.child = spawn_process(self.command('{} base base-framework'.format(UMAKE))) self.expect_and_no_warn("Choose installation path: {}".format(self.installed_path)) self.child.sendline("") self.expect_and_no_warn([pexpect.EOF], timeout=self.TIMEOUT_INSTALL_PROGRESS, expect_warn=True) self.wait_and_close(exit_status=1) # we have nothing installed self.assertFalse(self.launcher_exists_and_is_pinned(self.desktop_filename)) def test_install_with_404(self): """Installing should fail with a 404 download asset reported correctly""" with swap_file_and_restore(self.download_page_file_path) as content: with open(self.download_page_file_path, "w") as newfile: newfile.write(content.replace(self.TEST_URL_FAKE_DATA, "https://localhost:8765/android-studio-unexisting.tgz")) self.child = spawn_process(self.command('{} base base-framework'.format(UMAKE))) self.expect_and_no_warn("Choose installation path: {}".format(self.installed_path)) self.child.sendline("") self.expect_and_no_warn("\[I Accept.*\]") # ensure we have a license question self.child.sendline("a") self.expect_and_no_warn([pexpect.EOF, "ERROR: 404 Client Error: File not found"], timeout=self.TIMEOUT_INSTALL_PROGRESS, expect_warn=True) self.wait_and_close(exit_status=1) # we have nothing installed self.assertFalse(self.launcher_exists_and_is_pinned(self.desktop_filename)) def test_download_page_404(self): """Download page changed address or is just 404 should be reported correctly""" with swap_file_and_restore(self.download_page_file_path): os.remove(self.download_page_file_path) self.child = spawn_process(self.command('{} base base-framework'.format(UMAKE))) self.expect_and_no_warn("Choose installation path: {}".format(self.installed_path)) self.child.sendline("") self.expect_and_no_warn([pexpect.EOF, "ERROR: 404 Client Error: File not found"], timeout=self.TIMEOUT_INSTALL_PROGRESS, expect_warn=True) self.wait_and_close(exit_status=1) # we have nothing installed self.assertFalse(self.launcher_exists_and_is_pinned(self.desktop_filename)) ubuntu-make-18.09+disco1/tests/large/test_basics_cli.py0000644000000000000000000002107513352651520020003 0ustar # -*- coding: utf-8 -*- # Copyright (C) 2014 Canonical # # Authors: # Didier Roche # # 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; version 3. # # 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 """Tests for basic CLI commands""" from contextlib import suppress import os import subprocess from . import LargeFrameworkTests from ..tools import LoggedTestCase, UMAKE, get_root_dir class BasicCLI(LargeFrameworkTests): """This will test the basic cli command class""" @classmethod def setUpClass(cls): super().setUpClass() cls.log_cfg = None with suppress(KeyError): cls.log_cfg = os.environ.pop("LOG_CFG") @classmethod def tearDownClass(cls): super().tearDownClass() if (cls.log_cfg): os.environ["LOG_CFG"] = cls.log_cfg def command_as_list(self, commands_input): """passthrough, return args""" return commands_input def return_without_first_output(self, stdout): """We return ignoring the first line which is INFO: set logging level to""" return "\n".join(stdout.split('\n')[1:]) def test_global_help(self): """We display a global help message""" result = subprocess.check_output(self.command_as_list([UMAKE, '--help'])) self.assertNotEqual(result, "") def test_setup_info_logging(self): """We display info logs""" result = subprocess.check_output(self.command_as_list([UMAKE, '-v', '--help']), stderr=subprocess.STDOUT) self.assertIn("INFO:", self.return_without_first_output(result.decode("utf-8"))) def test_setup_debug_logging(self): """We display debug logs""" result = subprocess.check_output(self.command_as_list([UMAKE, '-vv', '--help']), stderr=subprocess.STDOUT) self.assertIn("DEBUG:", self.return_without_first_output(result.decode("utf-8"))) def test_setup_with_option_logging(self): """We don't mix info or debug logs with a -v option""" exception_raised = False try: subprocess.check_output(self.command_as_list([UMAKE, '-vouep', '--help']), stderr=subprocess.STDOUT) except subprocess.CalledProcessError as e: self.assertNotIn("INFO:", self.return_without_first_output(e.output.decode("utf-8"))) self.assertNotIn("DEBUG:", self.return_without_first_output(e.output.decode("utf-8"))) exception_raised = True self.assertTrue(exception_raised) def test_setup_logging_level_with_env(self): """Set logging option to debug via env var""" env = {"LOG_CFG": os.path.join(get_root_dir(), "confs", "info.logcfg")} env.update(os.environ) commands = [UMAKE] if self.in_container: commands.insert(0, "LOG_CFG={}".format(env["LOG_CFG"])) result = subprocess.check_output(self.command_as_list(commands), env=env, stderr=subprocess.STDOUT) self.assertIn("Logging level set to INFO", result.decode("utf-8")) def test_version(self): """We display a version""" result = subprocess.check_output(self.command_as_list([UMAKE, '--version'])) self.assertNotEqual(result, "") def test_category_help(self): """We display a category help""" result = subprocess.check_output(self.command_as_list([UMAKE, 'ide', '--help'])) self.assertNotEqual(result, "") def test_framework_help(self): """We display a framework help""" result = subprocess.check_output(self.command_as_list([UMAKE, 'ide', 'pycharm', '--help'])) self.assertNotEqual(result, "") def test_help_position_matters(self): """The help option position matters""" result1 = subprocess.check_output(self.command_as_list([UMAKE, 'ide', 'pycharm', '--help'])) result2 = subprocess.check_output(self.command_as_list([UMAKE, 'ide', '--help', 'pycharm'])) result3 = subprocess.check_output(self.command_as_list([UMAKE, '--help', 'ide', 'pycharm'])) self.assertNotEquals(result1, result2) self.assertNotEquals(result2, result3) self.assertNotEquals(result1, result3) def test_category_with_default_framework_help(self): """We display a help when there is a default framework""" result = subprocess.check_output(self.command_as_list([UMAKE, 'android', '--help'])) self.assertNotEqual(result, "") def test_only_category_help_with_default_framework(self): """We display a category help which is different from the default framework one""" result1 = subprocess.check_output(self.command_as_list([UMAKE, 'android', '--help'])) result2 = subprocess.check_output(self.command_as_list([UMAKE, 'android', 'android-studio', '--help'])) self.assertNotEquals(result1, result2) def test_listing_all_frameworks(self): """We display all the frameworks""" result = subprocess.check_output(self.command_as_list([UMAKE, '--list'])) self.assertNotEqual(result, "") result = subprocess.check_output(self.command_as_list([UMAKE, '-l'])) self.assertNotEqual(result, "") def test_listing_installed_frameworks(self): """We display just installed frameworks""" result = subprocess.check_output(self.command_as_list([UMAKE, '--list-installed'])) self.assertNotEqual(result, "") def test_listing_available_frameworks(self): """We display just available frameworks""" result = subprocess.check_output(self.command_as_list([UMAKE, '--list-available'])) self.assertNotEqual(result, "") def test_combine_listing_all_frameworks_and_available_frameworks(self): """Try to list all frameworks and available frameworks""" with self.assertRaises(subprocess.CalledProcessError): subprocess.check_output(self.command_as_list([UMAKE, '--list', '--list-available']), stderr=subprocess.STDOUT) def test_combine_listing_all_frameworks_and_installed_frameworks(self): """Try to list all frameworks and installed frameworks""" with self.assertRaises(subprocess.CalledProcessError): subprocess.check_output(self.command_as_list([UMAKE, '--list', '--list-installed']), stderr=subprocess.STDOUT) def test_combine_listing_available_frameworks_and_installed_frameworks(self): """Try to list available frameworks and installed frameworks""" with self.assertRaises(subprocess.CalledProcessError): subprocess.check_output(self.command_as_list([UMAKE, '--list-available', '--list-installed']), stderr=subprocess.STDOUT) def test_listing_all_frameworks_and_check_categories_by_order(self): """List all frameworks and check if categories appear by order""" result = subprocess.check_output(self.command_as_list([UMAKE, '--list'])) previous_category = None for element in result.split(b"\n"): if element and not element.startswith(b"\t"): current_category = element[:element.find(b":")] # Skip the empty category since it' not in alphabetic order if previous_category and current_category is not b'': self.assertTrue(previous_category < current_category) previous_category = current_category def test_listing_all_frameworks_and_check_frameworks_by_order(self): """List all frameworks and check if frameworks appear by order""" result = subprocess.check_output(self.command_as_list([UMAKE, '--list'])) previous_framework = None for element in result.split(b"\n"): if element.startswith(b"\t"): current_framework = element[:element.find(b":")] if previous_framework: self.assertTrue(previous_framework < current_framework) previous_framework = current_framework else: previous_framework = None ubuntu-make-18.09+disco1/tests/large/test_crystal.py0000644000000000000000000000507013352651520017366 0ustar # -*- coding: utf-8 -*- # Copyright (C) 2014 Canonical # # Authors: # Galileo Sartor # # 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; version 3. # # 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 """Tests for the Crystal category""" import subprocess import os import tempfile from tests.large import LargeFrameworkTests from tests.tools import UMAKE, spawn_process class CrystalTests(LargeFrameworkTests): """The default Crystal compiler.""" TIMEOUT_INSTALL_PROGRESS = 300 EXAMPLE_PROJECT = '''puts "Hello world!"''' def setUp(self): super().setUp() self.installed_path = os.path.join(self.install_base_path, "crystal", "crystal-lang") self.framework_name_for_profile = "Crystal Lang" @property def exec_path(self): return os.path.join(self.installed_path, "bin", "crystal") def test_default_crystal_install(self): """Install Crystal from scratch test case""" if not self.in_container: self.example_prog_dir = tempfile.mkdtemp() self.additional_dirs.append(self.example_prog_dir) example_file = os.path.join(self.example_prog_dir, "hello.cr") open(example_file, "w").write(self.EXAMPLE_PROJECT) compile_command = ["bash", "-l", "-c", "crystal run {}".format(example_file)] else: # our mock expects getting that path compile_command = ["bash", "-l", "crystal run /tmp/hello.cr"] self.child = spawn_process(self.command('{} crystal'.format(UMAKE))) self.expect_and_no_warn("Choose installation path: {}".format(self.installed_path)) self.child.sendline("") self.expect_and_no_warn("Installation done", timeout=self.TIMEOUT_INSTALL_PROGRESS) self.wait_and_close() self.assert_exec_exists() self.assertTrue(self.is_in_path(self.exec_path)) # compile a small project output = subprocess.check_output(self.command_as_list(compile_command)).decode()\ .replace('\r', '').replace('\n', '') self.assertEqual(output, "Hello world!") ubuntu-make-18.09+disco1/tests/large/test_dart.py0000644000000000000000000000411313352651520016634 0ustar # -*- coding: utf-8 -*- # Copyright (C) 2015 Canonical # # Authors: # Didier Roche # # 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; version 3. # # 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 """Tests for the Dart category""" import logging import os from tests.large import LargeFrameworkTests from tests.tools import UMAKE, spawn_process logger = logging.getLogger(__name__) class DartEditorTests(LargeFrameworkTests): """Tests for Dart Editor with SDK""" TIMEOUT_INSTALL_PROGRESS = 120 def setUp(self): super().setUp() self.installed_path = os.path.join(self.install_base_path, "dart", "dart-sdk") @property def exec_path(self): return os.path.join(self.installed_path, "bin", "dart") def test_default_dart_install(self): """Install dart editor from scratch test case""" self.child = spawn_process(self.command('{} dart'.format(UMAKE))) self.expect_and_no_warn("Choose installation path: {}".format(self.installed_path)) self.child.sendline("") self.expect_and_no_warn("Installation done", timeout=self.TIMEOUT_INSTALL_PROGRESS) self.wait_and_close() # we have an installed launcher, added to the launcher and an icon file self.assert_exec_exists() self.assertTrue(self.is_in_path(self.exec_path)) # ensure that it's detected as installed: self.child = spawn_process(self.command('{} dart'.format(UMAKE))) self.expect_and_no_warn("Dart SDK is already installed.*\[.*\] ") self.child.sendline() self.wait_and_close() ubuntu-make-18.09+disco1/tests/large/test_electronics.py0000644000000000000000000001106013352651520020213 0ustar # -*- coding: utf-8 -*- # Copyright (C) 2014 Canonical # # Authors: # Didier Roche # Tin Tvrtković # # 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; version 3. # # 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 """Tests for the IDE category""" import logging import platform import subprocess import os from tests.large import LargeFrameworkTests from tests.tools import UMAKE, spawn_process logger = logging.getLogger(__name__) class ArduinoIDETests(LargeFrameworkTests): """The Arduino Software distribution from the IDE collection.""" TIMEOUT_INSTALL_PROGRESS = 120 TIMEOUT_START = 60 TIMEOUT_STOP = 60 def setUp(self): super().setUp() self.installed_path = os.path.join(self.install_base_path, "electronics", "arduino") self.desktop_filename = "arduino.desktop" @property def arch_option(self): """we return the expected arch call on command line""" return platform.machine() def test_default_install(self): """Install Arduino from scratch test case""" self.child = spawn_process(self.command('{} electronics arduino'.format(UMAKE))) self.expect_and_no_warn("Choose installation path: {}".format(self.installed_path)) self.child.sendline("") self.expect_and_no_warn("Installation done", timeout=self.TIMEOUT_INSTALL_PROGRESS) self.wait_and_close() # we have an installed launcher, added to the launcher and an icon file self.assertTrue(self.launcher_exists_and_is_pinned(self.desktop_filename)) self.assert_exec_exists() self.assert_icon_exists() self.assertTrue(self.is_in_group("dialout")) self.assert_exec_link_exists() # launch it, send SIGTERM and check that it exits fine proc = subprocess.Popen(self.command_as_list(self.exec_path), stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) self.check_and_kill_process(["java", "processing.app.Base"], wait_before=self.TIMEOUT_START) proc.wait(self.TIMEOUT_STOP) # ensure that it's detected as installed: self.child = spawn_process(self.command('{} electronics arduino'.format(UMAKE))) self.expect_and_no_warn("Arduino is already installed.*\[.*\] ") self.child.sendline() self.wait_and_close() class EagleTests(LargeFrameworkTests): """The Eagle Autodesk tests.""" TIMEOUT_INSTALL_PROGRESS = 120 TIMEOUT_START = 60 TIMEOUT_STOP = 60 def setUp(self): super().setUp() self.installed_path = os.path.join(self.install_base_path, "electronics", "eagle") self.desktop_filename = "eagle.desktop" self.command_args = '{} electronics eagle'.format(UMAKE) self.name = "Eagle" def test_default_eclipse_ide_install(self): """Install eclipse from scratch test case""" self.child = spawn_process(self.command(self.command_args)) self.expect_and_no_warn("Choose installation path: {}".format(self.installed_path)) self.child.sendline("") self.expect_and_no_warn("Installation done", timeout=self.TIMEOUT_INSTALL_PROGRESS) self.wait_and_close() # we have an installed launcher, added to the launcher and an icon file self.assertTrue(self.launcher_exists_and_is_pinned(self.desktop_filename)) self.assert_exec_exists() self.assert_icon_exists() self.assert_exec_link_exists() # launch it, send SIGTERM and check that it exits fine proc = subprocess.Popen(self.command_as_list(self.exec_path), stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) self.check_and_kill_process([self.exec_path], wait_before=self.TIMEOUT_START, send_sigkill=True) proc.wait(self.TIMEOUT_STOP) # ensure that it's detected as installed: self.child = spawn_process(self.command(self.command_args)) self.expect_and_no_warn("{} is already installed.*\[.*\] ".format(self.name)) self.child.sendline() self.wait_and_close() ubuntu-make-18.09+disco1/tests/large/test_games.py0000644000000000000000000003135013352651520017001 0ustar # -*- coding: utf-8 -*- # Copyright (C) 2014 Canonical # # Authors: # Didier Roche # # 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; version 3. # # 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 """Tests for android""" from . import LargeFrameworkTests import os import platform import subprocess from ..tools import UMAKE, spawn_process class StencylTests(LargeFrameworkTests): """This will test the Stencyl installation""" TIMEOUT_INSTALL_PROGRESS = 120 TIMEOUT_START = 20 TIMEOUT_STOP = 20 def setUp(self): super().setUp() self.installed_path = os.path.join(self.install_base_path, "games", "stencyl") self.desktop_filename = "stencyl.desktop" def test_default_stencyl_install(self): """Install stencyl from scratch test case""" self.child = spawn_process(self.command('{} games stencyl'.format(UMAKE))) self.expect_and_no_warn("Choose installation path: {}".format(self.installed_path)) self.child.sendline("") self.expect_and_no_warn("Installation done", timeout=self.TIMEOUT_INSTALL_PROGRESS) self.wait_and_close() # we have an installed launcher, added to the launcher self.assertTrue(self.launcher_exists_and_is_pinned(self.desktop_filename)) self.assert_exec_exists() self.assert_icon_exists() self.assert_exec_link_exists() # launch it, send SIGTERM and check that it exits fine use_cwd = self.installed_path if self.in_container: use_cwd = None proc = subprocess.Popen(self.command_as_list(self.exec_path), stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, cwd=use_cwd) self.check_and_kill_process([self.exec_path], wait_before=self.TIMEOUT_START) proc.wait(self.TIMEOUT_STOP) # ensure that it's detected as installed: self.child = spawn_process(self.command('{} games stencyl'.format(UMAKE))) self.expect_and_no_warn("Stencyl is already installed.*\[.*\] ") self.child.sendline() self.wait_and_close() class BlenderTests(LargeFrameworkTests): """This will test the Blender installation""" TIMEOUT_INSTALL_PROGRESS = 120 TIMEOUT_START = 20 TIMEOUT_STOP = 20 def setUp(self): super().setUp() self.installed_path = os.path.join(self.install_base_path, "games", "blender") self.desktop_filename = "blender.desktop" def test_default_blender_install(self): """Install blender from scratch test case""" self.child = spawn_process(self.command('{} games blender'.format(UMAKE))) self.expect_and_no_warn("Choose installation path: {}".format(self.installed_path)) self.child.sendline("") self.expect_and_no_warn("Installation done", timeout=self.TIMEOUT_INSTALL_PROGRESS) self.wait_and_close() # we have an installed launcher, added to the launcher self.assertTrue(self.launcher_exists_and_is_pinned(self.desktop_filename)) self.assert_exec_exists() self.assert_icon_exists() self.assert_exec_link_exists() # launch it, send SIGTERM and check that it exits fine use_cwd = self.installed_path if self.in_container: use_cwd = None proc = subprocess.Popen(self.command_as_list(self.exec_path), stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, cwd=use_cwd) self.check_and_kill_process([self.exec_path], wait_before=self.TIMEOUT_START) proc.wait(self.TIMEOUT_STOP) # ensure that it's detected as installed: self.child = spawn_process(self.command('{} games blender'.format(UMAKE))) self.expect_and_no_warn("Blender is already installed.*\[.*\] ") self.child.sendline() self.wait_and_close() class Unity3DTests(LargeFrameworkTests): """This will test the Unity 3D editor installation""" TIMEOUT_INSTALL_PROGRESS = 120 TIMEOUT_START = 20 TIMEOUT_STOP = 20 def setUp(self): super().setUp() self.installed_path = os.path.join(self.install_base_path, "games", "unity3d") self.desktop_filename = "unity3d-editor.desktop" def test_default_unity3D_install(self): """Install unity3D editor from scratch test case""" # only an amd64 test if platform.machine() != "x86_64": return self.child = spawn_process(self.command('{} games unity3d'.format(UMAKE))) self.expect_and_no_warn("Choose installation path: {}".format(self.installed_path)) self.child.sendline("") self.expect_and_no_warn("Installation done", timeout=self.TIMEOUT_INSTALL_PROGRESS) self.wait_and_close() # we have an installed launcher, added to the launcher self.assertTrue(self.launcher_exists_and_is_pinned(self.desktop_filename)) self.assert_exec_exists() self.assert_icon_exists() self.assert_exec_link_exists() # ensure setuid self.assertEqual(self.get_file_perms(os.path.join(self.installed_path, "chrome-sandbox")), '-rwsr-xr-x') # launch it, send SIGTERM and check that it exits fine proc = subprocess.Popen(self.command_as_list(self.exec_path), stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) self.check_and_kill_process([self.exec_path], wait_before=self.TIMEOUT_START) proc.wait(self.TIMEOUT_STOP) # ensure that it's detected as installed: self.child = spawn_process(self.command('{} games unity3d'.format(UMAKE))) self.expect_and_no_warn("Unity3d is already installed.*\[.*\] ") self.child.sendline() self.wait_and_close() class TwineTests(LargeFrameworkTests): """This will test the Twine installation""" TIMEOUT_INSTALL_PROGRESS = 120 TIMEOUT_START = 20 TIMEOUT_STOP = 20 def setUp(self): super().setUp() self.installed_path = os.path.join(self.install_base_path, "games", "twine") self.desktop_filename = "twine.desktop" def test_default_twine_install(self): """Install twine editor from scratch test case""" self.child = spawn_process(self.command('{} games twine'.format(UMAKE))) self.expect_and_no_warn("Choose installation path: {}".format(self.installed_path)) self.child.sendline("") self.expect_and_no_warn("Installation done", timeout=self.TIMEOUT_INSTALL_PROGRESS) self.wait_and_close() # we have an installed launcher, added to the launcher self.assertTrue(self.launcher_exists_and_is_pinned(self.desktop_filename)) self.assert_exec_exists() self.assert_icon_exists() self.assert_exec_link_exists() # launch it, send SIGTERM and check that it exits fine proc = subprocess.Popen(self.command_as_list(self.exec_path), stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) self.check_and_kill_process([self.exec_path], wait_before=self.TIMEOUT_START) proc.wait(self.TIMEOUT_STOP) # ensure that it's detected as installed: self.child = spawn_process(self.command('{} games twine'.format(UMAKE))) self.expect_and_no_warn("Twine is already installed.*\[.*\] ") self.child.sendline() self.wait_and_close() class SuperpowersTests(LargeFrameworkTests): """This will test the Superpowers installation""" TIMEOUT_INSTALL_PROGRESS = 120 TIMEOUT_START = 20 TIMEOUT_STOP = 20 def setUp(self): super().setUp() self.installed_path = os.path.join(self.install_base_path, "games", "superpowers") self.desktop_filename = "superpowers.desktop" self.command_args = '{} games superpowers'.format(UMAKE) def test_default_superpowers_install(self): """Install Superpowers editor from scratch test case""" self.child = spawn_process(self.command(self.command_args)) self.expect_and_no_warn("Choose installation path: {}".format(self.installed_path)) self.child.sendline("") self.expect_and_no_warn("Installation done", timeout=self.TIMEOUT_INSTALL_PROGRESS) self.wait_and_close() # we have an installed launcher, added to the launcher self.assertTrue(self.launcher_exists_and_is_pinned(self.desktop_filename)) self.assert_exec_exists() self.assert_icon_exists() self.assert_exec_link_exists() # launch it, send SIGTERM and check that it exits fine proc = subprocess.Popen(self.command_as_list(self.exec_path), stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) self.check_and_kill_process([self.exec_path], wait_before=self.TIMEOUT_START) proc.wait(self.TIMEOUT_STOP) # ensure that it's detected as installed: self.child = spawn_process(self.command(self.command_args)) self.expect_and_no_warn("Superpowers is already installed.*\[.*\] ") self.child.sendline() self.wait_and_close() class GDevelopTests(LargeFrameworkTests): """This will test the GDevelop installation""" TIMEOUT_INSTALL_PROGRESS = 120 TIMEOUT_START = 20 TIMEOUT_STOP = 20 def setUp(self): super().setUp() self.installed_path = os.path.join(self.install_base_path, "games", "gdevelop") self.desktop_filename = "gdevelop.desktop" self.command_args = '{} games gdevelop'.format(UMAKE) def test_default_gdevelop_install(self): """Install GDevelop editor from scratch test case""" self.child = spawn_process(self.command(self.command_args)) self.expect_and_no_warn("Choose installation path: {}".format(self.installed_path)) self.child.sendline("") self.expect_and_no_warn("Installation done", timeout=self.TIMEOUT_INSTALL_PROGRESS) self.wait_and_close() # we have an installed launcher, added to the launcher self.assertTrue(self.launcher_exists_and_is_pinned(self.desktop_filename)) self.assert_exec_exists() self.assert_icon_exists() self.assert_exec_link_exists() # launch it, send SIGTERM and check that it exits fine proc = subprocess.Popen(self.command_as_list(self.exec_path), stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) self.check_and_kill_process([self.exec_path], wait_before=self.TIMEOUT_START) proc.wait(self.TIMEOUT_STOP) # ensure that it's detected as installed: self.child = spawn_process(self.command(self.command_args)) self.expect_and_no_warn("GDevelop is already installed.*\[.*\] ") self.child.sendline() self.wait_and_close() class GodotTests(LargeFrameworkTests): """This will test the Godot installation""" TIMEOUT_INSTALL_PROGRESS = 120 TIMEOUT_START = 20 TIMEOUT_STOP = 20 def setUp(self): super().setUp() self.installed_path = os.path.join(self.install_base_path, "games", "godot") self.desktop_filename = "godot.desktop" self.command_args = '{} games godot'.format(UMAKE) def test_default_godot_install(self): """Install Godot editor from scratch test case""" self.child = spawn_process(self.command(self.command_args)) self.expect_and_no_warn("Choose installation path: {}".format(self.installed_path)) self.child.sendline("") self.expect_and_no_warn("Installation done", timeout=self.TIMEOUT_INSTALL_PROGRESS) self.wait_and_close() # we have an installed launcher, added to the launcher self.assertTrue(self.launcher_exists_and_is_pinned(self.desktop_filename)) self.assert_exec_exists() self.assert_icon_exists() self.assert_exec_link_exists() # launch it, send SIGTERM and check that it exits fine proc = subprocess.Popen(self.command_as_list(self.exec_path), stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) self.check_and_kill_process([self.exec_path], wait_before=self.TIMEOUT_START) proc.wait(self.TIMEOUT_STOP) # ensure that it's detected as installed: self.child = spawn_process(self.command(self.command_args)) self.expect_and_no_warn("Godot is already installed.*\[.*\] ") self.child.sendline() self.wait_and_close() ubuntu-make-18.09+disco1/tests/large/test_general.py0000644000000000000000000000261513352651520017324 0ustar # -*- coding: utf-8 -*- # Copyright (C) 2015 Canonical # # Authors: # Didier Roche # # 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; version 3. # # 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 """General frameworks tests""" from . import LargeFrameworkTests import subprocess from ..tools import UMAKE class GeneralTests(LargeFrameworkTests): """This will test the General frameworks functionality""" def test_run_category_without_default_framework(self): """Trying to run a category without a default framework exits in error""" exception_raised = False try: subprocess.check_output(self.command_as_list([UMAKE, 'ide']), stderr=subprocess.STDOUT) except subprocess.CalledProcessError as e: self.assertIn("ERROR:", e.output.decode("utf-8")) exception_raised = True self.assertTrue(exception_raised) ubuntu-make-18.09+disco1/tests/large/test_go.py0000644000000000000000000000516413352651520016316 0ustar # -*- coding: utf-8 -*- # Copyright (C) 2014 Canonical # # Authors: # Didier Roche # Tin Tvrtković # # 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; version 3. # # 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 """Tests for the Go category""" import subprocess import os import tempfile from tests.large import LargeFrameworkTests from tests.tools import UMAKE, spawn_process class GoTests(LargeFrameworkTests): """The default Go google compiler.""" TIMEOUT_INSTALL_PROGRESS = 300 EXAMPLE_PROJECT = """package main import "fmt" func main() { fmt.Printf("hello, world") }""" def setUp(self): super().setUp() self.installed_path = os.path.join(self.install_base_path, "go", "go-lang") self.framework_name_for_profile = "Go Lang" @property def exec_path(self): return os.path.join(self.installed_path, "bin", "go") def test_default_go_install(self): """Install Go from scratch test case""" if not self.in_container: self.example_prog_dir = tempfile.mkdtemp() self.additional_dirs.append(self.example_prog_dir) example_file = os.path.join(self.example_prog_dir, "hello.go") open(example_file, "w").write(self.EXAMPLE_PROJECT) compile_command = ["bash", "-l", "-c", "go run {}".format(example_file)] else: # our mock expects getting that path compile_command = ["bash", "-l", "go run /tmp/hello.go"] self.child = spawn_process(self.command('{} go'.format(UMAKE))) self.expect_and_no_warn("Choose installation path: {}".format(self.installed_path)) self.child.sendline("") self.expect_and_no_warn("Installation done", timeout=self.TIMEOUT_INSTALL_PROGRESS) self.wait_and_close() self.assert_exec_exists() self.assertTrue(self.is_in_path(self.exec_path)) # compile a small project output = subprocess.check_output(self.command_as_list(compile_command)).decode()\ .replace('\r', '').replace('\n', '') self.assertEqual(output, "hello, world") ubuntu-make-18.09+disco1/tests/large/test_ide.py0000644000000000000000000007720513352651520016457 0ustar # -*- coding: utf-8 -*- # Copyright (C) 2014 Canonical # # Authors: # Didier Roche # Tin Tvrtković # # 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; version 3. # # 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 """Tests for the IDE category""" import logging import platform import subprocess import os from tests.large import LargeFrameworkTests from tests.tools import UMAKE, spawn_process logger = logging.getLogger(__name__) class EclipseJavaIDETests(LargeFrameworkTests): """The Eclipse distribution from the IDE collection.""" TIMEOUT_INSTALL_PROGRESS = 120 TIMEOUT_START = 60 TIMEOUT_STOP = 60 def setUp(self): super().setUp() self.installed_path = os.path.join(self.install_base_path, "ide", "eclipse") self.desktop_filename = "eclipse-java.desktop" self.command_args = '{} ide eclipse'.format(UMAKE) self.name = "Eclipse" @property def arch_option(self): """we return the expected arch call on command line""" return platform.machine() def test_default_eclipse_ide_install(self): """Install eclipse from scratch test case""" self.child = spawn_process(self.command(self.command_args)) self.expect_and_no_warn("Choose installation path: {}".format(self.installed_path)) self.child.sendline("") self.expect_and_no_warn("Installation done", timeout=self.TIMEOUT_INSTALL_PROGRESS) self.wait_and_close() # we have an installed launcher, added to the launcher and an icon file self.assertTrue(self.launcher_exists_and_is_pinned(self.desktop_filename)) self.assert_exec_exists() self.assert_icon_exists() self.assert_exec_link_exists() # launch it, send SIGTERM and check that it exits fine proc = subprocess.Popen(self.command_as_list(self.exec_path), stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) # on 64 bits, there is a java subprocess, we kill that one with SIGKILL (eclipse isn't reliable on SIGTERM) if self.arch_option == "x86_64": self.check_and_kill_process(["java", self.arch_option, self.installed_path], wait_before=self.TIMEOUT_START, send_sigkill=True) else: self.check_and_kill_process([self.exec_path], wait_before=self.TIMEOUT_START, send_sigkill=True) proc.wait(self.TIMEOUT_STOP) # ensure that it's detected as installed: self.child = spawn_process(self.command(self.command_args)) self.expect_and_no_warn("{} is already installed.*\[.*\] ".format(self.name)) self.child.sendline() self.wait_and_close() class EclipseJEEIDETests(EclipseJavaIDETests): """The Eclipse distribution from the IDE collection.""" def setUp(self): super().setUp() self.installed_path = os.path.join(self.install_base_path, "ide", "eclipse-jee") self.desktop_filename = "eclipse-jee.desktop" self.command_args = '{} ide eclipse-jee'.format(UMAKE) self.name = "Eclipse JEE" class EclipseJSIDETests(EclipseJavaIDETests): """The Eclipse distribution from the IDE collection.""" def setUp(self): super().setUp() self.installed_path = os.path.join(self.install_base_path, "ide", "eclipse-javascript") self.desktop_filename = "eclipse-javascript.desktop" self.command_args = '{} ide eclipse-javascript'.format(UMAKE) self.name = "Eclipse JavaScript" class EclipsePHPIDETests(EclipseJavaIDETests): """The Eclipse distribution from the IDE collection.""" def setUp(self): super().setUp() self.installed_path = os.path.join(self.install_base_path, "ide", "eclipse-php") self.desktop_filename = "eclipse-php.desktop" self.command_args = '{} ide eclipse-php'.format(UMAKE) self.name = "Eclipse PHP" class EclipseCPPIDETests(EclipseJavaIDETests): """The Eclipse distribution from the IDE collection.""" def setUp(self): super().setUp() self.installed_path = os.path.join(self.install_base_path, "ide", "eclipse-cpp") self.desktop_filename = "eclipse-cpp.desktop" self.command_args = '{} ide eclipse-cpp'.format(UMAKE) self.name = "Eclipse CPP" class IdeaIDETests(LargeFrameworkTests): """IntelliJ Idea from the IDE collection.""" TIMEOUT_INSTALL_PROGRESS = 120 TIMEOUT_START = 60 TIMEOUT_STOP = 60 def setUp(self): super().setUp() self.installed_path = os.path.join(self.install_base_path, "ide", "idea") self.desktop_filename = 'jetbrains-idea-ce.desktop' self.command_args = '{} ide idea'.format(UMAKE) self.name = 'Idea' def test_default_install(self): """Install from scratch test case""" self.child = spawn_process(self.command(self.command_args)) self.expect_and_no_warn("Choose installation path: {}".format(self.installed_path)) self.child.sendline("") result = self.return_and_wait_expect(["ERROR: No Stable version available.", "Installation done"], timeout=self.TIMEOUT_INSTALL_PROGRESS) if result == 0: self.assertTrue(self.name == 'GoLand') elif result == 1: # we have an installed launcher, added to the launcher and an icon file self.assertTrue(self.launcher_exists_and_is_pinned(self.desktop_filename)) self.assert_exec_exists() self.assert_icon_exists() self.assert_exec_link_exists() # launch it, send SIGTERM and check that it exits fine proc = subprocess.Popen(self.command_as_list(self.exec_path), stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) self.check_and_kill_process(["java", self.installed_path], wait_before=self.TIMEOUT_START) proc.wait(self.TIMEOUT_STOP) # ensure that it's detected as installed: self.child = spawn_process(self.command(self.command_args)) self.expect_and_no_warn("{} is already installed.*\[.*\] ".format(self.name)) self.child.sendline() self.wait_and_close() def test_eap_install(self): self.installed_path += '-eap' self.desktop_filename = self.desktop_filename.replace('.desktop', '-eap.desktop') self.command_args += ' --eap' self.name += ' EAP' self.child = spawn_process(self.command(self.command_args)) result = self.return_and_wait_expect(["ERROR: No EAP version available.*\[.*\]", "Choose installation path: {}".format(self.installed_path)]) if result == 1: self.child.sendline("") self.expect_and_no_warn("Installation done", timeout=self.TIMEOUT_INSTALL_PROGRESS) self.wait_and_close() # we have an installed launcher, added to the launcher and an icon file self.assertTrue(self.launcher_exists_and_is_pinned(self.desktop_filename)) self.assert_exec_exists() self.assert_icon_exists() self.assert_exec_link_exists() # launch it, send SIGTERM and check that it exits fine proc = subprocess.Popen(self.command_as_list(self.exec_path), stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) self.check_and_kill_process(["java", self.installed_path], wait_before=self.TIMEOUT_START) proc.wait(self.TIMEOUT_STOP) # ensure that it's detected as installed: self.child = spawn_process(self.command(self.command_args)) self.expect_and_no_warn("{} is already installed.*\[.*\] ".format(self.name)) self.child.sendline() self.wait_and_close() class IdeaUltimateIDETests(IdeaIDETests): """IntelliJ Idea Ultimate from the IDE collection.""" TIMEOUT_INSTALL_PROGRESS = 120 TIMEOUT_START = 60 TIMEOUT_STOP = 60 def setUp(self): super().setUp() self.installed_path = os.path.join(self.install_base_path, "ide", "idea-ultimate") self.desktop_filename = 'jetbrains-idea.desktop' self.command_args = '{} ide idea-ultimate'.format(UMAKE) self.name = 'Idea Ultimate' class PyCharmIDETests(IdeaIDETests): """PyCharm from the IDE collection.""" TIMEOUT_INSTALL_PROGRESS = 120 TIMEOUT_START = 60 TIMEOUT_STOP = 60 def setUp(self): super().setUp() self.installed_path = os.path.join(self.install_base_path, "ide", "pycharm") self.desktop_filename = 'jetbrains-pycharm-ce.desktop' self.command_args = '{} ide pycharm'.format(UMAKE) self.name = 'PyCharm' class PyCharmEducationalIDETests(IdeaIDETests): """PyCharm Educational from the IDE collection.""" TIMEOUT_INSTALL_PROGRESS = 120 TIMEOUT_START = 60 TIMEOUT_STOP = 60 def setUp(self): super().setUp() self.installed_path = os.path.join(self.install_base_path, "ide", "pycharm-educational") self.desktop_filename = 'jetbrains-pycharm-edu.desktop' self.command_args = '{} ide pycharm-educational'.format(UMAKE) self.name = 'PyCharm Educational' class PyCharmProfessionalIDETests(IdeaIDETests): """PyCharm Professional from the IDE collection.""" TIMEOUT_INSTALL_PROGRESS = 120 TIMEOUT_START = 60 TIMEOUT_STOP = 60 def setUp(self): super().setUp() self.installed_path = os.path.join(self.install_base_path, "ide", "pycharm-professional") self.desktop_filename = 'jetbrains-pycharm.desktop' self.command_args = '{} ide pycharm-professional'.format(UMAKE) self.name = 'PyCharm Professional' class RubyMineIDETests(IdeaIDETests): """RubyMine from the IDE collection.""" TIMEOUT_INSTALL_PROGRESS = 120 TIMEOUT_START = 60 TIMEOUT_STOP = 60 def setUp(self): super().setUp() self.installed_path = os.path.join(self.install_base_path, "ide", "rubymine") self.desktop_filename = 'jetbrains-rubymine.desktop' self.command_args = '{} ide rubymine'.format(UMAKE) self.name = 'RubyMine' class WebStormIDETests(IdeaIDETests): """WebStorm from the IDE collection.""" TIMEOUT_INSTALL_PROGRESS = 120 TIMEOUT_START = 60 TIMEOUT_STOP = 60 def setUp(self): super().setUp() self.installed_path = os.path.join(self.install_base_path, "ide", "webstorm") self.desktop_filename = 'jetbrains-webstorm.desktop' self.command_args = '{} ide webstorm'.format(UMAKE) self.name = 'WebStorm' class PhpStormIDETests(IdeaIDETests): """PhpStorm from the IDE collection.""" TIMEOUT_INSTALL_PROGRESS = 120 TIMEOUT_START = 60 TIMEOUT_STOP = 60 def setUp(self): super().setUp() self.installed_path = os.path.join(self.install_base_path, "ide", "phpstorm") self.desktop_filename = 'jetbrains-phpstorm.desktop' self.command_args = '{} ide phpstorm'.format(UMAKE) self.name = 'PhpStorm' class CLionIDETests(IdeaIDETests): """CLion test from the IDE collection""" TIMEOUT_INSTALL_PROGRESS = 120 TIMEOUT_START = 60 TIMEOUT_STOP = 60 def setUp(self): super().setUp() self.installed_path = os.path.join(self.install_base_path, "ide", "clion") self.desktop_filename = 'jetbrains-clion.desktop' self.command_args = '{} ide clion'.format(UMAKE) self.name = 'CLion' class DataGripIDETests(IdeaIDETests): """Datagrip test from the IDE collection""" TIMEOUT_INSTALL_PROGRESS = 120 TIMEOUT_START = 60 TIMEOUT_STOP = 60 def setUp(self): super().setUp() self.installed_path = os.path.join(self.install_base_path, "ide", "datagrip") self.desktop_filename = 'jetbrains-datagrip.desktop' self.command_args = '{} ide datagrip'.format(UMAKE) self.name = 'DataGrip' class GoLandIDETests(IdeaIDETests): """GoLand test from the IDE collection""" TIMEOUT_INSTALL_PROGRESS = 120 TIMEOUT_START = 60 TIMEOUT_STOP = 60 def setUp(self): super().setUp() self.installed_path = os.path.join(self.install_base_path, "ide", "goland") self.desktop_filename = 'jetbrains-goland.desktop' self.command_args = '{} ide goland'.format(UMAKE) self.name = 'GoLand' class RiderIDETests(IdeaIDETests): """Rider from the IDE collection.""" TIMEOUT_INSTALL_PROGRESS = 120 TIMEOUT_START = 60 TIMEOUT_STOP = 60 def setUp(self): super().setUp() self.installed_path = os.path.join(self.install_base_path, "ide", "rider") self.desktop_filename = 'jetbrains-rider.desktop' self.command_args = '{} ide rider'.format(UMAKE) self.name = 'Rider' class BaseNetBeansTests(LargeFrameworkTests): """Tests for the Netbeans installer.""" TIMEOUT_INSTALL_PROGRESS = 120 TIMEOUT_START = 60 TIMEOUT_STOP = 60 def setUp(self): super().setUp() self.installed_path = os.path.join(self.install_base_path, "ide", "netbeans") self.desktop_filename = "netbeans.desktop" def test_default_install(self): """Install from scratch test case""" self.child = spawn_process(self.command('{} ide netbeans'.format(UMAKE))) self.expect_and_no_warn("Choose installation path: {}".format(self.installed_path)) self.child.sendline("") self.expect_and_no_warn("Installation done", timeout=self.TIMEOUT_INSTALL_PROGRESS) self.wait_and_close() logger.info("Installed, running...") # we have an installed launcher, added to the launcher and an icon file self.assertTrue(self.launcher_exists_and_is_pinned(self.desktop_filename)) self.assert_exec_exists() self.assert_icon_exists() self.assert_exec_link_exists() # launch it, send SIGTERM and check that it exits fine proc = subprocess.Popen(self.command_as_list(self.exec_path), stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) self.check_and_kill_process(["java", self.installed_path], wait_before=self.TIMEOUT_START) proc.wait(self.TIMEOUT_STOP) # ensure that it's detected as installed: self.child = spawn_process(self.command('{} ide netbeans'.format(UMAKE))) self.expect_and_no_warn("Netbeans is already installed.*\[.*\] ") self.child.sendline() self.wait_and_close() class VisualStudioCodeTest(LargeFrameworkTests): """Tests for Visual Studio Code""" TIMEOUT_INSTALL_PROGRESS = 120 TIMEOUT_START = 20 TIMEOUT_STOP = 20 def setUp(self): super().setUp() self.installed_path = os.path.join(self.install_base_path, "ide", "visual-studio-code") self.desktop_filename = "visual-studio-code.desktop" self.command_args = '{} ide visual-studio-code'.format(UMAKE) self.name = 'Visual Studio Code' def test_default_install(self): """Install visual studio from scratch test case""" self.child = spawn_process(self.command(self.command_args)) self.expect_and_no_warn("Choose installation path: {}".format(self.installed_path)) self.child.sendline("") self.expect_and_no_warn("\[I Accept.*\]") # ensure we have a license question self.child.sendline("a") self.expect_and_no_warn("Installation done", timeout=self.TIMEOUT_INSTALL_PROGRESS) self.wait_and_close() # we have an installed launcher, added to the launcher and an icon file self.assertTrue(self.launcher_exists_and_is_pinned(self.desktop_filename)) self.assert_exec_exists() self.assert_icon_exists() self.assert_exec_link_exists() # launch it, send SIGTERM and check that it exits fine proc = subprocess.Popen(self.command_as_list(self.exec_path), stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) self.check_and_kill_process([os.path.join(self.installed_path, 'code')], wait_before=self.TIMEOUT_START, send_sigkill=True) proc.wait(self.TIMEOUT_STOP) # ensure that it's detected as installed: self.child = spawn_process(self.command(self.command_args)) self.expect_and_no_warn("Visual Studio Code is already installed.*\[.*\] ") self.child.sendline() self.wait_and_close() def test_insiders_install(self): """Install visual studio insiders""" self.installed_path += '-insiders' self.desktop_filename = self.desktop_filename.replace('.desktop', '-insiders.desktop') self.command_args += ' --insiders' self.name += ' Insiders' self.child = spawn_process(self.command(self.command_args)) self.expect_and_no_warn("Choose installation path: {}".format(self.installed_path)) self.child.sendline("") self.expect_and_no_warn("\[I Accept.*\]") # ensure we have a license question self.child.sendline("a") self.expect_and_no_warn("Installation done", timeout=self.TIMEOUT_INSTALL_PROGRESS) self.wait_and_close() # we have an installed launcher, added to the launcher and an icon file self.assertTrue(self.launcher_exists_and_is_pinned(self.desktop_filename)) self.assert_exec_exists() self.assert_icon_exists() self.assert_exec_link_exists() # launch it, send SIGTERM and check that it exits fine proc = subprocess.Popen(self.command_as_list(self.exec_path), stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) self.check_and_kill_process([os.path.join(self.installed_path, 'code-insiders')], wait_before=self.TIMEOUT_START, send_sigkill=True) proc.wait(self.TIMEOUT_STOP) # ensure that it's detected as installed: self.child = spawn_process(self.command(self.command_args)) self.expect_and_no_warn("Visual Studio Code Insiders is already installed.*\[.*\] ") self.child.sendline() self.wait_and_close() class LightTableTest(LargeFrameworkTests): """Tests for LightTable""" TIMEOUT_INSTALL_PROGRESS = 120 TIMEOUT_START = 20 TIMEOUT_STOP = 20 def setUp(self): super().setUp() self.installed_path = os.path.join(self.install_base_path, "ide", "lighttable") self.desktop_filename = "lighttable.desktop" self.command_args = '{} ide lighttable'.format(UMAKE) def test_default_install(self): """Install LightTable from scratch test case""" self.child = spawn_process(self.command(self.command_args)) self.expect_and_no_warn("Choose installation path: {}".format(self.installed_path)) self.child.sendline("") self.expect_and_no_warn("Installation done", timeout=self.TIMEOUT_INSTALL_PROGRESS) self.wait_and_close() # we have an installed launcher, added to the launcher and an icon file self.assertTrue(self.launcher_exists_and_is_pinned(self.desktop_filename)) self.assert_exec_exists() self.assert_icon_exists() self.assert_exec_link_exists() # launch it, send SIGTERM and check that it exits fine proc = subprocess.Popen(self.command_as_list(self.exec_path), stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) self.check_and_kill_process(["LightTable", self.installed_path], wait_before=self.TIMEOUT_START, send_sigkill=True) proc.wait(self.TIMEOUT_STOP) # ensure that it's detected as installed: self.child = spawn_process(self.command(self.command_args)) self.expect_and_no_warn("LightTable is already installed.*\[.*\] ") self.child.sendline() self.wait_and_close() class AtomTest(LargeFrameworkTests): """Tests for Atom""" TIMEOUT_INSTALL_PROGRESS = 120 TIMEOUT_START = 20 TIMEOUT_STOP = 20 def setUp(self): super().setUp() self.installed_path = os.path.join(self.install_base_path, "ide", "atom") self.desktop_filename = "atom.desktop" self.command_args = '{} ide atom'.format(UMAKE) self.name = "Atom" def test_default_install(self): """Install Atom from scratch test case""" self.child = spawn_process(self.command(self.command_args)) self.expect_and_no_warn("Choose installation path: {}".format(self.installed_path)) self.child.sendline("") self.expect_and_no_warn("Installation done", timeout=self.TIMEOUT_INSTALL_PROGRESS) self.wait_and_close() # we have an installed launcher, added to the launcher and an icon file self.assertTrue(self.launcher_exists_and_is_pinned(self.desktop_filename)) self.assert_exec_exists() self.assert_icon_exists() self.assert_exec_link_exists() # Test if the apm symlink is added correctly: self.assertTrue(self.is_in_path(os.path.join(self.install_base_path, 'bin', 'apm'))) # launch it, send SIGTERM and check that it exits fine proc = subprocess.Popen(self.command_as_list(self.exec_path), stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) self.check_and_kill_process(["atom", self.installed_path], wait_before=self.TIMEOUT_START, send_sigkill=True) proc.wait(self.TIMEOUT_STOP) # ensure that it's detected as installed: self.child = spawn_process(self.command(self.command_args)) self.expect_and_no_warn("{} is already installed.*\[.*\] ".format(self.name)) self.child.sendline() self.wait_and_close() def test_beta_install(self): """Install Atom from scratch test case""" self.installed_path += '-beta' self.desktop_filename = self.desktop_filename.replace('.desktop', '-beta.desktop') self.command_args += ' --beta' self.name += ' Beta' self.child = spawn_process(self.command(self.command_args)) self.expect_and_no_warn("Choose installation path: {}".format(self.installed_path)) self.child.sendline("") self.expect_and_no_warn("Installation done", timeout=self.TIMEOUT_INSTALL_PROGRESS) self.wait_and_close() # we have an installed launcher, added to the launcher and an icon file self.assertTrue(self.launcher_exists_and_is_pinned(self.desktop_filename)) self.assert_exec_exists() self.assert_icon_exists() self.assert_exec_link_exists() # Test if the apm symlink is added correctly: self.assertTrue(self.is_in_path(os.path.join(self.install_base_path, 'bin', 'apm'))) # launch it, send SIGTERM and check that it exits fine proc = subprocess.Popen(self.command_as_list(self.exec_path), stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) self.check_and_kill_process(["atom", self.installed_path], wait_before=self.TIMEOUT_START, send_sigkill=True) proc.wait(self.TIMEOUT_STOP) # ensure that it's detected as installed: self.child = spawn_process(self.command(self.command_args)) self.expect_and_no_warn("{} is already installed.*\[.*\] ".format(self.name)) self.child.sendline() self.wait_and_close() class DBeaverTest(LargeFrameworkTests): """Tests for DBeaver""" TIMEOUT_INSTALL_PROGRESS = 120 TIMEOUT_START = 20 TIMEOUT_STOP = 20 def setUp(self): super().setUp() self.installed_path = os.path.join(self.install_base_path, "ide", "dbeaver") self.desktop_filename = "dbeaver.desktop" self.command_args = '{} ide dbeaver'.format(UMAKE) self.name = "DBeaver" @property def arch_option(self): """we return the expected arch call on command line""" return platform.machine() def test_default_install(self): """Install DBeaver from scratch test case""" self.child = spawn_process(self.command(self.command_args)) self.expect_and_no_warn("Choose installation path: {}".format(self.installed_path)) self.child.sendline("") self.expect_and_no_warn("Installation done", timeout=self.TIMEOUT_INSTALL_PROGRESS) self.wait_and_close() # we have an installed launcher, added to the launcher and an icon file self.assertTrue(self.launcher_exists_and_is_pinned(self.desktop_filename)) self.assert_exec_exists() self.assert_icon_exists() self.assert_exec_link_exists() # launch it, send SIGTERM and check that it exits fine proc = subprocess.Popen(self.command_as_list(self.exec_path), stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) # on 64 bits, there is a java subprocess, we kill that one with SIGKILL (eclipse isn't reliable on SIGTERM) if self.arch_option == "x86_64": self.check_and_kill_process(["java", self.arch_option, self.installed_path], wait_before=self.TIMEOUT_START, send_sigkill=True) else: self.check_and_kill_process([self.exec_path], wait_before=self.TIMEOUT_START, send_sigkill=True) proc.wait(self.TIMEOUT_STOP) # ensure that it's detected as installed: self.child = spawn_process(self.command(self.command_args)) self.expect_and_no_warn("{} is already installed.*\[.*\] ".format(self.name)) self.child.sendline() self.wait_and_close() class SpringToolsSuiteTest(LargeFrameworkTests): """Tests for Spring Tools Suite""" TIMEOUT_INSTALL_PROGRESS = 120 TIMEOUT_START = 60 TIMEOUT_STOP = 60 def setUp(self): super().setUp() self.installed_path = os.path.join(self.install_base_path, "ide", "spring-tools-suite") self.desktop_filename = "STS.desktop" self.command_args = '{} ide spring-tools-suite'.format(UMAKE) self.name = 'Spring Tools Suite' @property def arch_option(self): """we return the expected arch call on command line""" return platform.machine() def test_default_install(self): """Install STS from scratch test case""" self.child = spawn_process(self.command(self.command_args)) self.expect_and_no_warn("Choose installation path: {}".format(self.installed_path)) self.child.sendline("") self.expect_and_no_warn("Installation done", timeout=self.TIMEOUT_INSTALL_PROGRESS) self.wait_and_close() # we have an installed launcher, added to the launcher and an icon file self.assertTrue(self.launcher_exists_and_is_pinned(self.desktop_filename)) self.assert_exec_exists() self.assert_icon_exists() self.assert_exec_link_exists() # launch it, send SIGTERM and check that it exits fine proc = subprocess.Popen(self.command_as_list(self.exec_path), stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) # on 64 bits, there is a java subprocess, we kill that one with SIGKILL (eclipse isn't reliable on SIGTERM) if self.arch_option == "x86_64": self.check_and_kill_process(["java", self.arch_option, self.installed_path], wait_before=self.TIMEOUT_START, send_sigkill=True) else: self.check_and_kill_process([self.exec_path], wait_before=self.TIMEOUT_START, send_sigkill=True) proc.wait(self.TIMEOUT_STOP) # ensure that it's detected as installed: self.child = spawn_process(self.command(self.command_args)) self.expect_and_no_warn("{} is already installed.*\[.*\] ".format(self.name)) self.child.sendline() self.wait_and_close() class SublimeTextTests(LargeFrameworkTests): """Tests for Sublime Text""" TIMEOUT_INSTALL_PROGRESS = 120 TIMEOUT_START = 20 TIMEOUT_STOP = 20 def setUp(self): super().setUp() self.installed_path = os.path.join(self.install_base_path, "ide", "sublime-text") self.desktop_filename = "sublime-text.desktop" self.command_args = '{} ide sublime-text'.format(UMAKE) def test_default_install(self): """Install Sublime Text from scratch test case""" self.child = spawn_process(self.command(self.command_args)) self.expect_and_no_warn("Choose installation path: {}".format(self.installed_path)) self.child.sendline("") self.expect_and_no_warn("Installation done", timeout=self.TIMEOUT_INSTALL_PROGRESS) self.wait_and_close() # we have an installed launcher, added to the launcher and an icon file self.assertTrue(self.launcher_exists_and_is_pinned(self.desktop_filename)) self.assert_exec_exists() self.assert_icon_exists() self.assert_exec_link_exists() # launch it, send SIGTERM and check that it exits fine proc = subprocess.Popen(self.command_as_list(self.exec_path), stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) self.check_and_kill_process([self.exec_path], wait_before=self.TIMEOUT_START, send_sigkill=True) proc.wait(self.TIMEOUT_STOP) # ensure that it's detected as installed: self.child = spawn_process(self.command(self.command_args)) self.expect_and_no_warn("Sublime Text is already installed.*\[.*\] ") self.child.sendline() self.wait_and_close() class ProcessingTests(LargeFrameworkTests): """Tests for Processing""" TIMEOUT_INSTALL_PROGRESS = 120 TIMEOUT_START = 20 TIMEOUT_STOP = 20 def setUp(self): super().setUp() self.installed_path = os.path.join(self.install_base_path, "ide", "processing") self.desktop_filename = "processing.desktop" self.command_args = '{} ide processing'.format(UMAKE) @property def arch_option(self): """we return the expected arch call on command line""" return platform.machine() def test_default_install(self): """Install Processing from scratch test case""" self.child = spawn_process(self.command(self.command_args)) self.expect_and_no_warn("Choose installation path: {}".format(self.installed_path)) self.child.sendline("") self.expect_and_no_warn("Installation done", timeout=self.TIMEOUT_INSTALL_PROGRESS) self.wait_and_close() # we have an installed launcher, added to the launcher and an icon file self.assertTrue(self.launcher_exists_and_is_pinned(self.desktop_filename)) self.assert_exec_exists() self.assert_icon_exists() self.assert_exec_link_exists() # launch it, send SIGTERM and check that it exits fine proc = subprocess.Popen(self.command_as_list(self.exec_path), stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) self.check_and_kill_process(["java", "processing.app.Base"], wait_before=self.TIMEOUT_START) proc.wait(self.TIMEOUT_STOP) # ensure that it's detected as installed: self.child = spawn_process(self.command(self.command_args)) self.expect_and_no_warn("Processing is already installed.*\[.*\] ") self.child.sendline() self.wait_and_close() ubuntu-make-18.09+disco1/tests/large/test_kotlin.py0000644000000000000000000000507413352651520017211 0ustar # -*- coding: utf-8 -*- # Copyright (C) 2016 Canonical # # Authors: # Omer Sheikh # # 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; version 3. # # 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 """Tests for the Kotlin category""" import subprocess import os import tempfile from tests.large import LargeFrameworkTests from tests.tools import UMAKE, spawn_process class KotlinTests(LargeFrameworkTests): """The default Kotlin compiler.""" TIMEOUT_INSTALL_PROGRESS = 300 EXAMPLE_PROJECT = """println("Hello, world!")""" def setUp(self): super().setUp() self.installed_path = os.path.join(self.install_base_path, "kotlin", "kotlin-lang") self.framework_name_for_profile = "Kotlin Lang" @property def exec_path(self): return os.path.join(self.installed_path, "bin", "kotlinc") def test_default_kotlin_install(self): """Install Kotlin from scratch test case""" if not self.in_container: self.example_prog_dir = tempfile.mkdtemp() self.additional_dirs.append(self.example_prog_dir) example_file = os.path.join(self.example_prog_dir, "hello.kts") open(example_file, "w").write(self.EXAMPLE_PROJECT) compile_command = ["bash", "-l", "-c", "kotlinc -script {}".format(example_file)] else: # our mock expects getting that path compile_command = ["bash", "-l", "kotlinc -script /tmp/hello.kts"] self.child = spawn_process(self.command('{} kotlin'.format(UMAKE))) self.expect_and_no_warn("Choose installation path: {}".format(self.installed_path)) self.child.sendline("") self.expect_and_no_warn("Installation done", timeout=self.TIMEOUT_INSTALL_PROGRESS) self.wait_and_close() self.assert_exec_exists() self.assertTrue(self.is_in_path(self.exec_path)) # compile a small project output = subprocess.check_output(self.command_as_list(compile_command)).decode()\ .replace('\r', '').replace('\n', '') self.assertEqual(output, "Hello, world!") ubuntu-make-18.09+disco1/tests/large/test_maven.py0000644000000000000000000000346213352651520017016 0ustar # -*- coding: utf-8 -*- # Copyright (C) 2014 Canonical # # Authors: # Didier Roche # Tin Tvrtković # Igor Vuk # # 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; version 3. # # 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 """Tests for the Maven category""" import subprocess import os import tempfile from tests.large import LargeFrameworkTests from tests.tools import UMAKE, spawn_process class MavenTests(LargeFrameworkTests): """The default Maven compiler.""" TIMEOUT_INSTALL_PROGRESS = 300 def setUp(self): super().setUp() self.installed_path = os.path.join(self.install_base_path, "maven", "maven-lang") self.framework_name_for_profile = "Maven Lang" @property def exec_path(self): return os.path.join(self.installed_path, "bin", "mvn") def test_default_maven_install(self): """Install Maven from scratch test case""" self.child = spawn_process(self.command('{} maven'.format(UMAKE))) self.expect_and_no_warn("Choose installation path: {}".format(self.installed_path)) self.child.sendline("") self.expect_and_no_warn("Installation done", timeout=self.TIMEOUT_INSTALL_PROGRESS) self.wait_and_close() self.assert_exec_exists() self.assertTrue(self.is_in_path(self.exec_path)) ubuntu-make-18.09+disco1/tests/large/test_nodejs.py0000644000000000000000000000722413352651520017172 0ustar # -*- coding: utf-8 -*- # Copyright (C) 2014 Canonical # # Authors: # Didier Roche # # 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; version 3. # # 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 """Tests for the Nodejs category""" import subprocess import os import tempfile from tests.large import LargeFrameworkTests from tests.tools import UMAKE, spawn_process class NodejsTests(LargeFrameworkTests): """Nodejs stable.""" TIMEOUT_INSTALL_PROGRESS = 300 EXAMPLE_PROJECT = """console.log("Hello World");""" def setUp(self): super().setUp() self.installed_path = os.path.join(self.install_base_path, "nodejs", "nodejs-lang") self.framework_name_for_profile = "Nodejs Lang" @property def exec_path(self): return os.path.join(self.installed_path, "bin", "node") def test_default_nodejs_install(self): """Install Nodejs from scratch test case""" if not self.in_container: self.example_prog_dir = tempfile.mkdtemp() self.additional_dirs.append(self.example_prog_dir) example_file = os.path.join(self.example_prog_dir, "hello.js") open(example_file, "w").write(self.EXAMPLE_PROJECT) compile_command = ["bash", "-l", "-c", "node {}".format(example_file)] npm_command = ["bash", "-l", "-c", "npm config get prefix"] else: # our mock expects getting that path compile_command = ["bash", "-l", "node /tmp/hello.js"] npm_command = ["bash", "-l", "npm config get prefix"] self.child = spawn_process(self.command('{} nodejs'.format(UMAKE))) self.expect_and_no_warn("Choose installation path: {}".format(self.installed_path)) self.child.sendline("") self.expect_and_no_warn("Installation done", timeout=self.TIMEOUT_INSTALL_PROGRESS) self.wait_and_close() self.assert_exec_exists() self.assertTrue(self.is_in_path(self.exec_path)) npm_path = os.path.join(self.installed_path, "bin", "npm") self.assertTrue(self.path_exists(npm_path)) self.assertTrue(self.is_in_path(npm_path)) # compile a small project output = subprocess.check_output(self.command_as_list(compile_command)).decode()\ .replace('\r', '').replace('\n', '') # set npm prefix npm_output = subprocess.check_output(self.command_as_list(npm_command)).decode()\ .replace('\r', '').replace('\n', '') self.assertEqual(output, "Hello World") self.assertEqual(npm_output, "{}/.npm_modules".format(os.path.join("/", self.installed_path.split('/')[1], self.installed_path.split('/')[2]))) def test_lts_select_install(self): """Install nodejs lts""" self.child = spawn_process(self.command('{} nodejs --lts').format(UMAKE)) self.expect_and_no_warn("Choose installation path: {}".format(self.installed_path)) self.child.sendline("") self.expect_and_no_warn("Installation done", timeout=self.TIMEOUT_INSTALL_PROGRESS) self.wait_and_close() ubuntu-make-18.09+disco1/tests/large/test_rust.py0000644000000000000000000000715613352651520016711 0ustar # -*- coding: utf-8 -*- # Copyright (C) 2014-2015 Canonical # # Authors: # Didier Roche # Tin Tvrtković # Jared Ravetch # # 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; version 3. # # 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 """Tests for the Rust category""" import subprocess import os import tempfile from tests.large import LargeFrameworkTests from tests.tools import UMAKE, spawn_process class RustTests(LargeFrameworkTests): """The official Rust distribution""" TIMEOUT_INSTALL_PROGRESS = 300 EXAMPLE_PROJECT = """fn main() {println!("hello, world");}""" def setUp(self): super().setUp() self.installed_path = os.path.join(self.install_base_path, "rust", "rust-lang") self.framework_name_for_profile = "Rust" @property def exec_path(self): return os.path.join(self.installed_path, "rustc", "bin", "rustc") def test_default_rust_install(self): """Install Rust from scratch test case""" if not self.in_container: self.example_prog_dir = tempfile.mkdtemp() self.additional_dirs.append(self.example_prog_dir) example_file = os.path.join(self.example_prog_dir, "hello.rs") open(example_file, "w").write(self.EXAMPLE_PROJECT) # rust compile in pwd by default, do not pollute ubuntu make source code compile_command = ["bash", "-l", "-c", "rustc --out-dir {} {}".format(self.example_prog_dir, example_file)] else: # our mock expects getting that path self.example_prog_dir = "/tmp" example_file = os.path.join(self.example_prog_dir, "hello.rs") # rust compile in pwd by default, do not pollute ubuntu make source code compile_command = ["bash", "-l", "rustc --out-dir {} {}".format(self.example_prog_dir, example_file)] resulting_binary = os.path.join(self.example_prog_dir, "hello") self.child = spawn_process(self.command('{} rust'.format(UMAKE))) self.expect_and_no_warn("Choose installation path: {}".format(self.installed_path)) self.child.sendline("") self.expect_and_no_warn("Installation done", timeout=self.TIMEOUT_INSTALL_PROGRESS) self.wait_and_close() self.assert_exec_exists() self.assertTrue(self.is_in_path(self.exec_path)) self.assertTrue(self.is_in_path(os.path.join(self.installed_path, "cargo", "bin", "cargo"))) cmd_list = ["echo $LD_LIBRARY_PATH"] if not self.in_container: relogging_command = ["bash", "-l", "-c"] relogging_command.extend(cmd_list) cmd_list = relogging_command self.assertIn(os.path.join(self.installed_path, "rustc", "lib"), subprocess.check_output(self.command_as_list(cmd_list)).decode("utf-8").strip().split(":")) # compile a small project subprocess.check_call(self.command_as_list(compile_command)) # run the compiled result output = subprocess.check_output(self.command_as_list(resulting_binary)).decode()\ .replace('\r', '').replace('\n', '') self.assertEqual(output, "hello, world") ubuntu-make-18.09+disco1/tests/large/test_scala.py0000644000000000000000000000524613352651520016775 0ustar # -*- coding: utf-8 -*- # Copyright (C) 2014 Canonical # # Authors: # Didier Roche # Tin Tvrtković # Igor Vuk # # 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; version 3. # # 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 """Tests for the Scala category""" import subprocess import os import tempfile from tests.large import LargeFrameworkTests from tests.tools import UMAKE, spawn_process class ScalaTests(LargeFrameworkTests): """The default Scala compiler.""" TIMEOUT_INSTALL_PROGRESS = 300 EXAMPLE_PROJECT = """object HelloWorld { def main(args: Array[String]) { println("hello, world") } }""" def setUp(self): super().setUp() self.installed_path = os.path.join(self.install_base_path, "scala", "scala-lang") self.framework_name_for_profile = "Scala Lang" @property def exec_path(self): return os.path.join(self.installed_path, "bin", "scala") def test_default_scala_install(self): """Install Scala from scratch test case""" if not self.in_container: self.example_prog_dir = tempfile.mkdtemp() self.additional_dirs.append(self.example_prog_dir) example_file = os.path.join(self.example_prog_dir, "hello.scala") open(example_file, "w").write(self.EXAMPLE_PROJECT) compile_command = ["bash", "-l", "-c", "scala {}".format(example_file)] else: # our mock expects getting that path compile_command = ["bash", "-l", "scala /tmp/hello.scala"] self.child = spawn_process(self.command('{} scala'.format(UMAKE))) self.expect_and_no_warn("Choose installation path: {}".format(self.installed_path)) self.child.sendline("") self.expect_and_no_warn("Installation done", timeout=self.TIMEOUT_INSTALL_PROGRESS) self.wait_and_close() self.assert_exec_exists() self.assertTrue(self.is_in_path(self.exec_path)) # compile a small project output = subprocess.check_output(self.command_as_list(compile_command)).decode()\ .replace('\r', '').replace('\n', '') self.assertEqual(output, "hello, world") ubuntu-make-18.09+disco1/tests/large/test_swift.py0000644000000000000000000000516713352651520017050 0ustar # -*- coding: utf-8 -*- # Copyright (C) 2014 Canonical # # Authors: # Didier Roche # # 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; version 3. # # 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 """Tests for the Swift category""" import subprocess import os import tempfile from tests.large import LargeFrameworkTests from tests.tools import UMAKE, spawn_process class SwiftTests(LargeFrameworkTests): """The default Swift compiler.""" TIMEOUT_INSTALL_PROGRESS = 300 EXAMPLE_PROJECT = """print("Hello, world!") """ def setUp(self): super().setUp() self.installed_path = os.path.join(self.install_base_path, "swift", "swift-lang") self.framework_name_for_profile = "Swift Lang" @property def exec_path(self): return os.path.join(self.installed_path, "usr", "bin", "swift") def test_default_swift_install(self): """Install Swift from scratch test case""" if not self.in_container: self.example_prog_dir = tempfile.mkdtemp() self.additional_dirs.append(self.example_prog_dir) example_file = os.path.join(self.example_prog_dir, "main.swift") open(example_file, "w").write(self.EXAMPLE_PROJECT) compile_command = ["bash", "-l", "-c", "swift {}".format(example_file)] else: # our mock expects getting that command parameter self.example_prog_dir = "/tmp" compile_command = ["bash", "-l", "swift /tmp/main.swift"] self.child = spawn_process(self.command('{} swift'.format(UMAKE))) self.expect_and_no_warn("Choose installation path: {}".format(self.installed_path)) self.child.sendline("") self.expect_and_no_warn("Installation done", timeout=self.TIMEOUT_INSTALL_PROGRESS) self.wait_and_close() self.assert_exec_exists() self.assertTrue(self.is_in_path(self.exec_path)) # run the compiled result output = subprocess.check_output(self.command_as_list(compile_command)).decode()\ .replace('\r', '').replace('\n', '') self.assertEqual(output, "Hello, world!") ubuntu-make-18.09+disco1/tests/large/test_web.py0000644000000000000000000001517513352651520016471 0ustar # -*- coding: utf-8 -*- # Copyright (C) 2015 Canonical # # Authors: # Didier Roche # # 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; version 3. # # 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 """Tests for the Web category""" import logging import platform import subprocess import os import tempfile from tests.large import LargeFrameworkTests from tests.tools import UMAKE, spawn_process logger = logging.getLogger(__name__) class FirefoxDevTests(LargeFrameworkTests): """Tests for Firefox Developer Edition""" TIMEOUT_INSTALL_PROGRESS = 120 TIMEOUT_START = 20 TIMEOUT_STOP = 20 def setUp(self): super().setUp() self.installed_path = os.path.join(self.install_base_path, "web", "firefox-dev") self.desktop_filename = "firefox-developer.desktop" @property def arch_option(self): """we return the expected arch call on command line""" return platform.machine() def verify_install(self, installed_language): # we have an installed launcher, added to the launcher, a dictionary file and an icon file self.assertTrue(self.launcher_exists_and_is_pinned(self.desktop_filename)) self.assertTrue(self.language_file_exists(installed_language)) self.assert_exec_exists() self.assert_icon_exists() self.assert_exec_link_exists() # launch it, send SIGTERM and check that it exits fine proc = subprocess.Popen(self.command_as_list(self.exec_path), stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) self.check_and_kill_process(["firefox", self.installed_path], wait_before=self.TIMEOUT_START, send_sigkill=True) proc.wait(self.TIMEOUT_STOP) # ensure that it's detected as installed: self.child = spawn_process(self.command('{} web firefox-dev'.format(UMAKE))) self.expect_and_no_warn("Firefox Dev is already installed.*\[.*\] ") self.child.sendline() self.wait_and_close() def test_default_install(self): """Install firefox dev from scratch test case""" install_language = "en-US" self.child = spawn_process(self.command('{} web firefox-dev'.format(UMAKE))) self.expect_and_no_warn("Choose installation path: {}".format(self.installed_path)) self.child.sendline("") self.expect_and_no_warn("Choose language:") self.child.sendline("") self.expect_and_no_warn("Installation done", timeout=self.TIMEOUT_INSTALL_PROGRESS) self.wait_and_close() self.verify_install(install_language) def test_arg_language_select_install(self): """Install firefox dev with language selected by --lang""" install_language = "bg" self.child = spawn_process(self.command('{} web firefox-dev --lang={}'.format(UMAKE, install_language))) self.expect_and_no_warn("Choose installation path: {}".format(self.installed_path)) self.child.sendline("") self.expect_and_no_warn("Installation done", timeout=self.TIMEOUT_INSTALL_PROGRESS) self.wait_and_close() self.verify_install(install_language) def test_interactive_language_select_install(self): """Install firefox dev with language selected interactively""" install_language = "bg" self.child = spawn_process(self.command('{} web firefox-dev'.format(UMAKE))) self.expect_and_no_warn("Choose installation path: {}".format(self.installed_path)) self.child.sendline("") self.expect_and_no_warn("Choose language:") self.child.sendline(install_language) self.expect_and_no_warn("Installation done", timeout=self.TIMEOUT_INSTALL_PROGRESS) self.wait_and_close() self.verify_install(install_language) def test_unavailable_language_select_install(self): """Installing Firefox-dev in unavailable language should be rejected""" install_language = "ABCdwXYZ" self.child = spawn_process(self.command('{} web firefox-dev --lang={}'.format(UMAKE, install_language))) self.expect_and_no_warn("Choose installation path: {}".format(self.installed_path)) self.child.sendline("") self.wait_and_close(expect_warn=True, exit_status=1) self.assertFalse(self.launcher_exists_and_is_pinned(self.desktop_filename)) def language_file_exists(self, language): return self.path_exists(os.path.join(self.installed_path, "dictionaries", "{}.aff".format(language))) class PhantomJSTests(LargeFrameworkTests): """The default PhantomJS test.""" TIMEOUT_INSTALL_PROGRESS = 300 EXAMPLE_PROJECT = """console.log('hello, world'); phantom.exit();""" def setUp(self): super().setUp() self.installed_path = os.path.join(self.install_base_path, "web", "phantomjs") self.framework_name_for_profile = "PhantomJS" @property def exec_path(self): return os.path.join(self.installed_path, "bin", "phantomjs") def test_default_phantomjs_install(self): """Install PhantomJS from scratch test case""" if not self.in_container: self.example_prog_dir = tempfile.mkdtemp() self.additional_dirs.append(self.example_prog_dir) example_file = os.path.join(self.example_prog_dir, "hello.js") open(example_file, "w").write(self.EXAMPLE_PROJECT) compile_command = ["bash", "-l", "-c", "phantomjs {}".format(example_file)] else: # our mock expects getting that path compile_command = ["bash", "-l", "phantomjs /tmp/hello.js"] self.child = spawn_process(self.command('{} web phantomjs'.format(UMAKE))) self.expect_and_no_warn("Choose installation path: {}".format(self.installed_path)) self.child.sendline("") self.expect_and_no_warn("Installation done", timeout=self.TIMEOUT_INSTALL_PROGRESS) self.wait_and_close() self.assert_exec_exists() self.assertTrue(self.is_in_path(self.exec_path)) # compile a small project output = subprocess.check_output(self.command_as_list(compile_command)).decode()[:-1] self.assertEqual(output, "hello, world") ubuntu-make-18.09+disco1/tests/medium/0000755000000000000000000000000013352651520014460 5ustar ubuntu-make-18.09+disco1/tests/medium/__init__.py0000644000000000000000000002633413352651520016601 0ustar # -*- coding: utf-8 -*- # Copyright (C) 2014 Canonical # # Authors: # Didier Roche # # 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; version 3. # # 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 """Tests for basic CLI commands""" import os import pwd import subprocess from ..tools import get_root_dir, get_tools_helper_dir, LoggedTestCase, get_docker_path, get_data_dir, INSTALL_DIR, \ BRANCH_TESTS, SYSTEM_UMAKE_DIR from time import sleep class ContainerTests(LoggedTestCase): """Container-based tests utilities""" DOCKER_USER = "user" DOCKER_TESTIMAGE = "lyzardking/ubuntu-make" UMAKE_TOOLS_IN_CONTAINER = "/umake" APT_FAKE_REPO_PATH = "/apt-fake-repo" in_container = True def setUp(self): super().setUp() # this will call other parents of ContainerTests ancestors, like LargeFrameworkTests self.umake_path = get_root_dir() self.install_base_path = os.path.expanduser("/home/{}/{}".format(self.DOCKER_USER, INSTALL_DIR)) self.binary_dir = self.binary_dir.replace(os.environ['HOME'], "/home/{}".format(self.DOCKER_USER)) self.image_name = self.DOCKER_TESTIMAGE if not hasattr(self, "hosts"): self.hosts = {} if not hasattr(self, "additional_local_frameworks"): self.additional_local_frameworks = [] command = [get_docker_path(), "run"] # bind master used for testing tools code inside the container runner_cmd = "mkdir -p {}; ln -s {}/ {};".format(os.path.dirname(get_root_dir()), self.UMAKE_TOOLS_IN_CONTAINER, get_root_dir()) local_framework_dir = "/home/{}/.umake/frameworks/".format(self.DOCKER_USER) runner_cmd += "mkdir -p {};".format(local_framework_dir) for additional_framework in self.additional_local_frameworks: runner_cmd += "cp {} {};".format( os.path.join(self.UMAKE_TOOLS_IN_CONTAINER, additional_framework), local_framework_dir) if not BRANCH_TESTS: # create a system binary which will use system umake version (without having the package installed) bin_umake = "/usr/bin/umake" runner_cmd += "echo '#!/usr/bin/env python3\nfrom umake import main\nif __name__ == \"__main__\":" \ "\n main()'>{bin_umake}; chmod +x {bin_umake};".format(bin_umake=bin_umake) # start the local server at container startup for port, hostnames in self.hosts.items(): ftp_redir = hasattr(self, 'ftp') for hostname in hostnames: if "-h" not in command: command.extend(["-h", hostname]) runner_cmd += ' echo "127.0.0.1 {}" >> /etc/hosts;'.format(hostname) runner_cmd += "{} {} 'sudo -E env PATH={} VIRTUAL_ENV={} {} {} {} {}';".format( os.path.join(get_tools_helper_dir(), "run_in_umake_dir_async"), self.UMAKE_TOOLS_IN_CONTAINER, os.getenv("PATH"), os.getenv("VIRTUAL_ENV"), os.path.join(get_tools_helper_dir(), "run_local_server"), str(port), str(ftp_redir), " ".join(hostnames) if port == 443 else "") if ftp_redir: runner_cmd += "/usr/bin/twistd ftp -p 21 -r {};".format(os.path.join(get_data_dir(), 'server-content', hostnames[0])) if hasattr(self, "apt_repo_override_path"): runner_cmd += "sh -c 'echo deb file:{} / > /etc/apt/sources.list'; apt-get update;".format( self.apt_repo_override_path) runner_cmd += "/usr/sbin/sshd -D" # we bindmount system umake directory if not BRANCH_TESTS: command.extend(["-v", "{system_umake}:{system_umake}".format(system_umake=SYSTEM_UMAKE_DIR)]) command.extend(["-d", "-v", "{}:{}".format(self.umake_path, self.UMAKE_TOOLS_IN_CONTAINER), "--dns=8.8.8.8", "--dns=8.8.4.4", # suppress local DNS warning self.image_name, 'sh', '-c', runner_cmd]) self.container_id = subprocess.check_output(command).decode("utf-8").strip() self.container_ip = subprocess.check_output([get_docker_path(), "inspect", "-f", "{{ .NetworkSettings.IPAddress }}", self.container_id]).decode("utf-8").strip() # override with container paths self.conf_path = os.path.expanduser("/home/{}/.config/umake".format(self.DOCKER_USER)) sleep(5) # let the container and service starts def tearDown(self): subprocess.check_call([get_docker_path(), "stop", "-t", "0", self.container_id], stdout=subprocess.DEVNULL) subprocess.check_call([get_docker_path(), "rm", self.container_id], stdout=subprocess.DEVNULL) super().tearDown() # this will call other parents of ContainerTests ancestors, like LargeFrameworkTests def command(self, commands_to_run): """Return a string for a command line ready to run in docker""" return " ".join(self.command_as_list(commands_to_run)) def command_as_list(self, commands_to_run): """Return a list for a command line ready to run in docker""" if isinstance(commands_to_run, list): commands_to_run = " ".join(commands_to_run) return ["ssh", "-i", os.path.join(get_root_dir(), "docker", "umake_docker"), "-o", "UserKnownHostsFile=/dev/null", "-o", "StrictHostKeyChecking=no", "-t", "-q", "{}@{}".format(self.DOCKER_USER, self.container_ip), "{} {} '{}'".format(os.path.join(get_tools_helper_dir(), "run_in_umake_dir"), self.UMAKE_TOOLS_IN_CONTAINER, commands_to_run)] def check_and_kill_process(self, process_grep, wait_before=0, send_sigkill=False): """Check a process matching process_grep exists and kill it""" sleep(wait_before) if not self._exec_command(self.command_as_list("{} {} {}".format(os.path.join(get_tools_helper_dir(), "check_and_kill_process"), send_sigkill, " ".join(process_grep))))[0]: raise BaseException("The process we try to find and kill can't be found: {}".format(process_grep)) def _get_path_from_desktop_file(self, key, abspath_transform=None): """get the path referred as key in the desktop filename exists""" command = self.command_as_list([os.path.join(get_tools_helper_dir(), "get_path_from_desktop_file"), self.desktop_filename, key]) success, stdout, stderr = self._exec_command(command) if success: path = stdout if not path.startswith("/") and abspath_transform: path = abspath_transform(path) else: raise BaseException("Unknown failure from {}".format(command)) return path def _exec_command(self, command): """Exec the required command inside the container, returns if it exited with 0 or 1 + stdout/stderr""" proc = subprocess.Popen(command, stdin=subprocess.DEVNULL, stdout=subprocess.PIPE, stderr=subprocess.DEVNULL) (stdout, stderr) = proc.communicate() # convert in strings and remove remaining \n if stdout: stdout = stdout.decode("utf-8").strip() if stderr: stderr = stderr.decode("utf-8").strip() return_code = proc.returncode if return_code == 0: return (True, stdout, stderr) elif return_code == 1: return (False, stdout, stderr) raise BaseException("Unknown return code from {}".format(command)) def get_launcher_path(self, desktop_filename): """Return launcher path inside container""" command = self.command_as_list([os.path.join(get_tools_helper_dir(), "get_launcher_path"), desktop_filename]) return self._exec_command(command)[1] def launcher_exists_and_is_pinned(self, desktop_filename): """Check if launcher exists and is pinned inside the container""" command = self.command_as_list([os.path.join(get_tools_helper_dir(), "check_launcher_exists_and_is_pinned"), desktop_filename]) return self._exec_command(command)[0] def path_exists(self, path): """Check if a path exists inside the container""" # replace current user home dir with container one. path = path.replace(os.environ['HOME'], "/home/{}".format(self.DOCKER_USER)) command = self.command_as_list([os.path.join(get_tools_helper_dir(), "path_exists"), path]) return self._exec_command(command)[0] def remove_path(self, path): """Remove targeted path""" path = path.replace(os.environ['HOME'], "/home/{}".format(self.DOCKER_USER)) command = self.command_as_list([os.path.join(get_tools_helper_dir(), "remove_path"), path]) self._exec_command(command) def is_in_path(self, filename): """Check inside the container if filename is in PATH thanks to which""" return self._exec_command(self.command_as_list(["bash", "-l", "which", filename]))[0] def is_in_group(self, group): """Check inside the container if the user is in a group""" command = self.command_as_list([os.path.join(get_tools_helper_dir(), "check_user_in_group"), group]) return self._exec_command(command)[0] def get_file_perms(self, path): """return unix file perms string for path from the container""" command = self.command_as_list([os.path.join(get_tools_helper_dir(), "get_file_perms"), path]) success, stdout, stderr = self._exec_command(command) if success: return stdout else: raise BaseException("Unknown failure from {}".format(command)) def create_file(self, path, content): """Create file inside the container.replace in path current user with the docker user""" try: src_user = os.getlogin() except FileNotFoundError: # fallback for container issues when trying to get login src_user = pwd.getpwuid(os.getuid())[0] path = path.replace(src_user, self.DOCKER_USER) dir_path = os.path.dirname(path) command = self.command_as_list(["mkdir", "-p", dir_path, path]) if not self._exec_command(command)[0]: raise BaseException("Couldn't create {} in container".format(path)) ubuntu-make-18.09+disco1/tests/medium/test_android.py0000644000000000000000000000544313352651520017517 0ustar # -*- coding: utf-8 -*- # Copyright (C) 2014 Canonical # # Authors: # Didier Roche # # 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; version 3. # # 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 """Tests for android frameworks in container""" from . import ContainerTests import os from ..large import test_android class AndroidStudioInContainer(ContainerTests, test_android.AndroidStudioTests): """This will install Android Studio inside a container""" TIMEOUT_START = 20 TIMEOUT_STOP = 10 def setUp(self): self.hosts = {443: ["developer.android.com", "dl.google.com"]} self.apt_repo_override_path = os.path.join(self.APT_FAKE_REPO_PATH, 'android') super().setUp() # override with container path self.installed_path = os.path.join(self.install_base_path, "android", "android-studio") class AndroidSDKInContainer(ContainerTests, test_android.AndroidSDKTests): """This will install Android SDK inside a container""" def setUp(self): self.hosts = {443: ["developer.android.com", "dl.google.com"]} self.apt_repo_override_path = os.path.join(self.APT_FAKE_REPO_PATH, 'android') super().setUp() # override with container path self.installed_path = os.path.join(self.install_base_path, "android", "android-sdk") class AndroidPlatformToolsInContainer(ContainerTests, test_android.AndroidPlatformToolsTests): """This will install Android Platform Tools inside a container""" def setUp(self): self.hosts = {443: ["developer.android.com", "dl.google.com"]} self.apt_repo_override_path = os.path.join(self.APT_FAKE_REPO_PATH, 'android-platform-tools') super().setUp() # override with container path self.installed_path = os.path.join(self.install_base_path, "android", "android-platform-tools") class AndroidNDKInContainer(ContainerTests, test_android.AndroidNDKTests): """This will install Android NDK inside a container""" def setUp(self): self.hosts = {443: ["developer.android.com", "dl.google.com"]} self.apt_repo_override_path = os.path.join(self.APT_FAKE_REPO_PATH, 'android') super().setUp() # override with container path self.installed_path = os.path.join(self.install_base_path, "android", "android-ndk") ubuntu-make-18.09+disco1/tests/medium/test_baseinstaller.py0000644000000000000000000001411713352651520020725 0ustar # -*- coding: utf-8 -*- # Copyright (C) 2015 Canonical # # Authors: # Didier Roche # # 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; version 3. # # 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 """Tests for base installer framework in container""" from . import ContainerTests import os import subprocess import pexpect from ..large import test_baseinstaller from ..tools import UMAKE, spawn_process, get_data_dir, swap_file_and_restore class BaseInstallerInContainer(ContainerTests, test_baseinstaller.BaseInstallerTests): """This will install the Base Framework inside a container""" TIMEOUT_START = 10 TIMEOUT_STOP = 10 def setUp(self): self.hosts = {8765: ["localhost"], 443: ["github.com"]} self.apt_repo_override_path = os.path.join(self.APT_FAKE_REPO_PATH, 'android') self.additional_local_frameworks = [os.path.join("tests", "data", "testframeworks", "baseinstallerfake.py")] self.umake_download_page = os.path.join(get_data_dir(), "server-content", "github.com", "ubuntu", "ubuntu-make", "releases") super().setUp() # override with container path self.installed_path = os.path.join(self.install_base_path, "base", "base-framework") def test_install_wrong_download_link_update(self): """Install wrong download link, update available""" with swap_file_and_restore(self.download_page_file_path) as content: with open(self.download_page_file_path, "w") as newfile: newfile.write(content.replace('id="linux-bundle', "")) # umake download page can't match any version (LATESTRELEASE) self.child = spawn_process(self.command('{} base base-framework'.format(UMAKE))) self.expect_and_no_warn("Choose installation path: {}".format(self.installed_path)) self.child.sendline("") self.expect_and_no_warn("To get the latest version", timeout=self.TIMEOUT_INSTALL_PROGRESS, expect_warn=True) self.wait_and_close(exit_status=1) # we have nothing installed self.assertFalse(self.launcher_exists_and_is_pinned(self.desktop_filename)) def test_install_wrong_download_link_no_update(self): """Install wrong download link, no update available""" with swap_file_and_restore(self.download_page_file_path) as content: with open(self.download_page_file_path, "w") as newfile: newfile.write(content.replace('id="linux-bundle', "")) with swap_file_and_restore(self.umake_download_page) as content: with open(self.umake_download_page, "w") as newfile: # Note: our version will have +unknown, testing the git/snap case version = subprocess.check_output(self.command_as_list([UMAKE, '--version']), stderr=subprocess.STDOUT).decode("utf-8") newfile.write(content.replace('LATESTRELEASE', version.strip().split("+")[0])) self.child = spawn_process(self.command('{} base base-framework'.format(UMAKE))) self.expect_and_no_warn("Choose installation path: {}".format(self.installed_path)) self.child.sendline("") self.wait_and_close(exit_status=1, expect_warn=True) self.assertIn("Download page changed its syntax or is not parsable (url missing)", self.child.before) self.assertNotIn("To get the latest version", self.child.before) # we have nothing installed self.assertFalse(self.launcher_exists_and_is_pinned(self.desktop_filename)) def test_install_wrong_download_link_404_update(self): """Install wrong download link, github giving 404""" with swap_file_and_restore(self.download_page_file_path) as content: with open(self.download_page_file_path, "w") as newfile: newfile.write(content.replace('id="linux-bundle', "")) with swap_file_and_restore(self.umake_download_page): os.remove(self.umake_download_page) self.child = spawn_process(self.command('{} base base-framework'.format(UMAKE))) self.expect_and_no_warn("Choose installation path: {}".format(self.installed_path)) self.child.sendline("") self.wait_and_close(exit_status=1, expect_warn=True) self.assertIn("\r\nERROR: 404 Client Error:", self.child.before) # we have nothing installed self.assertFalse(self.launcher_exists_and_is_pinned(self.desktop_filename)) def test_install_wrong_download_link_github_missing(self): # TODO: cut all network connection on the container to enable that test return with swap_file_and_restore(self.download_page_file_path) as content: with open(self.download_page_file_path, "w") as newfile: newfile.write(content.replace('id="linux-bundle', "")) self.child = spawn_process(self.command('{} base base-framework'.format(UMAKE))) self.expect_and_no_warn("Choose installation path: {}".format(self.installed_path)) self.child.sendline("") self.expect_and_no_warn("\r\nERROR: Connection Error\r\n", timeout=self.TIMEOUT_INSTALL_PROGRESS, expect_warn=True) self.wait_and_close(exit_status=1) # we have nothing installed self.assertFalse(self.launcher_exists_and_is_pinned(self.desktop_filename)) ubuntu-make-18.09+disco1/tests/medium/test_basics_cli.py0000644000000000000000000000223313352651520020164 0ustar # -*- coding: utf-8 -*- # Copyright (C) 2014 Canonical # # Authors: # Didier Roche # # 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; version 3. # # 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 """Tests for basic CLI commands""" import os from ..large import test_basics_cli from . import ContainerTests class BasicCLIInContainer(ContainerTests, test_basics_cli.BasicCLI): """This will test the basic cli command class inside a container""" def setUp(self): # Reuse the Android Studio environment.(used in --help) self.apt_repo_override_path = os.path.join(self.APT_FAKE_REPO_PATH, 'android') super().setUp() ubuntu-make-18.09+disco1/tests/medium/test_crystal.py0000644000000000000000000000240713352651520017555 0ustar # -*- coding: utf-8 -*- # Copyright (C) 2014 Canonical # # Authors: # Galileo Sartor # # 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; version 3. # # 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 """Tests for go""" from . import ContainerTests import os from ..large import test_crystal class CrystalInContainer(ContainerTests, test_crystal.CrystalTests): """This will test the Crystal integration inside a container""" def setUp(self): self.hosts = {443: ["api.github.com", "github.com"]} self.apt_repo_override_path = os.path.join(self.APT_FAKE_REPO_PATH, 'crystal') super().setUp() # override with container path self.installed_path = os.path.join(self.install_base_path, "crystal", "crystal-lang") ubuntu-make-18.09+disco1/tests/medium/test_dart.py0000644000000000000000000000327513352651520017032 0ustar # -*- coding: utf-8 -*- # Copyright (C) 2015 Canonical # # Authors: # Didier Roche # # 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; version 3. # # 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 """Tests for dart""" from . import ContainerTests import os from ..large import test_dart from ..tools import get_data_dir, UMAKE class DartInContainer(ContainerTests, test_dart.DartEditorTests): """This will test the eclipse IDE integration inside a container""" def setUp(self): self.hosts = {443: ["api.dartlang.org", "storage.googleapis.com"]} super().setUp() # override with container path self.installed_path = os.path.join(self.install_base_path, "dart", "dart-sdk") def test_install_with_changed_version_page(self): """Installing dart sdk should fail if version page has significantly changed""" download_page_file_path = os.path.join(get_data_dir(), "server-content", "api.dartlang.org", "index.html") umake_command = self.command('{} dart'.format(UMAKE)) self.bad_download_page_test(umake_command, download_page_file_path) self.assertFalse(self.launcher_exists_and_is_pinned(self.desktop_filename)) ubuntu-make-18.09+disco1/tests/medium/test_electronics.py0000644000000000000000000000724313352651520020411 0ustar # -*- coding: utf-8 -*- # Copyright (C) 2014 Canonical # # Authors: # Didier Roche # Tin Tvrtković # # 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; version 3. # # 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 """Tests for ides""" from . import ContainerTests import os import pexpect from ..large import test_electronics from ..tools import get_data_dir, swap_file_and_restore, UMAKE, spawn_process class ArduinoIDEInContainer(ContainerTests, test_electronics.ArduinoIDETests): """This will test the Arduino IDE integration inside a container""" TIMEOUT_START = 20 TIMEOUT_STOP = 10 def setUp(self): self.hosts = {443: ["www.arduino.cc", "downloads.arduino.cc"]} self.apt_repo_override_path = os.path.join(self.APT_FAKE_REPO_PATH, 'arduino') super().setUp() # override with container path self.installed_path = os.path.join(self.install_base_path, "electronics", "arduino") def test_install_with_changed_download_page(self): """Installing arduino ide should fail if download page has significantly changed""" download_page_file_path = os.path.join(get_data_dir(), "server-content", "www.arduino.cc", "en", "Main", "Software") umake_command = self.command('{} electronics arduino'.format(UMAKE)) self.bad_download_page_test(umake_command, download_page_file_path) self.assertFalse(self.launcher_exists_and_is_pinned(self.desktop_filename)) self.assertFalse(self.is_in_path(self.exec_link)) def test_install_with_changed_checksum_page(self): """Installing arduino ide should fail if checksum link is unparseable""" download_page_file_path = os.path.join(get_data_dir(), "server-content", "downloads.arduino.cc", "arduino-mock.sha512sum.txt") umake_command = self.command('{} electronics arduino'.format(UMAKE)) self.bad_download_page_test(umake_command, download_page_file_path) self.assertFalse(self.launcher_exists_and_is_pinned(self.desktop_filename)) self.assertFalse(self.is_in_path(self.exec_link)) class EagleTestsInContainer(ContainerTests, test_electronics.EagleTests): """This will test the Eagle integration inside a container""" TIMEOUT_START = 20 TIMEOUT_STOP = 10 def setUp(self): self.hosts = {443: ["eagle-updates.circuits.io"]} super().setUp() # override with container path self.installed_path = os.path.join(self.install_base_path, "electronics", "eagle") def test_install_with_changed_download_page(self): """Installing eagle ide should fail if download page has significantly changed""" download_page_file_path = os.path.join(get_data_dir(), "server-content", "eagle-updates.circuits.io", "downloads", "latest.html") umake_command = self.command('{} electronics eagle'.format(UMAKE)) self.bad_download_page_test(umake_command, download_page_file_path) self.assertFalse(self.launcher_exists_and_is_pinned(self.desktop_filename)) self.assertFalse(self.is_in_path(self.exec_link)) ubuntu-make-18.09+disco1/tests/medium/test_games.py0000644000000000000000000001373613352651520017177 0ustar # -*- coding: utf-8 -*- # Copyright (C) 2014 Canonical # # Authors: # Didier Roche # # 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; version 3. # # 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 """Tests for games framework""" from . import ContainerTests import os from ..large import test_games from ..tools import get_data_dir, UMAKE class StencylInContainer(ContainerTests, test_games.StencylTests): """This will test the Stencyl editor inside a container""" TIMEOUT_START = 20 TIMEOUT_STOP = 10 def setUp(self): self.hosts = {80: ["www.stencyl.com"]} self.apt_repo_override_path = os.path.join(self.APT_FAKE_REPO_PATH, 'stencyl') super().setUp() # override with container path self.installed_path = os.path.join(self.install_base_path, "games", "stencyl") class BlenderInContainer(ContainerTests, test_games.BlenderTests): """This will test the Blender editor inside a container""" TIMEOUT_START = 20 TIMEOUT_STOP = 10 def setUp(self): self.hosts = {443: ["www.blender.org", "download.blender.org"]} self.apt_repo_override_path = os.path.join(self.APT_FAKE_REPO_PATH, 'blender') super().setUp() # override with container path self.installed_path = os.path.join(self.install_base_path, "games", "blender") class Unity3DInContainer(ContainerTests, test_games.Unity3DTests): """This will test the Unity 3D editor inside a container""" TIMEOUT_START = 20 TIMEOUT_STOP = 10 def setUp(self): self.hosts = {443: ["forum.unity3d.com", "beta.unity3d.com"]} self.apt_repo_override_path = os.path.join(self.APT_FAKE_REPO_PATH, 'unity3d') super().setUp() # override with container path self.installed_path = os.path.join(self.install_base_path, "games", "unity3d") class TwineInContainer(ContainerTests, test_games.TwineTests): """This will test Twine inside a container""" TIMEOUT_START = 20 TIMEOUT_STOP = 10 def setUp(self): self.hosts = {443: ["bitbucket.org", "twinery.org"]} super().setUp() # override with container path self.installed_path = os.path.join(self.install_base_path, "games", "twine") class SuperpowersInContainer(ContainerTests, test_games.SuperpowersTests): """This will test Superpowers inside a container""" TIMEOUT_START = 20 TIMEOUT_STOP = 10 def setUp(self): self.hosts = {443: ["api.github.com", "github.com"]} self.apt_repo_override_path = os.path.join(self.APT_FAKE_REPO_PATH, 'superpowers') super().setUp() # override with container path self.installed_path = os.path.join(self.install_base_path, "games", "superpowers") def test_install_with_changed_download_page(self): """Installing Superpowers should fail if download page has significantly changed""" download_page_file_path = os.path.join(get_data_dir(), "server-content", "api.github.com", "repos", "superpowers", "superpowers-app", "releases", "latest") umake_command = self.command('{} games superpowers'.format(UMAKE)) self.bad_download_page_test(self.command(self.command_args), download_page_file_path) self.assertFalse(self.launcher_exists_and_is_pinned(self.desktop_filename)) self.assertFalse(self.is_in_path(self.exec_link)) class GDevelopInContainer(ContainerTests, test_games.GDevelopTests): """This will test GDevelop inside a container""" TIMEOUT_START = 20 TIMEOUT_STOP = 10 def setUp(self): self.hosts = {443: ["api.github.com", "github.com"]} self.apt_repo_override_path = os.path.join(self.APT_FAKE_REPO_PATH, 'unity3d') super().setUp() # override with container path self.installed_path = os.path.join(self.install_base_path, "games", "gdevelop") def test_install_with_changed_download_page(self): """Installing GDevelop should fail if download page has significantly changed""" download_page_file_path = os.path.join(get_data_dir(), "server-content", "api.github.com", "repos", "4ian", "GD", "releases", "latest") umake_command = self.command('{} games gdevelop'.format(UMAKE)) self.bad_download_page_test(self.command(self.command_args), download_page_file_path) self.assertFalse(self.launcher_exists_and_is_pinned(self.desktop_filename)) self.assertFalse(self.is_in_path(self.exec_link)) class GodotInContainer(ContainerTests, test_games.GodotTests): """This will test Godot inside a container""" TIMEOUT_START = 20 TIMEOUT_STOP = 10 def setUp(self): self.hosts = {443: ["godotengine.org", "downloads.tuxfamily.org"]} super().setUp() # override with container path self.installed_path = os.path.join(self.install_base_path, "games", "godot") def test_install_with_changed_download_page(self): """Installing Godot should fail if download page has significantly changed""" download_page_file_path = os.path.join(get_data_dir(), "server-content", "godotengine.org", "download", "linux", "index.html") umake_command = self.command('{} games godot'.format(UMAKE)) self.bad_download_page_test(self.command(self.command_args), download_page_file_path) self.assertFalse(self.launcher_exists_and_is_pinned(self.desktop_filename)) self.assertFalse(self.is_in_path(self.exec_link)) ubuntu-make-18.09+disco1/tests/medium/test_go.py0000644000000000000000000000217113352651520016477 0ustar # -*- coding: utf-8 -*- # Copyright (C) 2014 Canonical # # Authors: # Didier Roche # # 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; version 3. # # 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 """Tests for go""" from . import ContainerTests import os from ..large import test_go class GoInContainer(ContainerTests, test_go.GoTests): """This will test the Go integration inside a container""" def setUp(self): self.hosts = {443: ["golang.org"]} super().setUp() # override with container path self.installed_path = os.path.join(self.install_base_path, "go", "go-lang") ubuntu-make-18.09+disco1/tests/medium/test_ide.py0000644000000000000000000006640013352651520016640 0ustar # -*- coding: utf-8 -*- # Copyright (C) 2014 Canonical # # Authors: # Didier Roche # Tin Tvrtković # # 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; version 3. # # 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 """Tests for ides""" from . import ContainerTests import os import pexpect from ..large import test_ide from ..tools import get_data_dir, swap_file_and_restore, UMAKE, spawn_process class EclipseJavaIDEInContainer(ContainerTests, test_ide.EclipseJavaIDETests): """This will test the eclipse IDE integration inside a container""" TIMEOUT_START = 20 TIMEOUT_STOP = 10 # The mock server replaces the checksum path. # this emulates the php function without using the same # filename as the tar archive. # The relevant change can be found in local_server.py def setUp(self): self.hosts = {443: ["www.eclipse.org"], 80: ["www.eclipse.org"]} # we reuse the android-studio repo self.apt_repo_override_path = os.path.join(self.APT_FAKE_REPO_PATH, 'android') super().setUp() # override with container path self.installed_path = os.path.join(self.install_base_path, "ide", "eclipse") self.bad_download_page_file_path = os.path.join(get_data_dir(), "server-content", "www.eclipse.org", "technology", "epp", "downloads", "release", "version", "point_release", "eclipse-java-linux-gtk-x86_64.tar.gz.sha512") def test_install_with_changed_download_page(self): """Installing eclipse ide should fail if download page has significantly changed""" download_page_file_path = os.path.join(get_data_dir(), "server-content", "www.eclipse.org", "downloads", "eclipse-packages", "index.html") self.bad_download_page_test(self.command(self.command_args), download_page_file_path) self.assertFalse(self.launcher_exists_and_is_pinned(self.desktop_filename)) self.assertFalse(self.is_in_path(self.exec_link)) def test_install_with_changed_checksum_page(self): """Installing eclipse ide should fail if checksum link is unparseable""" self.bad_download_page_test(self.command(self.command_args), self.bad_download_page_file_path) self.assertFalse(self.launcher_exists_and_is_pinned(self.desktop_filename)) self.assertFalse(self.is_in_path(self.exec_link)) class EclipseJEEIDEInContainer(ContainerTests, test_ide.EclipseJEEIDETests): """This will test the eclipse IDE integration inside a container""" TIMEOUT_START = 20 TIMEOUT_STOP = 10 def setUp(self): self.hosts = {443: ["www.eclipse.org"], 80: ["www.eclipse.org"]} # we reuse the android-studio repo self.apt_repo_override_path = os.path.join(self.APT_FAKE_REPO_PATH, 'android') super().setUp() # override with container path self.installed_path = os.path.join(self.install_base_path, "ide", "eclipse-jee") self.bad_download_page_file_path = os.path.join(get_data_dir(), "server-content", "www.eclipse.org", "technology", "epp", "downloads", "release", "version", "point_release", "eclipse-jee-linux-gtk-x86_64.tar.gz.sha512") class EclipsePHPIDEInContainer(ContainerTests, test_ide.EclipsePHPIDETests): """This will test the eclipse IDE integration inside a container""" TIMEOUT_START = 20 TIMEOUT_STOP = 10 def setUp(self): self.hosts = {443: ["www.eclipse.org"], 80: ["www.eclipse.org"]} # we reuse the android-studio repo self.apt_repo_override_path = os.path.join(self.APT_FAKE_REPO_PATH, 'android') super().setUp() # override with container path self.installed_path = os.path.join(self.install_base_path, "ide", "eclipse-php") self.bad_download_page_file_path = os.path.join(get_data_dir(), "server-content", "www.eclipse.org", "technology", "epp", "downloads", "release", "version", "point_release", "eclipse-php-linux-gtk-x86_64.tar.gz.sha512") class EclipseJSIDEInContainer(ContainerTests, test_ide.EclipseJSIDETests): """This will test the eclipse IDE integration inside a container""" TIMEOUT_START = 20 TIMEOUT_STOP = 10 def setUp(self): self.hosts = {443: ["www.eclipse.org"], 80: ["www.eclipse.org"]} # we reuse the android-studio repo self.apt_repo_override_path = os.path.join(self.APT_FAKE_REPO_PATH, 'android') super().setUp() # override with container path self.installed_path = os.path.join(self.install_base_path, "ide", "eclipse-javascript") self.bad_download_page_file_path = os.path.join(get_data_dir(), "server-content", "www.eclipse.org", "technology", "epp", "downloads", "release", "version", "point_release", "eclipse-javascript-linux-gtk-x86_64.tar.gz.sha512") class EclipseCPPIDEInContainer(ContainerTests, test_ide.EclipseCPPIDETests): """This will test the eclipse IDE integration inside a container""" TIMEOUT_START = 20 TIMEOUT_STOP = 10 def setUp(self): self.hosts = {443: ["www.eclipse.org"], 80: ["www.eclipse.org"]} # we reuse the android-studio repo self.apt_repo_override_path = os.path.join(self.APT_FAKE_REPO_PATH, 'android') super().setUp() # override with container path self.installed_path = os.path.join(self.install_base_path, "ide", "eclipse-cpp") self.bad_download_page_file_path = os.path.join(get_data_dir(), "server-content", "www.eclipse.org", "technology", "epp", "downloads", "release", "version", "point_release", "eclipse-cpp-linux-gtk-x86_64.tar.gz.sha512") class IdeaIDEInContainer(ContainerTests, test_ide.IdeaIDETests): """This will test the Idea IDE integration inside a container""" TIMEOUT_START = 20 TIMEOUT_STOP = 10 def setUp(self): self.hosts = {443: ["data.services.jetbrains.com", 'download.jetbrains.com']} # we reuse the android-studio repo self.apt_repo_override_path = os.path.join(self.APT_FAKE_REPO_PATH, 'android') super().setUp() # override with container path self.installed_path = os.path.join(self.install_base_path, "ide", "idea") self.bad_download_page_file_path = os.path.join(get_data_dir(), "server-content", "data.services.jetbrains.com", "products", "releases?code=IIC") # This actually tests the code in BaseJetBrains def test_install_with_changed_download_page(self): """Installing IntelliJ Idea should fail if download page has changed""" self.bad_download_page_test(self.command(self.command_args), self.bad_download_page_file_path) self.assertFalse(self.launcher_exists_and_is_pinned(self.desktop_filename)) self.assertFalse(self.is_in_path(self.exec_link)) class IdeaUltimateIDEInContainer(ContainerTests, test_ide.IdeaUltimateIDETests): """This will test the Idea Ultimate IDE integration inside a container""" TIMEOUT_START = 20 TIMEOUT_STOP = 10 def setUp(self): self.hosts = {443: ["data.services.jetbrains.com", 'download.jetbrains.com']} # we reuse the android-studio repo self.apt_repo_override_path = os.path.join(self.APT_FAKE_REPO_PATH, 'android') super().setUp() # override with container path self.installed_path = os.path.join(self.install_base_path, "ide", "idea-ultimate") self.bad_download_page_file_path = os.path.join(get_data_dir(), "server-content", "data.services.jetbrains.com", "products", "releases?code=IIU") class PyCharmIDEInContainer(ContainerTests, test_ide.PyCharmIDETests): """This will test the PyCharm IDE integration inside a container""" TIMEOUT_START = 20 TIMEOUT_STOP = 10 def setUp(self): self.hosts = {443: ["data.services.jetbrains.com", 'download.jetbrains.com']} super().setUp() # override with container path self.installed_path = os.path.join(self.install_base_path, "ide", "pycharm") self.bad_download_page_file_path = os.path.join(get_data_dir(), "server-content", "data.services.jetbrains.com", "products", "releases?code=PCC") class PyCharmEducationalIDEInContainer(ContainerTests, test_ide.PyCharmEducationalIDETests): """This will test the PyCharm Educational IDE integration inside a container""" TIMEOUT_START = 20 TIMEOUT_STOP = 10 def setUp(self): self.hosts = {443: ["data.services.jetbrains.com", 'download.jetbrains.com']} super().setUp() # override with container path self.installed_path = os.path.join(self.install_base_path, "ide", "pycharm-educational") self.bad_download_page_file_path = os.path.join(get_data_dir(), "server-content", "data.services.jetbrains.com", "products", "releases?code=PCE") class PyCharmProfessionalIDEInContainer(ContainerTests, test_ide.PyCharmProfessionalIDETests): """This will test the PyCharm Professional IDE integration inside a container""" TIMEOUT_START = 20 TIMEOUT_STOP = 10 def setUp(self): self.hosts = {443: ["data.services.jetbrains.com", 'download.jetbrains.com']} super().setUp() # override with container path self.installed_path = os.path.join(self.install_base_path, "ide", "pycharm-professional") self.bad_download_page_file_path = os.path.join(get_data_dir(), "server-content", "data.services.jetbrains.com", "products", "releases?code=PCP") class RubyMineIDEInContainer(ContainerTests, test_ide.RubyMineIDETests): """This will test the RubyMine IDE integration inside a container""" TIMEOUT_START = 20 TIMEOUT_STOP = 10 def setUp(self): self.hosts = {443: ["data.services.jetbrains.com", 'download.jetbrains.com']} self.apt_repo_override_path = os.path.join(self.APT_FAKE_REPO_PATH, 'rubymine') super().setUp() # override with container path self.installed_path = os.path.join(self.install_base_path, "ide", "rubymine") self.bad_download_page_file_path = os.path.join(get_data_dir(), "server-content", "data.services.jetbrains.com", "products", "releases?code=RM") class WebStormIDEInContainer(ContainerTests, test_ide.WebStormIDETests): """This will test the WebStorm IDE integration inside a container""" TIMEOUT_START = 20 TIMEOUT_STOP = 10 def setUp(self): self.hosts = {443: ["data.services.jetbrains.com", 'download.jetbrains.com']} super().setUp() # override with container path self.installed_path = os.path.join(self.install_base_path, "ide", "webstorm") self.bad_download_page_file_path = os.path.join(get_data_dir(), "server-content", "data.services.jetbrains.com", "products", "releases?code=WS") class CLionIDEInContainer(ContainerTests, test_ide.CLionIDETests): """This will test the CLion IDE integration inside a container""" TIMEOUT_START = 20 TIMEOUT_STOP = 10 def setUp(self): self.hosts = {443: ["data.services.jetbrains.com", 'download.jetbrains.com']} super().setUp() # override with container path self.installed_path = os.path.join(self.install_base_path, "ide", "clion") self.bad_download_page_file_path = os.path.join(get_data_dir(), "server-content", "data.services.jetbrains.com", "products", "releases?code=CL") class DataGripIDEInContainer(ContainerTests, test_ide.DataGripIDETests): """This will test the DataGrip IDE integration inside a container""" TIMEOUT_START = 20 TIMEOUT_STOP = 10 def setUp(self): self.hosts = {443: ["data.services.jetbrains.com", 'download.jetbrains.com']} super().setUp() # override with container path self.installed_path = os.path.join(self.install_base_path, "ide", "datagrip") self.bad_download_page_file_path = os.path.join(get_data_dir(), "server-content", "data.services.jetbrains.com", "products", "releases?code=DG") class PhpStormIDEInContainer(ContainerTests, test_ide.PhpStormIDETests): """This will test the PhpStorm IDE integration inside a container""" TIMEOUT_START = 20 TIMEOUT_STOP = 10 def setUp(self): self.hosts = {443: ["data.services.jetbrains.com", 'download.jetbrains.com']} super().setUp() # override with container path self.installed_path = os.path.join(self.install_base_path, "ide", "phpstorm") self.bad_download_page_file_path = os.path.join(get_data_dir(), "server-content", "data.services.jetbrains.com", "products", "releases?code=PS") class GoLandIDEInContainer(ContainerTests, test_ide.GoLandIDETests): """This will test the GoLand IDE integration inside a container""" TIMEOUT_START = 20 TIMEOUT_STOP = 10 def setUp(self): self.hosts = {443: ["data.services.jetbrains.com", 'download.jetbrains.com']} super().setUp() # override with container path self.installed_path = os.path.join(self.install_base_path, "ide", "goland") self.bad_download_page_file_path = os.path.join(get_data_dir(), "server-content", "data.services.jetbrains.com", "products", "releases?code=GO") class RiderIDEInContainer(ContainerTests, test_ide.RiderIDETests): """This will test the Rider IDE integration inside a container""" TIMEOUT_START = 20 TIMEOUT_STOP = 10 def setUp(self): self.hosts = {443: ["data.services.jetbrains.com", 'download.jetbrains.com']} # we reuse the android-studio repo self.apt_repo_override_path = os.path.join(self.APT_FAKE_REPO_PATH, 'rider') super().setUp() # override with container path self.installed_path = os.path.join(self.install_base_path, "ide", "rider") self.bad_download_page_file_path = os.path.join(get_data_dir(), "server-content", "data.services.jetbrains.com", "products", "releases?code=RD") class BaseNetBeansInContainer(ContainerTests, test_ide.BaseNetBeansTests): """This will test the NetBeans IDE integration inside a container""" TIMEOUT_START = 20 TIMEOUT_STOP = 10 TEST_CHECKSUM_NETBEANS_DATA = "e5018c428b5657b669155886f58429af63f69436625e876be9710824bbfd144a" def setUp(self): self.hosts = {80: ["download.netbeans.org"], 443: ["netbeans.org"]} # Reuse the Android Studio environment. self.apt_repo_override_path = os.path.join(self.APT_FAKE_REPO_PATH, 'android') super().setUp() # override with container path self.installed_path = os.path.join(self.install_base_path, "ide", "netbeans") def test_install_with_changed_download_page(self): """Installing NetBeans ide should fail if download page has significantly changed""" download_page_file_path = os.path.join(get_data_dir(), "server-content", "netbeans.org", "downloads", "zip.html") umake_command = self.command('{} ide netbeans'.format(UMAKE)) self.bad_download_page_test(umake_command, download_page_file_path) self.assertFalse(self.launcher_exists_and_is_pinned(self.desktop_filename)) self.assertFalse(self.is_in_path(self.exec_link)) def test_install_with_changed_download_reference_page(self): """Installing NetBeans ide should fail if download reference page has significantly changed""" download_page_file_path = os.path.join(get_data_dir(), "server-content", "netbeans.org", "images_www", "v6", "download", "8.2", "final", "js", "files.js") umake_command = self.command('{} ide netbeans'.format(UMAKE)) self.bad_download_page_test(umake_command, download_page_file_path) self.assertFalse(self.launcher_exists_and_is_pinned(self.desktop_filename)) self.assertFalse(self.is_in_path(self.exec_link)) def test_install_with_changed_checksum_page(self): """Installing NetBeans ide should fail if checksum link is wrong""" download_page_file_path = os.path.join(get_data_dir(), "server-content", "netbeans.org", "images_www", "v6", "download", "8.2", "final", "js", "files.js") with swap_file_and_restore(download_page_file_path) as content: with open(download_page_file_path, "w") as newfile: newfile.write(content.replace(self.TEST_CHECKSUM_NETBEANS_DATA, "abcdef")) self.child = spawn_process(self.command('{} ide netbeans'.format(UMAKE))) self.expect_and_no_warn("Choose installation path: {}".format(self.installed_path)) self.child.sendline("") self.expect_and_no_warn([pexpect.EOF, "Corrupted download? Aborting."], timeout=self.TIMEOUT_INSTALL_PROGRESS, expect_warn=True) self.wait_and_close(exit_status=1) # we have nothing installed self.assertFalse(self.launcher_exists_and_is_pinned(self.desktop_filename)) self.assertFalse(self.is_in_path(self.exec_link)) class VisualStudioCodeInContainer(ContainerTests, test_ide.VisualStudioCodeTest): """This will test the Visual Studio Code integration inside a container""" TIMEOUT_START = 20 TIMEOUT_STOP = 10 def setUp(self): self.hosts = {443: ["code.visualstudio.com", "go.microsoft.com"]} self.apt_repo_override_path = os.path.join(self.APT_FAKE_REPO_PATH, 'vscode') super().setUp() # override with container path self.installed_path = os.path.join(self.install_base_path, "ide", "visual-studio-code") class LightTableInContainer(ContainerTests, test_ide.LightTableTest): """This will test the LightTable integration inside a container""" TIMEOUT_START = 20 TIMEOUT_STOP = 10 def setUp(self): self.hosts = {443: ["api.github.com", "github.com"]} self.apt_repo_override_path = os.path.join(self.APT_FAKE_REPO_PATH, 'LightTable') super().setUp() # override with container path self.installed_path = os.path.join(self.install_base_path, "ide", "lighttable") def test_install_with_changed_download_page(self): """Installing LightTable should fail if download page has significantly changed""" download_page_file_path = os.path.join(get_data_dir(), "server-content", "api.github.com", "repos", "LightTable", "LightTable", "releases", "latest") umake_command = self.command('{} ide lighttable'.format(UMAKE)) self.bad_download_page_test(self.command(self.command_args), download_page_file_path) self.assertFalse(self.launcher_exists_and_is_pinned(self.desktop_filename)) self.assertFalse(self.is_in_path(self.exec_link)) class AtomInContainer(ContainerTests, test_ide.AtomTest): """This will test the Atom integration inside a container""" TIMEOUT_START = 20 TIMEOUT_STOP = 10 def setUp(self): self.hosts = {443: ["api.github.com", "github.com"]} self.apt_repo_override_path = os.path.join(self.APT_FAKE_REPO_PATH, 'atom') super().setUp() # override with container path self.installed_path = os.path.join(self.install_base_path, "ide", "atom") def test_install_with_changed_download_page(self): """Installing Atom should fail if download page has significantly changed""" download_page_file_path = os.path.join(get_data_dir(), "server-content", "api.github.com", "repos", "Atom", "Atom", "releases", "latest") umake_command = self.command('{} ide atom'.format(UMAKE)) self.bad_download_page_test(self.command(self.command_args), download_page_file_path) self.assertFalse(self.launcher_exists_and_is_pinned(self.desktop_filename)) self.assertFalse(self.is_in_path(self.exec_link)) def test_install_beta_with_changed_download_page(self): """Installing Atom Beta should fail if the latest is not a beta""" download_page_file_path = os.path.join(get_data_dir(), "server-content", "api.github.com", "repos", "Atom", "Atom", "releases", "index.html") with swap_file_and_restore(download_page_file_path) as content: with open(download_page_file_path, "w") as newfile: newfile.write(content.replace("-beta", "")) self.child = umake_command = self.command('{} ide atom --beta'.format(UMAKE)) self.assertFalse(self.launcher_exists_and_is_pinned(self.desktop_filename)) self.assertFalse(self.is_in_path(self.exec_link)) class SublimeTextInContainer(ContainerTests, test_ide.SublimeTextTests): """This will test the Sublime Text integration inside a container""" TIMEOUT_START = 20 TIMEOUT_STOP = 10 def setUp(self): self.hosts = {443: ["sublimetext.com", "download.sublimetext.com"]} super().setUp() # override with container path self.installed_path = os.path.join(self.install_base_path, "ide", "sublime-text") class DBeaverInContainer(ContainerTests, test_ide.DBeaverTest): """This will test the DBeaver integration inside a container""" TIMEOUT_START = 20 TIMEOUT_STOP = 10 def setUp(self): self.hosts = {443: ["api.github.com", "github.com"]} self.apt_repo_override_path = os.path.join(self.APT_FAKE_REPO_PATH, 'dbeaver') super().setUp() # override with container path self.installed_path = os.path.join(self.install_base_path, "ide", "dbeaver") def test_install_with_changed_download_page(self): """Installing DBeaver should fail if download page has significantly changed""" download_page_file_path = os.path.join(get_data_dir(), "server-content", "api.github.com", "repos", "DBeaver", "DBeaver", "releases", "latest") umake_command = self.command('{} ide dbeaver'.format(UMAKE)) self.bad_download_page_test(self.command(self.command_args), download_page_file_path) self.assertFalse(self.launcher_exists_and_is_pinned(self.desktop_filename)) self.assertFalse(self.is_in_path(self.exec_link)) class SpringToolsSuiteInContainer(ContainerTests, test_ide.SpringToolsSuiteTest): """This will test Spring Tools Suite IDE integration inside a container""" TIMEOUT_START = 20 TIMEOUT_STOP = 10 def setUp(self): self.hosts = {443: ['spring.io'], 80: ['download.springsource.com']} self.apt_repo_override_path = os.path.join(self.APT_FAKE_REPO_PATH, 'android') super().setUp() # override with container path self.installed_path = os.path.join(self.install_base_path, "ide", "spring-tools-suite") def test_install_with_changed_download_page(self): """Installing STS should fail if download page has significantly changed""" download_page_file_path = os.path.join(get_data_dir(), "server-content", "spring.io", "tools", "sts", "all") umake_command = self.command('{} ide spring-tools-suite'.format(UMAKE)) self.bad_download_page_test(self.command(self.command_args), download_page_file_path) self.assertFalse(self.launcher_exists_and_is_pinned(self.desktop_filename)) self.assertFalse(self.is_in_path(self.exec_link)) def test_install_with_changed_checksum_page(self): """Installing STS should fail if checksum link is unparseable""" download_page_file_path = os.path.join(get_data_dir(), 'server-content', 'download.springsource.com', 'release', 'STS', 'mock.RELEASE', 'dist', 'emock', 'spring-tool-suite-mock.RELEASE-emock-linux-gtk-x86_64.tar.gz.sha1') self.bad_download_page_test(self.command(self.command_args), download_page_file_path) self.assertFalse(self.launcher_exists_and_is_pinned(self.desktop_filename)) self.assertFalse(self.is_in_path(self.exec_link)) class ProcessingInContainer(ContainerTests, test_ide.ProcessingTests): """This will test the Processing integration inside a container""" TIMEOUT_START = 20 TIMEOUT_STOP = 10 def setUp(self): self.hosts = {443: ["api.github.com", "github.com"]} self.apt_repo_override_path = os.path.join(self.APT_FAKE_REPO_PATH, 'arduino') super().setUp() # override with container path self.installed_path = os.path.join(self.install_base_path, "ide", "processing") def test_install_with_changed_download_page(self): """Installing Processing should fail if download page has significantly changed""" download_page_file_path = os.path.join(get_data_dir(), "server-content", "api.github.com", "repos", "processing", "processing", "releases", "latest") umake_command = self.command('{} ide processing'.format(UMAKE)) self.bad_download_page_test(self.command(self.command_args), download_page_file_path) self.assertFalse(self.launcher_exists_and_is_pinned(self.desktop_filename)) self.assertFalse(self.is_in_path(self.exec_link)) ubuntu-make-18.09+disco1/tests/medium/test_kotlin.py0000644000000000000000000000350613352651520017375 0ustar # -*- coding: utf-8 -*- # Copyright (C) 2016 Canonical # # Authors: # Omer Sheikh # # 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; version 3. # # 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 """Tests for kotlin""" from . import ContainerTests import os from ..large import test_kotlin from ..tools import get_data_dir, UMAKE class KotlinInContainer(ContainerTests, test_kotlin.KotlinTests): """This will test Kotlin integration inside a container""" def setUp(self): self.hosts = {443: ["api.github.com", "github.com"]} self.apt_repo_override_path = os.path.join(self.APT_FAKE_REPO_PATH, 'kotlin') super().setUp() # override with container path self.installed_path = os.path.join(self.install_base_path, "kotlin", "kotlin-lang") def test_install_with_changed_download_page(self): """Installing Kotlin should fail if the download page has significantly changed""" download_page_file_path = os.path.join(get_data_dir(), "server-content", "api.github.com", "repos", "Jetbrains", "kotlin", "releases", "latest") umake_command = self.command('{} kotlin'.format(UMAKE)) self.bad_download_page_test(umake_command, download_page_file_path) self.assertFalse(self.path_exists(self.exec_path)) ubuntu-make-18.09+disco1/tests/medium/test_maven.py0000644000000000000000000000241413352651520017200 0ustar # -*- coding: utf-8 -*- # Copyright (C) 2014 Canonical # # Authors: # Didier Roche # Igor Vuk # # 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; version 3. # # 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 """Tests for maven""" from . import ContainerTests import os from ..large import test_maven class MavenInContainer(ContainerTests, test_maven.MavenTests): """This will test the Maven integration inside a container""" def setUp(self): self.hosts = {443: ["www.apache.org", "maven.apache.org"]} self.apt_repo_override_path = os.path.join(self.APT_FAKE_REPO_PATH, 'android') super().setUp() # override with container path self.installed_path = os.path.join(self.install_base_path, "maven", "maven-lang") ubuntu-make-18.09+disco1/tests/medium/test_nodejs.py0000644000000000000000000000426013352651520017355 0ustar # -*- coding: utf-8 -*- # Copyright (C) 2014 Canonical # # Authors: # Didier Roche # # 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; version 3. # # 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 """Tests for nodejs""" from . import ContainerTests import os import subprocess from ..large import test_nodejs from ..tools import UMAKE, spawn_process class NodejsInContainer(ContainerTests, test_nodejs.NodejsTests): """This will test the Nodejs integration inside a container""" def setUp(self): self.hosts = {443: ["nodejs.org"]} super().setUp() # override with container path self.installed_path = os.path.join(self.install_base_path, "nodejs", "nodejs-lang") def test_existing_prefix(self): subprocess.call(self.command_as_list(['echo', '''"prefix = test" > ~/.npmrc'''])) self.child = spawn_process(self.command('{} nodejs'.format(UMAKE))) self.expect_and_no_warn("Choose installation path: {}".format(self.installed_path)) self.child.sendline("") result = subprocess.check_output(self.command_as_list(['cat', '''~/.npmrc'''])) self.assertEqual(result.rstrip().decode(), 'prefix = test') def test_existing_npmrc(self): subprocess.call(self.command_as_list(['echo', '''"test = 123" > ~/.npmrc'''])) self.child = spawn_process(self.command('{} nodejs'.format(UMAKE))) self.expect_and_no_warn("Choose installation path: {}".format(self.installed_path)) self.child.sendline("") result = subprocess.check_output(self.command_as_list(["cat", "~/.npmrc"])) self.assertEqual(result.rstrip().decode(), 'test = 123\r\nprefix = ${HOME}/.npm_modules') ubuntu-make-18.09+disco1/tests/medium/test_rust.py0000644000000000000000000000363313352651520017073 0ustar # -*- coding: utf-8 -*- # Copyright (C) 2014-2015 Canonical # # Authors: # Didier Roche # Jared Ravetch # # 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; version 3. # # 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 """Tests for rust""" from . import ContainerTests import os import pexpect from ..large import test_rust from ..tools import get_data_dir, UMAKE, swap_file_and_restore, spawn_process class RustInContainer(ContainerTests, test_rust.RustTests): """This will test the Rust integration inside a container""" TEST_CHECKSUM_RUST_DATA = "2a0db6efe370a900491d9e9db13e53ffd00b01dcd8458486f9f3fc3177f96af3" def setUp(self): self.hosts = {443: ["www.rust-lang.org", "static.rust-lang.org"]} super().setUp() # override with container path self.installed_path = os.path.join(self.install_base_path, "rust", "rust-lang") def test_install_with_changed_download_reference_page(self): """Installing Rust should fail if download reference page has significantly changed""" download_page_file_path = os.path.join(get_data_dir(), "server-content", "www.rust-lang.org", "en-US", "other-installers.html") umake_command = self.command('{} rust'.format(UMAKE)) self.bad_download_page_test(umake_command, download_page_file_path) self.assertFalse(self.path_exists(self.exec_path)) ubuntu-make-18.09+disco1/tests/medium/test_scala.py0000644000000000000000000000237113352651520017157 0ustar # -*- coding: utf-8 -*- # Copyright (C) 2014 Canonical # # Authors: # Didier Roche # Igor Vuk # # 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; version 3. # # 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 """Tests for scala""" from . import ContainerTests import os from ..large import test_scala class ScalaInContainer(ContainerTests, test_scala.ScalaTests): """This will test the Scala integration inside a container""" def setUp(self): self.hosts = {80: ["www.scala-lang.org"]} self.apt_repo_override_path = os.path.join(self.APT_FAKE_REPO_PATH, 'scala') super().setUp() # override with container path self.installed_path = os.path.join(self.install_base_path, "scala", "scala-lang") ubuntu-make-18.09+disco1/tests/medium/test_swift.py0000644000000000000000000000341313352651520017226 0ustar # -*- coding: utf-8 -*- # Copyright (C) 2014 Canonical # # Authors: # Didier Roche # # 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; version 3. # # 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 """Tests for swift""" from . import ContainerTests import os from ..large import test_swift from ..tools import get_data_dir, UMAKE class SwiftInContainer(ContainerTests, test_swift.SwiftTests): """This will test the Swift integration inside a container""" def setUp(self): self.hosts = {443: ["swift.org"]} self.apt_repo_override_path = os.path.join(self.APT_FAKE_REPO_PATH, 'swift') super().setUp() # override with container path self.installed_path = os.path.join(self.install_base_path, "swift", "swift-lang") def test_install_with_changed_download_page(self): """Installing swift ide should fail if download page has significantly changed""" download_page_file_path = os.path.join(get_data_dir(), "server-content", "swift.org", "download", "index.html") umake_command = self.command('{} swift'.format(UMAKE)) self.bad_download_page_test(umake_command, download_page_file_path) self.assertFalse(self.is_in_path(self.exec_path)) ubuntu-make-18.09+disco1/tests/medium/test_web.py0000644000000000000000000000545713352651520016661 0ustar # -*- coding: utf-8 -*- # Copyright (C) 2015 Canonical # # Authors: # Didier Roche # # 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; version 3. # # 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 """Tests for web category""" from . import ContainerTests import os from ..large import test_web from ..tools import get_data_dir, UMAKE class FirefoxDevContainer(ContainerTests, test_web.FirefoxDevTests): """This will test the Firefox dev integration inside a container""" TIMEOUT_START = 20 TIMEOUT_STOP = 10 def setUp(self): self.hosts = {443: ["www.mozilla.org"]} super().setUp() # override with container path self.installed_path = os.path.join(self.install_base_path, "web", "firefox-dev") def test_install_with_changed_download_page(self): """Installing firefox developer should fail if download page has significantly changed""" download_page_file_path = os.path.join(get_data_dir(), "server-content", "www.mozilla.org", "en-US", "firefox", "developer", "all") umake_command = self.command('{} web firefox-dev'.format(UMAKE)) self.bad_download_page_test(umake_command, download_page_file_path) self.assertFalse(self.launcher_exists_and_is_pinned(self.desktop_filename)) self.assertFalse(self.is_in_path(os.path.join(self.binary_dir, self.desktop_filename.split('.')[0]))) class PhantomJSInContainer(ContainerTests, test_web.PhantomJSTests): """This will test the PhantomJS integration inside a container""" TIMEOUT_START = 20 TIMEOUT_STOP = 10 def setUp(self): self.hosts = {80: ["phantomjs.org"], 443: ['bitbucket.org']} super().setUp() # override with container path self.installed_path = os.path.join(self.install_base_path, "web", "phantomjs") def test_install_with_changed_download_page(self): """Installing firefox developer should fail if download page has significantly changed""" download_page_file_path = os.path.join(get_data_dir(), "server-content", "phantomjs.org", "download.html") umake_command = self.command('{} web phantomjs'.format(UMAKE)) self.bad_download_page_test(umake_command, download_page_file_path) self.assertFalse(self.path_exists(self.exec_path)) ubuntu-make-18.09+disco1/tests/small/0000755000000000000000000000000013415340675014316 5ustar ubuntu-make-18.09+disco1/tests/small/__init__.py0000644000000000000000000001133313352651520016422 0ustar # -*- coding: utf-8 -*- # Copyright (C) 2016 Canonical # # Authors: # Didier Roche # # 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; version 3. # # 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 """Some common tools between small tests""" import apt import os import shutil import stat import tempfile from ..tools import get_data_dir, LoggedTestCase, manipulate_path_env from unittest.mock import Mock from umake import tools class DpkgAptSetup(LoggedTestCase): """This parent class is there to setup and teardown a dpkg chroot test environment""" @classmethod def setUpClass(cls): super().setUpClass() apt.apt_pkg.config.set("Dir::Cache::pkgcache", "") apt.apt_pkg.config.set("Dir::Cache::srcpkgcache", "") apt.apt_pkg.config.clear("APT::Update::Post-Invoke") apt.apt_pkg.config.clear("APT::Update::Post-Invoke-Success") apt.apt_pkg.config.clear("DPkg::Post-Invoke") cls.apt_package_dir = os.path.join(get_data_dir(), "apt") cls.apt_status_dir = os.path.join(cls.apt_package_dir, "states") def setUp(self): super().setUp() self.chroot_path = tempfile.mkdtemp() # create the fake dpkg wrapper os.makedirs(os.path.join(self.chroot_path, "usr", "bin")) self.dpkg = os.path.join(self.chroot_path, "usr", "bin", "dpkg") with open(self.dpkg, "w") as f: # Don't nest fakeroot calls when having some dpkg hook scripts f.write("#!/bin/sh\nprependfakeroot=''\nif [ -z \"$FAKEROOTKEY\" ]; then\nprependfakeroot=fakeroot\nfi\n " "$prependfakeroot /usr/bin/dpkg --root={root} --force-not-root --force-bad-path " "--log={root}/var/log/dpkg.log \"$@\"".format(root=self.chroot_path)) st = os.stat(self.dpkg) os.chmod(self.dpkg, st.st_mode | stat.S_IEXEC) # for arch cache support tools._current_arch = None tools._foreign_arch = None manipulate_path_env(os.path.dirname(self.dpkg)) # apt requirements apt_etc = os.path.join(self.chroot_path, 'etc', 'apt') os.makedirs(apt_etc) os.makedirs(os.path.join(self.chroot_path, 'var', 'log', 'apt')) with open(os.path.join(apt_etc, 'sources.list'), 'w') as f: f.write('deb [trusted=yes] file:{} /'.format(self.apt_package_dir)) # dpkg requirements dpkg_dir = os.path.join(self.chroot_path, 'var', 'lib', 'dpkg') os.makedirs(dpkg_dir) os.mkdir(os.path.join(os.path.join(dpkg_dir, 'info'))) os.mkdir(os.path.join(os.path.join(dpkg_dir, 'triggers'))) os.mkdir(os.path.join(os.path.join(dpkg_dir, 'updates'))) open(os.path.join(dpkg_dir, 'status'), 'w').close() open(os.path.join(dpkg_dir, 'available'), 'w').close() self.dpkg_dir = dpkg_dir cache = apt.Cache(rootdir=self.chroot_path) apt.apt_pkg.config.set("Dir::Bin::dpkg", self.dpkg) # must be called after initializing the rootdir cache cache.update() cache.open() if hasattr(self, "handler"): self.handler.cache = cache self.done_callback = Mock() self._saved_seteuid_fn = os.seteuid self._saved_setegid_fn = os.setegid self._saved_geteuid_fn = os.geteuid self._saved_getenv = os.getenv self.user_uid, self.user_gid = (4242, 4242) os.seteuid = Mock() os.setegid = Mock() os.geteuid = Mock() os.geteuid.return_value = self.user_uid os.getenv = Mock(side_effect=self._mock_get_env) def tearDown(self): # remove arch cache support manipulate_path_env(os.path.dirname(self.dpkg), remove=True) tools._current_arch = None tools._foreign_arch = None shutil.rmtree(self.chroot_path) os.seteuid = self._saved_seteuid_fn os.setegid = self._saved_setegid_fn os.geteuid = self._saved_geteuid_fn os.getenv = self._saved_getenv super().tearDown() def _mock_get_env(self, env, default=None): if os.geteuid() == 0: if env == "SUDO_UID": return str(self.user_uid) elif env == "SUDO_GID": return str(self.user_gid) return self._saved_getenv(env) ubuntu-make-18.09+disco1/tests/small/test_cli.py0000644000000000000000000002756613352651520016510 0ustar # -*- coding: utf-8 -*- # Copyright (C) 2014 Canonical # # Authors: # Didier Roche # # 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; version 3. # # 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 """Tests for the cli module""" import importlib from ..tools import LoggedTestCase from umake.ui.cli import mangle_args_for_default_framework, get_frameworks_list_output import os import sys from ..tools import get_data_dir, change_xdg_path, patchelem import umake from unittest.mock import patch, Mock from umake import frameworks from argparse import Namespace import tempfile import shutil class TestCLIFromFrameworks(LoggedTestCase): """This will test the CLI module with loaded Frameworks""" @classmethod def setUpClass(cls): super().setUpClass() importlib.reload(umake.frameworks) change_xdg_path('XDG_CONFIG_HOME', os.path.join(get_data_dir(), 'configs', "foo")) sys.path.append(get_data_dir()) cls.testframeworks_dir = os.path.join(get_data_dir(), 'testframeworks') with patchelem(umake.frameworks, '__file__', os.path.join(cls.testframeworks_dir, '__init__.py')),\ patchelem(umake.frameworks, '__package__', "testframeworks"): frameworks.load_frameworks() # patch the BaseCategory dictionary from the umake.ui.cli one umake.ui.cli.BaseCategory = frameworks.BaseCategory @classmethod def tearDownClass(cls): change_xdg_path('XDG_CONFIG_HOME', remove=True) sys.path.remove(get_data_dir()) super().tearDownClass() def test_mangle_args_none(self): """No option goes are preserved""" self.assertEqual(mangle_args_for_default_framework([]), []) def test_mangle_args_options_only(self): """Options only goes are preserved""" self.assertEqual(mangle_args_for_default_framework(["--foo", "-b"]), ["--foo", "-b"]) def test_mangle_args_unknown_category(self): """Unknown category are preserved""" self.assertEqual(mangle_args_for_default_framework(["barframework", "-b"]), ["barframework", "-b"]) def test_mangle_args_for_framework(self): """Well formatted framework command are preserved""" self.assertEqual(mangle_args_for_default_framework(["category-a", "framework-a"]), ["category-a", "framework-a"]) def test_mangle_args_for_framework_none_default(self): """Well formatted none default framework command are preserved""" self.assertEqual(mangle_args_for_default_framework(["category-a", "framework-b"]), ["category-a", "framework-b"]) def test_mangle_args_for_framework_with_framework_options(self): """Well formatted framework command with framework options are preserved""" self.assertEqual(mangle_args_for_default_framework(["category-a", "framework-a", "--bar", "install_path", "--foo"]), ["category-a", "framework-a", "--bar", "install_path", "--foo"]) def test_mangle_args_for_framework_global_options(self): """Well formatted framework with global options are preserved""" self.assertEqual(mangle_args_for_default_framework(["category-a", "framework-a"]), ["category-a", "framework-a"]) def test_mangle_args_default_framework(self): """Choose default framework for the category""" self.assertEqual(mangle_args_for_default_framework(["category-a"]), ["category-a", "framework-a"]) def test_mangle_args_without_framework_with_framework_options(self): """Don't choose any framework for a category with default framework and framework options""" self.assertEqual(mangle_args_for_default_framework(["category-a", "install_path", "--foo"]), ["category-a", "install_path", "--foo"]) def test_mangle_args_for_framework_with_global_options(self): """Global options are preserved""" self.assertEqual(mangle_args_for_default_framework(["-v", "--debug", "category-a", "framework-a"]), ["-v", "--debug", "category-a", "framework-a"]) def test_mangle_args_for_framework_with_global_and_framework_options(self): """Global options and framework options are preserved""" self.assertEqual(mangle_args_for_default_framework(["-v", "category-a", "framework-a", "--bar", "install", "--foo"]), ["-v", "category-a", "framework-a", "--bar", "install", "--foo"]) def test_mangle_args_for_default_framework_with_global_options(self): """Global options are preserved, completing with default framework""" self.assertEqual(mangle_args_for_default_framework(["-v", "category-a"]), ["-v", "category-a", "framework-a"]) def test_mangle_args_for_default_framework_with_simple_options(self): """Global and framework simple options are preserved, completing with default framework with simple options""" self.assertEqual(mangle_args_for_default_framework(["-v", "category-a", "--foo", "--bar"]), ["-v", "category-a", "framework-a", "--foo", "--bar"]) def test_mangle_args_with_global_framework_extended_options(self): """Global options and framework extended options are preserved, NOT completing with default framework""" self.assertEqual(mangle_args_for_default_framework(["-v", "category-a", "--bar", "install_path", "--foo"]), ["-v", "category-a", "--bar", "install_path", "--foo"]) def test_mangle_args_with_global_framework_options_after_install(self): """Global and extended framework options are preserved after install_path, NOT completing with dft framework""" self.assertEqual(mangle_args_for_default_framework(["-v", "category-a", "install_path", "--foo"]), ["-v", "category-a", "install_path", "--foo"]) def test_mangle_args_for_default_framework_after_install_with_sep(self): """Add the default framework if the install path has a sep""" self.assertEqual(mangle_args_for_default_framework(["category-a", "install/path"]), ["category-a", "framework-a", "install/path"]) def test_mangle_args_with_global_framework_options_after_install_with_sep(self): """Global and ext framework options are preserved after install_path with sep, completing with dft framework""" self.assertEqual(mangle_args_for_default_framework(["-v", "category-a", "install/path", "--foo"]), ["-v", "category-a", "framework-a", "install/path", "--foo"]) def test_mangle_args_with_global_framework_options_between_install_with_sep(self): """Global and ext framework options are preserved before install_path with sep, completing with dft framework""" self.assertEqual(mangle_args_for_default_framework(["-v", "category-a", "--bar", "install/path", "--foo"]), ["-v", "category-a", "framework-a", "--bar", "install/path", "--foo"]) def test_mangle_args_for_framework_in_main_category(self): """framework in main category is preserved""" self.assertEqual(mangle_args_for_default_framework(["framework-free-a"]), ["framework-free-a"]) def test_mangle_args_for_framework_in_main_category_with_framework_options(self): """framework in main category with framework simple options are preserved""" self.assertEqual(mangle_args_for_default_framework(["framework-free-a", "--foo"]), ["framework-free-a", "--foo"]) def test_mangle_args_for_framework_in_main_category_with_framework_extended_options(self): """framework in main category with framework extended options are preserved""" self.assertEqual(mangle_args_for_default_framework(["framework-free-a", "--foo", "install_path"]), ["framework-free-a", "--foo", "install_path"]) def test_mangle_args_for_framework_in_main_category_with_global_and_framework_extended_options(self): """framework in main category with framework global and extended options are preserved""" self.assertEqual(mangle_args_for_default_framework(["-v", "framework-free-a", "--foo", "install_path"]), ["-v", "framework-free-a", "--foo", "install_path"]) def test_mangle_args_for_framework_in_main_category_with_global_and_framework_extended_options_and_path(self): """framework in main category with framework global and extended options are preserved and path""" self.assertEqual(mangle_args_for_default_framework(["-v", "framework-free-a", "--foo", "install/path"]), ["-v", "framework-free-a", "--foo", "install/path"]) def test_mangle_args_for_category_without_default_framework(self): """No framework in a category without default are preserved""" self.assertEqual(mangle_args_for_default_framework(["category-f"]), ["category-f"]) def test_mangle_args_for_category_without_default_framework_with_extended_options(self): """No framework in a category with ext. option without default are preserved""" self.assertEqual(mangle_args_for_default_framework(["category-f", "--foo", "install_path"]), ["category-f", "--foo", "install_path"]) def test_mangle_args_for_category_without_default_framework_with_install_path(self): """No framework in a category without default are preserved with install path""" self.assertEqual(mangle_args_for_default_framework(["category-f", "--foo", "install/path"]), ["category-f", "--foo", "install/path"]) def test_mangle_args_for_category_without_default_framework_with_global_and_extended_options(self): """No framework in a category without default are preserved with global and ext options""" self.assertEqual(mangle_args_for_default_framework(["-v", "category-f", "--foo", "install_path"]), ["-v", "category-f", "--foo", "install_path"]) def test_mangle_args_for_category_with_remove_global_options(self): """We mangle the remove option if global (before the category name) to append it to the framework option""" self.assertEqual(mangle_args_for_default_framework(["--remove", "category-a", "framework-a"]), ["category-a", "framework-a", "--remove"]) def test_mangle_args_for_category_with_remove_framework_options_middle(self): """We mangle the remove option if framework (between category and framework)""" self.assertEqual(mangle_args_for_default_framework(["category-a", "--remove", "framework-a"]), ["category-a", "framework-a", "--remove"]) def test_mangle_args_for_category_with_remove_framework_options(self): """We don't change the remove option if after framework""" self.assertEqual(mangle_args_for_default_framework(["category-a", "framework-a", "--remove", "--bar"]), ["category-a", "framework-a", "--remove", "--bar"]) def test_mangle_args_for_category_with_short_remove_global_options(self): """We mangle the -r remove option if global (before the category name) to append it to the framework option""" self.assertEqual(mangle_args_for_default_framework(["-r", "category-a", "framework-a"]), ["category-a", "framework-a", "-r"]) ubuntu-make-18.09+disco1/tests/small/test_decompressor.py0000644000000000000000000003565313352651520020442 0ustar # -*- coding: utf-8 -*- # Copyright (C) 2014 Canonical # # Authors: # Didier Roche # # 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; version 3. # # 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 """Tests for the decompressor module""" import os from time import time from unittest.mock import Mock import shutil import stat import tempfile from ..tools import get_data_dir, LoggedTestCase from umake.decompressor import Decompressor class TestDecompressor(LoggedTestCase): """This will test the decompressor class""" @classmethod def setUpClass(cls): super().setUpClass() cls.compressfiles_dir_orig = os.path.join(get_data_dir(), "compress-files") def setUp(self): super().setUp() self.on_done = Mock() self.tempdir = tempfile.mkdtemp() self.compressfiles_dir = os.path.join(self.tempdir, "source-files") shutil.copytree(self.compressfiles_dir_orig, self.compressfiles_dir) def tearDown(self): shutil.rmtree(self.tempdir) super().tearDown() def wait_for_callback(self, mock_function_to_be_called, timeout=10): """wait for the callback to be called until a timeout. Add temp files to the clean file list afterwards""" timeout_time = time() + 5 while not mock_function_to_be_called.called: if time() > timeout_time: raise(BaseException("Function not called within {} seconds".format(timeout))) def test_decompress(self): """We decompress a valid .tgz file successfully""" filepath = os.path.join(self.compressfiles_dir, "valid.tgz") Decompressor({open(filepath, 'rb'): Decompressor.DecompressOrder(dest=self.tempdir, dir='')}, self.on_done) self.wait_for_callback(self.on_done) results = self.on_done.call_args[0][0] self.assertEqual(len(results), 1, str(results)) for fd in results: self.assertIsNone(results[fd].error) self.assertTrue(os.path.isdir(os.path.join(self.tempdir, 'server-content'))) self.assertTrue(os.path.isfile(os.path.join(self.tempdir, 'server-content', 'simplefile'))) self.assertTrue(os.path.isdir(os.path.join(self.tempdir, 'server-content', 'subdir'))) self.assertTrue(os.path.isfile(os.path.join(self.tempdir, 'server-content', 'subdir', 'otherfile'))) self.assertEqual(self.on_done.call_count, 1, "Global done callback is only called once") def test_decompress_move_dir_content(self): """We decompress a valid file decompressing one subdir content (other files in root are kept in place)""" filepath = os.path.join(self.compressfiles_dir, "valid.tgz") Decompressor({open(filepath, 'rb'): Decompressor.DecompressOrder(dest=self.tempdir, dir='server-content')}, self.on_done) self.wait_for_callback(self.on_done) results = self.on_done.call_args[0][0] self.assertEqual(len(results), 1, str(results)) for fd in results: self.assertIsNone(results[fd].error) self.assertTrue(os.path.isdir(self.tempdir)) self.assertTrue(os.path.isfile(os.path.join(self.tempdir, 'simplefile'))) self.assertTrue(os.path.isdir(os.path.join(self.tempdir, 'subdir'))) self.assertTrue(os.path.isfile(os.path.join(self.tempdir, 'subdir', 'otherfile'))) def test_decompress_invalid_file(self): """We return an error if the compressed file is invalid""" self.expect_warn_error = True filepath = os.path.join(self.compressfiles_dir, "invalid.tgz") Decompressor({open(filepath, 'rb'): Decompressor.DecompressOrder(dest=self.tempdir, dir='')}, self.on_done) self.wait_for_callback(self.on_done) results = self.on_done.call_args[0][0] self.assertEqual(len(results), 1, str(results)) for fd in results: self.assertIsNotNone(results[fd].error) self.assertEqual(self.on_done.call_count, 1, "Global done callback is only called once") def test_decompress_content_glob(self): """We decompress a valid file decompressing one subdir content with a glob schema""" filepath = os.path.join(self.compressfiles_dir, "valid.tgz") Decompressor({open(filepath, 'rb'): Decompressor.DecompressOrder(dest=self.tempdir, dir='server-*')}, self.on_done) self.wait_for_callback(self.on_done) results = self.on_done.call_args[0][0] self.assertEqual(len(results), 1, str(results)) for fd in results: self.assertIsNone(results[fd].error) self.assertTrue(os.path.isdir(self.tempdir)) self.assertTrue(os.path.isfile(os.path.join(self.tempdir, 'simplefile'))) self.assertTrue(os.path.isdir(os.path.join(self.tempdir, 'subdir'))) self.assertTrue(os.path.isfile(os.path.join(self.tempdir, 'subdir', 'otherfile'))) def test_decompress_zip(self): """We decompress a valid zip file successfully""" filepath = os.path.join(self.compressfiles_dir, "valid.zip") Decompressor({open(filepath, 'rb'): Decompressor.DecompressOrder(dest=self.tempdir, dir='')}, self.on_done) self.wait_for_callback(self.on_done) results = self.on_done.call_args[0][0] self.assertEqual(len(results), 1, str(results)) for fd in results: self.assertIsNone(results[fd].error) self.assertTrue(os.path.isdir(os.path.join(self.tempdir, 'server-content'))) self.assertTrue(os.path.isfile(os.path.join(self.tempdir, 'server-content', 'simplefile'))) self.assertTrue(os.path.isfile(os.path.join(self.tempdir, 'server-content', 'executablefile'))) self.assertTrue(os.path.isdir(os.path.join(self.tempdir, 'server-content', 'subdir'))) self.assertTrue(os.path.isfile(os.path.join(self.tempdir, 'server-content', 'subdir', 'otherfile'))) def test_decompress_zip_good_permission(self): """We decompress a valid zip file successfully, retaining the right permissions""" filepath = os.path.join(self.compressfiles_dir, "valid.zip") Decompressor({open(filepath, 'rb'): Decompressor.DecompressOrder(dest=self.tempdir, dir='')}, self.on_done) self.wait_for_callback(self.on_done) results = self.on_done.call_args[0][0] self.assertEqual(len(results), 1, str(results)) for fd in results: self.assertIsNone(results[fd].error) self.assertTrue(os.path.isdir(os.path.join(self.tempdir, 'server-content'))) simplefile = os.path.join(self.tempdir, 'server-content', 'simplefile') self.assertTrue(os.path.isfile(simplefile)) execfile = os.path.join(self.tempdir, 'server-content', 'executablefile') self.assertTrue(os.path.isfile(execfile)) self.assertEqual(oct(stat.S_IMODE(os.lstat(simplefile).st_mode)), '0o664') self.assertEqual(oct(stat.S_IMODE(os.lstat(execfile).st_mode)), '0o775') def test_decompress_exec(self): """We decompress a valid executable file successfully""" filepath = os.path.join(self.compressfiles_dir, "simple.bin") Decompressor({open(filepath, 'rb'): Decompressor.DecompressOrder(dest=self.tempdir, dir='')}, self.on_done) self.wait_for_callback(self.on_done) results = self.on_done.call_args[0][0] self.assertEqual(len(results), 1, str(results)) for fd in results: self.assertIsNone(results[fd].error) self.assertTrue(os.path.isdir(os.path.join(self.tempdir, 'android-ndk-foo'))) self.assertTrue(os.path.isfile(os.path.join(self.tempdir, 'android-ndk-foo', 'ndk-which'))) self.assertTrue(os.path.isfile(os.path.join(self.tempdir, 'android-ndk-foo', 'ndk-build'))) def test_decompress_file_with_archive(self): """We decompress a .sh file containing an archive successfully""" filepath = os.path.join(self.compressfiles_dir, "script_with_archive.sh") with open(filepath, 'rb') as fd: for line in fd: if line.startswith(b"== ARCHIVE TAG =="): break Decompressor({fd: Decompressor.DecompressOrder(dest=self.tempdir, dir='')}, self.on_done) self.wait_for_callback(self.on_done) results = self.on_done.call_args[0][0] self.assertEqual(len(results), 1, str(results)) for fd in results: self.assertIsNone(results[fd].error) self.assertTrue(os.path.isdir(os.path.join(self.tempdir, 'server-content'))) self.assertTrue(os.path.isfile(os.path.join(self.tempdir, 'server-content', 'simplefile'))) self.assertTrue(os.path.isdir(os.path.join(self.tempdir, 'server-content', 'subdir'))) self.assertTrue(os.path.isfile(os.path.join(self.tempdir, 'server-content', 'subdir', 'otherfile'))) def test_decompress_wrong_dir_content(self): """We decompress a valid file, but the selected subdir isn't valid""" self.expect_warn_error = True filepath = os.path.join(self.compressfiles_dir, "valid.tgz") Decompressor({open(filepath, 'rb'): Decompressor.DecompressOrder(dest=self.tempdir, dir='doesnt-exists')}, self.on_done) self.wait_for_callback(self.on_done) results = self.on_done.call_args[0][0] self.assertEqual(len(results), 1, str(results)) for fd in results: self.assertIsNotNone(results[fd].error) def test_decompress_content_keep_existing_files(self): """We decompress a valid file in a directory which already have some content. This one is left.""" filepath = os.path.join(self.compressfiles_dir, "valid.tgz") open(os.path.join(self.tempdir, "foo"), 'w').write('') Decompressor({open(filepath, 'rb'): Decompressor.DecompressOrder(dest=self.tempdir, dir='')}, self.on_done) self.wait_for_callback(self.on_done) results = self.on_done.call_args[0][0] self.assertEqual(len(results), 1, str(results)) for fd in results: self.assertIsNone(results[fd].error) self.assertTrue(os.path.isdir(self.tempdir)) self.assertTrue(os.path.isdir(os.path.join(self.tempdir, 'server-content'))) self.assertTrue(os.path.isfile(os.path.join(self.tempdir, 'server-content', 'simplefile'))) self.assertTrue(os.path.isdir(os.path.join(self.tempdir, 'server-content', 'subdir'))) self.assertTrue(os.path.isfile(os.path.join(self.tempdir, 'server-content', 'subdir', 'otherfile'))) # the original file is there here self.assertTrue(os.path.isfile(os.path.join(self.tempdir, 'foo'))) def test_decompress_move_dir_content_keep_existing_files(self): """We decompress a valid file changing dir in a directory which already have some content. This one is left.""" filepath = os.path.join(self.compressfiles_dir, "valid.tgz") open(os.path.join(self.tempdir, "foo"), 'w').write('') Decompressor({open(filepath, 'rb'): Decompressor.DecompressOrder(dest=self.tempdir, dir='server-content')}, self.on_done) self.wait_for_callback(self.on_done) results = self.on_done.call_args[0][0] self.assertEqual(len(results), 1, str(results)) for fd in results: self.assertIsNone(results[fd].error) self.assertTrue(os.path.isdir(self.tempdir)) self.assertTrue(os.path.isfile(os.path.join(self.tempdir, 'simplefile'))) self.assertTrue(os.path.isdir(os.path.join(self.tempdir, 'subdir'))) self.assertTrue(os.path.isfile(os.path.join(self.tempdir, 'subdir', 'otherfile'))) # the original file is there here self.assertTrue(os.path.isfile(os.path.join(self.tempdir, 'foo'))) def test_decompress_multiple(self): """We decompress multiple valid .tgz file successfully""" filepath1 = os.path.join(self.compressfiles_dir, "valid.tgz") filepath2 = os.path.join(self.compressfiles_dir, "valid2.tgz") Decompressor({open(filepath1, 'rb'): Decompressor.DecompressOrder(dest=self.tempdir, dir=''), open(filepath2, 'rb'): Decompressor.DecompressOrder(dest=self.tempdir, dir='')}, self.on_done) self.wait_for_callback(self.on_done) results = self.on_done.call_args[0][0] self.assertEqual(len(results), 2, str(results)) for fd in results: self.assertIsNone(results[fd].error) self.assertTrue(os.path.isdir(os.path.join(self.tempdir, 'server-content'))) self.assertTrue(os.path.isfile(os.path.join(self.tempdir, 'server-content', 'simplefile'))) self.assertTrue(os.path.isdir(os.path.join(self.tempdir, 'server-content', 'subdir'))) self.assertTrue(os.path.isfile(os.path.join(self.tempdir, 'server-content', 'subdir', 'otherfile'))) self.assertTrue(os.path.isdir(os.path.join(self.tempdir, 'server-content2'))) self.assertTrue(os.path.isfile(os.path.join(self.tempdir, 'server-content2', 'simplefile2'))) self.assertTrue(os.path.isdir(os.path.join(self.tempdir, 'server-content2', 'subdir2'))) self.assertTrue(os.path.isfile(os.path.join(self.tempdir, 'server-content2', 'subdir2', 'otherfile'))) self.assertEqual(self.on_done.call_count, 1, "Global done callback is only called once") def test_decompress_multiple_with_dir(self): """We decompress multiple valid .tgz file successfully with different dir to extract""" filepath1 = os.path.join(self.compressfiles_dir, "valid.tgz") filepath2 = os.path.join(self.compressfiles_dir, "valid2.tgz") Decompressor({open(filepath1, 'rb'): Decompressor.DecompressOrder(dest=self.tempdir, dir='server-content'), open(filepath2, 'rb'): Decompressor.DecompressOrder(dest=self.tempdir, dir='server-content2')}, self.on_done) self.wait_for_callback(self.on_done) results = self.on_done.call_args[0][0] self.assertEqual(len(results), 2, str(results)) for fd in results: self.assertIsNone(results[fd].error) self.assertTrue(os.path.isfile(os.path.join(self.tempdir, 'simplefile'))) self.assertTrue(os.path.isdir(os.path.join(self.tempdir, 'subdir'))) self.assertTrue(os.path.isfile(os.path.join(self.tempdir, 'subdir', 'otherfile'))) self.assertTrue(os.path.isfile(os.path.join(self.tempdir, 'simplefile2'))) self.assertTrue(os.path.isdir(os.path.join(self.tempdir, 'subdir2'))) self.assertTrue(os.path.isfile(os.path.join(self.tempdir, 'subdir2', 'otherfile'))) self.assertEqual(self.on_done.call_count, 1, "Global done callback is only called once") ubuntu-make-18.09+disco1/tests/small/test_download_center.py0000644000000000000000000006367613415340516021112 0ustar # -*- coding: utf-8 -*- # Copyright (C) 2014 Canonical # # Authors: # Didier Roche # # 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; version 3. # # 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 """Tests for the download center module using a local server""" from enum import Enum import os from os.path import join, getsize from time import time from unittest.mock import Mock, call from ..tools import get_data_dir, CopyingMock, LoggedTestCase from ..tools.local_server import LocalHttp from umake.network.download_center import DownloadCenter, DownloadItem from umake.tools import ChecksumType, Checksum class TestDownloadCenter(LoggedTestCase): """This will test the download center by sending one or more download requests""" server = None @classmethod def setUpClass(cls): super().setUpClass() cls.server_dir = join(get_data_dir(), "server-content") cls.server = LocalHttp(cls.server_dir) @classmethod def tearDownClass(cls): super().tearDownClass() cls.server.stop() def setUp(self): super().setUp() self.callback = Mock() self.fd_to_close = [] def tearDown(self): super().tearDown() for fd in self.fd_to_close: fd.close() def build_server_address(self, path, localhost=False): """build server address to path to get requested""" return "{}/{}".format(self.server.get_address(localhost=localhost), path) def wait_for_callback(self, mock_function_to_be_called): """wait for the callback to be called until a timeout. Add temp files to the clean file list afterwards""" timeout = time() + 5 while not mock_function_to_be_called.called: if time() > timeout: raise(BaseException("Function not called within 5 seconds")) for calls in mock_function_to_be_called.call_args[0]: for request in calls: if calls[request].fd: self.fd_to_close.append(calls[request].fd) if calls[request].buffer: self.fd_to_close.append(calls[request].buffer) def test_download(self): """we deliver one successful download""" filename = "simplefile" url = self.build_server_address(filename) request = DownloadItem(url, None) DownloadCenter([request], self.callback) self.wait_for_callback(self.callback) result = self.callback.call_args[0][0][url] self.assertTrue(self.callback.called) self.assertEqual(self.callback.call_count, 1) with open(join(self.server_dir, filename), 'rb') as file_on_disk: self.assertEqual(file_on_disk.read(), result.fd.read()) self.assertTrue('.' not in result.fd.name, result.fd.name) self.assertIsNone(result.buffer) self.assertIsNone(result.error) def test_redirect_download(self): """we deliver one successful download after being redirected""" filename = "simplefile" # We add a suffix to make the server redirect us. url = self.build_server_address(filename + "-redirect") request = DownloadItem(url, None) DownloadCenter([request], self.callback) self.wait_for_callback(self.callback) result = self.callback.call_args[0][0][url] self.assertTrue(self.callback.called) self.assertEqual(self.callback.call_count, 1) self.assertEqual(result.final_url, self.build_server_address(filename)) with open(join(self.server_dir, filename), 'rb') as file_on_disk: self.assertEqual(file_on_disk.read(), result.fd.read()) self.assertIsNone(result.buffer) self.assertIsNone(result.error) def test_header_download(self): """we deliver one successful download with some headers""" filename = "simplefile" url = self.build_server_address(filename + '-headers?header=test') request = DownloadItem(url, headers={"header": "test"}) DownloadCenter([request], self.callback) self.wait_for_callback(self.callback) result = self.callback.call_args[0][0][url] self.assertTrue(self.callback.called) self.assertEqual(self.callback.call_count, 1) with open(join(self.server_dir, filename), 'rb') as file_on_disk: self.assertEqual(file_on_disk.read(), result.fd.read()) self.assertTrue('.' not in result.fd.name, result.fd.name) self.assertIsNone(result.buffer) self.assertIsNone(result.error) def test_cookies(self): """Test handing of outgoing and incoming cookies.""" filename = "simplefile" url = self.build_server_address(filename) # The server is rigged to inc the 'int' cookie by one. cookies = {'int': '5'} request = DownloadItem(url, None, cookies=cookies) DownloadCenter([request], self.callback) self.wait_for_callback(self.callback) result = self.callback.call_args[0][0][url] self.assertTrue(self.callback.called) self.assertEqual(self.callback.call_count, 1) self.assertEqual('6', result.cookies['int']) def test_content_encoding(self): """Ensure we perform (or don't) content decoding properly.""" # Use an existing .gz file, at data/server-content/www.eclipse.org/.../eclipse-standard-luna-R-linux-gtk.tar.gz filename = "www.eclipse.org/technology/epp/downloads/release/version/"\ "point_release/eclipse-java-linux-gtk.tar.gz" length = 10240 compressed_length = 266 url = self.build_server_address(filename + '-setheaders?content-encoding=gzip') request = DownloadItem(url) DownloadCenter([request], self.callback, download=False) self.wait_for_callback(self.callback) result = self.callback.call_args[0][0][url] self.assertTrue(self.callback.called) self.assertEqual(self.callback.call_count, 1) self.assertEqual(length, len(result.buffer.getvalue())) # Reset the callback mock. self.callback = Mock() request = DownloadItem(url, ignore_encoding=True) DownloadCenter([request], self.callback, download=False) self.wait_for_callback(self.callback) result = self.callback.call_args[0][0][url] self.assertTrue(self.callback.called) self.assertEqual(self.callback.call_count, 1) self.assertEqual(compressed_length, len(result.buffer.getvalue())) def test_download_keep_extensions(self): """we deliver successful downloads keeping the extension""" filename = "android-studio-fake.tgz" url = self.build_server_address(filename) request = DownloadItem(url, None) DownloadCenter([request], self.callback) self.wait_for_callback(self.callback) result = self.callback.call_args[0][0][url] self.assertTrue(self.callback.called) self.assertEqual(self.callback.call_count, 1) with open(join(self.server_dir, filename), 'rb'): self.assertTrue(result.fd.name.endswith('.tgz'), result.fd.name) def test_download_with_md5(self): """we deliver once successful download, matching md5sum""" filename = "simplefile" request = self.build_server_address(filename) DownloadCenter([DownloadItem(request, Checksum(ChecksumType.md5, '268a5059001855fef30b4f95f82044ed'))], self.callback) self.wait_for_callback(self.callback) result = self.callback.call_args[0][0][request] self.assertTrue(self.callback.called) self.assertEqual(self.callback.call_count, 1) with open(join(self.server_dir, filename), 'rb') as file_on_disk: self.assertEqual(file_on_disk.read(), result.fd.read()) self.assertIsNone(result.buffer) self.assertIsNone(result.error) def test_download_with_sha1sum(self): """we deliver once successful download, matching sha1sum""" filename = "simplefile" request = self.build_server_address(filename) DownloadCenter([DownloadItem(request, Checksum(ChecksumType.sha1, '0562f08aef399135936d6fb4eb0cc7bc1890d5b4'))], self.callback) self.wait_for_callback(self.callback) result = self.callback.call_args[0][0][request] self.assertTrue(self.callback.called) self.assertEqual(self.callback.call_count, 1) with open(join(self.server_dir, filename), 'rb') as file_on_disk: self.assertEqual(file_on_disk.read(), result.fd.read()) self.assertIsNone(result.buffer) self.assertIsNone(result.error) def test_download_with_sha256sum(self): """we deliver once successful download, matching sha256sum""" filename = "simplefile" request = self.build_server_address(filename) DownloadCenter([DownloadItem(request, Checksum(ChecksumType.sha256, 'b1b113c6ed8ab3a14779f7c54179eac2b87d39fcebbf65a50556b8d68caaa2fb'))], self.callback) self.wait_for_callback(self.callback) result = self.callback.call_args[0][0][request] self.assertTrue(self.callback.called) self.assertEqual(self.callback.call_count, 1) with open(join(self.server_dir, filename), 'rb') as file_on_disk: self.assertEqual(file_on_disk.read(), result.fd.read()) self.assertIsNone(result.buffer) self.assertIsNone(result.error) def test_download_with_sha512sum(self): """we deliver once successful download, matching sha512sum""" filename = "simplefile" request = self.build_server_address(filename) DownloadCenter([DownloadItem(request, Checksum(ChecksumType.sha512, '74e20d520ba4ecfdb59d98ac213deccecf591c9c6bfc5996ac158ab6facd6611cce7dd2' '2120b63ebe9217f159506f352ce0ee6c0c2a1d200841ae21635dc5f9a'))], self.callback) self.wait_for_callback(self.callback) result = self.callback.call_args[0][0][request] self.assertTrue(self.callback.called) self.assertEqual(self.callback.call_count, 1) with open(join(self.server_dir, filename), 'rb') as file_on_disk: self.assertEqual(file_on_disk.read(), result.fd.read()) self.assertIsNone(result.buffer) self.assertIsNone(result.error) def test_download_with_no_checksum_value(self): """we deliver one successful download with a checksum type having no value""" filename = "simplefile" url = self.build_server_address(filename) request = DownloadItem(url, Checksum(ChecksumType.md5, None)) DownloadCenter([request], self.callback) self.wait_for_callback(self.callback) result = self.callback.call_args[0][0][url] self.assertTrue(self.callback.called) self.assertEqual(self.callback.call_count, 1) with open(join(self.server_dir, filename), 'rb') as file_on_disk: self.assertEqual(file_on_disk.read(), result.fd.read()) self.assertTrue('.' not in result.fd.name, result.fd.name) self.assertIsNone(result.buffer) self.assertIsNone(result.error) def test_download_with_progress(self): """we deliver progress hook while downloading""" filename = "simplefile" filesize = getsize(join(self.server_dir, filename)) report = CopyingMock() request = DownloadItem(self.build_server_address(filename), None) DownloadCenter([request], self.callback, report=report) self.wait_for_callback(self.callback) self.assertEqual(report.call_count, 2) self.assertEqual(report.call_args_list, [call({self.build_server_address(filename): {'size': filesize, 'current': 0}}), call({self.build_server_address(filename): {'size': filesize, 'current': filesize}})]) def test_download_with_multiple_progress(self): """we deliver multiple progress hooks on bigger files""" filename = "biggerfile" filesize = getsize(join(self.server_dir, filename)) report = CopyingMock() request = DownloadItem(self.build_server_address(filename), None) dl_center = DownloadCenter([request], self.callback, report=report) self.wait_for_callback(self.callback) self.assertEqual(report.call_count, 3) self.assertEqual(report.call_args_list, [call({self.build_server_address(filename): {'size': filesize, 'current': 0}}), call({self.build_server_address(filename): {'size': filesize, 'current': dl_center.BLOCK_SIZE}}), call({self.build_server_address(filename): {'size': filesize, 'current': filesize}})]) def test_multiple_downloads(self): """we deliver more than on download in parallel""" requests = [DownloadItem(self.build_server_address("biggerfile"), None), DownloadItem(self.build_server_address("simplefile"), None)] DownloadCenter(requests, self.callback) self.wait_for_callback(self.callback) # ensure we saw 2 different requests callback_args, callback_kwargs = self.callback.call_args map_result = callback_args[0] self.assertIn(self.build_server_address("biggerfile"), map_result) self.assertIn(self.build_server_address("simplefile"), map_result) # ensure each temp file corresponds to the source content for filename in ("biggerfile", "simplefile"): with open(join(self.server_dir, filename), 'rb') as file_on_disk: self.assertEqual(file_on_disk.read(), map_result[self.build_server_address(filename)].fd.read()) self.assertEqual(self.callback.call_count, 1, "Global done callback is only called once") def test_multiple_downloads_with_reports(self): """we deliver more than on download in parallel""" requests = [DownloadItem(self.build_server_address("biggerfile"), None), DownloadItem(self.build_server_address("simplefile"), None)] report = CopyingMock() DownloadCenter(requests, self.callback, report=report) self.wait_for_callback(self.callback) self.assertEqual(report.call_count, 5) # ensure that first call only contains one file callback_args, callback_kwargs = report.call_args_list[0] map_result = callback_args[0] self.assertEqual(len(map_result), 1, str(map_result)) # ensure that last call is what we expect result_dict = {} for filename in ("biggerfile", "simplefile"): file_size = getsize(join(self.server_dir, filename)) result_dict[self.build_server_address(filename)] = {'size': file_size, 'current': file_size} self.assertEqual(report.call_args, call(result_dict)) self.assertEqual(self.callback.call_count, 1, "Global done callback is only called once") def test_404_url(self): """we return an error for a request including a 404 url""" request = DownloadItem(self.build_server_address("does_not_exist"), None) DownloadCenter([request], self.callback) self.wait_for_callback(self.callback) # no download means the file isn't in the result callback_args, callback_kwargs = self.callback.call_args result = callback_args[0][self.build_server_address("does_not_exist")] self.assertIn("404", result.error) self.assertIn("File not found", result.error) self.assertIsNone(result.buffer) self.assertIsNone(result.fd) self.expect_warn_error = True self.assertEqual(self.callback.call_count, 1, "Global done callback is only called once") def test_multiple_with_one_404_url(self): """we raise an error when we try to download 404 urls""" requests = [DownloadItem(self.build_server_address("does_not_exist"), None), DownloadItem(self.build_server_address("simplefile"), None)] DownloadCenter(requests, self.callback) self.wait_for_callback(self.callback) # we should have the two content, one in error callback_args, callback_kwargs = self.callback.call_args map_result = callback_args[0] self.assertEqual(len(map_result), 2, str(map_result)) self.assertIsNotNone(map_result[self.build_server_address("does_not_exist")].error) self.assertIsNotNone(map_result[self.build_server_address("simplefile")].fd) self.expect_warn_error = True self.assertEqual(self.callback.call_count, 1, "Global done callback is only called once") def test_in_memory_download(self): """we deliver download on memory objects""" filename = "simplefile" url = self.build_server_address(filename) request = DownloadItem(url, None) DownloadCenter([request], self.callback, download=False) self.wait_for_callback(self.callback) result = self.callback.call_args[0][0][url] self.assertTrue(self.callback.called) self.assertEqual(self.callback.call_count, 1) with open(join(self.server_dir, filename), 'rb') as file_on_disk: self.assertEqual(file_on_disk.read(), result.buffer.read()) self.assertIsNone(result.fd) self.assertIsNone(result.error) def test_unsupported_protocol(self): """Raises an exception when trying to download for an unsupported protocol""" filename = "simplefile" url = self.build_server_address(filename).replace('http', 'sftp') request = DownloadItem(url, None) DownloadCenter([request], self.callback, download=False) self.wait_for_callback(self.callback) result = self.callback.call_args[0][0][url] self.assertIn("Protocol not supported", result.error) self.assertIsNone(result.buffer) self.assertIsNone(result.fd) self.expect_warn_error = True def test_download_with_wrong_md5(self): """we raise an error if we don't have the correct md5sum""" filename = "simplefile" request = self.build_server_address(filename) DownloadCenter([DownloadItem(request, Checksum(ChecksumType.md5, 'AAAAA'))], self.callback) self.wait_for_callback(self.callback) result = self.callback.call_args[0][0][request] self.assertIn("Corrupted download", result.error) self.assertIsNone(result.buffer) self.assertIsNone(result.fd) self.expect_warn_error = True def test_download_with_wrong_sha1(self): """we raise an error if we don't have the correct sha1""" filename = "simplefile" request = self.build_server_address(filename) DownloadCenter([DownloadItem(request, Checksum(ChecksumType.sha1, 'AAAAA'))], self.callback) self.wait_for_callback(self.callback) result = self.callback.call_args[0][0][request] self.assertIn("Corrupted download", result.error) self.assertIsNone(result.buffer) self.assertIsNone(result.fd) self.expect_warn_error = True def test_download_with_wrong_sha256(self): """we raise an error if we don't have the correct sha256""" filename = "simplefile" request = self.build_server_address(filename) DownloadCenter([DownloadItem(request, Checksum(ChecksumType.sha256, 'AAAAA'))], self.callback) self.wait_for_callback(self.callback) result = self.callback.call_args[0][0][request] self.assertIn("Corrupted download", result.error) self.assertIsNone(result.buffer) self.assertIsNone(result.fd) self.expect_warn_error = True def test_download_with_no_size(self): """we deliver one successful download, even if size isn't provided. Progress returns -1 though""" filename = "simplefile-with-no-content-length" url = self.build_server_address(filename) request = DownloadItem(url, None) report = CopyingMock() DownloadCenter([request], self.callback, report=report) self.wait_for_callback(self.callback) result = self.callback.call_args[0][0][url] self.assertTrue(self.callback.called) self.assertEqual(self.callback.call_count, 1) with open(join(self.server_dir, filename), 'rb') as file_on_disk: self.assertEqual(file_on_disk.read(), result.fd.read()) self.assertIsNone(result.buffer) self.assertIsNone(result.error) self.assertEqual(report.call_count, 2) self.assertEqual(report.call_args_list, [call({self.build_server_address(filename): {'size': -1, 'current': 0}}), call({self.build_server_address(filename): {'size': -1, 'current': 8192}})]) def test_download_with_wrong_checksumtype(self): """we raise an error if we don't have a support checksum type""" class WrongChecksumType(Enum): didrocksha = "didrocksha" filename = "simplefile" request = self.build_server_address(filename) DownloadCenter([DownloadItem(request, Checksum(WrongChecksumType.didrocksha, 'AAAAA'))], self.callback) self.wait_for_callback(self.callback) result = self.callback.call_args[0][0][request] self.assertIn("Unsupported checksum type", result.error) self.assertIsNone(result.buffer) self.assertIsNone(result.fd) self.expect_warn_error = True class TestDownloadCenterSecure(LoggedTestCase): """This will test the download center in secure mode by sending one or more download requests""" server = None @classmethod def setUpClass(cls): super().setUpClass() cls.server_dir = join(get_data_dir(), "server-content") cls.server = LocalHttp(cls.server_dir, use_ssl=["localhost"]) @classmethod def tearDownClass(cls): super().tearDownClass() cls.server.stop() def setUp(self): super().setUp() self.callback = Mock() self.fd_to_close = [] def tearDown(self): super().tearDown() for fd in self.fd_to_close: fd.close() def test_download(self): """we deliver one successful download under ssl with known cert""" filename = "simplefile" # The host name is important here, since we verify it, so request # the localhost address. url = TestDownloadCenter.build_server_address(self, filename, True) request = DownloadItem(url, None) # prepare the cert and set it as the trusted system context os.environ['REQUESTS_CA_BUNDLE'] = join(get_data_dir(), 'localhost.pem') try: DownloadCenter([request], self.callback) TestDownloadCenter.wait_for_callback(self, self.callback) result = self.callback.call_args[0][0][url] self.assertTrue(self.callback.called) self.assertEqual(self.callback.call_count, 1) with open(os.path.join(self.server_dir, filename), 'rb') as file_on_disk: self.assertEqual(file_on_disk.read(), result.fd.read()) finally: del os.environ['REQUESTS_CA_BUNDLE'] def test_redirect_download(self): """we deliver one successful download after being redirected""" filename = "simplefile" # We add a suffix to make the server redirect us. url = TestDownloadCenter.build_server_address(self, filename + "-redirect", localhost=True) request = DownloadItem(url, None) os.environ['REQUESTS_CA_BUNDLE'] = join(get_data_dir(), 'localhost.pem') try: DownloadCenter([request], self.callback) TestDownloadCenter.wait_for_callback(self, self.callback) result = self.callback.call_args[0][0][url] self.assertTrue(self.callback.called) self.assertEqual(self.callback.call_count, 1) self.assertEqual(result.final_url, TestDownloadCenter.build_server_address(self, filename, localhost=True)) with open(os.path.join(self.server_dir, filename), 'rb') as file_on_disk: self.assertEqual(file_on_disk.read(), result.fd.read()) self.assertIsNone(result.buffer) self.assertIsNone(result.error) finally: del os.environ['REQUESTS_CA_BUNDLE'] def test_with_invalid_certificate(self): """we error on invalid ssl certificate""" filename = "simplefile" url = TestDownloadCenter.build_server_address(self, filename) request = DownloadItem(url, None) DownloadCenter([request], self.callback) TestDownloadCenter.wait_for_callback(self, self.callback) result = self.callback.call_args[0][0][url] # disco python changed the error type found = False for invalidError in ["CERTIFICATE_VERIFY_FAILED", "bad handshake"]: if invalidError in result.error: found = True self.assertTrue(found) self.assertIsNone(result.buffer) self.assertIsNone(result.fd) self.expect_warn_error = True ubuntu-make-18.09+disco1/tests/small/test_frameworks_loader.py0000644000000000000000000017777513352651520021457 0ustar # -*- coding: utf-8 -*- # Copyright (C) 2014 Canonical # # Authors: # Didier Roche # # 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; version 3. # # 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 """Tests the framework loader""" import argparse from contextlib import suppress import importlib import os import shutil import sys import tempfile from ..data.testframeworks.uninstantiableframework import Uninstantiable, InheritedFromUninstantiable from ..tools import get_data_dir, change_xdg_path, patchelem, LoggedTestCase, INSTALL_DIR import umake from umake import frameworks from umake.frameworks.baseinstaller import BaseInstaller from umake.settings import UMAKE_FRAMEWORKS_ENVIRON_VARIABLE from umake.tools import NoneDict, ConfigHandler from unittest.mock import Mock, patch, call from umake.ui.cli import get_frameworks_list_output class BaseFrameworkLoader(LoggedTestCase): """Unload and reload the module to ensure we clean all class dict""" @classmethod def setUpClass(cls): super().setUpClass() importlib.reload(frameworks) cls.CategoryHandler = frameworks.BaseCategory def setUp(self): """Ensure we don't have any config file loaded""" super().setUp() change_xdg_path('XDG_CONFIG_HOME', self.config_dir_for_name("foo")) def tearDown(self): change_xdg_path('XDG_CONFIG_HOME', remove=True) # we reset the loaded categories self.CategoryHandler.categories = NoneDict() super().tearDown() def config_dir_for_name(self, name): """Return the config dir for this name""" return os.path.join(get_data_dir(), 'configs', name) def fake_arch_version(self, arch, version): """Help to mock the current arch and version on further calls""" self._saved_current_arch_fn = umake.frameworks.get_current_arch self.get_current_arch_mock = Mock() self.get_current_arch_mock.return_value = arch umake.frameworks.get_current_arch = self.get_current_arch_mock self._saved_current_ubuntu_version_fn = umake.frameworks.get_current_ubuntu_version self.get_current_ubuntu_version_mock = Mock() self.get_current_ubuntu_version_mock.return_value = version umake.frameworks.get_current_ubuntu_version = self.get_current_ubuntu_version_mock def restore_arch_version(self): """Restore initial current arch and version""" umake.frameworks.get_current_arch = self._saved_current_arch_fn umake.frameworks.get_current_ubuntu_version = self._saved_current_ubuntu_version_fn class TestFrameworkLoader(BaseFrameworkLoader): """This will test the dynamic framework loader activity""" @classmethod def setUpClass(cls): super().setUpClass() sys.path.append(get_data_dir()) cls.testframeworks_dir = os.path.join(get_data_dir(), 'testframeworks') @classmethod def tearDownClass(cls): sys.path.remove(get_data_dir()) super().tearDownClass() def setUp(self): super().setUp() # fake versions and archs self.fake_arch_version("bar", "10.10.10") # load custom framework-directory with patchelem(umake.frameworks, '__file__', os.path.join(self.testframeworks_dir, '__init__.py')),\ patchelem(umake.frameworks, '__package__', "testframeworks"): frameworks.load_frameworks() self.categoryA = self.CategoryHandler.categories["category-a"] def tearDown(self): self.restore_arch_version() super().tearDown() def test_load_main_category(self): """The main category is loaded""" self.assertEqual(len([1 for category in self.CategoryHandler.categories.values() if category.is_main_category]), 1, str(self.CategoryHandler.categories.values())) def test_get_main_category(self): """main_category property returns main category""" main_category = [category for category in self.CategoryHandler.categories.values() if category.is_main_category][0] self.assertEqual(self.CategoryHandler.main_category, main_category) def test_load_category(self): """There is at least one category (not main) loaded""" self.assertTrue(len([1 for category in self.CategoryHandler.categories.values() if not category.is_main_category]) > 0, str(self.CategoryHandler.categories.values())) def test_get_category_by_prog_name(self): """categories index returns matching category""" category = self.CategoryHandler.categories["category-a"] self.assertEqual(category.name, "Category A") def test_get_framework_by_prog_name(self): """Framework index returns matching framework""" framework = self.categoryA.frameworks["framework-a"] self.assertEqual(framework.name, "Framework A") def test_get_category_not_existing(self): """the call to get category returns None when there is no match""" self.assertIsNone(self.CategoryHandler.categories["foo"]) def test_get_category_prog_name(self): """prog_name for category is what we expect""" self.assertEqual(self.categoryA.prog_name, "category-a") self.assertEqual(self.CategoryHandler.categories["category-b"].prog_name, "category-b") def test_multiple_files_loaded(self): """We load multiple categories in different files""" # main category, + at least 2 other categories self.assertTrue(len(self.CategoryHandler.categories) > 2, str(self.CategoryHandler.categories)) self.assertIsNotNone(self.categoryA) self.assertIsNotNone(self.CategoryHandler.categories["category-b"]) def test_frameworks_loaded(self): """We have frameworks attached to a category""" self.assertTrue(len(self.categoryA.frameworks) > 1, str(self.categoryA.frameworks)) self.assertTrue(self.categoryA.has_frameworks()) def test_framework_not_existing(self): """the call to get a framework returns None when there is no match""" self.assertIsNone(self.categoryA.frameworks["foo"]) def test_frameworks_doesn_t_mix(self): """Frameworks, even with the same name, don't mix between categories""" self.assertNotEqual(self.categoryA.frameworks["framework-a"], self.CategoryHandler.categories["category-b"].frameworks["framework-a"]) def test_has_more_than_one_framework(self): """more than one frameworks in a category is correctly reported""" self.assertFalse(self.categoryA.has_one_framework()) def test_empty_category_loaded(self): """We still load an empty category""" self.assertIsNotNone(self.CategoryHandler.categories["empty-category"]) def test_has_frameworks_on_empty_category(self): """has_frameworks return False on empty category""" self.assertFalse(self.CategoryHandler.categories["empty-category"].has_frameworks()) self.assertFalse(self.CategoryHandler.categories["empty-category"].has_one_framework()) def test_one_framework_category(self): """A category with one framework is reported as so""" self.assertTrue(self.CategoryHandler.categories["one-framework-category"].has_one_framework()) def test_framework_prog_name(self): """prog_name for framework is what we expect""" self.assertEqual(self.categoryA.frameworks["framework-a"].prog_name, "framework-a") self.assertEqual(self.categoryA.frameworks["framework-b"].prog_name, "framework-b") def test_nothing_installed(self): """Category returns that no framework is installed""" self.assertEqual(self.categoryA.is_installed, self.CategoryHandler.NOT_INSTALLED) def test_category_fully_installed(self): """Category returns than all frameworks are installed""" self.assertEqual(self.CategoryHandler.categories["category-b"].is_installed, self.CategoryHandler.FULLY_INSTALLED) def test_category_half_installed(self): """Category returns than half frameworks are installed""" self.assertEqual(self.CategoryHandler.categories["category-c"].is_installed, self.CategoryHandler.PARTIALLY_INSTALLED) def test_frameworks_loaded_in_main_category(self): """Some frameworks are loaded and attached to main category""" self.assertTrue(len(self.CategoryHandler.main_category.frameworks) > 1, str(self.CategoryHandler.main_category.frameworks)) self.assertIsNotNone(self.CategoryHandler.main_category.frameworks["framework-free-a"]) self.assertIsNotNone(self.CategoryHandler.main_category.frameworks["framework-free---b"]) def test_frameworks_report_installed(self): """Frameworks have an is_installed property""" category = self.CategoryHandler.categories["category-c"] self.assertFalse(category.frameworks["framework-a"].is_installed) self.assertTrue(category.frameworks["framework-b"].is_installed) def test_default_framework(self): """Test that a default framework flag is accessible""" framework_default = self.categoryA.frameworks["framework-a"] self.assertEqual(self.categoryA.default_framework, framework_default) def test_default_install_path(self): """Default install path is what we expect, based on category-and framework prog_name""" self.assertEqual(self.categoryA.frameworks["framework-b"].install_path, os.path.expanduser("~/{}/category-a/framework-b".format(INSTALL_DIR))) def test_specified_at_load_install_path(self): """Default install path is overriden by framework specified install path at load time""" self.assertEqual(self.categoryA.frameworks["framework-a"].install_path, os.path.expanduser("~/{}/custom/frameworka".format(INSTALL_DIR))) def test_no_restriction_installable_framework(self): """Framework with an no arch or version restriction is installable""" self.assertTrue(self.categoryA.frameworks["framework-a"].is_installable) def test_right_arch_right_version_framework(self): """Framework with a correct arch and correct version is installable""" self.assertTrue(self.CategoryHandler.categories["category-d"].frameworks["framework-c"].is_installable) def test_unsupported_arch_framework(self): """Framework with an unsupported arch isn't registered""" self.assertIsNone(self.CategoryHandler.categories["category-d"].frameworks["framework-a"]) def test_unsupported_version_framework(self): """Framework with an unsupported arch isn't registered""" self.assertIsNone(self.CategoryHandler.categories["category-d"].frameworks["framework-b"]) def test_child_installable_chained_parent(self): """Framework with an is_installable chained to parent""" self.assertTrue(self.CategoryHandler.categories["category-e"].frameworks["framework-a"].is_installable) def test_child_installable_overridden(self): """Framework with an is_installable override to True from children (with unmatched restrictions)""" self.assertTrue(self.CategoryHandler.categories["category-e"].frameworks["framework-b"].is_installable) def test_child_installable_overridden_false(self): """Framework with an is_installable override to False from children (with no restrictions)""" self.assertIsNone(self.CategoryHandler.categories["category-e"].frameworks["framework-c"]) def test_check_not_installed_wrong_path(self): """Framework isn't installed path doesn't exist""" self.assertFalse(self.CategoryHandler.categories["category-f"].frameworks["framework-a"].is_installed) def test_check_installed_right_path_no_package_req(self): """Framework is installed if right path but no package req.""" self.assertTrue(self.CategoryHandler.categories["category-f"].frameworks["framework-b"].is_installed) def test_check_unmatched_requirements_not_installed(self): """Framework with unmatched requirements are not registered""" self.assertIsNone(self.CategoryHandler.categories["category-f"].frameworks["framework-c"]) def test_no_root_need_if_no_requirements(self): """Framework with not requirements don't need root access""" self.assertFalse(self.categoryA.frameworks["framework-a"].need_root_access) def test_uninstalled_framework_marked_for_removal_only_not_registered(self): """Uninstalled framework marked for removal only isn't not registered (as we can't install it back)""" self.assertIsNone(self.CategoryHandler.categories["category-r"].frameworks["framework-r-uninstalled"]) def test_installed_framework_not_installable_registered(self): """Installed framework not installable are still registered (can be used for removal)""" self.assertIsNotNone(self.CategoryHandler.categories["category-r"] .frameworks["framework-r-installed-not-installable"]) def test_installed_framework_marked_for_removal_only_registered(self): """Installed framework marked for removal only is registered to be able to remove it""" self.assertIsNotNone(self.CategoryHandler.categories["category-r"].frameworks["framework-r-installed"]) def test_installed_framework_marked_for_removal_only_not_installable(self): """Installed framework that are marked for removal only are not installable""" self.assertFalse(self.CategoryHandler.categories["category-r"].frameworks["framework-r-installed"] .is_installable) def test_parse_category_and_framework_run_correct_framework(self): """Parsing category and framework return right category and framework""" args = Mock() args.category = "category-a" args.destdir = None args.framework = "framework-b" args.accept_license = False args.remove = False with patch.object(self.CategoryHandler.categories[args.category].frameworks["framework-b"], "setup")\ as setup_call: self.CategoryHandler.categories[args.category].run_for(args) self.assertTrue(setup_call.called) self.assertEqual(setup_call.call_args, call(install_path=None, auto_accept_license=False)) def test_parse_no_framework_run_default_for_category(self): """Parsing category will run default framework""" args = Mock() args.category = "category-a" args.destdir = None args.framework = None args.accept_license = False args.remove = False with patch.object(self.CategoryHandler.categories[args.category].frameworks["framework-a"], "setup")\ as setup_call: self.CategoryHandler.categories[args.category].run_for(args) self.assertTrue(setup_call.called) self.assertEqual(setup_call.call_args, call(install_path=None, auto_accept_license=False)) def test_parse_category_and_framework_run_correct_remove_framework(self): """Parsing category and framework with --remove run remove on right category and framework""" args = Mock() args.category = "category-a" args.destdir = None args.framework = "framework-b" args.accept_license = False args.remove = True with patch.object(self.CategoryHandler.categories[args.category].frameworks["framework-b"], "remove")\ as remove_call: self.CategoryHandler.categories[args.category].run_for(args) self.assertTrue(remove_call.called) remove_call.assert_called_with() def test_parse_no_framework_run_default_remove_for_category(self): """Parsing category with --remove will run default framework removal action""" args = Mock() args.category = "category-a" args.framework = None args.remove = True args.accept_license = False args.destdir = None with patch.object(self.CategoryHandler.categories[args.category].frameworks["framework-a"], "remove")\ as remove_call: self.CategoryHandler.categories[args.category].run_for(args) self.assertTrue(remove_call.called) remove_call.assert_called_with() def test_parse_no_framework_with_no_default_returns_errors(self): """Parsing a category with no default returns an error when calling run""" args = Mock() args.category = "category-b" args.framework = None args.accept_license = False args.remove = False self.assertRaises(BaseException, self.CategoryHandler.categories[args.category].run_for, args) self.expect_warn_error = True def test_parse_category_and_framework_cannot_run_remove_with_destdir_framework(self): """Parsing category and framework with remove and destdir raises an error""" args = Mock() args.category = "category-a" args.framework = "framework-b" args.remove = True args.accept_license = False self.assertRaises(BaseException, self.CategoryHandler.categories[args.category].run_for, args) self.expect_warn_error = True def test_parse_category_and_framework_cannot_install_not_installable_but_installed_framework(self): """We cannot install frameworks that are not installable but already installed (and so, registered)""" self.expect_warn_error = True args = Mock() args.category = "category-r" args.destdir = None args.framework = "framework-r-installed-not-installable" args.accept_license = False args.remove = False self.assertRaises(BaseException, self.CategoryHandler.categories[args.category].run_for, args) def test_parse_category_and_framework_can_remove_not_installable_but_installed_framework(self): """Parsing category and frameworks with --remove can remove not installable but installed framework""" args = Mock() args.category = "category-r" args.destdir = None args.framework = "framework-r-installed" args.accept_license = False args.remove = True with patch.object(self.CategoryHandler.categories[args.category].frameworks["framework-r-installed"], "remove")\ as remove_call: self.CategoryHandler.categories[args.category].run_for(args) self.assertTrue(remove_call.called) remove_call.assert_called_with() def test_parse_category_and_framework_get_accept_license_arg(self): """Parsing category and framework get the accept license arg""" args = Mock() args.category = "category-a" args.destdir = None args.framework = "framework-b" args.accept_license = True args.remove = False with patch.object(self.CategoryHandler.categories[args.category].frameworks["framework-b"], "setup")\ as setup_call: self.CategoryHandler.categories[args.category].run_for(args) self.assertTrue(setup_call.called) self.assertEqual(setup_call.call_args, call(install_path=None, auto_accept_license=True)) def test_uninstantiable_framework(self): """A uninstantiable framework isn't loaded""" # use the string as we fake the package when loading them self.assertNotIn(str(Uninstantiable).split('.')[-1], [str(type(framework)).split('.')[-1] for framework in self.CategoryHandler.main_category.frameworks.values()]) def test_inherited_from_uninstantiable_framework(self): """We can attach a framework which inherit from an uninstantiable one""" # use the string as we fake the package when loading them self.assertIn(str(InheritedFromUninstantiable).split('.')[-1], [str(type(framework)).split('.')[-1] for framework in self.CategoryHandler.main_category.frameworks.values()]) @patch("umake.frameworks.get_user_frameworks_path") def test_list_installed_default_framework(self, get_user_frameworks_path): """List the correct installed items""" args = Mock() args.list = False args.list_available = False args.list_installed = True self.assertTrue(get_frameworks_list_output(args).startswith("framework-a: Description for framework A")) @patch("umake.frameworks.get_user_frameworks_path") def test_list_default_framework(self, get_user_frameworks_path): """List the correct items""" args = Mock() args.list = True args.list_available = False self.assertTrue(get_frameworks_list_output(args).startswith("base: Base category [not installed]")) @patch("umake.frameworks.get_user_frameworks_path") def test_list_available_default_framework(self, get_user_frameworks_path): """List the correct available items""" args = Mock() args.list = False args.list_available = True args.list_installed = False print(get_frameworks_list_output(args)) self.assertTrue(get_frameworks_list_output(args).startswith("base: Base category [not installed]")) class TestFrameworkLoaderWithValidConfig(BaseFrameworkLoader): """This will test the dynamic framework loader activity with a valid configuration""" @classmethod def setUpClass(cls): super().setUpClass() sys.path.append(get_data_dir()) cls.testframeworks_dir = os.path.join(get_data_dir(), 'testframeworks') @classmethod def tearDownClass(cls): sys.path.remove(get_data_dir()) super().tearDownClass() def setUp(self): # load valid configuration super().setUp() change_xdg_path('XDG_CONFIG_HOME', self.config_dir_for_name("valid")) # load custom framework-directory with patchelem(umake.frameworks, '__file__', os.path.join(self.testframeworks_dir, '__init__.py')),\ patchelem(umake.frameworks, '__package__', "testframeworks"): frameworks.load_frameworks() self.categoryA = self.CategoryHandler.categories["category-a"] def tearDown(self): change_xdg_path('XDG_CONFIG_HOME', remove=True) super().tearDown() def test_config_override_defaults(self): """Configuration override defaults (explicit or implicit). If not present in config, still load default""" # was overridden with at load time self.assertEqual(self.categoryA.frameworks["framework-a"].install_path, "/home/didrocks/quickly/ubuntu-make/adt-eclipse") # was default self.assertEqual(self.categoryA.frameworks["framework-b"].install_path, "/home/didrocks/foo/bar/android-studio") # isn't in the config self.assertEqual(self.CategoryHandler.categories['category-c'].frameworks["framework-a"].install_path, os.path.expanduser("~/{}/category-c/framework-a".format(INSTALL_DIR))) class TestFrameworkLoaderSaveConfig(BaseFrameworkLoader): """This will test the dynamic framework loader activity being able to save some configurations""" @classmethod def setUpClass(cls): super().setUpClass() sys.path.append(get_data_dir()) cls.testframeworks_dir = os.path.join(get_data_dir(), 'testframeworks') @classmethod def tearDownClass(cls): sys.path.remove(get_data_dir()) super().tearDownClass() def setUp(self): super().setUp() # load custom framework-directory with patchelem(umake.frameworks, '__file__', os.path.join(self.testframeworks_dir, '__init__.py')),\ patchelem(umake.frameworks, '__package__', "testframeworks"): frameworks.load_frameworks() self.categoryA = self.CategoryHandler.categories["category-a"] self.config_dir = tempfile.mkdtemp() change_xdg_path('XDG_CONFIG_HOME', self.config_dir) def tearDown(self): change_xdg_path('XDG_CONFIG_HOME', remove=True) shutil.rmtree(self.config_dir) super().tearDown() def test_call_mark_in_config_save_config(self): """Calling mark_in_config save path in the configuration""" # load custom framework-directory self.categoryA.frameworks["framework-b"].mark_in_config() self.assertEqual(ConfigHandler().config, {'frameworks': { 'category-a': { 'framework-b': { 'path': os.path.expanduser('~/{}/category-a/framework-b'.format(INSTALL_DIR)) }}}}) def test_call_setup_save_and_then_mark_in_config_tweaked_path(self): """Calling mark_in_config with a custom install path save it in the configuration""" # load custom framework-directory fw = self.categoryA.frameworks["framework-b"] fw.setup() fw.install_path = "/home/foo/bar" self.categoryA.frameworks["framework-b"].mark_in_config() self.assertEqual(ConfigHandler().config, {'frameworks': { 'category-a': { 'framework-b': {'path': '/home/foo/bar'} }}}) def test_call_remove_from_config(self): """Calling remove_from_config remove a framework from the config""" ConfigHandler().config = {'frameworks': { 'category-a': { 'framework-b': {'path': os.path.expanduser('~/{}/category-a/framework-b'.format(INSTALL_DIR))} }}} self.categoryA.frameworks["framework-b"].remove_from_config() self.assertEqual(ConfigHandler().config, {'frameworks': {'category-a': {}}}) def test_call_remove_from_config_keep_other(self): """Calling remove_from_config remove a framework from the config but keep others""" ConfigHandler().config = {'frameworks': { 'category-a': { 'framework-b': {'path': os.path.expanduser('~/{}/category-a/framework-b'.format(INSTALL_DIR))}, 'framework-c': {'path': os.path.expanduser('~/{}/category-a/framework-c'.format(INSTALL_DIR))} }, 'category-b': { 'framework-b': {'path': os.path.expanduser('~/{}/category-a/framework-b'.format(INSTALL_DIR))} }}} self.categoryA.frameworks["framework-b"].remove_from_config() self.assertEqual(ConfigHandler().config, {'frameworks': { 'category-a': { 'framework-c': { 'path': os.path.expanduser('~/{}/category-a/framework-c'.format(INSTALL_DIR)) }}, 'category-b': { 'framework-b': { 'path': os.path.expanduser('~/{}/category-a/framework-b'.format(INSTALL_DIR)) }}}}) class TestFrameworkLoadOnDemandLoader(BaseFrameworkLoader): """This will test the dynamic framework loader activity. This class doesn't load frameworks before the tests does""" @classmethod def setUpClass(cls): super().setUpClass() sys.path.append(get_data_dir()) cls.testframeworks_dir = os.path.join(get_data_dir(), 'testframeworks') @classmethod def tearDownClass(cls): sys.path.remove(get_data_dir()) super().tearDownClass() def setUp(self): super().setUp() # fake versions and archs self.fake_arch_version("foo", "10.04") def tearDown(self): self.restore_arch_version() super().tearDown() def loadFramework(self, framework_name): """Load framework name""" with patchelem(umake.frameworks, '__file__', os.path.join(self.testframeworks_dir, '__init__.py')),\ patchelem(umake.frameworks, '__package__', framework_name): frameworks.load_frameworks() def install_category_parser(self, main_parser, categories=[]): """Install parser for those categories""" categories_parser = main_parser.add_subparsers(dest="category") category_parsers = [] for category in categories: with patch('umake.frameworks.is_completion_mode') as completionmode_mock: completionmode_mock.return_value = False self.loadFramework("testframeworks") category_parsers.append(self.CategoryHandler.categories[category] .install_category_parser(categories_parser)) return category_parsers def test_arch_report_issue_framework(self): """Framework where we can't reach arch and having a restriction isn't installable""" self.get_current_arch_mock.side_effect = BaseException('arch detection failure!') self.loadFramework("testframeworks") # restricted arch framework isn't installable self.assertIsNone(self.CategoryHandler.categories["category-d"].frameworks["framework-a"]) # framework with no arch restriction but others are still installable self.assertTrue(self.CategoryHandler.categories["category-d"].frameworks["framework-b"].is_installable) # framework without any restriction is still installable self.assertTrue(self.CategoryHandler.categories["category-a"].frameworks["framework-a"].is_installable) self.expect_warn_error = True def test_version_report_issue_framework(self): """Framework where we can't reach version and having a restriction isn't installable""" self.get_current_ubuntu_version_mock.side_effect = BaseException('version detection failure!') self.loadFramework("testframeworks") # restricted version framework isn't installable self.assertIsNone(self.CategoryHandler.categories["category-d"].frameworks["framework-b"]) # framework with no version restriction but others are still installable self.assertTrue(self.CategoryHandler.categories["category-d"].frameworks["framework-a"].is_installable) # framework without any restriction is still installable self.assertTrue(self.CategoryHandler.categories["category-a"].frameworks["framework-a"].is_installable) self.expect_warn_error = True def test_check_not_installed_wrong_requirements(self): """Framework isn't installed if path and package requirements aren't met""" with patch('umake.frameworks.RequirementsHandler') as requirement_mock: requirement_mock.return_value.is_bucket_installed.return_value = False self.loadFramework("testframeworks") self.assertFalse(self.CategoryHandler.categories["category-f"].frameworks["framework-c"].is_installed) requirement_mock.return_value.is_bucket_installed.assert_called_with(['foo', 'bar']) # is_bucket_available is called when it's not installed requirement_mock.return_value.is_bucket_available.assert_has_calls([call(['foo', 'bar'])]) def test_check_installed_with_matched_requirements(self): """Framework is installed if path and package requirements are met""" with patch('umake.frameworks.RequirementsHandler') as requirement_mock: requirement_mock.return_value.is_bucket_installed.return_value = True self.loadFramework("testframeworks") self.assertTrue(self.CategoryHandler.categories["category-f"].frameworks["framework-c"].is_installed) requirement_mock.return_value.is_bucket_installed.assert_called_with(['foo', 'bar']) # we don't call is_bucket_available if requirements are met self.assertFalse(call(['foo', 'bar']) in requirement_mock.return_value.is_bucket_available.call_args_list) def test_check_requirements_inherited_from_category(self): """Framework without package requirements are inherited from category""" with patch('umake.frameworks.RequirementsHandler') as requirement_mock: self.loadFramework("testframeworks") self.assertEqual(self.CategoryHandler.categories["category-g"].frameworks["framework-b"] .packages_requirements, ["baz"]) def test_check_requirements_from_category_merge_into_exiting(self): """Framework with package requirements merged them from the associated category""" with patch('umake.frameworks.RequirementsHandler') as requirement_mock: self.loadFramework("testframeworks") self.assertEqual(self.CategoryHandler.categories["category-g"].frameworks["framework-a"] .packages_requirements, ["buz", "biz", "baz"]) def test_root_needed_if_not_matched_requirements(self): """Framework with unmatched requirements need root access""" with patch('umake.frameworks.RequirementsHandler') as requirement_mock: requirement_mock.return_value.is_bucket_installed.return_value = False self.loadFramework("testframeworks") self.assertTrue(self.CategoryHandler.categories["category-f"].frameworks["framework-c"].need_root_access) def test_no_root_needed_if_matched_requirements_even_uninstalled(self): """Framework which are uninstalled but with matched requirements doesn't need root access""" with patch('umake.frameworks.RequirementsHandler') as requirement_mock: requirement_mock.return_value.is_bucket_installed.return_value = True self.loadFramework("testframeworks") # ensure the framework isn't installed, but the bucket being installed, we don't need root access self.assertFalse(self.CategoryHandler.categories["category-f"].frameworks["framework-a"].is_installed) self.assertFalse(self.CategoryHandler.categories["category-f"].frameworks["framework-a"].need_root_access) def test_root_needed_setup_call_root(self): """Framework with root access needed call sudo""" with patch('umake.frameworks.subprocess') as subprocess_mock,\ patch.object(umake.frameworks.os, 'geteuid', return_value=1000) as geteuid,\ patch('umake.frameworks.MainLoop') as mainloop_mock,\ patch('umake.frameworks.RequirementsHandler') as requirement_mock: requirement_mock.return_value.is_bucket_installed.return_value = False self.loadFramework("testframeworks") self.assertTrue(self.CategoryHandler.categories["category-f"].frameworks["framework-c"].need_root_access) self.CategoryHandler.categories["category-f"].frameworks["framework-c"].setup() self.assertEqual(subprocess_mock.call.call_args[0][0][0], "sudo") self.assertTrue(mainloop_mock.return_value.quit.called) def test_no_root_needed_setup_doesnt_call_root(self): """Framework without root access needed don't call sudo""" with patch('umake.frameworks.subprocess') as subprocess_mock,\ patch.object(umake.frameworks.os, 'geteuid', return_value=1000) as geteuid,\ patch.object(umake.frameworks.sys, 'exit', return_value=True) as sys_exit_mock,\ patch('umake.frameworks.RequirementsHandler') as requirement_mock: requirement_mock.return_value.is_bucket_installed.return_value = True self.loadFramework("testframeworks") self.assertFalse(self.CategoryHandler.categories["category-f"].frameworks["framework-c"].need_root_access) self.CategoryHandler.categories["category-f"].frameworks["framework-c"].setup() self.assertFalse(subprocess_mock.call.called) self.assertFalse(sys_exit_mock.called) def test_root_needed_setup_doesnt_call_root(self): """setup doesn't call sudo if we are already root""" with patch('umake.frameworks.subprocess') as subprocess_mock,\ patch.object(umake.frameworks.sys, 'exit', return_value=True) as sys_exit_mock,\ patch.object(umake.frameworks.os, 'geteuid', return_value=0) as geteuid,\ patch('umake.frameworks.RequirementsHandler') as requirement_mock,\ patch('umake.frameworks.switch_to_current_user') as switch_to_current_use_mock: requirement_mock.return_value.is_bucket_installed.return_value = False self.loadFramework("testframeworks") self.assertTrue(self.CategoryHandler.categories["category-f"].frameworks["framework-c"].need_root_access) self.CategoryHandler.categories["category-f"].frameworks["framework-c"].setup() self.assertFalse(subprocess_mock.call.called) self.assertFalse(sys_exit_mock.called) geteuid.assert_called_once_with() switch_to_current_use_mock.assert_called_once_with() def test_completion_mode_dont_use_expensive_calls(self): """Completion mode bypass expensive calls and so, register all frameworks but those marked as only for removal (so read config)""" with patch('umake.frameworks.ConfigHandler') as config_handler_mock,\ patch('umake.frameworks.RequirementsHandler') as requirementhandler_mock,\ patch('umake.frameworks.is_completion_mode') as completionmode_mock: completionmode_mock.return_value = True self.loadFramework("testframeworks") self.assertTrue(completionmode_mock.called) self.assertFalse(requirementhandler_mock.return_value.is_bucket_installed.called) # test that a non installed framework is registered self.assertIsNotNone(self.CategoryHandler.categories["category-e"].frameworks["framework-c"]) def test_use_expensive_calls_when_not_in_completion_mode(self): """Non completion mode have expensive calls and don't register all frameworks""" with patch('umake.frameworks.ConfigHandler') as config_handler_mock,\ patch('umake.frameworks.RequirementsHandler') as requirementhandler_mock,\ patch('umake.frameworks.is_completion_mode') as completionmode_mock: completionmode_mock.return_value = False self.loadFramework("testframeworks") self.assertTrue(completionmode_mock.called) self.assertTrue(len(config_handler_mock.return_value.config.mock_calls) > 0, str(config_handler_mock.return_value.config.mock_calls)) self.assertTrue(requirementhandler_mock.return_value.is_bucket_installed.called) # test that a non installed framework is registered self.assertIsNone(self.CategoryHandler.categories["category-e"].frameworks["framework-c"]) def test_install_category_and_framework_parsers(self): """Install category and framework parsers contains works""" main_parser = argparse.ArgumentParser() categories_parser = main_parser.add_subparsers() with patch('umake.frameworks.is_completion_mode') as completionmode_mock: completionmode_mock.return_value = False self.loadFramework("testframeworks") category_parser = self.CategoryHandler.categories['category-a'].install_category_parser(categories_parser) self.assertTrue('category-a' in categories_parser.choices) self.assertTrue('framework-a' in category_parser.choices) self.assertTrue('framework-b' in category_parser.choices) def test_parse_category_and_framework(self): """Parsing category and framework return right category and framework""" main_parser = argparse.ArgumentParser() self.install_category_parser(main_parser, ['category-a']) args = main_parser.parse_args(["category-a", "framework-a"]) self.assertEqual(args.category, "category-a") self.assertEqual(args.framework, "framework-a") self.assertEqual(args.destdir, None) def test_parse_framework(self): """Parsing framework get default parser framework options""" main_parser = argparse.ArgumentParser() self.install_category_parser(main_parser, ['category-a']) args = main_parser.parse_args(["category-a", "framework-a"]) self.assertEqual(args.category, "category-a") self.assertEqual(args.framework, "framework-a") self.assertEqual(args.destdir, None) self.assertFalse(args.remove) with self.assertRaises(AttributeError): args.accept_license def test_parse_framework_with_optional_accept_license(self): """Parsing framework with optional auto accept license argument""" main_parser = argparse.ArgumentParser() self.install_category_parser(main_parser, ['category-a']) args = main_parser.parse_args(["category-a", "framework-b", "--accept-license"]) self.assertEqual(args.category, "category-a") self.assertEqual(args.framework, "framework-b") self.assertEqual(args.destdir, None) self.assertFalse(args.remove) self.assertTrue(args.accept_license) def test_parse_invalid_categories_raise_exit_error(self): """Invalid categories parse requests exit""" def error_without_message(x): raise SystemExit() main_parser = argparse.ArgumentParser() main_parser.print_usage = lambda x: "" main_parser.error = error_without_message self.install_category_parser(main_parser, []) self.assertRaises(SystemExit, main_parser.parse_args, ["category-a", "framework-a"]) def test_parse_invalid_frameworks_return_error(self): """Invalid framework parse requests exit""" def error_without_message(x): raise SystemExit() main_parser = argparse.ArgumentParser() self.install_category_parser(main_parser, ["category-a"]) category_parser = main_parser._actions[1].choices["category-a"] category_parser.print_usage = lambda x: "" category_parser.error = error_without_message self.assertRaises(SystemExit, main_parser.parse_args, ["category-a", "framework-aa"]) def test_parse_no_category_return_empty_namespace(self): """No category or framework returns an empty namespace""" main_parser = argparse.ArgumentParser() self.install_category_parser(main_parser, ['category-a']) self.assertEqual(main_parser.parse_args([]), argparse.Namespace(category=None)) def test_install_category_with_no_framework(self): """Install category with no framework returns None""" main_parser = argparse.ArgumentParser() self.assertEqual(self.install_category_parser(main_parser, ['empty-category']), [None]) def test_install_main_category(self): """Main category install directly at root of the parser""" main_parser = argparse.ArgumentParser() main_cat_parser = self.install_category_parser(main_parser, ['main'])[0] self.assertTrue('framework-free---b' in main_cat_parser.choices) self.assertTrue('framework-free-a' in main_cat_parser.choices) self.assertFalse('framework-a' in main_cat_parser.choices) def test_parse_main_category(self): """Main category elements can be directly accessed""" main_parser = argparse.ArgumentParser() self.install_category_parser(main_parser, ['main']) args = main_parser.parse_args(["framework-free-a"]) self.assertEqual(args.category, "framework-free-a") self.assertEqual(args.destdir, None) self.assertFalse("framework" in args) def test_run_framework_in_main_category(self): """Frameworks command from main category can be run as usual""" main_parser = argparse.ArgumentParser() self.install_category_parser(main_parser, ['main']) args = main_parser.parse_args(["framework-free-a"]) with patch.object(self.CategoryHandler.main_category.frameworks["framework-free-a"], "setup") as setup_call: self.CategoryHandler.main_category.frameworks["framework-free-a"].run_for(args) self.assertTrue(setup_call.called) class TestEmptyFrameworkLoader(BaseFrameworkLoader): """This will test the dynamic framework loader activity with an empty set of frameworks""" @classmethod def setUpClass(cls): super().setUpClass() sys.path.append(get_data_dir()) cls.testframeworks_dir = os.path.join(get_data_dir(), 'testframeworksdoesntexist') @classmethod def tearDownClass(cls): sys.path.remove(get_data_dir()) super().tearDownClass() def setUp(self): super().setUp() # load custom unexisting framework-directory with patchelem(umake.frameworks, '__file__', os.path.join(self.testframeworks_dir, '__init__.py')),\ patchelem(umake.frameworks, '__package__', "testframeworksdoesntexist"): frameworks.load_frameworks() def test_invalid_framework(self): """There is one main category, but nothing else""" main_category = [category for category in self.CategoryHandler.categories.values() if category.is_main_category][0] self.assertEqual(self.CategoryHandler.main_category, main_category) self.assertEqual(len(self.CategoryHandler.categories), 1, str(self.CategoryHandler.categories)) def test_listing_empty_framework(self): """List the correct empty items""" args = Mock() args.destdir = None args.accept_license = False args.list = True args.list_available = False self.assertEquals(get_frameworks_list_output(args), "") class TestDuplicatedFrameworkLoader(BaseFrameworkLoader): """This will test the dynamic framework loader activity with some duplicated categories and frameworks""" @classmethod def setUpClass(cls): super().setUpClass() sys.path.append(get_data_dir()) cls.testframeworks_dir = os.path.join(get_data_dir(), 'duplicatedframeworks') @classmethod def tearDownClass(cls): sys.path.remove(get_data_dir()) super().tearDownClass() def setUp(self): super().setUp() with patchelem(umake.frameworks, '__file__', os.path.join(self.testframeworks_dir, '__init__.py')),\ patchelem(umake.frameworks, '__package__', "duplicatedframeworks"): frameworks.load_frameworks() self.categoryA = self.CategoryHandler.categories["category-a"] self.expect_warn_error = True # as we load multiple duplicate categories and frameworks def test_duplicated_categories(self): """We only load one category when a second with same name is met""" # main + categoryA self.assertEqual(len(self.CategoryHandler.categories), 2, str(self.CategoryHandler.categories)) self.assertEqual(self.CategoryHandler.categories["category-a"].name, "Category A") def test_duplicated_frameworks(self): """We only load one framework when a second with the same name is met""" self.assertEqual(len(self.categoryA.frameworks), 1, str(self.categoryA.frameworks)) def test_main_category_empty(self): """The main category (unused here) is empty by default""" self.assertEqual(len(self.CategoryHandler.main_category.frameworks), 0, str(self.CategoryHandler.main_category.frameworks)) class TestMultipleDefaultFrameworkLoader(BaseFrameworkLoader): """This will test if we try to load multiple default frameworsk in loader""" @classmethod def setUpClass(cls): super().setUpClass() sys.path.append(get_data_dir()) cls.testframeworks_dir = os.path.join(get_data_dir(), 'multipledefaultsframeworks') @classmethod def tearDownClass(cls): sys.path.remove(get_data_dir()) super().tearDownClass() def setUp(self): super().setUp() with patchelem(umake.frameworks, '__file__', os.path.join(self.testframeworks_dir, '__init__.py')),\ patchelem(umake.frameworks, '__package__', "multipledefaultsframeworks"): frameworks.load_frameworks() self.categoryA = self.CategoryHandler.categories["category-a"] self.expect_warn_error = True # as we load multiple default frameworks in a category def test_multiple_defaults(self): """Setting multiple defaults frameworks to a category should void any default""" self.assertIsNone(self.categoryA.default_framework) self.assertEqual(len(self.categoryA.frameworks), 2, str(self.categoryA.frameworks)) # ensure they are still loaded def test_one_default_in_main_category(self): """Reject default framework for main category""" self.assertIsNone(self.CategoryHandler.main_category.default_framework) self.assertEqual(len(self.CategoryHandler.main_category.frameworks), 1, str(self.CategoryHandler.main_category.frameworks)) # ensure it's still loaded class TestNotLoadedFrameworkLoader(BaseFrameworkLoader): def setUp(self): super().setUp() self.CategoryHandler = frameworks.BaseCategory def test_get_no_main_category(self): """main_category returns None when there is no main category""" self.assertIsNone(self.CategoryHandler.main_category) def test_get_with_no_category(self): """categories is empty when there is no category loaded""" self.assertEqual(len(self.CategoryHandler.categories), 0, str(self.CategoryHandler.categories)) class TestAbstractFrameworkLoader(BaseFrameworkLoader): """Test the loader skips abstract frameworks.""" @classmethod def setUpClass(cls): super().setUpClass() sys.path.append(get_data_dir()) cls.testframeworks_dir = os.path.join(get_data_dir(), 'abstractframeworks') @classmethod def tearDownClass(cls): sys.path.remove(get_data_dir()) super().tearDownClass() def setUp(self): super().setUp() # load custom unexisting framework-directory with patchelem(umake.frameworks, '__file__', os.path.join(self.testframeworks_dir, '__init__.py')),\ patchelem(umake.frameworks, '__package__', "abstractframeworks"): frameworks.load_frameworks() self.categoryA = self.CategoryHandler.categories["category-a"] def test_load(self): """Previous loading should have been successful""" self.assertFalse(self.categoryA.has_frameworks()) self.expect_warn_error = False # Should be silent. class TestInvalidFrameworksLoader(BaseFrameworkLoader): """Test the loader handles badly formatted frameworks.""" @classmethod def setUpClass(cls): super().setUpClass() sys.path.append(get_data_dir()) cls.testframeworks_dir = os.path.join(get_data_dir(), 'invalidframeworks') @classmethod def tearDownClass(cls): sys.path.remove(get_data_dir()) super().tearDownClass() def test_invalid_framework_loading(self): """Frameworks that don't have a Framework type aren't loaded""" with patchelem(umake.frameworks, '__file__', os.path.join(self.testframeworks_dir, '__init__.py')),\ patchelem(umake.frameworks, '__package__', "invalidframeworks"): frameworks.load_frameworks() self.assertEqual(len(self.CategoryHandler.categories["category-a"].frameworks), 0, self.CategoryHandler.categories["category-a"].frameworks) @patch("umake.frameworks.get_user_frameworks_path") def test_list_installed_single_framework(self, get_user_frameworks_path): """List the correct installed items in single framework""" with tempfile.TemporaryDirectory() as temp_path: shutil.copy(os.path.join(get_data_dir(), "overlayframeworks", "overlayframeworks.py"), temp_path) get_user_frameworks_path.return_value = temp_path # load home framework-directory with patchelem(umake.frameworks, '__file__', os.path.join(self.testframeworks_dir, '__init__.py')),\ patchelem(umake.frameworks, '__package__', "invalidframeworks"): frameworks.load_frameworks() args = Mock() args.list = False args.list_available = False args.list_installed = True self.assertTrue(get_frameworks_list_output(args).startswith("No frameworks are currently installed")) @patch("umake.frameworks.get_user_frameworks_path") def test_list_single_framework(self, get_user_frameworks_path): """List the correct items in single framework""" with tempfile.TemporaryDirectory() as temp_path: shutil.copy(os.path.join(get_data_dir(), "overlayframeworks", "overlayframeworks.py"), temp_path) get_user_frameworks_path.return_value = temp_path # load home framework-directory with patchelem(umake.frameworks, '__file__', os.path.join(self.testframeworks_dir, '__init__.py')),\ patchelem(umake.frameworks, '__package__', "invalidframeworks"): frameworks.load_frameworks() args = Mock() args.list = True args.list_available = False self.assertTrue(get_frameworks_list_output(args).startswith( "category-a: Category A description [not installed]")) @patch("umake.frameworks.get_user_frameworks_path") def test_list_available_single_framework(self, get_user_frameworks_path): """List the correct available items in single framework""" with tempfile.TemporaryDirectory() as temp_path: shutil.copy(os.path.join(get_data_dir(), "overlayframeworks", "overlayframeworks.py"), temp_path) get_user_frameworks_path.return_value = temp_path # load home framework-directory with patchelem(umake.frameworks, '__file__', os.path.join(self.testframeworks_dir, '__init__.py')),\ patchelem(umake.frameworks, '__package__', "invalidframeworks"): frameworks.load_frameworks() args = Mock() args.list = False args.list_available = True args.list_installed = False self.assertTrue(get_frameworks_list_output(args).startswith( "category-a: Category A description [not installed]")) class TestFrameworkLoaderCustom(BaseFrameworkLoader): """This will test the dynamic framework loader activity with custom path""" @classmethod def setUpClass(cls): super().setUpClass() sys.path.append(get_data_dir()) cls.testframeworks_dir = os.path.join(get_data_dir(), 'testframeworks') @classmethod def tearDownClass(cls): sys.path.remove(get_data_dir()) super().tearDownClass() def setUp(self): super().setUp() # fake versions and archs self.fake_arch_version("bar", "10.10.10") self.dirs_to_remove = [] def tearDown(self): self.restore_arch_version() with suppress(KeyError): os.environ.pop(UMAKE_FRAMEWORKS_ENVIRON_VARIABLE) for path in self.dirs_to_remove: sys.path.remove(path) with suppress(FileNotFoundError): shutil.rmtree(path) with suppress(ValueError): sys.path.remove(path) super().tearDown() @patch("umake.frameworks.get_user_frameworks_path") def test_load_additional_frameworks_in_home_dir(self, get_user_frameworks_path): """Ensure we load additional frameworks from home directory""" temp_path = tempfile.mkdtemp() self.dirs_to_remove.append(temp_path) shutil.copy(os.path.join(get_data_dir(), "overlayframeworks", "overlayframeworks.py"), temp_path) get_user_frameworks_path.return_value = temp_path # load home framework-directory with patchelem(umake.frameworks, '__file__', os.path.join(self.testframeworks_dir, '__init__.py')),\ patchelem(umake.frameworks, '__package__', "testframeworks"): frameworks.load_frameworks() # ensure that the overlay is loaded self.assertEqual(self.CategoryHandler.categories["category-a-overlay"].name, "Category A overlay") # ensure that the other frameworks are still loaded self.assertEqual(self.CategoryHandler.categories["category-a"].name, "Category A") def test_load_additional_frameworks_with_env_var(self): """Ensure we load additional frameworks set in an environment variable""" temp_path = tempfile.mkdtemp() self.dirs_to_remove.append(temp_path) os.environ[UMAKE_FRAMEWORKS_ENVIRON_VARIABLE] = temp_path shutil.copy(os.path.join(get_data_dir(), "overlayframeworks", "overlayframeworks.py"), temp_path) # load env framework-directory with patchelem(umake.frameworks, '__file__', os.path.join(self.testframeworks_dir, '__init__.py')),\ patchelem(umake.frameworks, '__package__', "testframeworks"): frameworks.load_frameworks() # ensure that the overlay is loaded self.assertEqual(self.CategoryHandler.categories["category-a-overlay"].name, "Category A overlay") # ensure that the other frameworks are still loaded self.assertEqual(self.CategoryHandler.categories["category-a"].name, "Category A") @patch("umake.frameworks.get_user_frameworks_path") def test_load_additional_frameworks_with_two_categories(self, get_user_frameworks_path): """Ensure we load additional frameworks in a path with two categories""" temp_path = tempfile.mkdtemp() self.dirs_to_remove.append(temp_path) shutil.copy(os.path.join(get_data_dir(), "overlayframeworks", "overlayframeworks.py"), temp_path) shutil.copy(os.path.join(get_data_dir(), "overlayframeworks", "withcategory2.py"), temp_path) get_user_frameworks_path.return_value = temp_path # load home framework-directory with patchelem(umake.frameworks, '__file__', os.path.join(self.testframeworks_dir, '__init__.py')),\ patchelem(umake.frameworks, '__package__', "testframeworks"): frameworks.load_frameworks() # ensure that both overlay are loaded self.assertEqual(self.CategoryHandler.categories["category-a-overlay"].name, "Category A overlay") self.assertEqual(self.CategoryHandler.categories["category-a2-overlay"].name, "Category A2 overlay") # ensure that the other frameworks are still loaded self.assertEqual(self.CategoryHandler.categories["category-a"].name, "Category A") @patch("umake.frameworks.get_user_frameworks_path") def test_load_additional_frameworks_with_same_filename(self, get_user_frameworks_path): """Ensure we load additional frameworks in a path with same filename""" temp_path = tempfile.mkdtemp() self.dirs_to_remove.append(temp_path) shutil.copy(os.path.join(get_data_dir(), "overlayframeworks", "withcategory.py"), temp_path) get_user_frameworks_path.return_value = temp_path # load home framework-directory with patchelem(umake.frameworks, '__file__', os.path.join(self.testframeworks_dir, '__init__.py')),\ patchelem(umake.frameworks, '__package__', "testframeworks"): frameworks.load_frameworks() # ensure that the duplicated filename (but not category) is loaded self.assertEqual(self.CategoryHandler.categories["category-a-overlay"].name, "Category A overlay") # ensure that the other frameworks with the same name is still loaded self.assertEqual(self.CategoryHandler.categories["category-a"].name, "Category A") @patch("umake.frameworks.get_user_frameworks_path") def test_load_additional_frameworks_with_duphome_before_system(self, get_user_frameworks_path): """Ensure we load additional frameworks from home before system if they have the same names""" temp_path = tempfile.mkdtemp() self.dirs_to_remove.append(temp_path) shutil.copy(os.path.join(get_data_dir(), "overlayframeworks", "duplicatedcategory.py"), temp_path) get_user_frameworks_path.return_value = temp_path # load home framework-directory with patchelem(umake.frameworks, '__file__', os.path.join(self.testframeworks_dir, '__init__.py')),\ patchelem(umake.frameworks, '__package__', "testframeworks"): frameworks.load_frameworks() # ensure that the overlay one is loaded categoryA = self.CategoryHandler.categories["category-a"] self.assertEqual(categoryA.name, "Category A") self.assertEqual(categoryA.frameworks["framework-a-from-overlay"].name, "Framework A from overlay") # ensure that the other frameworks are still loaded self.assertEqual(self.CategoryHandler.categories["category-b"].name, "Category/B") self.expect_warn_error = True # expect warning due to duplication @patch("umake.frameworks.get_user_frameworks_path") def test_load_additional_frameworks_with_dup_progname_env_before_home_before_system(self, get_user_frameworks_path): """Ensure we load additional frameworks from env before home and system if they have the same names""" # env var temp_path = tempfile.mkdtemp() self.dirs_to_remove.append(temp_path) os.environ[UMAKE_FRAMEWORKS_ENVIRON_VARIABLE] = temp_path shutil.copy(os.path.join(get_data_dir(), "overlayframeworks", "duplicatedcategory2.py"), temp_path) # home dir temp_path = tempfile.mkdtemp() self.dirs_to_remove.append(temp_path) shutil.copy(os.path.join(get_data_dir(), "overlayframeworks", "duplicatedcategory.py"), temp_path) get_user_frameworks_path.return_value = temp_path # load env and home framework-directory with patchelem(umake.frameworks, '__file__', os.path.join(self.testframeworks_dir, '__init__.py')),\ patchelem(umake.frameworks, '__package__', "testframeworks"): frameworks.load_frameworks() # ensure that the env overlay one is loaded categoryA = self.CategoryHandler.categories["category-a"] self.assertEqual(categoryA.name, "Category A") self.assertEqual(categoryA.frameworks["framework-a-from-overlay-2"].name, "Framework A from overlay 2") # ensure that the other frameworks are still loaded self.assertEqual(self.CategoryHandler.categories["category-b"].name, "Category/B") self.expect_warn_error = True # expect warning due to duplication class TestProductionFrameworkLoader(BaseFrameworkLoader): """Load production framework-and ensure there is no warning and no error""" def test_load_scala(self): """Can load production frameworks""" frameworks.load_frameworks() self.assertTrue(len(self.CategoryHandler.categories) > 0, str(self.CategoryHandler.categories)) self.assertIsNotNone(self.CategoryHandler.main_category) self.assertEqual(len(self.CategoryHandler.categories["scala"].frameworks), 1, str(self.CategoryHandler.categories["scala"].frameworks)) def test_ignored_frameworks(self): """Ignored frameworks aren't loaded""" frameworks.load_frameworks() self.assertNotIn(BaseInstaller, frameworks.BaseCategory.main_category.frameworks.values()) class TestCustomFrameworkCantLoad(BaseFrameworkLoader): """Get custom unloadable automatically frameworks to test custom corner cases""" class _CustomFramework(umake.frameworks.BaseFramework): def __init__(self): super().__init__(name="Custom", description="Custom uninstallable framework", category=umake.frameworks.MainCategory()) def setup(self): super().setup() def remove(self): super().remove() @property def is_installable(self): return False def test_call_setup_on_uninstallable_framework(self): """Calling setup on uninstallable framework return to main UI""" fw = self._CustomFramework() with patch("umake.frameworks.UI") as UIMock: fw.setup() self.assertTrue(UIMock.return_main_screen.called) self.expect_warn_error = True ubuntu-make-18.09+disco1/tests/small/test_interactions.py0000644000000000000000000003311313352651520020424 0ustar # -*- coding: utf-8 -*- # Copyright (C) 2014 Canonical # # Authors: # Didier Roche # # 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; version 3. # # 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 """Tests the various umake available interactions""" from ..tools import LoggedTestCase from umake.tools import InputError from umake.interactions import Choice, TextWithChoices, LicenseAgreement, InputText, YesNo, DisplayMessage,\ UnknownProgress from unittest.mock import Mock class TestInteractions(LoggedTestCase): """Test various interactions""" def test_choices(self): """We can instantiate with a choices interactions""" choices = [Choice(0, "Choice0", lambda: ""), Choice(1, "Choice1", lambda: ""), Choice(2, "Choice2", lambda: "")] inter = TextWithChoices("Foo Content", choices) self.assertEqual(inter.choices, choices) self.assertEqual(inter.content, "Foo Content") def test_choices_with_text_shorcut(self): """We can instantiate choices interactions with shortcut""" choices = [Choice(0, "Choice0", lambda: "", txt_shorcut="A"), Choice(1, "Choice1", lambda: "", txt_shorcut="B"), Choice(2, "Choice2", lambda: "", txt_shorcut="C")] inter = TextWithChoices("Foo Content", choices) self.assertEqual(inter.choices, choices) self.assertEqual(inter.content, "Foo Content") def test_choices_with_default(self): """We can instantiate choices interactions with a default""" choices = [Choice(0, "Choice0", lambda: ""), Choice(1, "Choice1", lambda: "", is_default=True), Choice(2, "Choice2", lambda: "")] inter = TextWithChoices("Foo Content", choices) self.assertEqual(inter.choices, choices) self.assertEqual(inter.content, "Foo Content") def test_choices_prompt(self): """We give a prompt for normal choice""" choices = [Choice(0, "Choice0", lambda: ""), Choice(1, "Choice1", lambda: ""), Choice(2, "Choice2", lambda: "")] inter = TextWithChoices("Foo Content", choices) self.assertEqual(inter.prompt, "Foo Content [Choice0/Choice1/Choice2] ") def test_choices_prompt_with_newline(self): """We give a prompt with newline before options if requested""" choices = [Choice(0, "Choice0", lambda: ""), Choice(1, "Choice1", lambda: ""), Choice(2, "Choice2", lambda: "")] inter = TextWithChoices("Foo Content", choices, newline_before_option=True) self.assertEqual(inter.prompt, "Foo Content\n[Choice0/Choice1/Choice2] ") def test_choices_prompt_with_txt_shortcut(self): """We give a prompt with txt shortcut if any""" choices = [Choice(0, "Choice0", lambda: "", txt_shorcut="A"), Choice(1, "Choice1", lambda: "", txt_shorcut="B"), Choice(2, "Choice2", lambda: "", txt_shorcut="c")] inter = TextWithChoices("Foo Content", choices) self.assertEqual(inter.prompt, "Foo Content [Choice0 (A)/Choice1 (B)/Choice2 (c)] ") def test_choices_prompt_with_partial_txt_shortcut(self): """We give a prompt, some choices having txt shortcut""" choices = [Choice(0, "Choice0", lambda: "", txt_shorcut="A"), Choice(1, "Choice1", lambda: ""), Choice(2, "Choice2", lambda: "", txt_shorcut="c")] inter = TextWithChoices("Foo Content", choices) self.assertEqual(inter.prompt, "Foo Content [Choice0 (A)/Choice1/Choice2 (c)] ") def test_instantiate_with_multiple_defaults_raises(self): """Instantiating with multiple defaults raises""" choices = [Choice(0, "Choice0", lambda: "", is_default=True), Choice(1, "Choice1", lambda: "", is_default=True), Choice(2, "Choice2", lambda: "")] self.assertRaises(BaseException, TextWithChoices, "Foo Content", choices) self.expect_warn_error = True def test_choices_choose_run_right_callback(self): """Choose call the correct callback""" callback1 = Mock() callback2 = Mock() choices = [Choice(0, "Choice0", Mock()), Choice(1, "Choice1", callback1), Choice(2, "Choice2", callback2)] inter = TextWithChoices("Foo Content", choices) self.assertEqual(inter.choose(choice_id=1), callback1.return_value) self.assertEqual(inter.choose(choice_id=2), callback2.return_value) def test_choices_choose_with_shorcut_run_right_callback(self): """Choose with text shortcut calls the correct callback""" callback1 = Mock() callback2 = Mock() choices = [Choice(0, "Choice0", Mock(), txt_shorcut="A"), Choice(1, "Choice1", callback1, txt_shorcut="B"), Choice(2, "Choice2", callback2, txt_shorcut="C")] inter = TextWithChoices("Foo Content", choices) self.assertEqual(inter.choose(answer='B'), callback1.return_value) self.assertEqual(inter.choose(answer='C'), callback2.return_value) def test_choices_choose_with_label_run_right_callback(self): """Choose with label calls the correct callback""" callback1 = Mock() callback2 = Mock() choices = [Choice(0, "Choice0", Mock(), txt_shorcut="A"), Choice(1, "Choice1", callback1, txt_shorcut="B"), Choice(2, "Choice2", callback2, txt_shorcut="C")] inter = TextWithChoices("Foo Content", choices) self.assertEqual(inter.choose(answer='Choice1'), callback1.return_value) self.assertEqual(inter.choose(answer='Choice2'), callback2.return_value) def test_choices_choose_with_partial_shorcut_run_right_callback(self): """Choose with some having text shortcut calls the correct callback""" callback1 = Mock() choices = [Choice(0, "Choice0", Mock()), Choice(1, "Choice1", callback1, txt_shorcut="B"), Choice(2, "Choice2", Mock())] inter = TextWithChoices("Foo Content", choices) self.assertEqual(inter.choose(answer='B'), callback1.return_value) def test_choices_choose_with_shorcut_no_right_casse(self): """Choose with shortcut without respecting the casse""" callback1 = Mock() choices = [Choice(0, "Choice0", Mock(), txt_shorcut="A"), Choice(1, "Choice1", callback1, txt_shorcut="B"), Choice(2, "Choice2", Mock())] inter = TextWithChoices("Foo Content", choices) self.assertEqual(inter.choose(answer='b'), callback1.return_value) def test_choices_choose_with_label_no_right_casse(self): """Choose with label without respecting the casse""" callback1 = Mock() choices = [Choice(0, "Choice0", Mock()), Choice(1, "Choice1", callback1), Choice(2, "Choice2", Mock())] inter = TextWithChoices("Foo Content", choices) self.assertEqual(inter.choose(answer='chOIce1'), callback1.return_value) def test_reject_invalid_choices(self): """TestChoice with Choices with the same id raises""" choices = [Choice(0, "Choice0", lambda: ""), Choice(1, "Choice1", lambda: ""), Choice(0, "Choice2", lambda: "")] self.assertRaises(BaseException, TextWithChoices, "Foo Content", choices) self.expect_warn_error = True def test_choices_wrong_choice_id_raise(self): """Wrong choice_id raises an exception""" callback1 = Mock() callback2 = Mock() choices = [Choice(0, "Choice0", Mock()), Choice(1, "Choice1", callback1), Choice(2, "Choice2", callback2)] inter = TextWithChoices("Foo Content", choices) self.assertRaises(InputError, inter.choose, choice_id=3) def test_choices_wrong_txt_shortcut_raise(self): """Wrong txt shortcut raises an exception""" choices = [Choice(0, "Choice0", Mock(), txt_shorcut='A'), Choice(1, "Choice1", Mock(), txt_shorcut='B'), Choice(2, "Choice2", Mock(), txt_shorcut='C')] inter = TextWithChoices("Foo Content", choices) self.assertRaises(InputError, inter.choose, answer='Z') def test_choices_wrong_label_raise(self): """Wrong label answer raises an exception""" choices = [Choice(0, "Choice0", Mock()), Choice(1, "Choice1", Mock()), Choice(2, "Choice2", Mock())] inter = TextWithChoices("Foo Content", choices) self.assertRaises(InputError, inter.choose, answer='abc') def test_choices_choose_default(self): """Choices with a default without any answer return callback""" callback1 = Mock() choices = [Choice(0, "Choice0", Mock()), Choice(1, "Choice1", callback1, is_default=True), Choice(2, "Choice2", Mock())] inter = TextWithChoices("Foo Content", choices) self.assertEqual(inter.choose(), callback1.return_value) def test_choices_choose_no_default_raises(self): """We raise an exception if there is no default and we choose without any answer""" choices = [Choice(0, "Choice0", Mock()), Choice(1, "Choice1", Mock()), Choice(2, "Choice2", Mock())] inter = TextWithChoices("Foo Content", choices) self.assertRaises(InputError, inter.choose) def test_license_agreement(self): """We can instantiate a license agreement interaction""" callback_yes = Mock() callback_no = Mock() inter = LicenseAgreement("License content", callback_yes, callback_no) self.assertEqual(inter.content, "License content") self.assertEqual(len(inter.choices), 2, str(inter.choices)) def test_license_agreement_choice(self): """We have right callbacks called in license choices""" callback_yes = Mock() callback_no = Mock() inter = LicenseAgreement("License content", callback_yes, callback_no) self.assertEqual(inter.choose(choice_id=0), callback_yes.return_value) self.assertEqual(inter.choose(choice_id=1), callback_no.return_value) self.assertEqual(inter.choose(answer='a'), callback_yes.return_value) self.assertEqual(inter.choose(answer='N'), callback_no.return_value) self.assertEqual(inter.choose(), callback_no.return_value) def test_license_agreement_input(self): """We return a license agreement input""" inter = LicenseAgreement("License content", lambda: "", lambda: "") self.assertEqual(inter.input, "[I Accept (a)/I don't accept (N)] ") def test_input_text(self): """We can instantiate an input text""" inter = InputText("Content", lambda: "") self.assertEqual(inter.content, "Content") self.assertEqual(inter.default_input, "") def test_input_text_with_default_input(self): """We can instantiate an input text with a default input""" inter = InputText("Content", lambda: "", default_input="This is a default input") self.assertEqual(inter.default_input, "This is a default input") def test_input_text_callback(self): """An input text runs callback with the result as argument""" callback_fn = Mock() inter = InputText("Content", callback_fn) inter.run_callback("Foo Bar Baz") callback_fn.assert_called_once_with("Foo Bar Baz") def test_yesno(self): """We can instantiate a YesNo""" inter = YesNo("Content?", lambda: "", lambda: "") self.assertEqual(inter.content, "Content?") self.assertEqual(len(inter.choices), 2, str(inter.choices)) self.assertEqual(inter.prompt, "Content? [Yes (y)/No (N)] ") def test_yesno_choose_default(self): """Default is No""" yes_callback = Mock() no_callback = Mock() inter = YesNo("Content?", yes_callback, no_callback) inter.choose("") self.assertTrue(no_callback.called) self.assertFalse(yes_callback.called) def test_yesno_choose_default_overriden(self): """Default is No""" yes_callback = Mock() no_callback = Mock() inter = YesNo("Content?", yes_callback, no_callback, default_is_yes=True) inter.choose("") self.assertTrue(yes_callback.called) self.assertFalse(no_callback.called) def test_yesno_run_answers(self): """Yes runs yes in different ways""" yes_callback = Mock() no_callback = Mock() inter = YesNo("Content?", yes_callback, no_callback) self.assertEqual(inter.choose(choice_id=0), yes_callback.return_value) self.assertEqual(inter.choose(choice_id=1), no_callback.return_value) self.assertEqual(inter.choose(answer='Y'), yes_callback.return_value) self.assertEqual(inter.choose(answer='N'), no_callback.return_value) self.assertEqual(inter.choose(answer='yEs'), yes_callback.return_value) self.assertEqual(inter.choose(answer='nO'), no_callback.return_value) def test_display_message(self): """We can instantiate a message display""" inter = DisplayMessage("Content") self.assertEqual(inter.text, "Content") def test_unknown_progress(self): """We can instantiate an unknown progress""" def foo(): yield inter = UnknownProgress(foo) inter.bar = "BarElement" self.assertEqual(inter.bar, "BarElement") ubuntu-make-18.09+disco1/tests/small/test_requirements_handler.py0000644000000000000000000006770613352651520022161 0ustar # -*- coding: utf-8 -*- # Copyright (C) 2014 Canonical # # Authors: # Didier Roche # # 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; version 3. # # 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 """Tests for the download center module using a local server""" import os import shutil import subprocess from time import time from unittest.mock import Mock, call, patch import umake from . import DpkgAptSetup from umake.network.requirements_handler import RequirementsHandler from umake import tools class TestRequirementsHandler(DpkgAptSetup): """This will test the download center by sending one or more download requests""" @classmethod def setUpClass(cls): super().setUpClass() cls.handler = RequirementsHandler() def count_number_progress_call(self, call_args_list, tag): """Count the number of tag in progress call and return it""" count = 0 for call in call_args_list: if call[0][0]['step'] == tag: count += 1 return count def wait_for_callback(self, mock_function_to_be_called, timeout=10): """wait for the callback to be called until a timeout. Add temp files to the clean file list afterwards""" timeout_time = time() + timeout while not mock_function_to_be_called.called: if time() > timeout_time: raise(BaseException("Function not called within {} seconds".format(timeout))) def test_singleton(self): """Ensure we are delivering a singleton for RequirementsHandler""" other = RequirementsHandler() self.assertEqual(self.handler, other) def test_install(self): """Install one package""" self.handler.install_bucket(["testpackage"], lambda x: "", self.done_callback) self.wait_for_callback(self.done_callback) self.assertEqual(self.done_callback.call_args[0][0].bucket, ['testpackage']) self.assertIsNone(self.done_callback.call_args[0][0].error) self.assertTrue(self.handler.is_bucket_installed(["testpackage"])) def test_install_multi_arch_current_arch(self): """We install a multi_arch package corresponding to current arch""" multi_arch_name = "testpackage:{}".format(tools.get_current_arch()) self.handler.install_bucket([multi_arch_name], lambda x: "", self.done_callback) self.wait_for_callback(self.done_callback) self.assertEqual(self.done_callback.call_args[0][0].bucket, [multi_arch_name]) self.assertIsNone(self.done_callback.call_args[0][0].error) self.assertTrue(self.handler.is_bucket_installed(["testpackage"])) def test_install_perm(self): """When we install one package, we first switch to root""" self.handler.install_bucket(["testpackage"], lambda x: "", self.done_callback) self.wait_for_callback(self.done_callback) os.seteuid.assert_called_once_with(0) os.setegid.assert_called_once_with(0) def test_install_return_error_if_no_perm(self): """Return an exception when we try to install and we can't switch to root""" os.seteuid.side_effect = PermissionError() self.handler.install_bucket(["testpackage"], lambda x: "", self.done_callback) self.wait_for_callback(self.done_callback) self.assertIsNotNone(self.done_callback.call_args[0][0].error) self.assertFalse(self.handler.is_bucket_installed(["testpackage"])) self.expect_warn_error = True def test_install_perm_switch_back_user(self): """When we install one package, we switch back to user at the end""" umake.network.requirements_handler.os.geteuid.return_value = 0 self.handler.install_bucket(["testpackage"], lambda x: "", self.done_callback) self.wait_for_callback(self.done_callback) # we call it twice and the latest is the user id self.assertEqual(os.seteuid.call_count, 2) self.assertEqual(os.seteuid.call_args, call(self.user_uid)) self.assertEqual(os.setegid.call_args, call(self.user_gid)) def test_install_progress(self): """Install one package and get progress feedback""" progress_callback = Mock() self.handler.install_bucket(["testpackage"], progress_callback, self.done_callback) self.wait_for_callback(self.done_callback) downloading_msg = self.count_number_progress_call(progress_callback.call_args_list, RequirementsHandler.STATUS_DOWNLOADING) installing_msg = self.count_number_progress_call(progress_callback.call_args_list, RequirementsHandler.STATUS_INSTALLING) self.assertTrue(downloading_msg > 1) self.assertTrue(installing_msg > 1) # the first download call is at 0% of progress. testpackage is 1byte to download on != xenial self.assertIn(progress_callback.call_args_list[0][0][0], [{'step': 0, 'pkg_size_download': 1, 'percentage': 0.0}, {'step': 0, 'pkg_size_download': 1698, 'percentage': 0.0}]) callfound = False for call in progress_callback.call_args_list: if call[0][0] == {'step': 1, 'percentage': 0.0}: callfound = True break self.assertTrue(callfound, "We expect to have one install step at 0% call in the list") def test_install_multiple_packages(self): """Install multiple packages in one shot""" self.handler.install_bucket(["testpackage", "testpackage0"], lambda x: "", self.done_callback) self.wait_for_callback(self.done_callback) self.assertEqual(self.done_callback.call_args[0][0].bucket, ['testpackage', 'testpackage0']) self.assertIsNone(self.done_callback.call_args[0][0].error) self.assertTrue(self.handler.is_bucket_installed(["testpackage", "testpackage0"])) def test_install_multiple_packages_progress(self): """Install multiple packages in one shot and ensure that progress is global""" progress_callback = Mock() self.handler.install_bucket(["testpackage", "testpackage0"], progress_callback, self.done_callback) self.wait_for_callback(self.done_callback) downloading_msg = self.count_number_progress_call(progress_callback.call_args_list, RequirementsHandler.STATUS_DOWNLOADING) installing_msg = self.count_number_progress_call(progress_callback.call_args_list, RequirementsHandler.STATUS_INSTALLING) self.assertTrue(downloading_msg > 1) self.assertTrue(installing_msg > 1) # the first download call is at 0% of progress. testpackage is 1byte to download on != xenial self.assertIn(progress_callback.call_args_list[0][0][0], [{'step': 0, 'pkg_size_download': 1, 'percentage': 0.0}, {'step': 0, 'pkg_size_download': 3412, 'percentage': 0.0}]) def test_install_pending(self): """Appending two installations and wait for results. Only the first call should have progress""" done_callback0 = Mock() self.handler.install_bucket(["testpackage"], lambda x: "", self.done_callback) self.handler.install_bucket(["testpackage0"], lambda x: "", done_callback0) self.wait_for_callback(self.done_callback) self.wait_for_callback(done_callback0) self.assertTrue(self.handler.is_bucket_installed(["testpackage", "testpackage0"])) def test_install_pending_order(self): """Installation order of pending requests are respected""" done_callback = Mock() done_callback.side_effect = self.done_callback done_callback0 = Mock() done_callback0.side_effect = self.done_callback ordered_progress_callback = Mock() progress_callback = Mock() progress_callback.side_effect = ordered_progress_callback progress_callback0 = Mock() progress_callback0.side_effect = ordered_progress_callback self.handler.install_bucket(["testpackage"], progress_callback, done_callback) self.handler.install_bucket(["testpackage0"], progress_callback0, done_callback0) self.wait_for_callback(done_callback) self.wait_for_callback(done_callback0) self.assertEqual(self.done_callback.call_args_list, [call(RequirementsHandler.RequirementsResult(bucket=['testpackage'], error=None)), call(RequirementsHandler.RequirementsResult(bucket=['testpackage0'], error=None))]) # we will get progress with 0, 1 (first bucket), 0, 1 (second bucket). So 4 progress signal status change current_status = RequirementsHandler.STATUS_DOWNLOADING current_status_change_count = 1 calls = ordered_progress_callback.call_args_list for current_call in calls[1:]: if current_call[0][0]['step'] != current_status: current_status = current_call[0][0]['step'] current_status_change_count += 1 self.assertEqual(current_status_change_count, 4) def test_install_pending_callback_not_mixed(self): """Callbacks are separated on pending requests""" done_callback = Mock() done_callback.side_effect = self.done_callback done_callback0 = Mock() done_callback0.side_effect = self.done_callback global_progress_callback = Mock() progress_callback = Mock() progress_callback.side_effect = global_progress_callback progress_callback0 = Mock() progress_callback0.side_effect = global_progress_callback self.handler.install_bucket(["testpackage"], progress_callback, done_callback) self.handler.install_bucket(["testpackage0"], progress_callback0, done_callback0) self.wait_for_callback(done_callback) self.wait_for_callback(done_callback0) self.assertTrue(progress_callback.call_count < global_progress_callback.call_count) self.assertTrue(progress_callback0.call_count < global_progress_callback.call_count) self.assertTrue(done_callback.call_count < self.done_callback.call_count) self.assertTrue(done_callback0.call_count < self.done_callback.call_count) def test_install_twice(self): """Test appending two installations and wait for results. Only the first call should have progress""" progress_callback = Mock() progress_second_callback = Mock() done_callback = Mock() self.handler.install_bucket(["testpackage"], progress_callback, done_callback) self.handler.install_bucket(["testpackage"], progress_second_callback, self.done_callback) self.wait_for_callback(done_callback) self.wait_for_callback(self.done_callback) self.assertTrue(self.handler.is_bucket_installed(["testpackage"])) self.assertFalse(progress_second_callback.called) def test_deps(self): """Installing one package, ensure the dep (even with auto_fix=False) is installed""" self.handler.install_bucket(["testpackage1"], lambda x: "", self.done_callback) self.wait_for_callback(self.done_callback) self.assertTrue(self.handler.is_bucket_installed(["testpackage1", "testpackage"])) def test_fail(self): """An error is caught when asking for the impossible (installing 2 packages in conflicts)""" self.handler.install_bucket(["testpackage", "testpackage2"], lambda x: "", self.done_callback) self.wait_for_callback(self.done_callback) self.assertIsNotNone(self.done_callback.call_args[0][0].error) both_package_installed = self.handler.is_bucket_installed(["testpackage"]) and \ self.handler.is_bucket_installed(["testpackage2"]) self.assertFalse(both_package_installed) self.expect_warn_error = True def test_install_shadow_pkg(self): """We return an error if we try to install a none existing package""" self.handler.install_bucket(["foo"], lambda x: "", self.done_callback) self.wait_for_callback(self.done_callback) self.assertIsNotNone(self.done_callback.call_args[0][0].error) self.expect_warn_error = True def test_error_in_dpkg(self): """An error while installing a package is caught""" with open(self.dpkg, mode='w') as f: f.write("#!/bin/sh\nexit 1") # Simulate an error in dpkg self.handler.install_bucket(["testpackage"], lambda x: "", self.done_callback) self.wait_for_callback(self.done_callback) self.assertIsNotNone(self.done_callback.call_args[0][0].error) self.expect_warn_error = True def test_is_installed_bucket_installed(self): """Install bucket should return True if a bucket is installed""" self.handler.install_bucket(["testpackage", "testpackage1"], lambda x: "", self.done_callback) self.wait_for_callback(self.done_callback) self.assertTrue(self.handler.is_bucket_installed(['testpackage', 'testpackage1'])) def test_is_installed_bucket_half_installed(self): """Install bucket shouldn't be considered installed if not fully installed""" self.handler.install_bucket(["testpackage"], lambda x: "", self.done_callback) self.wait_for_callback(self.done_callback) self.assertFalse(self.handler.is_bucket_installed(['testpackage', 'testpackage1'])) def test_is_installed_bucket_not_installed(self): """Install bucket should return False if a bucket is not installed""" self.assertFalse(self.handler.is_bucket_installed(['testpackage', 'testpackage1'])) def test_is_bucket_installed_multi_arch_current_arch(self): """Installed bucket should return True even if contains multi-arch part with current package""" self.handler.install_bucket(["testpackage"], lambda x: "", self.done_callback) self.wait_for_callback(self.done_callback) self.assertTrue(self.handler.is_bucket_installed(["testpackage:{}".format(tools.get_current_arch())])) def test_is_bucket_installed_with_unavailable_package(self): """Bucket isn't installed if some package are even not in the cache""" self.assertFalse(self.handler.is_bucket_installed(["testpackagedoesntexist"])) def test_is_bucket_installed_with_unavailable_multiarch_package(self): """Bucket isn't installed if some multiarch package are even not in the cache""" self.assertFalse(self.handler.is_bucket_installed(["testpackagedoesntexist:foo"])) def test_is_bucket_installed_with_foreign_archs_package_not_installed(self): """After adding a foreign arch, test that the package is not installed and report so""" subprocess.call([self.dpkg, "--add-architecture", "foo"]) self.handler.cache.open() # reopen the cache with the new added architecture self.assertFalse(self.handler.is_bucket_installed(['testpackagefoo:foo'])) def test_is_bucket_uptodate_bucket_uptodate(self): """Up to date bucket is reported as such""" self.handler.install_bucket(["testpackage", "testpackage1"], lambda x: "", self.done_callback) self.wait_for_callback(self.done_callback) self.assertTrue(self.handler.is_bucket_uptodate(['testpackage', 'testpackage1'])) def test_is_bucket_uptodate_bucket_not_installed(self): """Not installed bucket is not uptodate""" self.assertFalse(self.handler.is_bucket_uptodate(['testpackage', 'testpackage1'])) def test_is_bucket_uptodate_bucket_half_installed(self): """bucket shouldn't be considered up to date if not fully installed""" self.handler.install_bucket(["testpackage"], lambda x: "", self.done_callback) self.wait_for_callback(self.done_callback) self.assertFalse(self.handler.is_bucket_uptodate(['testpackage', 'testpackage1'])) def test_is_bucket_uptodate_multi_arch_current_arch(self): """Installed bucket should return as being uptodate even if contains multi-arch part with current package""" self.handler.install_bucket(["testpackage"], lambda x: "", self.done_callback) self.wait_for_callback(self.done_callback) self.assertTrue(self.handler.is_bucket_uptodate(["testpackage:{}".format(tools.get_current_arch())])) def test_is_bucket_uptodate_with_unavailable_package(self): """Bucket isn't uptodate if some package are even not in the cache""" self.assertFalse(self.handler.is_bucket_uptodate(["testpackagedoesntexist"])) def test_is_bucket_uptodate_with_unavailable_multiarch_package(self): """Bucket isn't uptodate if some multiarch package are even not in the cache""" self.assertFalse(self.handler.is_bucket_uptodate(["testpackagedoesntexist:foo"])) def test_is_bucket_uptodate_with_foreign_archs(self): """After adding a foreign arch, test that the package is uptodate and report so""" subprocess.call([self.dpkg, "--add-architecture", "foo"]) self.handler.cache.open() # reopen the cache with the new added architecture self.handler.install_bucket(["testpackagefoo:foo"], lambda x: "", self.done_callback) self.wait_for_callback(self.done_callback) self.assertTrue(self.handler.is_bucket_uptodate(['testpackagefoo:foo'])) def test_is_bucket_uptodate_with_foreign_archs_package_not_installed(self): """After adding a foreign arch, test that the package is not uptodate and report so""" subprocess.call([self.dpkg, "--add-architecture", "foo"]) self.handler.cache.open() # reopen the cache with the new added architecture self.assertFalse(self.handler.is_bucket_uptodate(['testpackagefoo:foo'])) def test_is_bucket_uptodate_with_possible_upgrade(self): """If one package of the bucket can be upgraded, tell it's not up to date""" shutil.copy(os.path.join(self.apt_status_dir, "testpackage_installed_dpkg_status"), os.path.join(self.dpkg_dir, "status")) self.handler.cache.open() self.assertFalse(self.handler.is_bucket_uptodate(["testpackage"])) def test_is_bucket_available(self): """An available bucket on that platform is reported""" self.assertTrue(self.handler.is_bucket_available(['testpackage', 'testpackage1'])) def test_is_bucket_available_multi_arch_current_arch(self): """We return a package is available on the current platform""" self.assertTrue(self.handler.is_bucket_available(['testpackage:{}'.format(tools.get_current_arch())])) def test_unavailable_bucket(self): """An unavailable bucket on that platform is reported""" self.assertFalse(self.handler.is_bucket_available(['testpackage42', 'testpackage404'])) def test_is_bucket_available_foreign_archs(self): """After adding a foreign arch, test that the package is available on it""" subprocess.call([self.dpkg, "--add-architecture", "foo"]) self.handler.cache.open() # reopen the cache with the new added architecture self.assertTrue(self.handler.is_bucket_available(['testpackagefoo:foo', 'testpackage1'])) def test_is_bucket_unavailable_with_foreign_archs(self): """After adding a foreign arch, test that the package is unavailable and report so""" subprocess.call([self.dpkg, "--add-architecture", "foo"]) self.handler.cache.open() # reopen the cache with the new added architecture self.assertFalse(self.handler.is_bucket_available(['testpackagebar:foo', 'testpackage1'])) def test_bucket_unavailable_but_foreign_archs_no_added(self): """Bucket is set as available when foreign arch not added""" self.assertTrue(self.handler.is_bucket_available(['testpackagefoo:foo', 'testpackage1'])) def test_bucket_unavailable_foreign_archs_no_added_another_package_not_available(self): """Bucket is set as unavailable when foreign arch not added, but another package on current arch is unavailable""" self.assertFalse(self.handler.is_bucket_available(['testpackagefoo:foo', 'testpackage123'])) def test_apt_cache_not_ready(self): """When the first apt.Cache() access tells it's not ready, we wait and recover""" origin_open = self.handler.cache.open raise_returned = False def cache_call(*args, **kwargs): nonlocal raise_returned if raise_returned: return origin_open() else: raise_returned = True raise SystemError with patch.object(self.handler.cache, 'open', side_effect=cache_call) as openaptcache_mock: self.handler.install_bucket(["testpackage"], lambda x: "", self.done_callback) self.wait_for_callback(self.done_callback) self.assertEqual(openaptcache_mock.call_count, 2) def test_upgrade(self): """Upgrade one package already installed""" shutil.copy(os.path.join(self.apt_status_dir, "testpackage_installed_dpkg_status"), os.path.join(self.dpkg_dir, "status")) self.handler.cache.open() self.assertTrue(self.handler.is_bucket_installed(["testpackage"])) self.assertEqual(self.handler.cache["testpackage"].installed.version, "0.0.0") self.handler.install_bucket(["testpackage"], lambda x: "", self.done_callback) self.wait_for_callback(self.done_callback) self.assertEqual(self.done_callback.call_args[0][0].bucket, ['testpackage']) self.assertIsNone(self.done_callback.call_args[0][0].error) self.assertTrue(self.handler.is_bucket_installed(["testpackage"])) self.assertEqual(self.handler.cache["testpackage"].installed.version, "0.0.1") def test_one_install_one_upgrade(self): """Install and Upgrade one package in the same bucket""" shutil.copy(os.path.join(self.apt_status_dir, "testpackage_installed_dpkg_status"), os.path.join(self.dpkg_dir, "status")) self.handler.cache.open() self.assertTrue(self.handler.is_bucket_installed(["testpackage"])) self.assertEqual(self.handler.cache["testpackage"].installed.version, "0.0.0") self.assertFalse(self.handler.is_bucket_installed(["testpackage0"])) self.handler.install_bucket(["testpackage", "testpackage0"], lambda x: "", self.done_callback) self.wait_for_callback(self.done_callback) self.assertEqual(self.done_callback.call_args[0][0].bucket, ['testpackage', 'testpackage0']) self.assertIsNone(self.done_callback.call_args[0][0].error) self.assertTrue(self.handler.is_bucket_installed(["testpackage", "testpackage0"])) self.assertEqual(self.handler.cache["testpackage"].installed.version, "0.0.1") def test_install_with_foreign_foreign_arch_added(self): """Install packages with a foreign arch added""" subprocess.call([self.dpkg, "--add-architecture", "foo"]) self.handler.cache.open() # reopen the cache with the new added architecture bucket = ["testpackagefoo:foo", "testpackage1"] with patch("umake.tools.subprocess") as subprocess_mock: subprocess_mock.check_output.side_effect = subprocess.check_output self.handler.install_bucket(bucket, lambda x: "", self.done_callback) self.wait_for_callback(self.done_callback) self.assertFalse(subprocess_mock.call.called) self.assertEqual(self.done_callback.call_args[0][0].bucket, bucket) self.assertIsNone(self.done_callback.call_args[0][0].error) self.assertTrue(self.handler.is_bucket_installed(bucket)) def test_install_with_foreign_foreign_arch_not_added(self): """Install packages with a foreign arch, while the foreign arch wasn't added""" bucket = ["testpackagefoo:foo", "testpackage1"] self.handler.install_bucket(bucket, lambda x: "", self.done_callback) self.wait_for_callback(self.done_callback) self.assertEqual(self.done_callback.call_args[0][0].bucket, bucket) self.assertIsNone(self.done_callback.call_args[0][0].error) self.assertTrue(self.handler.is_bucket_installed(bucket)) def test_install_with_foreign_foreign_arch_add_fails(self): """Install packages with a foreign arch, where adding a foreign arch fails""" bucket = ["testpackagefoo:foo", "testpackage1"] with patch("umake.tools.subprocess") as subprocess_mock: subprocess_mock.call.return_value = 1 self.handler.install_bucket(bucket, lambda x: "", self.done_callback) self.wait_for_callback(self.done_callback) self.assertTrue(subprocess_mock.call.called) self.assertFalse(self.handler.is_bucket_installed(bucket)) self.expect_warn_error = True def test_cant_change_seteuid(self): """Not being able to change the euid to root returns an error""" os.seteuid.side_effect = PermissionError() self.handler.install_bucket(["testpackage"], lambda x: "", self.done_callback) self.wait_for_callback(self.done_callback) self.assertEqual(self.done_callback.call_args[0][0].bucket, ['testpackage']) self.assertIsNotNone(self.done_callback.call_args[0][0].error) self.assertFalse(self.handler.is_bucket_installed(["testpackage"])) self.expect_warn_error = True def test_or_option_none_installed(self): self.assertFalse(self.handler.is_bucket_installed(["testpackage | testpackage0"])) def test_or_option_first_installed(self): test_bucket = ["testpackage | testpackage1 | testpackage0"] shutil.copy(os.path.join(self.apt_status_dir, "testpackage_installed_dpkg_status"), os.path.join(self.dpkg_dir, "status")) self.handler.cache.open() self.assertTrue(self.handler.is_bucket_installed(test_bucket)) self.assertEqual(test_bucket, ['testpackage']) def test_or_option_second_installed(self): test_bucket = ["testpackage0 | testpackage | testpackage1", "testpackage2"] shutil.copy(os.path.join(self.apt_status_dir, "testpackage_installed_dpkg_status"), os.path.join(self.dpkg_dir, "status")) self.handler.cache.open() self.assertTrue(self.handler.is_bucket_installed(test_bucket)) self.assertEqual(test_bucket, ['testpackage2', 'testpackage']) def test_or_option_third_installed(self): test_bucket = ["testpackage0 | testpackage1 | testpackage", "testpackage2"] shutil.copy(os.path.join(self.apt_status_dir, "testpackage_installed_dpkg_status"), os.path.join(self.dpkg_dir, "status")) self.handler.cache.open() self.assertTrue(self.handler.is_bucket_installed(test_bucket)) self.assertEqual(test_bucket, ['testpackage2', 'testpackage']) def test_or_option_is_first_available(self): test_bucket = ["testpackage | testpackage42", "testpackage1"] self.handler.cache.open() self.assertTrue(self.handler.is_bucket_available(test_bucket)) self.assertEqual(test_bucket, ['testpackage1', 'testpackage']) def test_or_option_is_second_available(self): test_bucket = ["testpackage42 | testpackage"] self.handler.cache.open() self.assertTrue(self.handler.is_bucket_available(test_bucket)) self.assertEqual(test_bucket, ['testpackage']) def test_or_option_is_none_available(self): self.assertFalse(self.handler.is_bucket_available(['testpackage42 | testpackage404'])) def test_or_option_both_available(self): test_bucket = ['testpackage | testpackage0', 'testpackage1'] self.handler.cache.open() self.assertTrue(self.handler.is_bucket_available(test_bucket)) self.assertEqual(test_bucket, ['testpackage1', 'testpackage']) ubuntu-make-18.09+disco1/tests/small/test_settings.py0000644000000000000000000000773613352651520017576 0ustar # -*- coding: utf-8 -*- # Copyright (C) 2015 Canonical # # Authors: # Didier Roche # # 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; version 3. # # This program is distributed in he 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 """Tests the umake settings handler""" import os import shutil import tempfile from ..tools import get_data_dir, LoggedTestCase from unittest.mock import patch from umake import settings class TestVersionHandler(LoggedTestCase): """This will test the version handler""" def setUp(self): super().setUp() self.from_dev_opt = settings.from_dev self.version_dir = tempfile.mkdtemp() self.initial_env = os.environ.copy() self.initial_os_path_join = os.path.join os.environ["PATH"] = "{}:{}".format(os.path.join(get_data_dir(), "mocks"), os.getenv("PATH")) self.version_file_path = os.path.join(self.version_dir, "version") open(self.version_file_path, "w").write("42.02") def tearDown(self): # remove caching shutil.rmtree(self.version_dir) settings.from_dev = self.from_dev_opt # restore original environment. Do not use the dict copy which erases the object and doesn't have the magical # _Environ which setenv() for subprocess os.environ.clear() os.environ.update(self.initial_env) os.path.join = self.initial_os_path_join super().tearDown() def return_fake_version_path(self, *args): '''Only return fake version path if the request was for that one''' if args[-1] == "version": return self.version_file_path return self.initial_os_path_join(*args) @patch("os.path.join") def test_version_release(self, path_join_result): """Ensure we are returning the right version for a release""" path_join_result.side_effect = self.return_fake_version_path os.environ.clear() os.environ.update(self.initial_env) self.assertEquals(settings.get_version(), "42.02") @patch("os.path.join") def test_version_git(self, path_join_result): """Ensure we are returning the right version for a git repo""" settings.from_dev = True path_join_result.side_effect = self.return_fake_version_path self.assertEquals(settings.get_version(), "42.03-25-g1fd9507") @patch("os.path.join") def test_version_snap(self, path_join_result): """Ensure we are returning the right version for a snap""" path_join_result.side_effect = self.return_fake_version_path os.environ.clear() os.environ.update(self.initial_env) os.environ["SNAP_REVISION"] = "42" self.assertEquals(settings.get_version(), "42.02+snap42") @patch("os.path.join") def test_version_git_fail(self, path_join_result): """Ensure we are returning last known version + unknown if git fails""" settings.from_dev = True path_join_result.side_effect = self.return_fake_version_path os.environ["PATH"] = "{}:{}".format(os.path.join(get_data_dir(), "mocks", "fails"), os.getenv("PATH")) self.assertEquals(settings.get_version(), "42.02+unknown") @patch("os.path.join") def test_version_git_not_installed(self, path_join_result): """Ensure we are returning last known version + unknown if git isn't installed""" settings.from_dev = True path_join_result.side_effect = self.return_fake_version_path os.environ["PATH"] = "" self.assertEquals(settings.get_version(), "42.02+unknown") ubuntu-make-18.09+disco1/tests/small/test_tools.py0000644000000000000000000015303213352651520017065 0ustar # -*- coding: utf-8 -*- # Copyright (C) 2014 Canonical # # Authors: # Didier Roche # # 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; version 3. # # This program is distributed in he 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 """Tests the various umake tools""" from concurrent import futures from contextlib import contextmanager, suppress from gi.repository import GLib import os import shutil import subprocess import stat import sys import tempfile from textwrap import dedent from time import time import threading from . import DpkgAptSetup from ..tools import change_xdg_path, get_data_dir, LoggedTestCase, INSTALL_DIR from umake import settings, tools from umake.tools import ConfigHandler, Singleton, get_current_arch, get_foreign_archs, get_current_ubuntu_version,\ create_launcher, launcher_exists_and_is_pinned, launcher_exists, get_icon_path, get_launcher_path, copy_icon,\ add_exec_link from unittest.mock import patch, Mock class TestConfigHandler(LoggedTestCase): """This will test the config handler using xdg dirs""" def setUp(self): super().setUp() self.config_dir = tempfile.mkdtemp() change_xdg_path('XDG_CONFIG_HOME', self.config_dir) def tearDown(self): # remove caching Singleton._instances = {} change_xdg_path('XDG_CONFIG_HOME', remove=True) shutil.rmtree(self.config_dir) super().tearDown() def config_dir_for_name(self, name): """Return the config dir for this name""" return os.path.join(get_data_dir(), 'configs', name) def test_singleton(self): """Ensure we are delivering a singleton for TestConfigHandler""" config1 = ConfigHandler() config2 = ConfigHandler() self.assertEqual(config1, config2) def test_load_config(self): """Valid config loads correct content""" change_xdg_path('XDG_CONFIG_HOME', self.config_dir_for_name("valid")) self.assertEqual(ConfigHandler().config, {'frameworks': { 'category-a': { 'framework-a': {'path': '/home/didrocks/quickly/ubuntu-make/adt-eclipse'}, 'framework-b': {'path': '/home/didrocks/foo/bar/android-studio'} } }}) def test_load_no_config(self): """No existing file gives an empty result""" change_xdg_path('XDG_CONFIG_HOME', self.config_dir_for_name("foo")) self.assertEqual(ConfigHandler().config, {}) def test_load_invalid_config(self): """Existing invalid file gives an empty result""" change_xdg_path('XDG_CONFIG_HOME', self.config_dir_for_name("invalid")) self.assertEqual(ConfigHandler().config, {}) self.expect_warn_error = True def test_save_new_config(self): """Save a new config in a vanilla directory""" content = {'foo': 'bar'} ConfigHandler().config = content self.assertEqual(ConfigHandler().config, content) with open(os.path.join(self.config_dir, settings.CONFIG_FILENAME)) as f: self.assertEqual(f.read(), 'foo: bar\n') def test_save_config_without_xdg_dir(self): """Save a new config file with an unexisting directory""" os.removedirs(self.config_dir) self.test_save_new_config() def test_save_config_existing(self): """Replace an existing config with a new one""" shutil.copy(os.path.join(self.config_dir_for_name('valid'), settings.CONFIG_FILENAME), self.config_dir) content = {'foo': 'bar'} ConfigHandler().config = content self.assertEqual(ConfigHandler().config, content) with open(os.path.join(self.config_dir, settings.CONFIG_FILENAME)) as f: self.assertEqual(f.read(), 'foo: bar\n') def test_dont_create_file_without_assignment(self): """We don't create any file without an assignment""" ConfigHandler() self.assertEqual(len(os.listdir(self.config_dir)), 0) def test_transition_old_config(self): """Transition udtc old config to new umake one""" with tempfile.TemporaryDirectory() as tmpdirname: shutil.copy(os.path.join(self.config_dir_for_name("old"), "udtc"), tmpdirname) change_xdg_path('XDG_CONFIG_HOME', tmpdirname) self.assertEqual(ConfigHandler().config, {'frameworks': { 'category-a': { 'framework-a': {'path': '/home/didrocks/quickly/ubuntu-make/adt-eclipse'}, 'framework-b': {'path': '/home/didrocks/foo/bar/android-studio'} } }}) # file has been renamed self.assertTrue(os.path.exists(os.path.join(tmpdirname, "umake")), "New umake config file exists") self.assertFalse(os.path.exists(os.path.join(tmpdirname, "udtc")), "Old udtc config file is removed") class TestGetUbuntuVersion(LoggedTestCase): def setUp(self): """Reset previously cached values""" super().setUp() tools._version = None def tearDown(self): """Reset cached values""" tools._version = None super().tearDown() def get_lsb_release_filepath(self, name): return os.path.join(get_data_dir(), 'lsb_releases', name) @patch("umake.tools.settings") def test_get_current_ubuntu_version(self, settings_module): """Current ubuntu version is reported from our lsb_release local file""" settings_module.LSB_RELEASE_FILE = self.get_lsb_release_filepath("valid") self.assertEqual(get_current_ubuntu_version(), '14.04') @patch("umake.tools.settings") def test_get_current_ubuntu_version_invalid(self, settings_module): """Raise an error when parsing an invalid lsb release file""" settings_module.LSB_RELEASE_FILE = self.get_lsb_release_filepath("invalid") self.assertRaises(BaseException, get_current_ubuntu_version) self.expect_warn_error = True @patch("umake.tools.settings") def test_get_current_ubuntu_version_no_lsb_release(self, settings_module): """Raise an error when there is no lsb release file""" settings_module.LSB_RELEASE_FILE = self.get_lsb_release_filepath("notexist") self.assertRaises(BaseException, get_current_ubuntu_version) self.expect_warn_error = True class TestCompletion(LoggedTestCase): def setUp(self): super().setUp() self.initial_env = os.environ.copy() def tearDown(self): # restore original environment. Do not use the dict copy which erases the object and doesn't have the magical # _Environ which setenv() for subprocess os.environ.clear() os.environ.update(self.initial_env) super().tearDown() def test_in_completion_mode(self): """We return if we are in completion mode""" os.environ["_ARGCOMPLETE"] = "1" self.assertTrue(tools.is_completion_mode()) def test_not_incompletion_mode(self): """We are not in completion mode by default""" self.assertFalse(tools.is_completion_mode()) class TestArchVersion(DpkgAptSetup): def setUp(self): """Reset previously cached values""" super().setUp() tools._current_arch = None tools._foreign_arch = None def tearDown(self): """Reset cached values""" tools._current_arch = None tools._foreign_arch = None super().tearDown() def dpkg_error(self, *args, **kwargs): """Simulate a dpkg failure""" raise subprocess.CalledProcessError("dpkg failure", cmd="dpkg") def test_get_current_arch(self): """Current arch is reported""" with patch("umake.tools.subprocess") as subprocess_mock: subprocess_mock.check_output.return_value = "fooarch" self.assertEqual(get_current_arch(), "fooarch") def test_get_current_arch_twice(self): """Current arch is reported twice and the same""" with patch("umake.tools.subprocess") as subprocess_mock: subprocess_mock.check_output.return_value = "fooarch" self.assertEqual(get_current_arch(), "fooarch") self.assertEqual(get_current_arch(), "fooarch") self.assertEquals(subprocess_mock.check_output.call_count, 1, "We cache older value") def test_get_current_arch_no_dpkg(self): """Assert an error if dpkg exit with an error""" with patch("umake.tools.subprocess") as subprocess_mock: subprocess_mock.check_output.side_effect = self.dpkg_error self.assertRaises(subprocess.CalledProcessError, get_current_arch) def test_get_foreign_arch(self): """Get current foreign arch (one)""" with patch("umake.tools.subprocess") as subprocess_mock: subprocess_mock.check_output.return_value = "fooarch" self.assertEqual(get_foreign_archs(), ["fooarch"]) def test_get_foreign_archs(self): """Get current foreign arch (multiple)""" with patch("umake.tools.subprocess") as subprocess_mock: subprocess_mock.check_output.return_value = "fooarch\nbararch\nbazarch" self.assertEqual(get_foreign_archs(), ["fooarch", "bararch", "bazarch"]) def test_get_foreign_archs_error(self): """Get current foreign arch raises an exception if dpkg is in error""" with patch("umake.tools.subprocess") as subprocess_mock: subprocess_mock.check_output.side_effect = self.dpkg_error self.assertRaises(subprocess.CalledProcessError, get_foreign_archs) def test_add_new_foreign_arch(self): """Add a new foreign arch and check that we can retrieve it (cache invalidated)""" tools.add_foreign_arch("foo") self.assertEqual(get_foreign_archs(), ["foo"]) def test_add_foreign_arch_already_in(self): """Add a foreign arch which was already there should be a noop""" with patch("umake.tools.subprocess") as subprocess_mock: subprocess_mock.check_output.return_value = "foo" subprocess_mock.call.side_effect = subprocess.call tools.add_foreign_arch("foo") self.assertFalse(subprocess_mock.call.called) def test_add_current_arch(self): """Add the current arch should be a noop""" tools._current_arch = "foo" with patch("umake.tools.subprocess") as subprocess_mock: subprocess_mock.call.side_effect = subprocess.call tools.add_foreign_arch("foo") def test_add_new_foreign_arch_fail(self): """Add a new foreign arch, but failing should raise an exception""" with patch("umake.tools.subprocess") as subprocess_mock: subprocess_mock.call.return_value = 1 self.assertRaises(BaseException, tools.add_foreign_arch, "foo") class TestToolsThreads(LoggedTestCase): """Test main loop threading helpers""" def setUp(self): super().setUp() self.mainloop_object = tools.MainLoop() self.mainloop_thread = None self.function_thread = None self.saved_stderr = sys.stderr def tearDown(self): Singleton._instances = {} sys.stderr = self.saved_stderr super().tearDown() def patch_stderr(self): class writer(object): def write(self, data): print(data) sys.stderr = writer() # function that will complete once the mainloop is started def wait_for_mainloop_function(self): timeout_time = time() + 5 while not self.mainloop_object.mainloop.is_running(): if time() > timeout_time: raise(BaseException("Mainloop not started in 5 seconds")) def wait_for_mainloop_shutdown(self): timeout_time = time() + 5 while self.mainloop_object.mainloop.is_running(): if time() > timeout_time: raise(BaseException("Mainloop not stopped in 5 seconds")) def get_mainloop_thread(self): self.mainloop_thread = threading.current_thread().ident def start_glib_mainloop(self): # quit after 5 seconds if nothing made the mainloop to end GLib.timeout_add_seconds(5, self.mainloop_object.mainloop.quit) GLib.idle_add(self.get_mainloop_thread) self.mainloop_object.run() @patch("umake.tools.sys") def test_run_function_in_mainloop_thread(self, mocksys): """Decorated mainloop thread functions are really running in that thread""" # function supposed to run in the mainloop thread @tools.MainLoop.in_mainloop_thread def _function_in_mainloop_thread(future): self.function_thread = threading.current_thread().ident self.mainloop_object.quit() executor = futures.ThreadPoolExecutor(max_workers=1) future = executor.submit(self.wait_for_mainloop_function) future.add_done_callback(_function_in_mainloop_thread) self.start_glib_mainloop() self.wait_for_mainloop_shutdown() # mainloop and thread were started self.assertIsNotNone(self.mainloop_thread) self.assertIsNotNone(self.function_thread) self.assertEqual(self.mainloop_thread, self.function_thread) @patch("umake.tools.sys") def test_run_function_not_in_mainloop_thread(self, mocksys): """Non decorated callback functions are not running in the mainloop thread""" # function not supposed to run in the mainloop thread def _function_not_in_mainloop_thread(future): self.function_thread = threading.current_thread().ident self.mainloop_object.quit(raise_exception=False) # as we don't run that from the mainloop executor = futures.ThreadPoolExecutor(max_workers=1) future = executor.submit(self.wait_for_mainloop_function) future.add_done_callback(_function_not_in_mainloop_thread) self.start_glib_mainloop() self.wait_for_mainloop_shutdown() # mainloop and thread were started self.assertIsNotNone(self.mainloop_thread) self.assertIsNotNone(self.function_thread) self.assertNotEqual(self.mainloop_thread, self.function_thread) def test_singleton(self): """Ensure we are delivering a singleton for RequirementsHandler""" second = tools.MainLoop() self.assertEqual(self.mainloop_object, second) def test_mainloop_run(self): """We effectively executes the mainloop""" with patch.object(self.mainloop_object, "mainloop") as mockmainloop: self.mainloop_object.run() self.assertTrue(mockmainloop.run.called) @patch("umake.tools.sys") def test_mainloop_quit(self, mocksys): """We quit the process""" def _quit_ignoring_exception(): self.mainloop_object.quit(raise_exception=False) # as we don't run that from the mainloop GLib.idle_add(_quit_ignoring_exception) self.start_glib_mainloop() self.wait_for_mainloop_shutdown() mocksys.exit.assert_called_once_with(0) @patch("umake.tools.sys") def test_mainloop_quit_with_exit_value(self, mocksys): """We quit the process with a return code""" def _quit_ignoring_exception(): self.mainloop_object.quit(42, raise_exception=False) # as we don't run that from the mainloop GLib.idle_add(_quit_ignoring_exception) self.start_glib_mainloop() self.wait_for_mainloop_shutdown() mocksys.exit.assert_called_once_with(42) @patch("umake.tools.sys") def test_unhandled_exception_in_mainloop_thead_exit(self, mocksys): """We quit the process in error for any unhandled exception, logging it""" @tools.MainLoop.in_mainloop_thread def _function_raising_exception(): raise BaseException("foo bar") _function_raising_exception() self.patch_stderr() self.start_glib_mainloop() self.wait_for_mainloop_shutdown() mocksys.exit.assert_called_once_with(1) self.expect_warn_error = True class TestLauncherIcons(LoggedTestCase): """Test module for launcher icons handling""" @classmethod def setUpClass(cls): super().setUpClass() cls.server_dir = os.path.join(get_data_dir(), "server-content") def setUp(self): super().setUp() self.tmpHome = tempfile.mkdtemp() self.local_dir = tempfile.mkdtemp() os.mkdir(os.path.join(self.local_dir, "applications")) os.mkdir(os.path.join(self.local_dir, "icons")) change_xdg_path('XDG_DATA_HOME', self.local_dir) self.current_desktop = os.environ.get("XDG_CURRENT_DESKTOP") os.environ["XDG_CURRENT_DESKTOP"] = "Unity" def tearDown(self): change_xdg_path('XDG_DATA_HOME', remove=True) shutil.rmtree(self.local_dir) if self.current_desktop: os.environ["XDG_CURRENT_DESKTOP"] = self.current_desktop super().tearDown() def get_generic_desktop_content(self): """Return a generic desktop content to win spaces""" return dedent("""\ [Desktop Entry] Version=1.0 Type=Application Name=Android Studio Icon=/home/didrocks/{install_dir}/android-studio/bin/studio.png Exec="/home/didrocks/{install_dir}/android-studio/bin/studio.sh" %f Comment=Develop with pleasure! Categories=Development;IDE; Terminal=false StartupWMClass=jetbrains-android-studio """.format(install_dir=INSTALL_DIR)) def write_desktop_file(self, filename): """Write a dummy filename to the applications dir and return filepath""" result_file = os.path.join(self.local_dir, "applications", filename) with open(result_file, 'w') as f: f.write("Foo Bar Baz") return result_file @patch("umake.tools.Gio.Settings") def test_can_install(self, SettingsMock): """Install a basic launcher, default case with unity://running""" SettingsMock.list_schemas.return_value = ["foo", "bar", "com.canonical.Unity.Launcher", "baz"] SettingsMock.return_value.get_strv.return_value = ["application://bar.desktop", "unity://running-apps"] create_launcher("foo.desktop", self.get_generic_desktop_content()) self.assertTrue(SettingsMock.list_schemas.called) SettingsMock.return_value.get_strv.assert_called_with("favorites") SettingsMock.return_value.set_strv.assert_called_with("favorites", ["application://bar.desktop", "application://foo.desktop", "unity://running-apps"]) self.assertTrue(os.path.exists(get_launcher_path("foo.desktop"))) self.assertEqual(open(get_launcher_path("foo.desktop")).read(), self.get_generic_desktop_content()) @patch("umake.tools.Gio.Settings") def test_can_update_launcher(self, SettingsMock): """Update a launcher file""" SettingsMock.list_schemas.return_value = ["foo", "bar", "com.canonical.Unity.Launcher", "baz"] SettingsMock.return_value.get_strv.return_value = ["application://bar.desktop", "unity://running-apps"] create_launcher("foo.desktop", self.get_generic_desktop_content()) new_content = dedent("""\ [Desktop Entry] Version=1.0 Type=Application Name=Android Studio 2 Icon=/home/didrocks/{install_dir}/android-studio/bin/idea2.png Exec="/home/didrocks/{install_dir}/android-studio/bin/studio2.sh" %f Comment=Develop with pleasure! Categories=Development;IDE; Terminal=false StartupWMClass=jetbrains-android-studio """.format(install_dir=INSTALL_DIR)) create_launcher("foo.desktop", new_content) self.assertTrue(os.path.exists(get_launcher_path("foo.desktop"))) self.assertEqual(open(get_launcher_path("foo.desktop")).read(), new_content) @patch("umake.tools.Gio.Settings") def test_can_install_without_unity_running(self, SettingsMock): """Install a basic launcher icon, without a running apps entry (so will be last)""" SettingsMock.list_schemas.return_value = ["foo", "bar", "com.canonical.Unity.Launcher", "baz"] SettingsMock.return_value.get_strv.return_value = ["application://bar.desktop", "application://baz.desktop"] create_launcher("foo.desktop", self.get_generic_desktop_content()) self.assertTrue(SettingsMock.list_schemas.called) SettingsMock.return_value.set_strv.assert_called_with("favorites", ["application://bar.desktop", "application://baz.desktop", "application://foo.desktop"]) @patch("umake.tools.Gio.Settings") def test_can_install_already_in_launcher(self, SettingsMock): """A file listed in launcher still install the files, but the entry isn't changed""" SettingsMock.list_schemas.return_value = ["foo", "bar", "com.canonical.Unity.Launcher", "baz"] SettingsMock.return_value.get_strv.return_value = ["application://bar.desktop", "application://foo.desktop", "unity://running-apps"] create_launcher("foo.desktop", self.get_generic_desktop_content()) self.assertFalse(SettingsMock.return_value.set_strv.called) self.assertTrue(os.path.exists(get_launcher_path("foo.desktop"))) @patch("umake.tools.Gio.Settings") def test_install_no_schema_file(self, SettingsMock): """No schema file still installs the file""" SettingsMock.list_schemas.return_value = ["foo", "bar", "baz"] create_launcher("foo.desktop", self.get_generic_desktop_content()) self.assertFalse(SettingsMock.return_value.get_strv.called) self.assertFalse(SettingsMock.return_value.set_strv.called) self.assertTrue(os.path.exists(get_launcher_path("foo.desktop"))) @patch("umake.tools.Gio.Settings") def test_already_existing_file_different_content(self, SettingsMock): """A file with a different file content already exists and is updated""" SettingsMock.list_schemas.return_value = ["foo", "bar", "baz"] result_file = self.write_desktop_file("foo.desktop") create_launcher("foo.desktop", self.get_generic_desktop_content()) self.assertEqual(open(result_file).read(), self.get_generic_desktop_content()) @patch("umake.tools.Gio.Settings") def test_create_launcher_without_xdg_dir(self, SettingsMock): """Save a new launcher in an unexisting directory""" shutil.rmtree(self.local_dir) SettingsMock.list_schemas.return_value = ["foo", "bar", "baz"] create_launcher("foo.desktop", self.get_generic_desktop_content()) self.assertTrue(os.path.exists(get_launcher_path("foo.desktop"))) def test_desktop_file_exists(self): """Launcher exists""" self.write_desktop_file("foo.desktop") self.assertTrue(launcher_exists("foo.desktop")) def test_desktop_file_doesnt_exist(self): """Launcher file doesn't exists""" self.assertFalse(launcher_exists("foo.desktop")) @patch("umake.tools.Gio.Settings") def test_launcher_exists_and_is_pinned(self, SettingsMock): """Launcher exists and is pinned if the file exists and is in favorites list""" SettingsMock.list_schemas.return_value = ["foo", "bar", "com.canonical.Unity.Launcher", "baz"] SettingsMock.return_value.get_strv.return_value = ["application://bar.desktop", "application://foo.desktop", "unity://running-apps"] self.write_desktop_file("foo.desktop") self.assertTrue(launcher_exists_and_is_pinned("foo.desktop")) @patch("umake.tools.Gio.Settings") def test_launcher_isnt_pinned(self, SettingsMock): """Launcher doesn't exists and is pinned if the file exists but not in favorites list""" SettingsMock.list_schemas.return_value = ["foo", "bar", "com.canonical.Unity.Launcher", "baz"] SettingsMock.return_value.get_strv.return_value = ["application://bar.desktop", "unity://running-apps"] self.write_desktop_file("foo.desktop") self.assertFalse(launcher_exists_and_is_pinned("foo.desktop")) @patch("umake.tools.Gio.Settings") def test_launcher_exists_but_isnt_pinned_in_none_unity(self, SettingsMock): """Launcher exists return True if file exists, not pinned but not in Unity""" os.environ["XDG_CURRENT_DESKTOP"] = "FOOenv" SettingsMock.list_schemas.return_value = ["foo", "bar", "com.canonical.Unity.Launcher", "baz"] SettingsMock.return_value.get_strv.return_value = ["application://bar.desktop", "unity://running-apps"] self.write_desktop_file("foo.desktop") self.assertTrue(launcher_exists_and_is_pinned("foo.desktop")) @patch("umake.tools.Gio.Settings") def test_launcher_exists_but_not_schema_in_none_unity(self, SettingsMock): """Launcher exists return True if file exists, even if Unity schema isn't installed""" os.environ["XDG_CURRENT_DESKTOP"] = "FOOenv" SettingsMock.list_schemas.return_value = ["foo", "bar", "baz"] self.write_desktop_file("foo.desktop") self.assertTrue(launcher_exists_and_is_pinned("foo.desktop")) @patch("umake.tools.Gio.Settings") def test_launcher_exists_but_not_schema_in_unity(self, SettingsMock): """Launcher exists return False if file exists, but no Unity schema installed""" SettingsMock.list_schemas.return_value = ["foo", "bar", "baz"] self.write_desktop_file("foo.desktop") self.assertFalse(launcher_exists_and_is_pinned("foo.desktop")) @patch("umake.tools.Gio.Settings") def test_launcher_doesnt_exists_but_pinned(self, SettingsMock): """Launcher doesn't exist if no file, even if pinned""" SettingsMock.list_schemas.return_value = ["foo", "bar", "com.canonical.Unity.Launcher", "baz"] SettingsMock.return_value.get_strv.return_value = ["application://bar.desktop", "application://foo.desktop", "unity://running-apps"] self.assertFalse(launcher_exists_and_is_pinned("foo.desktop")) def test_can_copy_icon(self): """Copy a basic icon""" # we copy any file and treat it as an icon copy_icon(os.path.join(self.server_dir, "simplefile"), "foo.png") self.assertTrue(os.path.exists(get_icon_path("foo.png"))) self.assertEqual(open(os.path.join(self.server_dir, "simplefile")).read(), open(get_icon_path("foo.png")).read()) def test_can_update_icon(self): """Update a basic icon with a new content""" copy_icon(os.path.join(self.server_dir, "simplefile"), "foo.png") copy_icon(os.path.join(self.server_dir, "biggerfile"), "foo.png") self.assertTrue(os.path.exists(get_icon_path("foo.png"))) self.assertEqual(open(os.path.join(self.server_dir, "biggerfile")).read(), open(get_icon_path("foo.png")).read()) def test_can_copy_icon_with_glob(self): """Copy an icon with glob pattern matching""" # we copy any file and treat it as an icon copy_icon(os.path.join(self.server_dir, "sim*file"), "foo.png") self.assertTrue(os.path.exists(get_icon_path("foo.png"))) self.assertEqual(open(os.path.join(self.server_dir, "simplefile")).read(), open(get_icon_path("foo.png")).read()) def test_create_icon_without_xdg_dir(self): """Save a new icon in an unexisting directory""" shutil.rmtree(self.local_dir) copy_icon(os.path.join(self.server_dir, "simplefile"), "foo.png") self.assertTrue(os.path.exists(get_icon_path("foo.png"))) def test_get_icon_path(self): """Get correct launcher path""" self.assertEqual(get_icon_path("foo.png"), os.path.join(self.local_dir, "icons", "foo.png")) def test_get_launcher_path(self): """Get correct launcher path""" self.assertEqual(get_launcher_path("foo.desktop"), os.path.join(self.local_dir, "applications", "foo.desktop")) @patch("umake.tools.settings") @patch.dict(os.environ, {'HOME': tempfile.mkdtemp()}) def test_create_exec_path(self, settings_module): """Create link to the executable""" settings_module.DEFAULT_BINARY_LINK_PATH = os.path.join(self.local_dir, ".local", "share", "umake", "bin") add_exec_link(os.path.join(self.server_dir, "simplefile"), "foo") self.assertTrue(os.path.exists(os.path.join(settings_module.DEFAULT_BINARY_LINK_PATH, "foo"))) class TestMiscTools(LoggedTestCase): def test_get_application_desktop_file(self): """We return expect results with normal content""" self.assertEqual(tools.get_application_desktop_file(name="Name 1", icon_path="/to/icon/path", try_exec="/to/exec/path", exec="command %f", comment="Comment for Name 1", categories="Cat1:Cat2"), dedent("""\ [Desktop Entry] Version=1.0 Type=Application Name=Name 1 Icon=/to/icon/path TryExec=/to/exec/path Exec=command %f Comment=Comment for Name 1 Categories=Cat1:Cat2 Terminal=false """)) def test_get_application_desktop_file_with_extra(self): """We return expect results with extra content""" self.assertEqual(tools.get_application_desktop_file(name="Name 1", icon_path="/to/icon/path", try_exec="/to/exec/path", exec="command %f", comment="Comment for Name 1", categories="Cat1:Cat2", extra="Extra=extra1\nFoo=foo"), dedent("""\ [Desktop Entry] Version=1.0 Type=Application Name=Name 1 Icon=/to/icon/path TryExec=/to/exec/path Exec=command %f Comment=Comment for Name 1 Categories=Cat1:Cat2 Terminal=false Extra=extra1 Foo=foo """)) def test_get_application_desktop_file_all_empty(self): """We return expect results without any content""" self.assertEqual(tools.get_application_desktop_file(), dedent("""\ [Desktop Entry] Version=1.0 Type=Application Name= Icon= TryExec= Exec= Comment= Categories= Terminal=false """)) def test_strip_tags(self): """We return strip tags from content""" self.assertEqual(tools.strip_tags("content content content contentcontent\n content" "\ncontent content"), "content content content contentcontent\n content\ncontent content") def test_strip_invalid_tags(self): """We return trip tags even if invalid""" self.assertEqual(tools.strip_tags("content content content contentcontent\n content" "\ncontent content"), "content content content contentcontent\n content\ncontent content") def test_strip_without_tags(self): """We return unmodified content if there is no tag""" self.assertEqual(tools.strip_tags("content content content contentcontent\n content" "\ncontent content"), "content content content contentcontent\n content\ncontent content") def test_raise_inputerror(self): def foo(): raise tools.InputError("Foo bar") self.assertRaises(tools.InputError, foo) def test_print_inputerror(self): self.assertEqual(str(tools.InputError("Foo bar")), "'Foo bar'") @patch("umake.tools.os") def test_switch_user_from_sudo(self, osmock): """Test switch user account from root to previous user under SUDO""" osmock.getenv.return_value = 1234 osmock.geteuid.return_value = 0 tools.switch_to_current_user() osmock.setegid.assert_called_once_with(1234) osmock.seteuid.assert_called_once_with(1234) @patch("umake.tools.os") def test_switch_user_from_non_sudo(self, osmock): """Test switch user from a non sudo command (non root), dosen't call anything""" osmock.getenv.return_value = 1234 osmock.geteuid.return_value = 1234 tools.switch_to_current_user() self.assertFalse(osmock.setegid.called) self.assertFalse(osmock.seteuid.called) self.assertFalse(osmock.getenv.called) @patch("umake.tools.os") def test_switch_user_from_root(self, osmock): """Test switch user from root, let it as root""" osmock.getenv.return_value = 0 osmock.geteuid.return_value = 0 tools.switch_to_current_user() osmock.setegid.assert_called_once_with(0) osmock.seteuid.assert_called_once_with(0) @patch("umake.tools.os") @patch("umake.tools.switch_to_current_user") def test_as_root(self, switch_to_current_usermock, osmock): """Switch as root when everything is permitted""" with tools.as_root(): osmock.seteuid.assert_called_once_with(0) osmock.setegid.assert_called_once_with(0) self.assertFalse(switch_to_current_usermock.called, "didn't switch to current user in context") self.assertTrue(switch_to_current_usermock.called, "switch back to user when exiting context") @patch("umake.tools.os") @patch("umake.tools.switch_to_current_user") def test_as_root_euid_perm_denied(self, switch_to_current_usermock, osmock): """Switch as root raise exception when euid permission is denied""" def raiseException(self): raise PermissionError("") osmock.seteuid.side_effect = raiseException exception_raised = False try: with tools.as_root(): pass except PermissionError: exception_raised = True self.assertTrue(exception_raised, "Permission Error was raised") self.assertTrue(switch_to_current_usermock.called, "switch back to user when exiting context") @patch("umake.tools.os") @patch("umake.tools.switch_to_current_user") def test_as_root_egid_perm_denied(self, switch_to_current_usermock, osmock): """Switch as root raise exception when egid permission is denied""" def raiseException(self): raise PermissionError("") osmock.setegid.side_effect = raiseException exception_raised = False try: with tools.as_root(): pass except PermissionError: exception_raised = True self.assertTrue(exception_raised, "Permission Error was raised") self.assertTrue(switch_to_current_usermock.called, "switch back to user when exiting context") @patch("umake.tools.os") @patch("umake.tools.switch_to_current_user") def test_as_root_with_lock(self, switch_to_current_usermock, osmock): """Ensure we don't try to switch as root before the lock is released""" def as_root_function(): with tools.as_root(): method_called_as_root() method_called_as_root = Mock() executor = futures.ThreadPoolExecutor(max_workers=1) # take main lock in that thread and start other one tools.root_lock.acquire() future = executor.submit(as_root_function) # we didn't get any root switch self.assertFalse(osmock.seteuid.called, "we didn't switch to root yet with seteuid") self.assertFalse(osmock.setegid.called, "we didn't switch to root yet with setegid") # release it tools.root_lock.release() # wait for the executor to finish in 1s and ensure that root was called future.result(1) osmock.seteuid.assert_called_once_with(0) osmock.setegid.assert_called_once_with(0) self.assertTrue(switch_to_current_usermock.called, "switch back to user when exiting context") class TestUserENV(LoggedTestCase): def setUp(self): super().setUp() self.orig_environ = os.environ.copy() self.local_dir = tempfile.mkdtemp() os.environ['SHELL'] = '/bin/bash' def tearDown(self): shutil.rmtree(self.local_dir) # restore original environment. Do not use the dict copy which erases the object and doesn't have the magical # _Environ which setenv() for subprocess os.environ.clear() os.environ.update(self.orig_environ) super().tearDown() @patch("umake.tools.os.path.expanduser") def test_add_env_to_user(self, expanderusermock): """Test that adding to user env appending to an existing .profile file""" expanderusermock.return_value = self.local_dir profile_file = os.path.join(self.local_dir, ".profile") open(profile_file, 'w').write("Foo\nBar\n") tools.add_env_to_user("one path addition", {"FOOO": {"value": "bar"}}) expanderusermock.assert_called_with('~') profile_content = open(profile_file).read() self.assertTrue("Foo\nBar\n" in profile_content, profile_content) # we kept previous content self.assertTrue("export FOOO=bar\n" in profile_content, profile_content) self.assertTrue("bar" in os.environ["FOOO"], os.environ["FOOO"]) @patch("umake.tools.os.path.expanduser") def test_add_env_to_user(self, expanderusermock): """Test that adding to user env a list concatenate them to an existing .profile file""" expanderusermock.return_value = self.local_dir profile_file = os.path.join(self.local_dir, ".profile") open(profile_file, 'w').write("Foo\nBar\n") tools.add_env_to_user("one path addition", {"FOOO": {"value": ["bar", "baz"]}}) expanderusermock.assert_called_with('~') profile_content = open(profile_file).read() self.assertTrue("Foo\nBar\n" in profile_content, profile_content) # we kept previous content self.assertTrue("export FOOO=bar:baz\n" in profile_content, profile_content) self.assertTrue("bar" in os.environ["FOOO"], os.environ["FOOO"]) @patch("umake.tools.os.path.expanduser") def test_add_env_to_user_with_shell_zsh(self, expanderusermock): """Test that adding to user env appending to an existing .zprofile file""" os.environ['SHELL'] = '/bin/zsh' expanderusermock.return_value = self.local_dir profile_file = os.path.join(self.local_dir, ".zprofile") open(profile_file, 'w').write("Foo\nBar\n") tools.add_env_to_user("one path addition", {"FOOO": {"value": "bar"}}) expanderusermock.assert_called_with('~') profile_content = open(profile_file).read() self.assertTrue("Foo\nBar\n" in profile_content, profile_content) # we kept previous content self.assertTrue("export FOOO=bar\n" in profile_content, profile_content) self.assertTrue("bar" in os.environ["FOOO"], os.environ["FOOO"]) @patch("umake.tools.os.path.expanduser") def test_add_env_to_user_keep(self, expanderusermock): """Test that adding to user env appending to an existing env""" os.environ["FOOO"] = "foo" expanderusermock.return_value = self.local_dir profile_file = os.path.join(self.local_dir, ".profile") open(profile_file, 'w').write("Foo\nBar\n") tools.add_env_to_user("one path addition", {"FOOO": {"value": "bar"}}) expanderusermock.assert_called_with('~') profile_content = open(profile_file).read() self.assertTrue("Foo\nBar\n" in profile_content, profile_content) # we kept previous content self.assertTrue("export FOOO=bar:$FOOO\n" in profile_content, profile_content) self.assertEqual(os.environ["FOOO"], "bar:foo") @patch("umake.tools.os.path.expanduser") def test_add_env_to_user_not_keep(self, expanderusermock): """Test that adding to user env without keep replace an existing env""" os.environ["FOOO"] = "foo" expanderusermock.return_value = self.local_dir profile_file = os.path.join(self.local_dir, ".profile") open(profile_file, 'w').write("Foo\nBar\n") tools.add_env_to_user("one path addition", {"FOOO": {"value": "bar", "keep": False}}) expanderusermock.assert_called_with('~') profile_content = open(profile_file).read() self.assertTrue("Foo\nBar\n" in profile_content, profile_content) # we kept previous content self.assertTrue("export FOOO=bar\n" in profile_content, profile_content) self.assertTrue("bar" in os.environ["FOOO"], os.environ["FOOO"]) self.assertFalse("foo" in os.environ["FOOO"], os.environ["FOOO"]) self.assertEqual(os.environ["FOOO"], "bar") @patch("umake.tools.os.path.expanduser") def test_add_env_to_user_empty_file(self, expanderusermock): """Test that adding to user env append to an non existing .profile file""" expanderusermock.return_value = self.local_dir profile_file = os.path.join(self.local_dir, ".profile") tools.add_env_to_user("one path addition", {"FOOO": {"value": "/tmp/foo"}}) expanderusermock.assert_called_with('~') profile_content = open(profile_file).read() self.assertTrue("export FOOO=/tmp/foo\n" in profile_content, profile_content) self.assertTrue("/tmp/foo" in os.environ["FOOO"], os.environ["FOOO"]) @patch("umake.tools.os.path.expanduser") def test_add_to_user_path_twice(self, expanderusermock): """Test that adding to user env twice doesn't add it twice in the file""" expanderusermock.return_value = self.local_dir profile_file = os.path.join(self.local_dir, ".profile") open(profile_file, 'w').write("Foo\nBar\n") tools.add_env_to_user("add twice", {"FOOO": {"value": "/tmp/foo"}}) expanderusermock.assert_called_with('~') profile_content = open(profile_file).read() self.assertTrue("Foo\nBar\n" in profile_content, profile_content) # we kept previous content self.assertTrue("export FOOO=/tmp/foo\n" in profile_content, profile_content) tools.add_env_to_user("add twice", {"FOOO": {"value": "/tmp/foo"}}) # ensure, it's only there once profile_content = open(profile_file).read() self.assertEqual(profile_content.count("export FOOO=/tmp/foo"), 1, profile_content) @patch("umake.tools.os.path.expanduser") def test_add_to_user_path_twice_with_new_content(self, expanderusermock): """Test that adding to some env twice for same framework only add the latest""" expanderusermock.return_value = self.local_dir profile_file = os.path.join(self.local_dir, ".profile") open(profile_file, 'w').write("Foo\nBar\n") tools.add_env_to_user("add twice", {"FOOO": {"value": "/tmp/foo"}}) expanderusermock.assert_called_with('~') profile_content = open(profile_file).read() self.assertTrue("Foo\nBar\n" in profile_content, profile_content) # we kept previous content self.assertTrue("export FOOO=/tmp/foo\n" in profile_content, profile_content) tools.add_env_to_user("add twice", {"FOOO": {"value": "/tmp/bar"}}) # ensure, it's only there once profile_content = open(profile_file).read() self.assertEqual(profile_content.count("export FOOO=/tmp/bar"), 1, profile_content) @patch("umake.tools.os.path.expanduser") def test_add_to_user_path_twice_other_framework(self, expanderusermock): """Test that adding to user env with another framework add them twice""" expanderusermock.return_value = self.local_dir profile_file = os.path.join(self.local_dir, ".profile") open(profile_file, 'w').write("Foo\nBar\n") tools.add_env_to_user("add twice", {"FOOO": {"value": "/tmp/foo"}}) expanderusermock.assert_called_with('~') profile_content = open(profile_file).read() self.assertTrue("Foo\nBar\n" in profile_content, profile_content) # we kept previous content self.assertTrue("export FOOO=/tmp/foo\n" in profile_content, profile_content) tools.add_env_to_user("add twice with other framework", {"BAR": {"value": "/tmp/bar"}}) # ensure, it's only there once profile_content = open(profile_file).read() self.assertTrue("export FOOO=/tmp/foo\n" in profile_content, profile_content) self.assertTrue("export BAR=/tmp/bar\n" in profile_content, profile_content) @patch("umake.tools.os.path.expanduser") def test_add_env_to_user_multiple(self, expanderusermock): """Test that adding to user with multiple env for same framework appending to an existing .profile file""" expanderusermock.return_value = self.local_dir profile_file = os.path.join(self.local_dir, ".profile") open(profile_file, 'w').write("Foo\nBar\n") tools.add_env_to_user("one path addition", {"FOOO": {"value": "bar"}, "BAR": {"value": "foo"}}) expanderusermock.assert_called_with('~') profile_content = open(profile_file).read() self.assertTrue("Foo\nBar\n" in profile_content, profile_content) # we kept previous content self.assertTrue("export FOOO=bar\n" in profile_content, profile_content) self.assertTrue("export BAR=foo\n" in profile_content, profile_content) self.assertEqual(os.environ["FOOO"], "bar") self.assertEqual(os.environ["BAR"], "foo") @patch("umake.tools.os.path.expanduser") def test_add_path_to_user(self, expanderusermock): """Test that adding to user path doesn't export as PATH is already exported""" expanderusermock.return_value = self.local_dir profile_file = os.path.join(self.local_dir, ".profile") open(profile_file, 'w').write("Foo\nBar\n") tools.add_env_to_user("one path addition", {"PATH": {"value": "/tmp/bar"}}) expanderusermock.assert_called_with('~') profile_content = open(profile_file).read() self.assertTrue("Foo\nBar\n" in profile_content, profile_content) # we kept previous content self.assertTrue("\nPATH=/tmp/bar:$PATH\n" in profile_content, profile_content) self.assertTrue("/tmp/bar" in os.environ["PATH"], os.environ["PATH"]) @patch("umake.tools.os.path.expanduser") def test_remove_user_env(self, expanderusermock): """Remove an env from a user setup""" expanderusermock.return_value = self.local_dir profile_file = os.path.join(self.local_dir, ".profile") open(profile_file, 'w').write("Foo\nBar\n# Ubuntu make installation of framework A" "\nexport FOO=bar\n\nexport BAR=baz") tools.remove_framework_envs_from_user("framework A") profile_content = open(profile_file).read() self.assertEqual(profile_content, "Foo\nBar\nexport BAR=baz") @patch("umake.tools.os.path.expanduser") def test_remove_user_env_end(self, expanderusermock): """Remove an env from a user setup being at the end of profile file""" expanderusermock.return_value = self.local_dir profile_file = os.path.join(self.local_dir, ".profile") open(profile_file, 'w').write("Foo\nBar\n# Ubuntu make installation of framework A" "\nexport FOO=bar\n\n") tools.remove_framework_envs_from_user("framework A") profile_content = open(profile_file).read() self.assertEqual(profile_content, "Foo\nBar\n") @patch("umake.tools.os.path.expanduser") def test_remove_user_env_not_found(self, expanderusermock): """Remove an env from a user setup with no matching content found""" expanderusermock.return_value = self.local_dir profile_file = os.path.join(self.local_dir, ".profile") open(profile_file, 'w').write("Foo\nBar\nexport BAR=baz") tools.remove_framework_envs_from_user("framework A") profile_content = open(profile_file).read() self.assertEqual(profile_content, "Foo\nBar\nexport BAR=baz") @patch("umake.tools.os.path.expanduser") def test_remove_user_env_no_file(self, expanderusermock): """Remove an env from a user setup with no profile file""" expanderusermock.return_value = self.local_dir profile_file = os.path.join(self.local_dir, ".profile") tools.remove_framework_envs_from_user("framework A") self.assertRaises(FileNotFoundError, open, profile_file) @patch("umake.tools.os.path.expanduser") def test_remove_user_env_multiple_frameworks(self, expanderusermock): """Remove an env from a user setup restraining to the correct framework""" expanderusermock.return_value = self.local_dir profile_file = os.path.join(self.local_dir, ".profile") open(profile_file, 'w').write("Foo\nBar\n# Ubuntu make installation of framework B\nexport BAR=bar\n\n" "# Ubuntu make installation of framework A\nexport FOO=bar\n\nexport BAR=baz") tools.remove_framework_envs_from_user("framework A") profile_content = open(profile_file).read() self.assertEqual(profile_content, "Foo\nBar\n# Ubuntu make installation of framework B\nexport BAR=bar\n\n" "export BAR=baz") @patch("umake.tools.os.path.expanduser") def test_remove_user_env_multiple_lines(self, expanderusermock): """Remove an env from a user setup having multiple lines""" expanderusermock.return_value = self.local_dir profile_file = os.path.join(self.local_dir, ".profile") open(profile_file, 'w').write("Foo\nBar\n# Ubuntu make installation of framework A" "\nexport FOO=bar\nexport BOO=foo\n\nexport BAR=baz") tools.remove_framework_envs_from_user("framework A") profile_content = open(profile_file).read() self.assertEqual(profile_content, "Foo\nBar\nexport BAR=baz") @patch("umake.tools.os.path.expanduser") def test_remove_user_multiple_same_framework(self, expanderusermock): """Remove an env from a user setup, same framework being repeated multiple times""" expanderusermock.return_value = self.local_dir profile_file = os.path.join(self.local_dir, ".profile") open(profile_file, 'w').write("Foo\nBar\n# Ubuntu make installation of framework A\nexport BAR=bar\n\n" "# Ubuntu make installation of framework A\nexport FOO=bar\n\nexport BAR=baz") tools.remove_framework_envs_from_user("framework A") profile_content = open(profile_file).read() self.assertEqual(profile_content, "Foo\nBar\nexport BAR=baz") @patch("umake.tools.os.path.expanduser") def test_remove_user_env_zsh(self, expanderusermock): """Remove an env from a user setup using zsh""" os.environ['SHELL'] = '/bin/zsh' expanderusermock.return_value = self.local_dir profile_file = os.path.join(self.local_dir, ".zprofile") open(profile_file, 'w').write("Foo\nBar\n# Ubuntu make installation of framework A" "\nexport FOO=bar\n\nexport BAR=baz") tools.remove_framework_envs_from_user("framework A") profile_content = open(profile_file).read() self.assertEqual(profile_content, "Foo\nBar\nexport BAR=baz") class TestUserShell(LoggedTestCase): def setUp(self): super().setUp() self.orig_environ = os.environ.copy() os.environ['SHELL'] = '/bin/bash' def tearDown(self): os.environ = self.orig_environ.copy() super().tearDown() def test_return_shell_bash(self): """Default setup should change the bash profile""" self.assertTrue(tools._get_shell_profile_file_path().endswith(".profile")) def test_can_override_zsh_with_SHELL(self): """Can return zsh profile if set""" os.environ['SHELL'] = '/bin/zsh' self.assertTrue(tools._get_shell_profile_file_path().endswith(".zprofile")) def test_return_bash_if_nosense(self): """Return bash if content is garbage""" os.environ['SHELL'] = 'contain_nothing' self.assertTrue(tools._get_shell_profile_file_path().endswith(".profile")) def test_return_bash_if_empty(self): """Return bash if no key""" os.environ.pop('SHELL') self.assertTrue(tools._get_shell_profile_file_path().endswith(".profile")) ubuntu-make-18.09+disco1/tests/small/test_ui.py0000644000000000000000000001421113352651520016335 0ustar # -*- coding: utf-8 -*- # Copyright (C) 2014 Canonical # # Authors: # Didier Roche # # 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; version 3. # # 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 """Tests for the generic ui module""" from concurrent import futures from gi.repository import GLib from time import time from unittest.mock import Mock, patch from ..tools import LoggedTestCase import threading from umake.tools import MainLoop, Singleton from umake.ui import UI class TestUI(LoggedTestCase): """This will test the UI generic module""" def setUp(self): super().setUp() self.mockUIPlug = Mock() self.mockUIPlug._display.side_effect = self.display_UIPlug self.contentType = Mock() self.ui = UI(self.mockUIPlug) self.mainloop_object = MainLoop() self.mainloop_thread = None self.function_thread = None self.display_thread = None self.time_display_call = 0 def tearDown(self): Singleton._instances = {} super().tearDown() # function that will complete once the mainloop is started def wait_for_mainloop_function(self): timeout_time = time() + 5 while not self.mainloop_object.mainloop.is_running(): if time() > timeout_time: raise(BaseException("Mainloop not started in 5 seconds")) def wait_for_mainloop_shutdown(self): timeout_time = time() + 5 while self.mainloop_object.mainloop.is_running(): if time() > timeout_time: raise(BaseException("Mainloop not stopped in 5 seconds")) def get_mainloop_thread(self): self.mainloop_thread = threading.current_thread().ident def start_glib_mainloop(self): # quit after 5 seconds if nothing made the mainloop to end GLib.timeout_add_seconds(5, self.mainloop_object.mainloop.quit) GLib.idle_add(self.get_mainloop_thread) self.mainloop_object.run() def display_UIPlug(self, contentType): """handler to mock _display and save the current thread""" self.time_display_call = time() self.assertEqual(self.contentType, contentType) self.display_thread = threading.current_thread().ident self.mainloop_object.quit(raise_exception=False) def test_singleton(self): """Ensure we are delivering a singleton for UI""" other = UI(self.mockUIPlug) self.assertEqual(self.ui, other) def test_return_to_mainscreen(self): """We call the return to main screen on the UIPlug""" UI.return_main_screen() self.assertTrue(self.mockUIPlug._return_main_screen.called) @patch("umake.tools.sys") def test_call_display(self, mocksys): """We call the display method from the UIPlug""" UI.display(self.contentType) self.start_glib_mainloop() self.wait_for_mainloop_shutdown() self.assertTrue(self.mockUIPlug._display.called) self.assertIsNotNone(self.mainloop_thread) self.assertIsNotNone(self.display_thread) self.assertEqual(self.mainloop_thread, self.display_thread) @patch("umake.tools.sys") def test_call_display_other_thread(self, mocksys): """We call the display method on UIPlug in the main thread from another thread""" def run_display(future): self.function_thread = threading.current_thread().ident UI.display(self.contentType) executor = futures.ThreadPoolExecutor(max_workers=1) future = executor.submit(self.wait_for_mainloop_function) future.add_done_callback(run_display) self.start_glib_mainloop() self.wait_for_mainloop_shutdown() self.assertTrue(self.mockUIPlug._display.called) self.assertIsNotNone(self.mainloop_thread) self.assertIsNotNone(self.function_thread) self.assertIsNotNone(self.display_thread) self.assertNotEqual(self.mainloop_thread, self.function_thread) self.assertEqual(self.mainloop_thread, self.display_thread) @patch("umake.tools.sys") def test_call_delayed_display(self, mocksys): """We call the display method from the UIPlug in delayed_display with 50ms waiting""" UI.delayed_display(self.contentType) now = time() self.start_glib_mainloop() self.wait_for_mainloop_shutdown() self.assertTrue(self.mockUIPlug._display.called) self.assertIsNotNone(self.mainloop_thread) self.assertIsNotNone(self.display_thread) self.assertEqual(self.mainloop_thread, self.display_thread) self.assertTrue(self.time_display_call - now > 0.05) @patch("umake.tools.sys") def test_call_delayed_display_from_other_thread(self, mocksys): """We call the display method from the UIPlug in delayed_display with 50ms waiting, even on other thread""" now = 0 def run_display(future): nonlocal now self.function_thread = threading.current_thread().ident now = time() UI.delayed_display(self.contentType) executor = futures.ThreadPoolExecutor(max_workers=1) future = executor.submit(self.wait_for_mainloop_function) future.add_done_callback(run_display) self.start_glib_mainloop() self.wait_for_mainloop_shutdown() self.assertTrue(self.mockUIPlug._display.called) self.assertIsNotNone(self.mainloop_thread) self.assertIsNotNone(self.function_thread) self.assertIsNotNone(self.display_thread) self.assertNotEqual(self.mainloop_thread, self.function_thread) self.assertEqual(self.mainloop_thread, self.display_thread) self.assertTrue(self.time_display_call - now > 0.05) ubuntu-make-18.09+disco1/tests/tools/0000755000000000000000000000000013415340675014346 5ustar ubuntu-make-18.09+disco1/tests/tools/__init__.py0000644000000000000000000001513513352651520016456 0ustar # -*- coding: utf-8 -*- # Copyright (C) 2014 Canonical # # Authors: # Didier Roche # # 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; version 3. # # 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 """Common tools between tests""" # DO NOT IMPORT HERE umake.* directly, only lazy import it in function. # This file is imported by runtests, before the coverage is enabled. from io import StringIO from contextlib import contextmanager, suppress from copy import deepcopy import grp import importlib import logging import os import re import shutil import xdg.BaseDirectory import pexpect from unittest import TestCase from unittest.mock import Mock logger = logging.getLogger(__name__) BRANCH_TESTS = False DOCKER = None UMAKE = "umake" INSTALL_DIR = ".local/share/umake" SYSTEM_UMAKE_DIR = "/usr/lib/python3/dist-packages/umake" class LoggedTestCase(TestCase): """A base TestCase class which asserts if there is a warning or error unless self.expect_warn_error is True""" def setUp(self): super().setUp() self.error_warn_logs = StringIO() self.__handler = logging.StreamHandler(self.error_warn_logs) self.__handler.setLevel(logging.WARNING) logging.root.addHandler(self.__handler) self.expect_warn_error = False def tearDown(self): super().tearDown() logging.root.removeHandler(self.__handler) if self.expect_warn_error: self.assertNotEqual(self.error_warn_logs.getvalue(), "") else: self.assertEqual(self.error_warn_logs.getvalue(), "") self.error_warn_logs.close() def get_data_dir(): """Return absolute data dir path""" return os.path.abspath(os.path.join(os.path.dirname(__file__), '..', 'data')) def get_root_dir(): """Return absolute project root dir path""" return os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "..")) def get_tools_helper_dir(): """Return an absolute path to where the runner helpers are""" return os.path.abspath(os.path.dirname(__file__)) def assert_files_identicals(filename1, filename2): """Assert if the files content are identical""" if open(filename1).read() != open(filename2).read(): logger.error("{}: {}\n{}: {}".format(filename1, open(filename1).read(), filename2, open(filename2).read())) raise AssertionError("{} and {} aren't identical".format(filename1, filename2)) class CopyingMock(Mock): """Mock for recording calls with mutable arguments""" def __call__(self, *args, **kwargs): args = deepcopy(args) kwargs = deepcopy(kwargs) return super().__call__(*args, **kwargs) def change_xdg_path(key, value=None, remove=False): if value: os.environ[key] = value if remove: with suppress(KeyError): os.environ.pop(key) import umake.tools importlib.reload(xdg.BaseDirectory) with suppress(KeyError): umake.tools.Singleton._instances.pop(umake.tools.ConfigHandler) umake.tools.xdg_config_home = xdg.BaseDirectory.xdg_config_home umake.tools.xdg_data_home = xdg.BaseDirectory.xdg_data_home @contextmanager def patchelem(element, attr, value): old_value = getattr(element, attr) setattr(element, attr, value) yield setattr(element, attr, old_value) def manipulate_path_env(value, remove=False): """prepend value to PATH environment. If remove is true, remove it""" path = os.environ["PATH"].split(os.pathsep) if remove: path.remove(value) else: path.insert(0, value) os.environ["PATH"] = os.pathsep.join(path) @contextmanager def swap_file_and_restore(filepath): """Let changing the file in the context manager and restore to original one if needed""" try: original_content = open(filepath).read() yield original_content finally: open(filepath, 'w').write(original_content) def set_local_umake(): global UMAKE global BRANCH_TESTS UMAKE = "./bin/umake" BRANCH_TESTS = True def get_docker_path(): global DOCKER if DOCKER is None: DOCKER = shutil.which("docker.io") if not DOCKER: DOCKER = shutil.which("docker") return DOCKER def local_which(filename): """Find filename in $PATH and return it if present""" for dir in os.environ["PATH"].split(os.pathsep): file_path = os.path.join(dir, filename) if os.path.isfile(file_path): return file_path return None def get_desktop_file_path(desktop_filename): """get the desktop file path""" if not desktop_filename: return "" from umake.tools import get_launcher_path importlib.reload(xdg.BaseDirectory) return get_launcher_path(desktop_filename) def get_path_from_desktop_file(desktop_filename, key): """get the path referred as key in the desktop filename exists""" desktop_file_path = get_desktop_file_path(desktop_filename) if not get_desktop_file_path(desktop_file_path): return "" path = "" with open(desktop_file_path) as f: for line in f: p = re.search(r'{}=(.*)'.format(key), line) with suppress(AttributeError): path = p.group(1) # sanitize the field with unescaped quotes for separator in ('"', "'", " "): elem_paths = path.split(separator) path = "" for elem in elem_paths: if not elem: continue # the separator was escaped, read the separator element if elem[-1] == "\\": elem += separator path += elem # stop for current sep at first unescaped separator if not path.endswith("\\" + separator): break return path def is_in_group(group): """return if current user is in a group""" for group_name in [g.gr_name for g in grp.getgrall() if os.environ["USER"] in g.gr_mem]: print(group_name) if group_name == group: return True return False def spawn_process(command): """return a handle to a new controllable child process""" return pexpect.spawnu(command, dimensions=(24, 250)) ubuntu-make-18.09+disco1/tests/tools/check_and_kill_process0000755000000000000000000000301013352651520020730 0ustar #!/usr/bin/env python3 # -*- coding: utf-8 -*- # Copyright (C) 2014 Canonical # # Authors: # Didier Roche # # 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; version 3. # # 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 from contextlib import suppress import os import signal import sys kill_process = sys.argv[1] == "True" process_grep = sys.argv[2:] for pid in os.listdir('/proc'): if not pid.isdigit() or int(pid) == os.getpid(): continue # ignore processes that are closed in between with suppress(IOError): cmdline = open(os.path.join('/proc', pid, 'cmdline'), 'r').read() for process_elem in process_grep: if process_elem not in cmdline or "run_in_umake_dir" in cmdline or sys.argv[0] in cmdline: break # we found it else: signal_to_send = signal.SIGTERM if kill_process: signal_to_send = signal.SIGKILL os.kill(int(pid), signal_to_send) sys.exit(0) sys.exit(1) ubuntu-make-18.09+disco1/tests/tools/check_launcher_exists_and_is_pinned0000755000000000000000000000173413352651520023502 0ustar #!/usr/bin/env python3 # -*- coding: utf-8 -*- # Copyright (C) 2014 Canonical # # Authors: # Didier Roche # # 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; version 3. # # 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 import os import sys sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), "..", ".."))) from umake.tools import launcher_exists_and_is_pinned if launcher_exists_and_is_pinned(sys.argv[1]): sys.exit(0) sys.exit(1) ubuntu-make-18.09+disco1/tests/tools/check_user_in_group0000755000000000000000000000167013352651520020307 0ustar #!/usr/bin/env python3 # -*- coding: utf-8 -*- # Copyright (C) 2014 Canonical # # Authors: # Didier Roche # # 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; version 3. # # 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 import os import sys sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), "..", ".."))) from tests.tools import is_in_group if is_in_group(sys.argv[1]): sys.exit(0) sys.exit(1) ubuntu-make-18.09+disco1/tests/tools/get_file_perms0000755000000000000000000000150413352651520017252 0ustar #!/usr/bin/env python3 # -*- coding: utf-8 -*- # Copyright (C) 2015 Canonical # # Authors: # Didier Roche # # 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; version 3. # # 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 import os import stat import sys print(stat.filemode(os.stat(sys.argv[1]).st_mode)) ubuntu-make-18.09+disco1/tests/tools/get_launcher_path0000755000000000000000000000166313352651520017750 0ustar #!/usr/bin/env python3 # -*- coding: utf-8 -*- # Copyright (C) 2015 Canonical # # Authors: # Didier Roche # # 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; version 3. # # 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 import os import sys sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), "..", ".."))) from tests.tools import get_desktop_file_path print(get_desktop_file_path(sys.argv[1])) ubuntu-make-18.09+disco1/tests/tools/get_path_from_desktop_file0000755000000000000000000000171213352651520021635 0ustar #!/usr/bin/env python3 # -*- coding: utf-8 -*- # Copyright (C) 2015 Canonical # # Authors: # Didier Roche # # 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; version 3. # # 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 import os import sys sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), "..", ".."))) from tests.tools import get_path_from_desktop_file print(get_path_from_desktop_file(sys.argv[1], sys.argv[2])) ubuntu-make-18.09+disco1/tests/tools/local_server.py0000644000000000000000000002270413352651520017377 0ustar # -*- coding: utf-8 -*- # Copyright (C) 2014 Canonical # # Authors: # Didier Roche # # 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; version 3. # # 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 """Class enabling having a local http(s) server""" from concurrent import futures from http.server import HTTPServer, SimpleHTTPRequestHandler import http.cookies import logging import os import posixpath import ssl from . import get_data_dir import urllib import urllib.parse logger = logging.getLogger(__name__) # TO CREATE THE CERTIFICATES: # openssl req -new -x509 -nodes -days 3600 -out server.crt -keyout server.key (file the fqdn name) # cat server.key server.crt > server.pem # server loads the server.pem # put the .crt file in /usr/local/share/ca-certificates and run sudo update-ca-certificates class LocalHttp: """Local threaded http server. will be serving path content""" def __init__(self, path, multi_hosts=False, use_ssl=[], port=9876, ftp_redir=False): """path is the local path to server multi_hosts will transfer http://hostname/foo to path/hostname/foo. This is used when we potentially serve multiple paths. set use_ssl to a specific array of hostnames. We'll use the corresponding certificates. """ self.port = port self.path = path self.use_ssl = use_ssl handler = RequestHandler handler.root_path = path handler.multi_hosts = multi_hosts handler.ftp_redir = ftp_redir # can be TCPServer, but we don't have a self.httpd.server_name then self.httpd = HTTPServer(("", self.port), RequestHandler) handler.hostname = self.httpd.server_name # create ssl certificate handling for SNI case (switching between different host name) self.ssl_contexts = {} context_associated = False for hostname in self.use_ssl: pem_file = os.path.join(get_data_dir(), "{}.pem".format(hostname)) if os.path.isfile(pem_file): context = ssl.SSLContext(ssl.PROTOCOL_TLSv1) context.load_cert_chain(pem_file) self.ssl_contexts[hostname] = context if not context_associated: context_associated = True self.httpd.socket = context.wrap_socket(self.httpd.socket, server_side=True) context.set_servername_callback(self._match_sni_context) executor = futures.ThreadPoolExecutor(max_workers=1) self.future = executor.submit(self._serve) def _match_sni_context(self, ssl_sock, server_name, initial_context): """return matching certificates to the current request""" logger.info("Request on {}".format(server_name)) try: ssl_sock.context = self.ssl_contexts[server_name] except KeyError: logger.warning("Didn't find corresponding context on this server for {}, keeping default" .format(server_name)) def _serve(self): logger.info("Serving locally from {} on {}".format(self.path, self.get_address())) self.httpd.serve_forever() def get_address(self, localhost=False): """Get public address""" server_name = 'localhost' if localhost else self.httpd.server_name return "http{}://{}:{}".format("s" if self.use_ssl else "", server_name, self.port) def stop(self): """Stop local server""" logger.info("Stopping serving on {}".format(self.port)) self.httpd.shutdown() self.httpd.socket.close() class RequestHandler(SimpleHTTPRequestHandler): root_path = os.getcwd() def __init__(self, request, client_address, server): self.headers_to_send = [] super().__init__(request, client_address, server) def end_headers(self): """don't send Content-Length header for a particular file""" # we can send 404, so ensure that we have a valid path attribute if hasattr(self, "path") and self.path.endswith("-with-no-content-length"): for current_header in self._headers_buffer: if current_header.decode("UTF-8").startswith("Content-Length"): self._headers_buffer.remove(current_header) for key, value in self.headers_to_send: self.send_header(key, value) super().end_headers() def translate_path(self, path): """translate path given routes Most of it is a copy of the parent function which can't be override and uses cwd """ # Before we actually abandon the query params, see if they match an # actual file. # Need to strip the leading '/' so the join will actually work. current_root_path = RequestHandler.root_path if RequestHandler.multi_hosts: current_root_path = os.path.join(RequestHandler.root_path, self.headers["Host"].split(":")[0]) file_path = posixpath.normpath(urllib.parse.unquote(path))[1:] file_path = os.path.join(current_root_path, file_path) if os.path.exists(file_path): return file_path # abandon query parameters path = path.split('?', 1)[0] path = path.split('#', 1)[0] path = path.split('&', 1)[0] # Don't forget explicit trailing slash when normalizing. Issue17324 trailing_slash = path.rstrip().endswith('/') path = posixpath.normpath(urllib.parse.unquote(path)) words = path.split('/') words = filter(None, words) # root path isn't cwd but the one we specified and translated path = current_root_path for word in words: drive, word = os.path.splitdrive(word) head, word = os.path.split(word) if word in (os.curdir, os.pardir): continue path = os.path.join(path, word) if trailing_slash: path += '/' return path def do_GET(self): """Override this to enable redirecting paths that end in -redirect or rewrite in presence of ?file=""" cookies = http.cookies.SimpleCookie(self.headers['Cookie']) if 'int' in cookies: cookies['int'] = int(cookies['int'].value) + 1 for cookie in cookies.values(): self.headers_to_send.append(('Set-Cookie', cookie.OutputString(None))) if self.path.endswith('-redirect'): self.send_response(302) self.send_header('Location', self.path[:-len('-redirect')]) self.end_headers() elif 'setheaders' in self.path: # For paths that end with '-setheaders', we fish out the headers from the query # params and set them. url = urllib.parse.urlparse(self.path) params = urllib.parse.parse_qs(url.query) for key, values in params.items(): for value in values: self.headers_to_send.append((key, value)) # Now we need to chop off the '-setheaders' part. self.path = url.path[:-len('-setheaders')] super().do_GET() elif 'headers' in self.path: # For paths that end with '-headers', we check if the request actually # contains the header with the specified value. The expected header key # and value are in the query params. url = urllib.parse.urlparse(self.path) params = urllib.parse.parse_qs(url.query) for key in params: if self.headers[key] != params[key][0]: self.send_error(404) # Now we need to chop off the '-headers' part. self.path = url.path[:-len('-headers')] super().do_GET() else: # keep special ?file= to redirect the query if '?file=' in self.path: # Eclipse frameworks: # Redirect the checksum to the old path to keep different filenames # on the mock server. if '/downloads/sums.php?file=' in self.path: self.path += '.sha512' self.path = self.path.split('?file=', 1)[1] self.path = self.path.replace('&', '?', 1) # Replace the first & with ? to make it valid. if RequestHandler.ftp_redir: self.send_response(302) # We need to remove the query parameters, so we actually parse the URL. parsed_url = urllib.parse.urlparse(self.path) new_loc = 'ftp://' + RequestHandler.hostname + parsed_url.path self.send_header('Location', new_loc) self.end_headers() return super().do_GET() def log_message(self, fmt, *args): """Log an arbitrary message. override from SimpleHTTPRequestHandler to not output to stderr but log in the logging system """ logger.debug("%s - - [%s] %s\n" % (self.address_string(), self.log_date_time_string(), fmt % args)) ubuntu-make-18.09+disco1/tests/tools/path_exists0000755000000000000000000000150113352651520016616 0ustar #!/usr/bin/env python3 # -*- coding: utf-8 -*- # Copyright (C) 2014 Canonical # # Authors: # Didier Roche # # 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; version 3. # # 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 import os import sys if os.path.exists(sys.argv[1]): sys.exit(0) sys.exit(1) ubuntu-make-18.09+disco1/tests/tools/remove_path0000755000000000000000000000154013352651520016577 0ustar #!/usr/bin/env python3 # -*- coding: utf-8 -*- # Copyright (C) 2014 Canonical # # Authors: # Didier Roche # # 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; version 3. # # 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 import os import sys import shutil try: os.remove(sys.argv[1]) except OSError: shutil.rmtree(sys.argv[1])ubuntu-make-18.09+disco1/tests/tools/run_in_umake_dir0000755000000000000000000000151413352651520017601 0ustar #!/bin/bash # Copyright (C) 2014 Canonical # # Authors: # Didier Roche # # 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; version 3. # # 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 cd $1 shift [[ $(env | grep VIRTUAL_ENV) == *env ]] && . env/bin/activate export $(dbus-launch) command=$@ bash -l -c "$command" ubuntu-make-18.09+disco1/tests/tools/run_in_umake_dir_async0000755000000000000000000000162613352651520021002 0ustar #!/bin/bash # Copyright (C) 2014 Canonical # # Authors: # Didier Roche # # 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; version 3. # # 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 # setup dbus environment and launch a command, pwd being the umake dir. # Start command in async mode cd $1 shift [[ $(env | grep VIRTUAL_ENV) == *env ]] && . env/bin/activate export $(dbus-launch) $@ & ubuntu-make-18.09+disco1/tests/tools/run_local_server0000755000000000000000000000260713352651520017637 0ustar #!/usr/bin/env python3 # -*- coding: utf-8 -*- # Copyright (C) 2014 Canonical # # Authors: # Didier Roche # # 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; version 3. # # 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 import logging import os import sys sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), "..", ".."))) sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))) import sys from tools import get_data_dir from tools.local_server import LocalHttp logging.basicConfig(level=logging.DEBUG, format="%(asctime)s [%(name)s] %(levelname)s: %(message)s") # start a connection hostname = sys.argv[2] ftp_redir = (sys.argv[2].lower() == 'true') server_dir = os.path.join(get_data_dir(), "server-content") LocalHttp(server_dir, multi_hosts=True, port=int(sys.argv[1]), use_ssl=sys.argv[3:], ftp_redir=ftp_redir) ubuntu-make-18.09+disco1/tests/tools/sign-asset0000755000000000000000000000141413352651520016343 0ustar #!/bin/sh set -e usage="$(basename "$0") [-h] file_to_sign asc_public_sig -- create a temporary gpg key, sign and publish a public signature where: -h show this help text file_to_sign: path to the file to sign with this new gpg key. a .sig file alongside will be created. asc_public_sig: path to the public gpg key signature. This one will be appended A temporary gpg key is created and then deleted" if [ $# -ne 2 ] || [ $1 = '-h' ] || [ $2 = '-h' ]; then echo "$usage" exit fi tmpdir=`mktemp -d` chmod 700 $tmpdir gpg --homedir $tmpdir --gen-key --batch << EOF Key-Type: DSA Name-Email: ubuntu-make@ubuntu.com Expire-Date: 0 EOF gpg --homedir $tmpdir --armor -b --sign $1 mv $1.asc $1.sig gpg --homedir $tmpdir --armor --export >> $2 rm -rf $tmpdir ubuntu-make-18.09+disco1/umake/0000755000000000000000000000000013415342711013137 5ustar ubuntu-make-18.09+disco1/umake/__init__.py0000644000000000000000000001254713352651520015262 0ustar # -*- coding: utf-8 -*- # Copyright (C) 2014 Canonical # # Authors: # Didier Roche # # 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; version 3. # # 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 import argparse import gettext from gettext import gettext as _ import locale import logging import logging.config import os import sys from umake.frameworks import BaseCategory, load_frameworks from umake.tools import MainLoop from .ui import cli import yaml logger = logging.getLogger(__name__) # if set locale isn't installed, don't load up translations (we don't know what's the locale # user encoding is and python3 will fallback to ANSI_X3.4-1968, which isn't UTF-8 and creates # thus UnicodeEncodeError) try: locale.setlocale(locale.LC_ALL, '') gettext.textdomain("ubuntu-make") except locale.Error: logger.debug("Couldn't load default locale {}, fallback to English".format(locale.LC_ALL)) _default_log_level = logging.WARNING _datadir = None def _setup_logging(env_key='LOG_CFG', level=_default_log_level): """Setup logging configuration Order of preference: - manually define level - env_key env variable if set (logging config file) - fallback to _default_log_level """ path = os.getenv(env_key, '') logging.basicConfig(level=level, format="%(levelname)s: %(message)s") if level == _default_log_level: if os.path.exists(path): with open(path, 'rt') as f: config = yaml.load(f.read()) logging.config.dictConfig(config) logging.info("Logging level set to {}".format(logging.getLevelName(logging.root.getEffectiveLevel()))) def set_logging_from_args(args, parser): """Choose logging ignoring any unknown sys.argv options""" result_verbosity_arg = [] for arg in args: if arg.startswith("-v"): for char in arg: if char not in ['-', 'v']: break else: result_verbosity_arg.append(arg) args = parser.parse_args(result_verbosity_arg) # setup logging level if set by the command line if args.verbose == 1: _setup_logging(level=logging.INFO) elif args.verbose > 1: _setup_logging(level=logging.DEBUG) else: _setup_logging() def should_load_all_frameworks(args): """Set partial or complete framework loading condition based on arg""" for arg in args[1:]: if arg in ["-l", "--list", "--list-installed", "--list-available"]: return True return False class _HelpAction(argparse._HelpAction): def __call__(self, parser, namespace, values, option_string=None): parser.print_help() # retrieve subparsers from parser subparsers_actions = [ action for action in parser._actions if isinstance(action, argparse._SubParsersAction)] for subparsers_action in subparsers_actions: # get all subparsers and print help for choice, subparser in subparsers_action.choices.items(): print(_("* Command '{}':").format(choice)) print(subparser.format_help()) parser.exit() def main(): """Main entry point of the program""" if "udtc" in sys.argv[0]: print(_("WARNING: 'udtc' command is the previous name of Ubuntu Make. Please use the 'umake' command from now " "on providing the exact same features. The 'udtc' command will be removed soon.")) parser = argparse.ArgumentParser(description=_("Deploy and setup developers environment easily on ubuntu"), epilog=_("Note that you can also configure different debug logging behavior using " "LOG_CFG that points to a log yaml profile."), add_help=False) parser.add_argument('--help', action=_HelpAction, help=_('Show this help')) # add custom help parser.add_argument("-v", "--verbose", action="count", default=0, help=_("Increase output verbosity (2 levels)")) parser.add_argument('-r', '--remove', action="store_true", help=_("Remove specified framework if installed")) list_group = parser.add_argument_group("List frameworks").add_mutually_exclusive_group() list_group.add_argument('-l', '--list', action="store_true", help=_("List all frameworks")) list_group.add_argument('--list-installed', action="store_true", help=_("List installed frameworks")) list_group.add_argument('--list-available', action="store_true", help=_("List installable frameworks")) parser.add_argument('--version', action="store_true", help=_("Print version and exit")) # set logging ignoring unknown options set_logging_from_args(sys.argv, parser) mainloop = MainLoop() # load frameworks load_frameworks(force_loading=should_load_all_frameworks(sys.argv)) # initialize parser cli.main(parser) mainloop.run() ubuntu-make-18.09+disco1/umake/__pycache__/0000755000000000000000000000000013415342711015347 5ustar ubuntu-make-18.09+disco1/umake/decompressor.py0000644000000000000000000001433213352651520016222 0ustar # -*- coding: utf-8 -*- # Copyright (C) 2014 Canonical # # Authors: # Didier Roche # # 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; version 3. # # 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 from collections import namedtuple from concurrent import futures from glob import glob import logging import os import shutil import stat import subprocess import tarfile import tempfile import zipfile logger = logging.getLogger(__name__) class Decompressor: """Handle decompression of various file in separate threads""" DecompressOrder = namedtuple("DecompressOrder", ["dir", "dest"]) DecompressResult = namedtuple("DecompressResult", ["error"]) # override _extract_member to preserve file permissions: # http://bugs.python.org/issue15795 class ZipFileWithPerm(zipfile.ZipFile): def _extract_member(self, member, targetpath, pwd): if not isinstance(member, zipfile.ZipInfo): member = self.getinfo(member) targetpath = super()._extract_member(member, targetpath, pwd) mode = member.external_attr >> 16 & 0x1FF os.chmod(targetpath, mode) return targetpath def __init__(self, orders, on_done): """Decompress all fds in threads and send on_done callback once finished order is: { "fd": DecompressOrder(dir=directory to decompress (this will become the new root) dest=destination directory to use for decompressing) ) } Return a dict of DecompressResult on the on_done callback: { "fd": DecompressResult(error=optional error if anything went wrong" } """ self._orders = orders self._decompressed = {} self._done_callback = on_done executor = futures.ThreadPoolExecutor(max_workers=3) for fd in orders: logger.info("Requesting decompression to {}".format(orders[fd].dest)) future = executor.submit(self._decompress, fd, orders[fd].dir, orders[fd].dest) future.tag_fd = fd future.tag_dest = orders[fd].dest future.add_done_callback(self._one_done) def _decompress(self, fd, dir, dest): """decompress one entry dir can be a regexp""" logger.debug("Extracting to {}".format(dest)) # we temporarily extract to this destination the archive content tempdest = tempfile.mktemp(dir=dest) # We don't use shutil to automatically select the right codec as we need to ensure that zipfile # will keep the original perms. archive = None is_archive = False try: try: # the fd isn't forcibly at position 0 (like in Unity3D where we offset the script part) archive = tarfile.open(fileobj=fd, mode='r|*') logger.debug("tar file") except tarfile.ReadError: archive = self.ZipFileWithPerm(fd.name) logger.debug("zip file") is_archive = True # This is a band aid: if extractall can't successfully extract the file, we perform another approach: # exec tar xf and hope for the best (tar binary seems to be more acceptive of slightly misformed # archives) try: archive.extractall(tempdest) except tarfile.ReadError: logger.debug("Trigger fallback direct tar execution") shutil.rmtree(tempdest) os.makedirs(tempdest) archive = subprocess.Popen(["tar", "xf", fd.name, "-C", tempdest]) archive.communicate() fd.close() except: # try to treat it as self-extractable, some format don't like being opened at the same time though, so link # it. # error out if we had a valid archive which had an issue extracting if is_archive: raise name = "{}.safe".format(fd.name) os.link(fd.name, name) fd.close() st = os.stat(name) os.chmod(name, st.st_mode | stat.S_IEXEC) archive = subprocess.Popen([name, "-o{}".format(tempdest)], stdout=subprocess.PIPE, stderr=subprocess.PIPE) archive.communicate() logger.debug("executable file") os.remove(name) try: dir_path = glob(os.path.join(tempdest, dir))[0] except IndexError: raise BaseException("Couldn't find {} in tarball".format(dir)) for filename in os.listdir(dir_path): shutil.move(os.path.join(dir_path, filename), os.path.join(dest, filename)) shutil.rmtree(tempdest) def _one_done(self, future): """Callback that will be called once one decompress finishes. (will be wired on the constructor) """ result = self.DecompressResult(error=None) if future.exception(): logger.error("A decompression to {} failed: {}".format(future.tag_dest, future.exception()), exc_info=future.exception()) result = result._replace(error=str(future.exception())) logger.info("Decompression to {} finished".format(future.tag_dest)) self._decompressed[future.tag_fd] = result if len(self._orders) == len(self._decompressed): self._done() def _done(self): """Callback that will be called once all download finishes. uris of the temporary files will be passed on the wired callback """ logger.info("All pending decompression done to {} done.".format([self._orders[fd].dest for fd in self._orders])) self._done_callback(self._decompressed) ubuntu-make-18.09+disco1/umake/frameworks/0000755000000000000000000000000013415342711015317 5ustar ubuntu-make-18.09+disco1/umake/frameworks/__init__.py0000644000000000000000000004422013352651520017433 0ustar # -*- coding: utf-8 -*- # Copyright (C) 2014 Canonical # # Authors: # Didier Roche # # 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; version 3. # # 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 """Base Handling functions and base class of backends""" import abc from contextlib import suppress from gettext import gettext as _ from importlib import import_module, reload import inspect import logging import os import pkgutil import sys import subprocess from umake.network.requirements_handler import RequirementsHandler from umake.settings import DEFAULT_INSTALL_TOOLS_PATH, UMAKE_FRAMEWORKS_ENVIRON_VARIABLE, DEFAULT_BINARY_LINK_PATH from umake.tools import ConfigHandler, NoneDict, classproperty, get_current_arch, get_current_ubuntu_version,\ is_completion_mode, switch_to_current_user, MainLoop, get_user_frameworks_path from umake.ui import UI logger = logging.getLogger(__name__) class BaseCategory(): """Base Category class to be inherited""" NOT_INSTALLED, PARTIALLY_INSTALLED, FULLY_INSTALLED = range(3) categories = NoneDict() def __init__(self, name, description="", logo_path=None, is_main_category=False, packages_requirements=None): self.name = name self.description = description self.logo_path = logo_path self.is_main_category = is_main_category self.default = None self.frameworks = NoneDict() self.packages_requirements = [] if packages_requirements is None else packages_requirements if self.prog_name in self.categories: logger.warning("There is already a registered category with {} as a name. Don't register the second one." .format(name)) else: self.categories[self.prog_name] = self @classproperty def main_category(self): for category in self.categories.values(): if category.is_main_category: return category return None @property def prog_name(self): """Get programmatic, path and CLI compatible names""" return self.name.lower().replace('/', '-').replace(' ', '-') @property def default_framework(self): """Get default framework""" for framework in self.frameworks.values(): if framework.is_category_default: return framework return None def register_framework(self, framework): """Register a new framework""" if framework.prog_name in self.frameworks: logger.error("There is already a registered framework with {} as a name. Don't register the second one." .format(framework.name)) else: self.frameworks[framework.prog_name] = framework @property def is_installed(self): """Return if the category is installed""" installed_frameworks = [framework for framework in self.frameworks.values() if framework.is_installed] if len(installed_frameworks) == 0: return self.NOT_INSTALLED if len(installed_frameworks) == len(self.frameworks): return self.FULLY_INSTALLED return self.PARTIALLY_INSTALLED def install_category_parser(self, parser): """Install category parser and get frameworks""" if not self.has_frameworks(): logging.debug("Skipping {} having no framework".format(self.name)) return # framework parser is directly category parser if self.is_main_category: framework_parser = parser else: self.category_parser = parser.add_parser(self.prog_name, help=self.description) framework_parser = self.category_parser.add_subparsers(dest="framework") for framework in self.frameworks.values(): framework.install_framework_parser(framework_parser) return framework_parser def has_frameworks(self): """Return if a category has at least one framework""" return len(self.frameworks) > 0 def has_one_framework(self): """Return if a category has one framework""" return len(self.frameworks) == 1 def run_for(self, args): """Running commands from args namespace""" # try to call default framework if any if not args.framework: if not self.default_framework: message = _("A default framework for category {} was requested where there is none".format(self.name)) logger.error(message) self.category_parser.print_usage() UI.return_main_screen(status_code=2) self.default_framework.run_for(args) return self.frameworks[args.framework].run_for(args) class BaseFramework(metaclass=abc.ABCMeta): def __init__(self, name, description, category, force_loading=False, logo_path=None, is_category_default=False, install_path_dir=None, only_on_archs=None, only_ubuntu_version=None, packages_requirements=None, only_for_removal=False, expect_license=False, need_root_access=False, json=False): self.name = name self.description = description self.logo_path = None self.category = category self.is_category_default = is_category_default self.only_on_archs = [] if only_on_archs is None else only_on_archs self.only_ubuntu_version = [] if only_ubuntu_version is None else only_ubuntu_version self.packages_requirements = [] if packages_requirements is None else packages_requirements self.packages_requirements.extend(self.category.packages_requirements) self.only_for_removal = only_for_removal self.expect_license = expect_license # don't detect anything for completion mode (as we need to be quick), so avoid opening apt cache and detect # if it's installed. if is_completion_mode(): # only show it in shell completion if it was already installed if self.only_for_removal: config = ConfigHandler().config try: if not os.path.isdir(config["frameworks"][category.prog_name][self.prog_name]["path"]): # don't show the framework in shell completion as for removal only and not installed return except (TypeError, KeyError, FileNotFoundError): # don't show the framework in shell completion as for removal only and not installed return category.register_framework(self) return self.need_root_access = need_root_access if not need_root_access: with suppress(KeyError): self.need_root_access = not RequirementsHandler().is_bucket_installed(self.packages_requirements) if self.is_category_default: if self.category == BaseCategory.main_category: logger.error("Main category can't have default framework as {} requires".format(name)) self.is_category_default = False elif self.category.default_framework is not None: logger.error("Can't set {} as default for {}: this category already has a default framework ({}). " "Don't set any as default".format(category.name, name, self.category.default_framework.name)) self.is_category_default = False self.category.default_framework.is_category_default = False if not install_path_dir: install_path_dir = os.path.join("" if category.is_main_category else category.prog_name, self.prog_name) self.default_install_path = os.path.join(DEFAULT_INSTALL_TOOLS_PATH, install_path_dir) self.default_binary_link_path = DEFAULT_BINARY_LINK_PATH self.install_path = self.default_install_path # check if we have an install path previously set config = ConfigHandler().config try: self.install_path = config["frameworks"][category.prog_name][self.prog_name]["path"] except (TypeError, KeyError, FileNotFoundError): pass # This requires install_path and will register need_root or not if not force_loading and not self.is_installed and not self.is_installable: logger.info("Don't register {} as it's not installable on this configuration.".format(name)) return category.register_framework(self) @property def is_installable(self): """Return if the framework can be installed on that arch""" if self.only_for_removal: return False try: if len(self.only_on_archs) > 0: # we have some restricted archs, check we support it current_arch = get_current_arch() if current_arch not in self.only_on_archs: logger.debug("{} only supports {} archs and you are on {}.".format(self.name, self.only_on_archs, current_arch)) return False if len(self.only_ubuntu_version) > 0: current_version = get_current_ubuntu_version() if current_version not in self.only_ubuntu_version: logger.debug("{} only supports {} and you are on {}.".format(self.name, self.only_ubuntu_version, current_version)) return False if not RequirementsHandler().is_bucket_available(self.packages_requirements): return False except: logger.error("An error occurred when detecting platform, don't register {}".format(self.name)) return False return True @property def prog_name(self): """Get programmatic, path and CLI compatible names""" return self.name.lower().replace('/', '-').replace(' ', '-') @abc.abstractmethod def setup(self): """Method call to setup the Framework""" if not self.is_installable: logger.error(_("You can't install that framework on this machine")) UI.return_main_screen(status_code=2) if self.need_root_access and os.geteuid() != 0: logger.debug("Requesting root access") cmd = ["sudo", "-E", "env", "PATH={}".format(os.getenv("PATH"))] for var in ["PATH", "LD_LIBRARY_PATH", "PYTHONUSERBASE", "PYTHONHOME"]: if os.getenv(var): cmd.append("{}={}".format(var, os.getenv(var))) cmd.extend(sys.argv) MainLoop().quit(subprocess.call(cmd)) # be a normal, kind user as we don't want normal files to be written as root switch_to_current_user() @abc.abstractmethod def remove(self): """Method call to remove the current framework""" if not self.is_installed: logger.error(_("You can't remove {} as it isn't installed".format(self.name))) UI.return_main_screen(status_code=2) def mark_in_config(self): """Mark the installation as installed in the config file""" config = ConfigHandler().config config.setdefault("frameworks", {})\ .setdefault(self.category.prog_name, {})\ .setdefault(self.prog_name, {})["path"] = self.install_path ConfigHandler().config = config def remove_from_config(self): """Remove current framework from config""" config = ConfigHandler().config del(config["frameworks"][self.category.prog_name][self.prog_name]) ConfigHandler().config = config @property def is_installed(self): """Method call to know if the framework is installed""" if not os.path.isdir(self.install_path): return False if not RequirementsHandler().is_bucket_installed(self.packages_requirements): return False return True def install_framework_parser(self, parser): """Install framework parser""" this_framework_parser = parser.add_parser(self.prog_name, help=self.description) this_framework_parser.add_argument('destdir', nargs='?', help=_("If the default framework name isn't provided, " "destdir should contain a /")) this_framework_parser.add_argument('-r', '--remove', action="store_true", help=_("Remove framework if installed")) if self.expect_license: this_framework_parser.add_argument('--accept-license', dest="accept_license", action="store_true", help=_("Accept license without prompting")) return this_framework_parser def run_for(self, args): """Running commands from args namespace""" logger.debug("Call run_for on {}".format(self.name)) if args.remove: if args.destdir: message = "You can't specify a destination dir while removing a framework" logger.error(message) UI.return_main_screen(status_code=2) self.remove() else: install_path = None auto_accept_license = False if args.destdir: install_path = os.path.abspath(os.path.expanduser(args.destdir)) if self.expect_license and args.accept_license: auto_accept_license = True self.setup(install_path=install_path, auto_accept_license=auto_accept_license) class MainCategory(BaseCategory): def __init__(self): super().__init__(name="main", is_main_category=True) def _is_categoryclass(o): return inspect.isclass(o) and issubclass(o, BaseCategory) def _is_frameworkclass(o): """Filter concrete (non-abstract) subclasses of BaseFramework.""" return inspect.isclass(o) and issubclass(o, BaseFramework) and not inspect.isabstract(o) def load_module(module_abs_name, main_category, force_loading): logger.debug("New framework module: {}".format(module_abs_name)) if module_abs_name not in sys.modules: import_module(module_abs_name) else: reload(sys.modules[module_abs_name]) module = sys.modules[module_abs_name] current_category = main_category # if no category found -> we assign to main category for category_name, CategoryClass in inspect.getmembers(module, _is_categoryclass): logger.debug("Found category: {}".format(category_name)) current_category = CategoryClass() # if we didn't register the category: escape the framework registration if current_category not in BaseCategory.categories.values(): return for framework_name, FrameworkClass in inspect.getmembers(module, _is_frameworkclass): if FrameworkClass(category=current_category, force_loading=force_loading) is not None: logger.debug("Attach framework {} to {}".format(framework_name, current_category.name)) def list_frameworks(): """ Return frameworks and categories description as: [ { 'category_name': 'category_description': 'is_installed': BaseCategory.NOT_INSTALLED or BaseCategory.PARTIALLY_INSTALLED or BaseCategory.FULLY_INSTALLED 'frameworks': [ { 'framework_name': 'framework_description': 'install_path': None or Path string 'is_installed': True or False 'is_installable': True or False 'is_category_default': True or False 'only_for_removal': True or False }, ] }, ] """ categories_dict = list() for category in BaseCategory.categories.values(): frameworks_dict = list() for framework in category.frameworks.values(): new_fram = { "framework_name": framework.prog_name, "framework_description": framework.description, "install_path": framework.install_path, "is_installed": framework.is_installed, "is_installable": framework.is_installable, "is_category_default": framework.is_category_default, "only_for_removal": framework.only_for_removal } frameworks_dict.append(new_fram) new_cat = { "category_name": category.prog_name, "category_description": category.description, "is_installed": category.is_installed, "frameworks": frameworks_dict } categories_dict.append(new_cat) return categories_dict def load_frameworks(force_loading=False): """Load all modules and assign to correct category""" main_category = MainCategory() # Prepare local paths (1. environment path, 2. local path, 3. system paths). # If we have duplicated categories, only consider the first loaded one. local_paths = [get_user_frameworks_path()] sys.path.insert(0, get_user_frameworks_path()) environment_path = os.environ.get(UMAKE_FRAMEWORKS_ENVIRON_VARIABLE) if environment_path: sys.path.insert(0, environment_path) local_paths.insert(0, environment_path) for loader, module_name, ispkg in pkgutil.iter_modules(path=local_paths): load_module(module_name, main_category, force_loading) for loader, module_name, ispkg in pkgutil.iter_modules(path=[os.path.dirname(__file__)]): module_name = "{}.{}".format(__package__, module_name) load_module(module_name, main_category, force_loading) ubuntu-make-18.09+disco1/umake/frameworks/__pycache__/0000755000000000000000000000000013415342711017527 5ustar ubuntu-make-18.09+disco1/umake/frameworks/android.py0000644000000000000000000002533513352651520017322 0ustar # -*- coding: utf-8 -*- # Copyright (C) 2014 Canonical # # Authors: # Didier Roche # # 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; version 3. # # 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 """Android module""" from contextlib import suppress from gettext import gettext as _ import logging import os import platform import re import umake.frameworks.baseinstaller from umake.interactions import DisplayMessage from umake.ui import UI from umake.tools import add_env_to_user, create_launcher, get_application_desktop_file, ChecksumType logger = logging.getLogger(__name__) _supported_archs = ['i386', 'amd64'] class AndroidCategory(umake.frameworks.BaseCategory): def __init__(self): super().__init__(name="Android", description=_("Android Development Environment"), logo_path=None) def parse_license(self, tag, line, license_txt, in_license): """Parse Android download page for license""" if tag in line: in_license = True if in_license: if '(\w+)', line) with suppress(AttributeError): # ensure the size can match a md5 or sha1 checksum if len(p.group(1)) > 15: sha1sum = p.group(1) if "" in line: in_download = False if url is None and sha1sum is None: return (None, in_download) if url and url.startswith("//"): url = "https:" + url return ((url, sha1sum), in_download) class AndroidStudio(umake.frameworks.baseinstaller.BaseInstaller): def __init__(self, **kwargs): super().__init__(name="Android Studio", description=_("Android Studio (default)"), is_category_default=True, only_on_archs=_supported_archs, expect_license=True, packages_requirements=["openjdk-7-jdk | openjdk-8-jdk", "libc6:i386", "libncurses5:i386", "libstdc++6:i386", "lib32z1", "zlib1g:i386"], download_page="https://developer.android.com/studio/index.html", checksum_type=ChecksumType.sha256, dir_to_decompress_in_tarball="android-studio", desktop_filename="android-studio.desktop", required_files_path=[os.path.join("bin", "studio.sh")], **kwargs) def parse_license(self, line, license_txt, in_license): """Parse Android Studio download page for license""" return self.category.parse_license('

', line, license_txt, in_license) def parse_download_link(self, line, in_download): """Parse Android SDK download link, expect to find a SHA-1 and a url""" return self.category.parse_download_link('dac-download-linux', line, in_download) def post_install(self): """Add necessary environment variables""" add_env_to_user(self.name, {"PATH": {"value": [os.path.join(self.install_path, "platform-tools")]}}) UI.delayed_display(DisplayMessage(self.RELOGIN_REQUIRE_MSG.format(self.name))) class AndroidNDK(umake.frameworks.baseinstaller.BaseInstaller): def __init__(self, **kwargs): super().__init__(name="Android NDK", description=_("Android NDK"), only_on_archs='amd64', expect_license=True, download_page="https://developer.android.com/ndk/downloads/index.html", checksum_type=ChecksumType.sha1, packages_requirements=['clang'], dir_to_decompress_in_tarball="android-ndk-*", required_files_path=[os.path.join("ndk-build")], **kwargs) def parse_license(self, line, license_txt, in_license): """Parse Android NDK download page for license""" return self.category.parse_license('
Linux <" in line: in_download = True if in_download: regexp = r'href="(.*)"><.*64-' if get_current_arch() == "i386": regexp = r'href="(.*)"><.*32-' p = re.search(regexp, line) with suppress(AttributeError): url = p.group(1) if '


' in line: in_download = False if url is None: return (None, in_download) return ((url, None), in_download) def post_install(self): """Create the Stencyl launcher""" create_launcher(self.desktop_filename, get_application_desktop_file(name=_("Stencyl"), icon_path=os.path.join(self.install_path, "data", "other", "icon-30x30.png"), try_exec=self.exec_path, exec=self.exec_link_name, comment=self.description, categories="Development;IDE;", extra="Path={}\nStartupWMClass=stencyl-sw-Launcher".format(self.install_path))) class Blender(umake.frameworks.baseinstaller.BaseInstaller): def __init__(self, **kwargs): super().__init__(name="Blender", description=_("Very fast and versatile 3D modeller/renderer"), only_on_archs=['i386', 'amd64'], download_page="https://www.blender.org/download/", desktop_filename="blender.desktop", required_files_path=["blender"], dir_to_decompress_in_tarball='blender*', **kwargs) arch_trans = { "amd64": "x86_64", "i386": "i686" } def parse_download_link(self, line, in_download): """Parse Blender download links""" url = None if '.tar.bz2' in line: p = re.search(r'href=\"(https://www\.blender\.org/[^<]*{}\.tar\.bz2)/?"'.format( self.arch_trans[get_current_arch()]), line) with suppress(AttributeError): url = p.group(1) filename = 'release' + re.search('blender-(.*)-linux', url).group(1).replace('.', '') + '.md5' self.checksum_url = os.path.join(os.path.dirname(url), filename).replace('download', 'release').replace('www', 'download') url = url.replace('www.blender.org/download', 'download.blender.org/release') return ((url, None), in_download) def post_install(self): """Create the Blender launcher""" create_launcher(self.desktop_filename, get_application_desktop_file(name=_("Blender"), icon_path=os.path.join(self.install_path, "icons", "scalable", "apps", "blender.svg"), try_exec=self.exec_path, exec=self.exec_link_name, comment=self.description, categories="Development;IDE;Graphics")) def _chrome_sandbox_setuid(path): """Chown and setUID to chrome sandbox""" # switch to root with as_root(): try: os.chown(path, 0, -1) os.chmod(path, stat.S_ISUID | stat.S_IRWXU | stat.S_IRGRP | stat.S_IXGRP | stat.S_IROTH | stat.S_IXOTH) logger.debug("Changed setUID mode {}".format(path)) return True except Exception as e: logger.error("Couldn't change owner and file perm to {}: {}".format(path, e)) return False class Unity3D(umake.frameworks.baseinstaller.BaseInstaller): def __init__(self, **kwargs): super().__init__(name="Unity3d", description=_("Unity 3D Editor Linux experimental support"), only_on_archs=['amd64'], download_page="https://forum.unity3d.com/" + "threads/unity-on-linux-release-notes-and-known-issues.350256/page-2", match_last_link=True, dir_to_decompress_in_tarball='Editor', desktop_filename="unity3d-editor.desktop", required_files_path=[os.path.join("Unity")], # we need root access for chrome sandbox setUID need_root_access=True, # Note that some packages requirements essential to the system itself are not listed (we # don't want to create fake packages and kill the container for medium tests) packages_requirements=[ "gconf-service", "lib32gcc1", "lib32stdc++6", "libasound2", "libcairo2", "libcap2", "libcups2", "libfontconfig1", "libfreetype6", "libgconf-2-4", "libgdk-pixbuf2.0-0", "libglu1-mesa", "libgtk2.0-0", "libgl1-mesa-glx | libgl1-mesa-glx-lts-utopic |\ libgl1-mesa-glx-lts-vivid | libgl1-mesa-glx-lts-wily", "libnspr4", "libnss3", "libpango1.0-0", "libpq5", "libxcomposite1", "libxcursor1", "libxdamage1", "libxext6", "libxfixes3", "libxi6", "libxrandr2", "libxrender1", "libxtst6"], **kwargs) def parse_download_link(self, line, in_download): """Parse Unity3d download links""" url = None if "beta.unity" in line: in_download = True if in_download: p = re.search( r'href="(https://beta.unity3d.*.html)" target="_blank" class="externalLink">https://beta.unity3d.com', line) with suppress(AttributeError): url = p.group(1).replace("public_download.html", "LinuxEditorInstaller/Unity.tar.xz") if url is None: return (None, in_download) return ((url, None), in_download) def post_install(self): """Create the Unity 3D launcher and setuid chrome sandbox""" with futures.ProcessPoolExecutor(max_workers=1) as executor: # chrome sandbox requires this: https//code.google.com/p/chromium/wiki/LinuxSUIDSandbox f = executor.submit(_chrome_sandbox_setuid, os.path.join(self.install_path, "chrome-sandbox")) if not f.result(): UI.return_main_screen(status_code=1) create_launcher(self.desktop_filename, get_application_desktop_file(name=_("Unity3D Editor"), icon_path=os.path.join(self.install_path, "Data", "Resources", "LargeUnityIcon.png"), try_exec=self.exec_path, exec=self.exec_link_name, comment=self.description, categories="Development;IDE;")) class Twine(umake.frameworks.baseinstaller.BaseInstaller): def __init__(self, **kwargs): super().__init__(name="Twine", description=_("Twine tool for creating interactive and nonlinear stories"), only_on_archs=['i386', 'amd64'], download_page="https://twinery.org/", dir_to_decompress_in_tarball='twine*', desktop_filename="twine.desktop", required_files_path=["Twine"], **kwargs) # add logo download as the tar doesn't provide one self.download_requests.append(DownloadItem("https://twinery.org/homepage/img/logo.svg", None)) def parse_download_link(self, line, in_download): """Parse Twine download links""" url = None regexp = r'href="(.*)" .*linux64' if get_current_arch() == "i386": regexp = r'href="(.*)" .*linux32' p = re.search(regexp, line) with suppress(AttributeError): url = p.group(1) return ((url, None), False) def decompress_and_install(self, fds): # if icon, we grab the icon name to reference it later on for fd in fds: if fd.name.endswith(".svg"): orig_icon_name = os.path.basename(fd.name) break else: logger.error("We couldn't download the Twine icon") UI.return_main_screen(status_code=1) super().decompress_and_install(fds) # rename the asset logo self.icon_name = "logo.svg" os.rename(os.path.join(self.install_path, orig_icon_name), os.path.join(self.install_path, self.icon_name)) def post_install(self): """Create the Twine launcher""" create_launcher(self.desktop_filename, get_application_desktop_file(name=_("Twine"), icon_path=os.path.join(self.install_path, self.icon_name), try_exec=self.exec_path, exec=self.exec_link_name, comment=self.description, categories="Development;IDE;")) class Superpowers(umake.frameworks.baseinstaller.BaseInstaller): def __init__(self, **kwargs): super().__init__(name="Superpowers", description=_("The HTML5 2D+3D game maker"), only_on_archs=['i386', 'amd64'], download_page="https://api.github.com/repos/superpowers/superpowers-app/releases/latest", dir_to_decompress_in_tarball='superpowers*', desktop_filename="superpowers.desktop", required_files_path=["Superpowers"], json=True, **kwargs) arch_trans = { "amd64": "x64", "i386": "ia32" } def parse_download_link(self, line, in_download): url = None for asset in line["assets"]: if "linux-{}".format(self.arch_trans[get_current_arch()]) in asset["browser_download_url"]: in_download = True url = asset["browser_download_url"] return (url, in_download) def post_install(self): """Create the Superpowers launcher""" create_launcher(self.desktop_filename, get_application_desktop_file(name=_("Superpowers"), icon_path=os.path.join(self.install_path, "resources", "app", "renderer", "images", "superpowers-256.png"), try_exec=self.exec_path, exec=self.exec_link_name, comment=self.description, categories="Development;IDE;")) class GDevelop(umake.frameworks.baseinstaller.BaseInstaller): def __init__(self, **kwargs): super().__init__(name="GDevelop", description=_("Create your own games"), only_on_archs=['i386', 'amd64'], download_page="https://api.github.com/repos/4ian/GD/releases/latest", packages_requirements=["libgconf-2-4"], dir_to_decompress_in_tarball='gdevelop*', desktop_filename="gdevelop.desktop", required_files_path=["gdevelop"], json=True, **kwargs) self.icon_filename = "GDevelop.png" self.icon_url = os.path.join("https://raw.githubusercontent.com/4ian/GD/master/Binaries/Packaging", "linux-extra-files/usr/share/icons/hicolor/128x128/apps", self.icon_filename) def parse_download_link(self, line, in_download): url = None for asset in line["assets"]: if ".tar.gz" in asset["browser_download_url"]: in_download = True url = asset["browser_download_url"] return (url, in_download) def post_install(self): """Create the GDevelop launcher""" DownloadCenter(urls=[DownloadItem(self.icon_url, None)], on_done=self.save_icon, download=True) create_launcher(self.desktop_filename, get_application_desktop_file(name=_("GDevelop"), icon_path=os.path.join(self.install_path, self.icon_filename), try_exec=self.exec_path, exec=self.exec_link_name, comment=self.description, categories="Development;IDE;")) def save_icon(self, download_result): """Save correct GDevelop icon""" icon = download_result.pop(self.icon_url).fd.name shutil.copy(icon, os.path.join(self.install_path, self.icon_filename)) logger.debug("Copied icon: {}".format(self.icon_url)) class Godot(umake.frameworks.baseinstaller.BaseInstaller): def __init__(self, **kwargs): super().__init__(name="Godot", description=_("The game engine you waited for"), only_on_archs=['i386', 'amd64'], download_page="https://godotengine.org/download/linux", desktop_filename="godot.desktop", required_files_path=['godot'], **kwargs) self.icon_url = "https://godotengine.org/themes/godotengine/assets/download/godot_logo.svg" self.icon_filename = "Godot.svg" arch_trans = { "amd64": "64", "i386": "32" } def parse_download_link(self, line, in_download): """Parse Godot download links""" url = None if '{}.zip'.format(self.arch_trans[get_current_arch()]) in line: in_download = True p = re.search(r'href=\"(.*\.zip)\"', line) with suppress(AttributeError): url = p.group(1) bin = re.search(r'(Godot.*)\.zip', url) self.required_files_path[0] = bin.group(1) if url is None: return (None, in_download) return ((url, None), in_download) def post_install(self): """Create the Godot launcher""" # Override the exec_path. # Rename the binary to remove the version. self.set_exec_path() shutil.move(self.exec_path, os.path.join(self.install_path, 'godot')) self.exec_path = os.path.join(self.install_path, 'godot') DownloadCenter(urls=[DownloadItem(self.icon_url, None)], on_done=self.save_icon, download=True) create_launcher(self.desktop_filename, get_application_desktop_file(name=_("Godot"), icon_path=os.path.join(self.install_path, self.icon_filename), try_exec=self.exec_path, exec=self.exec_link_name, comment=self.description, categories="Development;IDE;")) def save_icon(self, download_result): """Save correct Godot icon""" icon = download_result.pop(self.icon_url).fd.name shutil.copy(icon, os.path.join(self.install_path, self.icon_filename)) logger.debug("Copied icon: {}".format(self.icon_url)) ubuntu-make-18.09+disco1/umake/frameworks/go.py0000644000000000000000000000552013352651520016301 0ustar # -*- coding: utf-8 -*- # Copyright (C) 2014 Canonical # # Authors: # Didier Roche # # 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; version 3. # # 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 """Go module""" from contextlib import suppress from gettext import gettext as _ import logging import os import re import umake.frameworks.baseinstaller from umake.interactions import DisplayMessage from umake.tools import get_current_arch, add_env_to_user, ChecksumType from umake.ui import UI logger = logging.getLogger(__name__) class GoCategory(umake.frameworks.BaseCategory): def __init__(self): super().__init__(name="Go", description=_("Go language"), logo_path=None) class GoLang(umake.frameworks.baseinstaller.BaseInstaller): def __init__(self, **kwargs): super().__init__(name="Go Lang", description=_("Google compiler (default)"), is_category_default=True, only_on_archs=['i386', 'amd64'], download_page="https://golang.org/dl/", checksum_type=ChecksumType.sha256, dir_to_decompress_in_tarball="go", required_files_path=[os.path.join("bin", "go")], **kwargs) def parse_download_link(self, line, in_download): """Parse Go download link, expect to find a sha and a url""" url, sha = (None, None) if "linux-{}".format(get_current_arch().replace("i386", "386")) in line: in_download = True if in_download: p = re.search(r'href="(.*)">', line) with suppress(AttributeError): url = p.group(1) p = re.search(r'(\w+)', line) with suppress(AttributeError): sha = p.group(1) if "" in line: in_download = False if url is None and sha is None: return (None, in_download) return ((url, sha), in_download) def post_install(self): """Add go necessary env variables""" add_env_to_user(self.name, {"PATH": {"value": os.path.join(self.install_path, "bin")}, "GOROOT": {"value": self.install_path, "keep": False}}) UI.delayed_display(DisplayMessage(self.RELOGIN_REQUIRE_MSG.format(self.name))) ubuntu-make-18.09+disco1/umake/frameworks/ide.py0000644000000000000000000011471013352651520016437 0ustar # -*- coding: utf-8 -*- # Copyright (C) 2014-2015 Canonical # # Authors: # Didier Roche # Tin Tvrtković # # 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; version 3. # # 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 """Generic IDE module.""" from abc import ABCMeta, abstractmethod from concurrent import futures from contextlib import suppress from gettext import gettext as _ import grp from io import StringIO import json import logging import os from os.path import join import pwd import platform import re import subprocess from urllib import parse import shutil import umake.frameworks.baseinstaller from umake.frameworks.electronics import Arduino from umake.interactions import DisplayMessage, LicenseAgreement from umake.network.download_center import DownloadCenter, DownloadItem from umake.tools import as_root, create_launcher, get_application_desktop_file, ChecksumType, Checksum, MainLoop,\ strip_tags, add_env_to_user, add_exec_link, get_current_arch from umake.ui import UI logger = logging.getLogger(__name__) class IdeCategory(umake.frameworks.BaseCategory): def __init__(self): super().__init__(name="IDE", description=_("Generic IDEs"), logo_path=None) class BaseEclipse(umake.frameworks.baseinstaller.BaseInstaller, metaclass=ABCMeta): """The Eclipse Foundation distribution.""" def __init__(self, *args, **kwargs): if self.executable: current_required_files_path = kwargs.get("required_files_path", []) current_required_files_path.append(os.path.join(self.executable)) kwargs["required_files_path"] = current_required_files_path download_page = 'https://www.eclipse.org/downloads/eclipse-packages/' kwargs["download_page"] = download_page kwargs["checksum_type"] = ChecksumType.sha512 super().__init__(*args, **kwargs) self.icon_url = os.path.join("https://www.eclipse.org/downloads/", "images", self.icon_filename) self.bits = '' if platform.machine() == 'i686' else 'x86_64' self.headers = {'User-agent': "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu " "Chromium/41.0.2272.76 Chrome/41.0.2272.76 Safari/537.36"} @property @abstractmethod def download_keyword(self): pass @property @abstractmethod def executable(self): pass def download_provider_page(self): logger.debug("Download application provider page") DownloadCenter([DownloadItem(self.download_page, headers=self.headers)], self.get_metadata_and_check_license, download=False) def parse_download_link(self, line, in_download): """Parse Eclipse download links""" if self.download_keyword in line and self.bits in line and 'linux' in line: in_download = True else: in_download = False if in_download: p = re.search(r"href='(http://www\.eclipse\.org\/downloads/download\.php\?file=.*\.tar\.gz)'", line) with suppress(AttributeError): self.new_download_url = p.group(1).replace('download.php', 'sums.php').replace('http://', 'https://') self.https = True if parse.splittype(self.new_download_url)[0] is "https" else False return ((None, None), in_download) @MainLoop.in_mainloop_thread def get_sha_and_start_download(self, download_result): res = download_result[self.new_download_url] checksum = res.buffer.getvalue().decode('utf-8').split()[0] url = self.new_download_url.replace('sums.php', 'download.php') + '&r=1' if not self.https: self.new_download_url = 'https://' + parse.splittype(self.new_download_url)[1] self.check_data_and_start_download(url, checksum) def post_install(self): """Create the Eclipse launcher""" DownloadCenter(urls=[DownloadItem(self.icon_url, None)], on_done=self.save_icon, download=True) icon_path = join(self.install_path, self.icon_filename) comment = self.description categories = "Development;IDE;" create_launcher(self.desktop_filename, get_application_desktop_file(name=self.name, icon_path=icon_path, try_exec=self.exec_path, exec=self.exec_link_name, comment=comment, categories=categories)) def save_icon(self, download_result): """Save correct Eclipse icon""" icon = download_result.pop(self.icon_url).fd.name shutil.copy(icon, join(self.install_path, self.icon_filename)) logger.debug("Copied icon: {}".format(self.icon_url)) class EclipseJava(BaseEclipse): """The Eclipse Java Edition distribution.""" download_keyword = 'eclipse-java-' executable = 'eclipse' def __init__(self, **kwargs): super().__init__(name="Eclipse", description=_("Eclipse Java IDE"), dir_to_decompress_in_tarball='eclipse', desktop_filename='eclipse-java.desktop', only_on_archs=['i386', 'amd64'], packages_requirements=['openjdk-7-jdk | openjdk-8-jdk'], icon_filename='java.png', **kwargs) class EclipseJEE(BaseEclipse): """The Eclipse JEE Edition distribution.""" download_keyword = 'eclipse-jee-' executable = 'eclipse' def __init__(self, **kwargs): super().__init__(name="Eclipse JEE", description=_("Eclipse JEE IDE"), dir_to_decompress_in_tarball='eclipse', desktop_filename='eclipse-jee.desktop', only_on_archs=['i386', 'amd64'], packages_requirements=['openjdk-7-jdk | openjdk-8-jdk'], icon_filename='javaee.png', **kwargs) class EclipsePHP(BaseEclipse): """The Eclipse PHP Edition distribution.""" download_keyword = 'eclipse-php-' executable = 'eclipse' def __init__(self, **kwargs): super().__init__(name="Eclipse PHP", description=_("Eclipse PHP IDE"), dir_to_decompress_in_tarball='eclipse', desktop_filename='eclipse-php.desktop', only_on_archs=['i386', 'amd64'], packages_requirements=['openjdk-7-jdk | openjdk-8-jdk'], icon_filename='php.png', **kwargs) class EclipseJS(BaseEclipse): """Eclipse IDE for JavaScript and Web distribution.""" download_keyword = 'eclipse-javascript-' executable = 'eclipse' def __init__(self, **kwargs): super().__init__(name="Eclipse JavaScript", description=_("Eclipse IDE for JavaScript and Web Developers"), dir_to_decompress_in_tarball='eclipse', desktop_filename='eclipse-javascript.desktop', only_on_archs=['i386', 'amd64'], packages_requirements=['openjdk-7-jdk | openjdk-8-jdk'], icon_filename='javascript.png', **kwargs) class EclipseCPP(BaseEclipse): """The Eclipse CPP Edition distribution.""" download_keyword = 'eclipse-cpp-' executable = 'eclipse' def __init__(self, **kwargs): super().__init__(name="Eclipse CPP", description=_("Eclipse C/C++ IDE"), dir_to_decompress_in_tarball='eclipse', desktop_filename='eclipse-cpp.desktop', only_on_archs=['i386', 'amd64'], packages_requirements=['openjdk-7-jdk | openjdk-8-jdk'], icon_filename='cdt.png', **kwargs) class BaseJetBrains(umake.frameworks.baseinstaller.BaseInstaller, metaclass=ABCMeta): """The base for all JetBrains installers.""" def __init__(self, *args, **kwargs): """Add executable required file path to existing list""" if self.executable: current_required_files_path = kwargs.get("required_files_path", []) current_required_files_path.append(os.path.join("bin", self.executable)) kwargs["required_files_path"] = current_required_files_path download_page = "https://data.services.jetbrains.com/products/releases?code={}".format(self.download_keyword) kwargs["download_page"] = download_page kwargs["json"] = True kwargs["checksum_type"] = ChecksumType.sha256 super().__init__(*args, **kwargs) @property @abstractmethod def download_keyword(self): pass @property @abstractmethod def executable(self): pass def parse_download_link(self, line, in_download): key, content = line.popitem() content = content[0] self.url = content['downloads']['linux']['link'] self.new_download_url = content['downloads']['linux']['checksumLink'] # Url is not defined here, but later on in the start_download return (None, in_download) @MainLoop.in_mainloop_thread def get_sha_and_start_download(self, download_result): res = download_result[self.new_download_url] checksum = res.buffer.getvalue().decode('utf-8').split()[0] self.check_data_and_start_download(self.url, checksum) def post_install(self): """Create the appropriate JetBrains launcher.""" icon_path = join(self.install_path, 'bin', self.icon_filename) comment = self.description + " (UDTC)" categories = "Development;IDE;" create_launcher(self.desktop_filename, get_application_desktop_file(name=self.name, icon_path=icon_path, try_exec=self.exec_path, exec=self.exec_link_name, comment=comment, categories=categories)) def install_framework_parser(self, parser): this_framework_parser = super().install_framework_parser(parser) this_framework_parser.add_argument('--eap', action="store_true", help=_("Install EAP version if available")) return this_framework_parser def run_for(self, args): if args.eap: self.download_page += '&type=eap' self.name += " EAP" self.description += " EAP" self.desktop_filename = self.desktop_filename.replace(".desktop", "-eap.desktop") self.install_path += "-eap" super().run_for(args) class PyCharm(BaseJetBrains): """The JetBrains PyCharm Community Edition distribution.""" download_keyword = 'PCC' executable = "pycharm.sh" def __init__(self, **kwargs): super().__init__(name="PyCharm", description=_("PyCharm Community Edition"), only_on_archs=['i386', 'amd64'], packages_requirements=['python', 'python3'], dir_to_decompress_in_tarball='pycharm-community-*', desktop_filename='jetbrains-pycharm-ce.desktop', icon_filename='pycharm.png', **kwargs) class PyCharmEducational(BaseJetBrains): """The JetBrains PyCharm Educational Edition distribution.""" download_keyword = 'PCE' executable = "pycharm.sh" def __init__(self, **kwargs): super().__init__(name="PyCharm Educational", description=_("PyCharm Educational Edition"), only_on_archs=['i386', 'amd64'], packages_requirements=['python', 'python3'], dir_to_decompress_in_tarball='pycharm-edu*', desktop_filename='jetbrains-pycharm-edu.desktop', icon_filename='pycharm.png', **kwargs) class PyCharmProfessional(BaseJetBrains): """The JetBrains PyCharm Professional Edition distribution.""" download_keyword = 'PCP' executable = "pycharm.sh" def __init__(self, **kwargs): super().__init__(name="PyCharm Professional", description=_("PyCharm Professional Edition"), only_on_archs=['i386', 'amd64'], packages_requirements=['python', 'python3'], dir_to_decompress_in_tarball='pycharm-*', desktop_filename='jetbrains-pycharm.desktop', icon_filename='pycharm.png', **kwargs) class Idea(BaseJetBrains): """The JetBrains IntelliJ Idea Community Edition distribution.""" download_keyword = 'IIC' executable = "idea.sh" def __init__(self, **kwargs): super().__init__(name="Idea", description=_("IntelliJ IDEA Community Edition"), only_on_archs=['i386', 'amd64'], packages_requirements=['openjdk-7-jdk | openjdk-8-jdk'], dir_to_decompress_in_tarball='idea-IC-*', desktop_filename='jetbrains-idea-ce.desktop', icon_filename='idea.png', **kwargs) class IdeaUltimate(BaseJetBrains): """The JetBrains IntelliJ Idea Ultimate Edition distribution.""" download_keyword = 'IIU' executable = "idea.sh" def __init__(self, **kwargs): super().__init__(name="Idea Ultimate", description=_("IntelliJ IDEA"), only_on_archs=['i386', 'amd64'], packages_requirements=['openjdk-7-jdk | openjdk-8-jdk'], dir_to_decompress_in_tarball='idea-IU-*', desktop_filename='jetbrains-idea.desktop', icon_filename='idea.png', **kwargs) class RubyMine(BaseJetBrains): """The JetBrains RubyMine IDE""" download_keyword = 'RM' executable = "rubymine.sh" def __init__(self, **kwargs): super().__init__(name="RubyMine", description=_("Ruby on Rails IDE"), only_on_archs=['i386', 'amd64'], packages_requirements=['ruby'], dir_to_decompress_in_tarball='RubyMine-*', desktop_filename='jetbrains-rubymine.desktop', icon_filename='rubymine.png', **kwargs) class WebStorm(BaseJetBrains): """The JetBrains WebStorm IDE""" download_keyword = 'WS' executable = "webstorm.sh" def __init__(self, **kwargs): super().__init__(name="WebStorm", description=_("Complex client-side and server-side javascript IDE"), only_on_archs=['i386', 'amd64'], dir_to_decompress_in_tarball='WebStorm-*', desktop_filename='jetbrains-webstorm.desktop', icon_filename='webstorm.svg', **kwargs) class PhpStorm(BaseJetBrains): """The JetBrains PhpStorm IDE""" download_keyword = 'PS' executable = "phpstorm.sh" def __init__(self, **kwargs): super().__init__(name="PhpStorm", description=_("PHP and web development IDE"), only_on_archs=['i386', 'amd64'], dir_to_decompress_in_tarball='PhpStorm-*', desktop_filename='jetbrains-phpstorm.desktop', icon_filename='phpstorm.png', **kwargs) class CLion(BaseJetBrains): """The JetBrains CLion IDE""" download_keyword = 'CL' executable = "clion.sh" def __init__(self, **kwargs): super().__init__(name="CLion", description=_("CLion integrated C/C++ IDE"), only_on_archs=['amd64'], dir_to_decompress_in_tarball='clion-*', desktop_filename='jetbrains-clion.desktop', icon_filename='clion.svg', **kwargs) class DataGrip(BaseJetBrains): """The JetBrains DataGrip IDE""" download_keyword = 'DG' executable = "datagrip.sh" def __init__(self, **kwargs): super().__init__(name="DataGrip", description=_("DataGrip SQL and databases IDE"), only_on_archs=['i386', 'amd64'], dir_to_decompress_in_tarball='DataGrip-*', desktop_filename='jetbrains-datagrip.desktop', icon_filename='datagrip.png', **kwargs) class GoLand(BaseJetBrains): """The JetBrains GoLand IDE""" download_keyword = 'GO' executable = "goland.sh" def __init__(self, **kwargs): super().__init__(name="GoLand", description=_("The Drive to Develop"), only_on_archs=['i386', 'amd64'], dir_to_decompress_in_tarball='GoLand-*', desktop_filename='jetbrains-goland.desktop', icon_filename='goland.png', **kwargs) class Rider(BaseJetBrains): """The JetBrains cross-platform .NET IDE""" download_keyword = 'RD' executable = "rider.sh" def __init__(self, **kwargs): super().__init__(name="Rider", description=_("The JetBrains cross-platform .NET IDE"), only_on_archs=['i386', 'amd64'], packages_requirements=['mono-devel'], dir_to_decompress_in_tarball='JetBrains Rider-*', desktop_filename='jetbrains-rider.desktop', icon_filename='rider.png', **kwargs) class BaseNetBeans(umake.frameworks.baseinstaller.BaseInstaller, metaclass=ABCMeta): """The base for all Netbeans installers.""" BASE_URL = "http://download.netbeans.org/netbeans" EXECUTABLE = "nb/netbeans" def __init__(self, *args, **kwargs): """Add executable required file path to existing list""" if self.executable: current_required_files_path = kwargs.get("required_files_path", []) current_required_files_path.append(os.path.join("bin", self.executable)) kwargs["required_files_path"] = current_required_files_path download_page = "https://netbeans.org/downloads/zip.html" kwargs["download_page"] = download_page super().__init__(*args, **kwargs) @property @abstractmethod def download_keyword(self): pass @property @abstractmethod def executable(self): pass def parse_download_link(self, line, in_download): """Parse Netbeans download links""" url, checksum = (None, None) if 'var PAGE_ARTIFACTS_LOCATION' in line: in_download = True else: in_download = False if in_download: p = re.search(r'var PAGE_ARTIFACTS_LOCATION = \"/images_www/v6/download/(\S+)/final/\";', line) with suppress(AttributeError): # url set to check in baseinstaller if missing self.version = p.group(1) self.new_download_url = "https://netbeans.org/images_www/v6/download/" + \ "{}/final/js/files.js".format(self.version) return ((None, None), in_download) @MainLoop.in_mainloop_thread def get_sha_and_start_download(self, download_result): res = download_result[self.new_download_url].buffer.getvalue().decode('utf-8').split('\n') preg = re.compile(r'add_file\(\"zip/netbeans-{}-[0-9]{{12}}-?{}.zip"'.format(self.version, self.download_keyword)) for line in res: if preg.match(line): # Clean up the string from js (it's a function call) line = line.replace("add_file(", "").replace(");", "").replace('"', "") url_string = line string_array = url_string.split(", ") url_suffix = string_array[0] checksum = string_array[2] url = "{}/{}/final/{}".format(self.BASE_URL, self.version, url_suffix) self.check_data_and_start_download(url, checksum) def post_install(self): """Create the Netbeans launcher""" create_launcher(self.desktop_filename, get_application_desktop_file(name=self.name, icon_path=join(self.install_path, "nb", "netbeans.png"), try_exec=self.exec_path, exec=self.exec_link_name, comment=self.description, categories="Development;IDE;")) class Netbeans(BaseNetBeans): download_keyword = '' executable = "netbeans" def __init__(self, **kwargs): super().__init__(name=_("Netbeans"), description=_("Extensible Java IDE"), only_on_archs=['i386', 'amd64'], desktop_filename="netbeans.desktop", dir_to_decompress_in_tarball="netbeans*", packages_requirements=['openjdk-7-jdk | openjdk-8-jdk'], checksum_type=ChecksumType.sha256, **kwargs) class NetbeansJavaEE(BaseNetBeans): download_keyword = 'javaee' executable = "netbeans" def __init__(self, **kwargs): super().__init__(name=_("Netbeans JavaEE"), description=_("Extensible Java IDE, JavaEE edition"), only_on_archs=['i386', 'amd64'], desktop_filename='netbeansjee.desktop', dir_to_decompress_in_tarball="netbeans*", packages_requirements=['openjdk-7-jdk | openjdk-8-jdk'], checksum_type=ChecksumType.sha256, **kwargs) class NetbeansHTML(BaseNetBeans): download_keyword = 'html' executable = "netbeans" def __init__(self, **kwargs): super().__init__(name=_("Netbeans HTML"), description=_("Extensible Java IDE, HTML edition"), only_on_archs=['i386', 'amd64'], desktop_filename='netbeanshtml.desktop', dir_to_decompress_in_tarball="netbeans*", packages_requirements=['openjdk-7-jdk | openjdk-8-jdk'], checksum_type=ChecksumType.sha256, **kwargs) class NetbeansJavaEE(BaseNetBeans): download_keyword = 'cpppp' executable = "netbeans" def __init__(self, **kwargs): super().__init__(name=_("Netbeans JEE"), description=_("Extensible Java IDE, C C++ edition"), only_on_archs=['i386', 'amd64'], desktop_filename='netbeansc.desktop', dir_to_decompress_in_tarball="netbeans*", packages_requirements=['openjdk-7-jdk | openjdk-8-jdk'], checksum_type=ChecksumType.sha256, **kwargs) class VisualStudioCode(umake.frameworks.baseinstaller.BaseInstaller): PERM_DOWNLOAD_LINKS = { "i686": "https://go.microsoft.com/fwlink/?LinkID=620885", "x86_64": "https://go.microsoft.com/fwlink/?LinkID=620884", "i686-insiders": "https://go.microsoft.com/fwlink/?LinkId=723969", "x86_64-insiders": "https://go.microsoft.com/fwlink/?LinkId=723968" } def __init__(self, **kwargs): super().__init__(name="Visual Studio Code", description=_("Visual Studio focused on modern web and cloud"), only_on_archs=['i386', 'amd64'], expect_license=True, download_page="https://code.visualstudio.com/License", desktop_filename="visual-studio-code.desktop", required_files_path=["bin/code"], dir_to_decompress_in_tarball="VSCode-linux-*", packages_requirements=["libgtk2.0-0", "libgconf-2-4"], **kwargs) def parse_license(self, line, license_txt, in_license): """Parse Android Studio download page for license""" if 'SOFTWARE LICENSE TERMS' in line: in_license = True if in_license and "
" in line: in_license = False if in_license: license_txt.write(line.strip() + "\n") return in_license def parse_download_link(self, line, in_download): """We have persistent links for Visual Studio Code, return it right away""" url = None version = platform.machine() if 'Insiders' in self.name: version += '-insiders' with suppress(KeyError): url = self.PERM_DOWNLOAD_LINKS[version] return ((url, None), in_download) def post_install(self): """Create the Visual Studio Code launcher""" create_launcher(self.desktop_filename, get_application_desktop_file(name=_("Visual Studio Code"), icon_path=os.path.join(self.install_path, "resources", "app", "resources", "linux", "code.png"), try_exec=self.exec_path, exec=self.exec_link_name, comment=_("Visual Studio focused on modern web and cloud"), categories="Development;IDE;", extra="StartupWMClass=Code")) def install_framework_parser(self, parser): this_framework_parser = super().install_framework_parser(parser) this_framework_parser.add_argument('--insiders', action="store_true", help=_("Install Insiders version if available")) return this_framework_parser def run_for(self, args): if args.insiders: self.name += " Insiders" self.description += " insiders" self.desktop_filename = self.desktop_filename.replace(".desktop", "-insiders.desktop") self.install_path += "-insiders" self.required_files_path = ["bin/code-insiders"] super().run_for(args) class LightTable(umake.frameworks.baseinstaller.BaseInstaller): def __init__(self, **kwargs): super().__init__(name="LightTable", description=_("LightTable code editor"), only_on_archs=['amd64'], download_page="https://api.github.com/repos/LightTable/LightTable/releases/latest", desktop_filename="lighttable.desktop", required_files_path=["LightTable"], dir_to_decompress_in_tarball="lighttable-*", json=True, **kwargs) def parse_download_link(self, line, in_download): url = None for asset in line["assets"]: if "linux" in asset["browser_download_url"]: in_download = True url = asset["browser_download_url"] return (url, in_download) def post_install(self): """Create the LightTable Code launcher""" create_launcher(self.desktop_filename, get_application_desktop_file(name=_("LightTable"), icon_path=os.path.join(self.install_path, "resources", "app", "core", "img", "lticon.png"), try_exec=self.exec_path, exec=self.exec_link_name, comment=_("LightTable code editor"), categories="Development;IDE;")) class Atom(umake.frameworks.baseinstaller.BaseInstaller): def __init__(self, **kwargs): super().__init__(name="Atom", description=_("The hackable text editor"), only_on_archs=['amd64'], download_page="https://api.github.com/repos/Atom/Atom/releases/latest", desktop_filename="atom.desktop", required_files_path=["atom", "resources/app/apm/bin/apm"], dir_to_decompress_in_tarball="atom-*", packages_requirements=["libgconf-2-4"], json=True, **kwargs) def parse_download_link(self, line, in_download): url = None for asset in line["assets"]: if "tar.gz" in asset["browser_download_url"]: in_download = True url = asset["browser_download_url"] return (url, in_download) def post_install(self): """Create the Atom Code launcher""" # Add apm to PATH add_exec_link(os.path.join(self.install_path, "resources", "app", "apm", "bin", "apm"), os.path.join(self.default_binary_link_path, 'apm')) create_launcher(self.desktop_filename, get_application_desktop_file(name=_("Atom"), icon_path=os.path.join(self.install_path, "atom.png"), try_exec=self.exec_path, exec=self.exec_link_name, comment=_("The hackable text editor"), categories="Development;IDE;")) def install_framework_parser(self, parser): this_framework_parser = super().install_framework_parser(parser) this_framework_parser.add_argument('--beta', action="store_true", help=_("Install Beta version if available")) return this_framework_parser def run_for(self, args): if args.beta: self.name += " Beta" self.description += " beta" self.desktop_filename = self.desktop_filename.replace(".desktop", "-beta.desktop") self.download_page = "https://api.github.com/repos/Atom/Atom/releases" self.install_path += "-beta" super().run_for(args) class DBeaver(umake.frameworks.baseinstaller.BaseInstaller): def __init__(self, **kwargs): super().__init__(name="DBeaver", description=_("Free universal database manager and SQL client"), only_on_archs=['amd64', 'i386'], download_page="https://api.github.com/repos/DBeaver/DBeaver/releases/latest", desktop_filename="dbeaver.desktop", required_files_path=["dbeaver"], dir_to_decompress_in_tarball="dbeaver", packages_requirements=['openjdk-8-jre-headless'], json=True, **kwargs) arch_trans = { "amd64": "x86_64", "i386": "x86" } def parse_download_link(self, line, in_download): url = None for asset in line["assets"]: if "linux.gtk.{}.tar.gz".format(self.arch_trans[get_current_arch()]) in asset["browser_download_url"]: in_download = True url = asset["browser_download_url"] return (url, in_download) def post_install(self): """Create the DBeaver launcher""" create_launcher(self.desktop_filename, get_application_desktop_file(name=self.name, icon_path=os.path.join(self.install_path, "dbeaver.png"), try_exec=self.exec_path, exec=self.exec_link_name, comment=self.description, categories="Development;IDE;")) class SublimeText(umake.frameworks.baseinstaller.BaseInstaller): def __init__(self, **kwargs): super().__init__(name="Sublime Text", description=_("Sophisticated text editor for code, markup and prose"), only_on_archs=['i386', 'amd64'], download_page="https://sublimetext.com/3", desktop_filename="sublime-text.desktop", required_files_path=["sublime_text"], dir_to_decompress_in_tarball="sublime_text_*", **kwargs) arch_trans = { "amd64": "x64", "i386": "x32" } def parse_download_link(self, line, in_download): """Parse SublimeText download links""" url = None if '.tar.bz2' in line: p = re.search(r'href="([^<]*{}.tar.bz2)"'.format(self.arch_trans[get_current_arch()]), line) with suppress(AttributeError): url = p.group(1) return ((url, None), in_download) def post_install(self): """Create the Sublime Text Code launcher""" create_launcher(self.desktop_filename, get_application_desktop_file(name=_("Sublime Text"), icon_path=os.path.join(self.install_path, "Icon", "128x128", "sublime-text.png"), try_exec=self.exec_path, exec=self.exec_link_name, comment=_("Sophisticated text editor for code, markup and prose"), categories="Development;TextEditor;")) class SpringToolsSuite(umake.frameworks.baseinstaller.BaseInstaller): def __init__(self, **kwargs): super().__init__(name="Spring Tools Suite", description=_("Spring Tools Suite IDE"), download_page="https://spring.io/tools/sts/all", dir_to_decompress_in_tarball='sts-bundle/sts-*', checksum_type=ChecksumType.sha1, desktop_filename='STS.desktop', only_on_archs=['i386', 'amd64'], packages_requirements=['openjdk-7-jdk | openjdk-8-jdk'], icon_filename='icon.xpm', required_files_path=["STS"], **kwargs) self.arch = '' if platform.machine() == 'i686' else '-x86_64' self.new_download_url = None def parse_download_link(self, line, in_download): """Parse STS download links""" url, checksum = (None, None) if 'linux-gtk{}.tar.gz'.format(self.arch) in line: in_download = True else: in_download = False if in_download: p = re.search(r'href="(.*.tar.gz)"', line) with suppress(AttributeError): # url set to check in baseinstaller if missing url = p.group(1) + '.sha1' self.new_download_url = url return ((None, None), in_download) @MainLoop.in_mainloop_thread def get_sha_and_start_download(self, download_result): res = download_result[self.new_download_url] checksum = res.buffer.getvalue().decode('utf-8').split()[0] # you get and store self.download_url url = re.sub('.sha1', '', self.new_download_url) self.check_data_and_start_download(url, checksum) def post_install(self): """Create the Spring Tools Suite launcher""" categories = "Development;IDE;" create_launcher(self.desktop_filename, get_application_desktop_file(name=_(self.name), icon_path=os.path.join(self.install_path, self.icon_filename), try_exec=self.exec_path, exec=self.exec_link_name, comment=_(self.description), categories=categories)) class Processing(umake.frameworks.baseinstaller.BaseInstaller): def __init__(self, **kwargs): super().__init__(name="Processing", description=_("Processing code editor"), only_on_archs=['i386', 'amd64'], download_page="https://api.github.com/repos/processing/processing/releases/latest", desktop_filename="processing.desktop", required_files_path=["processing"], dir_to_decompress_in_tarball="processing-*", json=True, **kwargs) arch_trans = { "amd64": "64", "i386": "32" } def parse_download_link(self, line, in_download): url = None for asset in line["assets"]: if "linux{}".format(self.arch_trans[get_current_arch()]) in asset["browser_download_url"]: in_download = True url = asset["browser_download_url"] return (url, in_download) def post_install(self): """Create the Processing Code launcher""" create_launcher(self.desktop_filename, get_application_desktop_file(name=_("Processing"), icon_path=os.path.join(self.install_path, "lib", "icons", "pde-256.png"), try_exec=self.exec_path, exec=self.exec_link_name, comment=_("Processing is a flexible software sketchbook"), categories="Development;IDE;")) class Arduino(Arduino): def setup(self, *args, **kwargs): '''Print a deprecation warning before calling parent setup()''' logger.warning("Arduino is now in the electronics category, please refer it from this category from now on. " "This compatibility will be dropped in the future.") super().setup(*args, **kwargs) ubuntu-make-18.09+disco1/umake/frameworks/kotlin.py0000644000000000000000000000435613352651520017202 0ustar # -*- coding: utf-8 -*- # Copyright (C) 2016 Canonical # # Authors: # Omer Sheikh # # 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; version 3. # # 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 """Kotlin module""" from gettext import gettext as _ import logging import os import json import umake.frameworks.baseinstaller from umake.interactions import DisplayMessage from umake.tools import add_env_to_user, MainLoop from umake.ui import UI from umake.network.download_center import DownloadItem logger = logging.getLogger(__name__) class KotlinCategory(umake.frameworks.BaseCategory): def __init__(self): super().__init__(name="Kotlin", description=_("The Kotlin Programming Language"), logo_path=None) class KotlinLang(umake.frameworks.baseinstaller.BaseInstaller): def __init__(self, **kwargs): super().__init__(name="Kotlin Lang", description=_("Kotlin language standalone compiler"), is_category_default=True, packages_requirements=["openjdk-7-jre | openjdk-8-jre"], download_page="https://api.github.com/repos/Jetbrains/kotlin/releases/latest", dir_to_decompress_in_tarball="kotlinc", required_files_path=[os.path.join("bin", "kotlinc")], json=True, **kwargs) def parse_download_link(self, line, in_download): url = line["assets"][0]["browser_download_url"] return (url, in_download) def post_install(self): """Add the Kotlin binary dir to PATH""" add_env_to_user(self.name, {"PATH": {"value": os.path.join(self.install_path, "bin")}}) UI.delayed_display(DisplayMessage(self.RELOGIN_REQUIRE_MSG.format(self.name))) ubuntu-make-18.09+disco1/umake/frameworks/maven.py0000644000000000000000000001171213352651520017002 0ustar # -*- coding: utf-8 -*- # Copyright (C) 2014 Canonical # # Authors: # Didier Roche # Igor Vuk # # 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; version 3. # # 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 """Maven module""" from contextlib import suppress from gettext import gettext as _ import logging import os import re import umake.frameworks.baseinstaller from umake.interactions import DisplayMessage from umake.network.download_center import DownloadCenter, DownloadItem from umake.tools import add_env_to_user, MainLoop, ChecksumType, Checksum from umake.ui import UI logger = logging.getLogger(__name__) class MavenCategory(umake.frameworks.BaseCategory): def __init__(self): super().__init__(name="Maven", description=_("Java software project management and comprehension tool"), logo_path=None) class MavenLang(umake.frameworks.baseinstaller.BaseInstaller): def __init__(self, **kwargs): super().__init__(name="Maven Lang", description=_("Java software project management and comprehension tool"), is_category_default=True, packages_requirements=["openjdk-7-jdk | openjdk-8-jdk"], checksum_type=ChecksumType.sha1, match_last_link=True, download_page="https://www.apache.org/dist/maven/maven-3", dir_to_decompress_in_tarball="apache-maven-*", required_files_path=[os.path.join("bin", "mvn")], **kwargs) self.checksum_url = None def parse_download_link(self, line, in_download): """Parse Maven download link, expect to find a url""" url_found = False if 'alt="[DIR]"> '.format(self.arch_trans[get_current_arch()]) in line: p = re.search(r'href="(.*)">', line) with suppress(AttributeError): url = p.group(1) logger.debug("Found link: {}".format(url)) return ((url, None), in_download) def post_install(self): """Add rust necessary env variables""" add_env_to_user(self.name, {"PATH": {"value": "{}:{}".format(os.path.join(self.install_path, "rustc", "bin"), os.path.join(self.install_path, "cargo", "bin"))}, "LD_LIBRARY_PATH": {"value": os.path.join(self.install_path, "rustc", "lib")}}) # adjust for rust: some symlinks magic to have stdlib craft available arch_lib_folder = '{}-unknown-linux-gnu'.format(self.arch_trans[get_current_arch()]) os.symlink(os.path.join(self.install_path, 'rust-std-{}'.format(arch_lib_folder), 'lib', 'rustlib', arch_lib_folder, 'lib'), os.path.join(self.install_path, 'rustc', 'lib', 'rustlib', arch_lib_folder, 'lib')) UI.delayed_display(DisplayMessage(self.RELOGIN_REQUIRE_MSG.format(self.name))) ubuntu-make-18.09+disco1/umake/frameworks/scala.py0000644000000000000000000000474313352651520016765 0ustar # -*- coding: utf-8 -*- # Copyright (C) 2014 Canonical # # Authors: # Didier Roche # Igor Vuk # # 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; version 3. # # 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 """Scala module""" from contextlib import suppress from gettext import gettext as _ import logging import os import re import umake.frameworks.baseinstaller from umake.interactions import DisplayMessage from umake.tools import add_env_to_user from umake.ui import UI logger = logging.getLogger(__name__) class ScalaCategory(umake.frameworks.BaseCategory): def __init__(self): super().__init__(name="Scala", description=_("The Scala Programming Language"), logo_path=None) class ScalaLang(umake.frameworks.baseinstaller.BaseInstaller): def __init__(self, **kwargs): super().__init__(name="Scala Lang", description=_("Scala compiler and interpreter (default)"), is_category_default=True, packages_requirements=["openjdk-7-jre | openjdk-8-jre"], download_page="http://www.scala-lang.org/download/", dir_to_decompress_in_tarball="scala-*", required_files_path=[os.path.join("bin", "scala")], **kwargs) def parse_download_link(self, line, in_download): """Parse Scala download link, expect to find a url""" if 'id="#link-main-unixsys"' in line: p = re.search(r'href="(.*)"', line) with suppress(AttributeError): url = p.group(1) return ((url, None), True) return ((None, None), False) def post_install(self): """Add the necessary Scala environment variables""" add_env_to_user(self.name, {"PATH": {"value": os.path.join(self.install_path, "bin")}, "SCALA_HOME": {"value": self.install_path}}) UI.delayed_display(DisplayMessage(self.RELOGIN_REQUIRE_MSG.format(self.name))) ubuntu-make-18.09+disco1/umake/frameworks/swift.py0000644000000000000000000001471313352651520017034 0ustar # -*- coding: utf-8 -*- # Copyright (C) 2014 Canonical # # Authors: # Didier Roche # # 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; version 3. # # 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 """Swift module""" from contextlib import suppress from gettext import gettext as _ import gnupg import logging import os import re import tempfile import umake.frameworks.baseinstaller from umake.interactions import DisplayMessage from umake.tools import add_env_to_user, as_root, MainLoop, get_current_ubuntu_version from umake.network.download_center import DownloadCenter, DownloadItem from umake.ui import UI logger = logging.getLogger(__name__) class SwiftCategory(umake.frameworks.BaseCategory): def __init__(self): super().__init__(name="Swift", description=_("Swift language"), logo_path=None) class SwiftLang(umake.frameworks.baseinstaller.BaseInstaller): def __init__(self, **kwargs): super().__init__(name="Swift Lang", description=_("Swift compiler (default)"), is_category_default=True, packages_requirements=["clang", "libicu-dev", "libicu57 | libicu55"], only_on_archs=['amd64'], download_page="https://swift.org/download/", dir_to_decompress_in_tarball="swift*", required_files_path=[os.path.join("usr", "bin", "swift")], **kwargs) self.asc_url = "https://swift.org/keys/all-keys.asc" def parse_download_link(self, line, in_download): """Parse Swift download link, expect to find a .sig file""" sig_url = None if '.tar.gz.sig' in line: in_download = True if in_download: p = re.search(r'href="(.*)" title="PGP Signature"', line) with suppress(AttributeError): sig_url = "https://swift.org" + p.group(1) logger.debug("Found signature link: {}".format(sig_url)) return (sig_url, in_download) @MainLoop.in_mainloop_thread def get_metadata_and_check_license(self, result): """Download files to download + license and check it""" logger.debug("Parse download metadata") error_msg = result[self.download_page].error if error_msg: logger.error("An error occurred while downloading {}: {}".format(self.download_page, error_msg)) UI.return_main_screen(status_code=1) in_download = False sig_url = None for line in result[self.download_page].buffer: line_content = line.decode() (new_sig_url, in_download) = self.parse_download_link(line_content, in_download) if str(new_sig_url) > str(sig_url): # Avoid fetching development snapshots if 'DEVELOPMENT-SNAPSHOT' not in new_sig_url: tmp_release = re.search("ubuntu(.....).tar", new_sig_url).group(1) if tmp_release <= get_current_ubuntu_version(): sig_url = new_sig_url if not sig_url: logger.error("Download page changed its syntax or is not parsable") UI.return_main_screen(status_code=1) DownloadCenter(urls=[DownloadItem(sig_url, None), DownloadItem(self.asc_url, None)], on_done=self.check_gpg_and_start_download, download=False) def _check_gpg_signature(self, gnupgdir, asc_content, sig): """check gpg signature (temporary stock in dir)""" gpg = gnupg.GPG(gnupghome=gnupgdir) imported_keys = gpg.import_keys(asc_content) if imported_keys.count == 0: logger.error("Keys not valid") UI.return_main_screen(status_code=1) verify = gpg.verify(sig) if verify is False: logger.error("Signature not valid") UI.return_main_screen(status_code=1) @MainLoop.in_mainloop_thread def check_gpg_and_start_download(self, download_result): asc_content = download_result.pop(self.asc_url).buffer.getvalue().decode('utf-8') sig_url = list(download_result.keys())[0] res = download_result[sig_url] sig = res.buffer.getvalue().decode('utf-8').split()[0] # When we install new packages, we are executing as root and then dropping # as the user for extracting and such. However, for signature verification, # we use gpg. This one doesn't like priviledge drop (if uid = 0 and # euid = 1000) and asserts if uid != euid. # Importing the key as root as well creates new gnupg files owned as root if # new keys weren't imported first. # Consequently, run gpg as root if we needed root access or as the user # otherwise. We store the gpg public key in a temporary gnupg directory that # will be removed under the same user rights (this directory needs to be owned # by the same user id to not be rejected by gpg).Z if self.need_root_access: with as_root(): with tempfile.TemporaryDirectory() as tmpdirname: self._check_gpg_signature(tmpdirname, asc_content, sig) else: with tempfile.TemporaryDirectory() as tmpdirname: self._check_gpg_signature(tmpdirname, asc_content, sig) # you get and store self.download_url url = re.sub('.sig', '', sig_url) if url is None: logger.error("Download page changed its syntax or is not parsable (missing url)") UI.return_main_screen(status_code=1) logger.debug("Found download link for {}".format(url)) self.download_requests.append(DownloadItem(url, None)) self.start_download_and_install() def post_install(self): """Add swift necessary env variables""" add_env_to_user(self.name, {"PATH": {"value": os.path.join(self.install_path, "usr", "bin")}}) UI.delayed_display(DisplayMessage(self.RELOGIN_REQUIRE_MSG.format(self.name))) ubuntu-make-18.09+disco1/umake/frameworks/web.py0000644000000000000000000001605713352651520016460 0ustar # -*- coding: utf-8 -*- # Copyright (C) 2015 Canonical # # Authors: # Didier Roche # # 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; version 3. # # 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 """Web module""" from contextlib import suppress from functools import partial from gettext import gettext as _ import logging import os import platform import re import umake.frameworks.baseinstaller from umake.interactions import Choice, TextWithChoices, DisplayMessage from umake.network.download_center import DownloadItem from umake.ui import UI from umake.tools import create_launcher, get_application_desktop_file, MainLoop, ChecksumType,\ get_current_arch, add_env_to_user logger = logging.getLogger(__name__) _supported_archs = ['i386', 'amd64'] class WebCategory(umake.frameworks.BaseCategory): def __init__(self): super().__init__(name="Web", description=_("Web Developer Environment"), logo_path=None) class FirefoxDev(umake.frameworks.baseinstaller.BaseInstaller): def __init__(self, **kwargs): super().__init__(name="Firefox Dev", description=_("Firefox Developer Edition"), only_on_archs=_supported_archs, download_page="https://www.mozilla.org/en-US/firefox/developer/all", dir_to_decompress_in_tarball="firefox", desktop_filename="firefox-developer.desktop", required_files_path=["firefox"], **kwargs) self.arg_lang = None @MainLoop.in_mainloop_thread def language_select_callback(self, url): url = url.replace("&", "&") logger.debug("Found download link for {}".format(url)) self.download_requests.append(DownloadItem(url, None)) self.start_download_and_install() @MainLoop.in_mainloop_thread def get_metadata_and_check_license(self, result): """Diverge from the baseinstaller implementation in order to allow language selection""" logger.debug("Parse download metadata") error_msg = result[self.download_page].error if error_msg: logger.error("An error occurred while downloading {}: {}".format(self.download_page, error_msg)) UI.return_main_screen(status_code=1) arch = platform.machine() arg_lang_url = None default_label = '' tag_machine = '' if arch == 'x86_64': tag_machine = '64' reg_expression = r'href="(\S+os=linux{}&lang=\S+)"'.format(tag_machine) languages = [] decoded_page = result[self.download_page].buffer.getvalue().decode() for index, p in enumerate(re.finditer(reg_expression, decoded_page)): with suppress(AttributeError): url = p.group(1) m = re.search(r'lang=(.*)', url) with suppress(AttributeError): lang = m.group(1) if self.arg_lang and self.arg_lang.lower() == lang.lower(): arg_lang_url = url break else: is_default_choice = False if lang == "en-US": default_label = "(default: en-US)" is_default_choice = True choice = Choice(index, lang, partial(self.language_select_callback, url), is_default=is_default_choice) languages.append(choice) if self.arg_lang: logger.debug("Selecting {} lang".format(self.arg_lang)) if not arg_lang_url: logger.error("Could not find a download url for language {}".format(self.arg_lang)) UI.return_main_screen(status_code=1) self.language_select_callback(arg_lang_url) else: if not languages: logger.error("Download page changed its syntax or is not parsable") UI.return_main_screen(status_code=1) logger.debug("Check list of installable languages.") UI.delayed_display(TextWithChoices(_("Choose language: {}".format(default_label)), languages, True)) def post_install(self): """Create the Firefox Developer launcher""" create_launcher(self.desktop_filename, get_application_desktop_file(name=_("Firefox Developer Edition"), icon_path=os.path.join(self.install_path, "browser", "chrome", "icons", "default", "default128.png"), try_exec=self.exec_path, exec=self.exec_link_name, comment=_("Firefox Aurora with Developer tools"), categories="Development;IDE;", extra="StartupWMClass=Firefox Developer Edition")) def install_framework_parser(self, parser): this_framework_parser = super().install_framework_parser(parser) this_framework_parser.add_argument('--lang', dest="lang", action="store", help=_("Install in given language without prompting")) return this_framework_parser def run_for(self, args): if args.lang: self.arg_lang = args.lang super().run_for(args) class PhantomJS(umake.frameworks.baseinstaller.BaseInstaller): def __init__(self, **kwargs): super().__init__(name="PhantomJS", description=_("headless WebKit scriptable with a JavaScript API"), is_category_default=False, only_on_archs=['i386', 'amd64'], download_page="http://phantomjs.org/download.html", dir_to_decompress_in_tarball="phantomjs*", required_files_path=[os.path.join("bin", "phantomjs")], **kwargs) arch_trans = { "amd64": "x86_64", "i386": "i686" } def parse_download_link(self, line, in_download): """Parse PhantomJS download link, expect to find a sha and a url""" url = None string = 'linux-{}.tar.bz2">'.format(self.arch_trans[get_current_arch()]) if string in line: in_download = True if in_download is True: p = re.search(r'href="(.*)">', line) with suppress(AttributeError): url = p.group(1) if url is None: return (None, in_download) return ((url, None), in_download) def post_install(self): """Add phantomjs necessary env variables""" add_env_to_user(self.name, {"PATH": {"value": os.path.join(self.install_path, "bin")}}) UI.delayed_display(DisplayMessage(self.RELOGIN_REQUIRE_MSG.format(self.name))) ubuntu-make-18.09+disco1/umake/interactions/0000755000000000000000000000000013415342711015641 5ustar ubuntu-make-18.09+disco1/umake/interactions/__init__.py0000644000000000000000000001446513352651520017765 0ustar # -*- coding: utf-8 -*- # Copyright (C) 2014 Canonical # # Authors: # Didier Roche # # 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; version 3. # # 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 # module gather different types of interactions with the UI from gettext import gettext as _ import logging from umake.tools import InputError logger = logging.getLogger(__name__) class Choice: def __init__(self, id, label, callback_fn, txt_shorcut=None, is_default=False): """Choice element containing label and callback function""" self.id = id self.label = label self.txt_shorcut = txt_shorcut self.callback_fn = callback_fn self.is_default = is_default class TextWithChoices: def __init__(self, content, choices=[], newline_before_option=False): """Content text with a list of multiple Choice elements""" current_ids = [] default_found = False for choice in choices: if choice.id in current_ids: message = "{} choice id is already in registered ids. Can't instantiate this " \ "interaction".format(choice.id) logger.error(message) raise BaseException(message) current_ids.append(choice.id) if choice.is_default: if default_found: message = "One default was already registered, can't register a second one in that choices set: {}"\ .format([choice.label for choice in choices]) logger.error(message) raise BaseException(message) default_found = True self.content = content self.choices = choices self.newline_before_option = newline_before_option def choose(self, choice_id=None, answer=None): """Return associated callback for choice""" for choice in self.choices: if (choice_id is not None and choice.id == choice_id) or\ (answer is not None and (choice.label.lower() == answer.lower() or (choice.txt_shorcut is not None and choice.txt_shorcut.lower() == answer.lower()))): return choice.callback_fn() msg = _("No suitable answer provided") if choice_id is not None: msg = _("Your entry '{}' isn't an acceptable choice. choices are: {}")\ .format(choice_id, [choice.id for choice in self.choices]) if answer is not None: txt_shortcuts = [choice.txt_shorcut for choice in self.choices if choice.txt_shorcut is not None] if txt_shortcuts: msg = _("Your entry '{}' isn't an acceptable choice. choices are: {} and {}")\ .format(answer, txt_shortcuts, [choice.label for choice in self.choices]) else: msg = _("Your entry '{}' isn't an acceptable choice. choices are: {}")\ .format(answer, [choice.label for choice in self.choices]) if not choice_id and not answer: for choice in self.choices: if choice.is_default: return choice.callback_fn() raise InputError(msg) @property def prompt(self): """Text prompt handling if we do have some shortcuts""" possible_answers = [] for choice in self.choices: answer = choice.label if choice.txt_shorcut: # NOTE: sum of answers answer += _(" ({})").format((choice.txt_shorcut)) possible_answers.append(answer) if self.newline_before_option: # NOTE: first is prompt, newline and then set of answers prompt = _("{}\n[{}] ").format(self.content, '/'.join(possible_answers)) else: # NOTE: first is prompt, then set of answers: prompt = _("{} [{}] ").format(self.content, '/'.join(possible_answers)) return prompt class LicenseAgreement(TextWithChoices): def __init__(self, content, callback_yes, callback_no): """License agreement text with accept/decline""" choices = [Choice(0, _("I Accept"), callback_yes, txt_shorcut=_("a")), Choice(1, _("I don't accept"), callback_no, txt_shorcut=_("N"), is_default=True)] super().__init__(content, choices=choices, newline_before_option=True) @property def input(self): """Text input prompt handling if we do have some shortcuts""" answers = [] for choice in self.choices: # NOTE: first element is choice, and then shortcut _("{} ({})") answer = _("{} ({})").format(choice.label, choice.txt_shorcut) answers.append(answer) # append different possible choices return _("[{}] ").format('/'.join(answers)) class InputText: def __init__(self, content, callback_fn, default_input=""): """Content text with an line input""" self.content = content self._callback_fn = callback_fn self.default_input = default_input def run_callback(self, result): self._callback_fn(result) class YesNo(TextWithChoices): def __init__(self, content, callback_yes, callback_no, default_is_yes=False): """Return a basic Yes No question, default being false or overriden""" super().__init__(content, [Choice(0, _("Yes"), callback_yes, txt_shorcut=_('y'), is_default=default_is_yes), Choice(1, _("No"), callback_no, txt_shorcut=_("N"), is_default=(not default_is_yes))]) class DisplayMessage: def __init__(self, text): self.text = text class UnknownProgress: def __init__(self, iterator): self.bar = None self._iterator = iterator ubuntu-make-18.09+disco1/umake/interactions/__pycache__/0000755000000000000000000000000013415342711020051 5ustar ubuntu-make-18.09+disco1/umake/network/0000755000000000000000000000000013415342711014630 5ustar ubuntu-make-18.09+disco1/umake/network/__init__.py0000644000000000000000000000000013352651520016730 0ustar ubuntu-make-18.09+disco1/umake/network/__pycache__/0000755000000000000000000000000013415342711017040 5ustar ubuntu-make-18.09+disco1/umake/network/download_center.py0000644000000000000000000002324313352651520020356 0ustar # -*- coding: utf-8 -*- # Copyright (C) 2014 Canonical # # Authors: # Didier Roche # # 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; version 3. # # 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 """Module delivering a DownloadCenter to download in parallel multiple requests""" from collections import namedtuple from concurrent import futures from contextlib import closing import hashlib from io import BytesIO import logging import os import tempfile import requests import requests.exceptions from umake.network.ftp_adapter import FTPAdapter from umake.tools import ChecksumType, root_lock logger = logging.getLogger(__name__) class DownloadItem(namedtuple('DownloadItem', ['url', 'checksum', 'headers', 'ignore_encoding', 'cookies'])): """An individual item to be downloaded and checked. Checksum should be an instance of tools.Checksum, if provided. Headers should be a dictionary of HTTP headers, if provided. Cookies should be a cookie dictionary, if provided.""" def __new__(cls, url, checksum=None, headers=None, ignore_encoding=False, cookies=None): return super().__new__(cls, url, checksum, headers, ignore_encoding, cookies) class DownloadCenter: """Read or download requested urls in separate threads.""" BLOCK_SIZE = 1024 * 8 # from urlretrieve code DownloadResult = namedtuple("DownloadResult", ["buffer", "error", "fd", "final_url", "cookies"]) def __init__(self, urls, on_done, download=True, report=lambda x: None): """Generate a threaded download machine. urls is a list of DownloadItems to download or read from. on_done is the callback that will be called once all those urls are downloaded. report, if not None, will be called once any download is in progress, reporting a dict of current download with current/size parameters The callback will get a dictionary parameter like: { "url": DownloadResult(buffer=page content as bytes if download is set to False. close() will clean it from memory, error=string detailing the error which occurred (path and content would be empty), fd=temporary file descriptor. close() will delete it from disk, final_url=the final url, which may be different from the start if there were redirects, cookies=a dictionary of cookies after the request ) } """ self._done_callback = on_done self._wired_report = report self._download_to_file = download self._urls = urls self._downloaded_content = {} self._download_progress = {} executor = futures.ThreadPoolExecutor(max_workers=len(urls)) for url_request in self._urls: # grab the md5sum if any # switch between inline memory and temp file if download: # Named because shutils and tarfile library needs a .name property # http://bugs.python.org/issue21044 # also, ensure we keep the same suffix path, ext = os.path.splitext(url_request.url) # We want to ensure that we don't create files as root root_lock.acquire() dest = tempfile.NamedTemporaryFile(suffix=ext) root_lock.release() logger.info("Start downloading {} to a temp file".format(url_request)) else: dest = BytesIO() logger.info("Start downloading {} in memory".format(url_request)) future = executor.submit(self._fetch, url_request, dest) future.tag_url = url_request.url future.tag_download = download future.tag_dest = dest future.add_done_callback(self._one_done) def _fetch(self, download_item, dest): """Get an url content and close the connexion. This will write the content to dest and check for md5sum. Return a tuple of (dest, final_url, cookies) """ url = download_item.url checksum = download_item.checksum headers = download_item.headers or {} cookies = download_item.cookies def _report(block_no, block_size, total_size): current_size = int(block_no * block_size) if total_size != -1: current_size = min(current_size, total_size) self._download_progress[url] = {"current": current_size, "size": total_size} logger.debug("Deliver download update: {}".format(self._download_progress)) self._wired_report(self._download_progress) # Requests support redirection out of the box. # Create a session so we can mount our own FTP adapter. session = requests.Session() session.mount('ftp://', FTPAdapter()) try: with closing(session.get(url, stream=True, headers=headers, cookies=cookies)) as r: r.raise_for_status() content_size = int(r.headers.get('content-length', -1)) # read in chunk and send report updates block_num = 0 _report(block_num, self.BLOCK_SIZE, content_size) for data in r.raw.stream(amt=self.BLOCK_SIZE, decode_content=not download_item.ignore_encoding): dest.write(data) block_num += 1 _report(block_num, self.BLOCK_SIZE, content_size) final_url = r.url cookies = session.cookies except requests.exceptions.InvalidSchema as exc: # Wrap this for a nicer error message. raise BaseException("Protocol not supported.") from exc if checksum and checksum.checksum_value: checksum_type = checksum.checksum_type checksum_value = checksum.checksum_value logger.debug("Checking checksum ({}).".format(checksum_type.name)) dest.seek(0) if checksum_type is ChecksumType.sha1: actual_checksum = self.sha1_for_fd(dest) elif checksum_type is ChecksumType.md5: actual_checksum = self.md5_for_fd(dest) elif checksum_type is ChecksumType.sha256: actual_checksum = self.sha256_for_fd(dest) elif checksum_type is ChecksumType.sha512: actual_checksum = self.sha512_for_fd(dest) else: msg = "Unsupported checksum type: {}.".format(checksum_type) raise BaseException(msg) logger.debug("Expected: {}, actual: {}.".format(checksum_value, actual_checksum)) if checksum_value != actual_checksum: msg = ("The checksum of {} doesn't match. Corrupted download? " "Aborting.").format(url) raise BaseException(msg) return dest, final_url, cookies def _one_done(self, future): """Callback that will be called once the download finishes. (will be wired on the constructor) """ if future.exception(): logger.error("{} couldn't finish download: {}".format(future.tag_url, future.exception())) result = self.DownloadResult(buffer=None, error=str(future.exception()), fd=None, final_url=None, cookies=None) # cleaned unusable temp file as something bad happened future.tag_dest.close() else: logger.info("{} download finished".format(future.tag_url)) fd, final_url, cookies = future.result() fd.seek(0) if future.tag_download: result = self.DownloadResult(buffer=None, error=None, fd=fd, final_url=final_url, cookies=cookies) else: result = self.DownloadResult(buffer=fd, error=None, fd=None, final_url=final_url, cookies=cookies) self._downloaded_content[future.tag_url] = result if len(self._urls) == len(self._downloaded_content): self._done() def _done(self): """Callback that will be called once all download finishes. uris of the temporary files will be passed on the wired callback """ logger.info("All pending downloads for {} done".format(self._urls)) self._done_callback(self._downloaded_content) @classmethod def _checksum_for_fd(cls, algorithm, f, block_size=2 ** 20): checksum = algorithm() while True: data = f.read(block_size) if not data: break checksum.update(data) return checksum.hexdigest() @classmethod def md5_for_fd(cls, f, block_size=2 ** 20): return cls._checksum_for_fd(hashlib.md5, f, block_size) @classmethod def sha1_for_fd(cls, f, block_size=2 ** 20): return cls._checksum_for_fd(hashlib.sha1, f, block_size) @classmethod def sha256_for_fd(cls, f, block_size=2 ** 20): return cls._checksum_for_fd(hashlib.sha256, f, block_size) @classmethod def sha512_for_fd(cls, f, block_size=2 ** 20): return cls._checksum_for_fd(hashlib.sha512, f, block_size) ubuntu-make-18.09+disco1/umake/network/ftp_adapter.py0000644000000000000000000000742113352651520017500 0ustar # -*- coding: utf-8 -*- # Copyright (C) 2014 Canonical # # Authors: # Tin Tvrtković # # 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; version 3. # # 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 from collections import namedtuple from ftplib import FTP, error_perm from queue import Queue from threading import Thread import urllib.parse from requests import Response from requests.adapters import BaseAdapter import requests.exceptions class FTPAdapter(BaseAdapter): """An FTP adapter for requests. Supports streaming GETs and not much else.""" @staticmethod def get_connection(hostname, timeout=None): return FTP(host=hostname, timeout=timeout, user='anonymous') def send(self, request, stream=False, timeout=None, **kwargs): parsed_url = urllib.parse.urlparse(request.url) file_path = parsed_url.path # Strip the leading slash, if present. if file_path.startswith('/'): file_path = file_path[1:] try: self.conn = self.get_connection(parsed_url.netloc, timeout) except ConnectionRefusedError as exc: # Wrap this in a requests exception. # in requests 2.2.1, ConnectionError does not take keyword args raise requests.exceptions.ConnectionError() from exc resp = Response() resp.url = request.url try: size = self.conn.size(file_path) except error_perm: resp.status_code = 404 return resp if stream: # We have to do this in a background thread, since ftplib's and requests' approaches are the opposite: # ftplib is callback based, and requests needs to expose an iterable. (Push vs pull) # When the queue size is reached, puts will block. This provides some backpressure. queue = Queue(maxsize=100) done_sentinel = object() def handle_transfer(): # Download all the chunks into a queue, then place a sentinel object into it to signal completion. self.conn.retrbinary('RETR ' + file_path, queue.put) queue.put(done_sentinel) Thread(target=handle_transfer).start() def stream(amt=8192, decode_content=False): """A generator, yielding chunks from the queue.""" # We maintain a buffer so the consumer gets exactly the number of bytes requested. buffer = bytearray() while True: data = queue.get() if data is not done_sentinel: buffer.extend(data) if len(buffer) >= amt: result = buffer[:amt] buffer = buffer[amt:] yield result else: if buffer: yield buffer return Raw = namedtuple('raw', 'stream') raw = Raw(stream) resp.status_code = 200 resp.raw = raw resp.headers['content-length'] = size resp.close = lambda: self.conn.close() return resp else: # Not relevant for Ubuntu Make. raise NotImplementedError ubuntu-make-18.09+disco1/umake/network/requirements_handler.py0000644000000000000000000003432113352651520021426 0ustar # -*- coding: utf-8 -*- # Copyright (C) 2014 Canonical # # Authors: # Didier Roche # # 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; version 3. # # 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 """Module delivering a DownloadCenter to download in parallel multiple requests""" import apt import apt.progress import apt.progress.base from collections import namedtuple from concurrent import futures from contextlib import suppress import fcntl import logging import os import tempfile import time from umake.tools import Singleton, add_foreign_arch, get_foreign_archs, get_current_arch, as_root logger = logging.getLogger(__name__) class RequirementsHandler(object, metaclass=Singleton): """Handle platform requirements""" STATUS_DOWNLOADING, STATUS_INSTALLING = range(2) RequirementsResult = namedtuple("RequirementsResult", ["bucket", "error"]) def __init__(self): logger.info("Create a new apt cache") self.cache = apt.Cache() self.executor = futures.ThreadPoolExecutor(max_workers=1) def is_bucket_installed(self, bucket): """Check if the bucket is installed The bucket is a list of packages to check if installed.""" logger.debug("Check if {} is installed".format(bucket)) is_installed = True for pkg_name in bucket: if ' | ' in pkg_name: for package in pkg_name.split(' | '): if self.is_bucket_installed([package]): bucket.remove(pkg_name) bucket.append(package) pkg_name = package break # /!\ danger: if current arch == ':appended_arch', on a non multiarch system, dpkg doesn't # understand that. strip :arch then if ":" in pkg_name: (pkg_without_arch_name, arch) = pkg_name.split(":", -1) if arch == get_current_arch(): pkg_name = pkg_without_arch_name if pkg_name not in self.cache or not self.cache[pkg_name].is_installed: logger.info("{} isn't installed".format(pkg_name)) is_installed = False return is_installed def is_bucket_available(self, bucket): """Check if bucket available on the platform""" all_in_cache = True for pkg_name in bucket: if ' | ' in pkg_name: for package in pkg_name.split(' | '): if self.is_bucket_available([package]): bucket.remove(pkg_name) bucket.append(package) pkg_name = package break if pkg_name not in self.cache: # this can be also a foo:arch and we don't have added. Tell is may be available if ":" in pkg_name: # /!\ danger: if current arch == ':appended_arch', on a non multiarch system, dpkg doesn't # understand that. strip :arch then (pkg_without_arch_name, arch) = pkg_name.split(":", -1) if arch == get_current_arch() and pkg_without_arch_name in self.cache: # false positive, available continue elif arch not in get_foreign_archs(): # relax the constraint logger.info("{} isn't available on this platform, but {} isn't enabled. So it may be available " "later on".format(pkg_name, arch)) continue logger.info("{} isn't available on this platform".format(pkg_name)) all_in_cache = False return all_in_cache def is_bucket_uptodate(self, bucket): """Check if the bucket is installed and up to date The bucket is a list of packages to check if installed.""" logger.debug("Check if {} is uptodate".format(bucket)) is_installed_and_uptodate = True for pkg_name in bucket: if ' | ' in pkg_name: for package in pkg_name.split(' | '): if self.is_bucket_available([package]): bucket.remove(pkg_name) bucket.append(package) pkg_name = package break # /!\ danger: if current arch == ':appended_arch', on a non multiarch system, dpkg doesn't # understand that. strip :arch then if ":" in pkg_name: (pkg_without_arch_name, arch) = pkg_name.split(":", -1) if arch == get_current_arch(): pkg_name = pkg_without_arch_name if pkg_name not in self.cache or not self.cache[pkg_name].is_installed: logger.info("{} isn't installed".format(pkg_name)) is_installed_and_uptodate = False elif self.cache[pkg_name].is_upgradable: logger.info("We can update {}".format(pkg_name)) is_installed_and_uptodate = False return is_installed_and_uptodate def install_bucket(self, bucket, progress_callback, installed_callback): """Install a specific bucket. If any other bucket is in progress, queue the request bucket is a list of packages to install. Return a tuple (num packages to install, size packages to download)""" logger.info("Installation {} pending".format(bucket)) bucket_pack = { "bucket": bucket, "progress_callback": progress_callback, "installed_callback": installed_callback } pkg_to_install = not self.is_bucket_uptodate(bucket) future = self.executor.submit(self._really_install_bucket, bucket_pack) future.tag_bucket = bucket_pack future.add_done_callback(self._on_done) return pkg_to_install def _really_install_bucket(self, current_bucket): """Really install current bucket and bind signals""" bucket = current_bucket["bucket"] logger.debug("Starting {} installation".format(bucket)) # exchange file output for apt and dpkg after the fork() call (open it empty) self.apt_fd = tempfile.NamedTemporaryFile(delete=False) self.apt_fd.close() if self.is_bucket_uptodate(bucket): return True need_cache_reload = False for pkg_name in bucket: if ":" in pkg_name: arch = pkg_name.split(":", -1)[-1] need_cache_reload = need_cache_reload or add_foreign_arch(arch) if need_cache_reload: with as_root(): self._force_reload_apt_cache() self.cache.update() self._force_reload_apt_cache() # mark for install and so on for pkg_name in bucket: # /!\ danger: if current arch == ':appended_arch', on a non multiarch system, dpkg doesn't understand that # strip :arch then if ":" in pkg_name: (pkg_without_arch_name, arch) = pkg_name.split(":", -1) if arch == get_current_arch(): pkg_name = pkg_without_arch_name try: pkg = self.cache[pkg_name] if pkg.is_installed and pkg.is_upgradable: logger.debug("Marking {} for upgrade".format(pkg_name)) pkg.mark_upgrade() else: logger.debug("Marking {} for install".format(pkg_name)) pkg.mark_install(auto_fix=False) except Exception as msg: message = "Can't mark for install {}: {}".format(pkg_name, msg) raise BaseException(message) # this can raise on installedArchives() exception if the commit() fails with as_root(): self.cache.commit(fetch_progress=self._FetchProgress(current_bucket, self.STATUS_DOWNLOADING, current_bucket["progress_callback"]), install_progress=self._InstallProgress(current_bucket, self.STATUS_INSTALLING, current_bucket["progress_callback"], self._force_reload_apt_cache, self.apt_fd.name)) return True def _on_done(self, future): """Call future associated bucket done callback""" result = self.RequirementsResult(bucket=future.tag_bucket["bucket"], error=None) if future.exception(): error_message = str(future.exception()) with suppress(FileNotFoundError): with open(self.apt_fd.name) as f: subprocess_content = f.read() if subprocess_content: error_message = "{}\nSubprocess output: {}".format(error_message, subprocess_content) logger.error(error_message) result = result._replace(error=error_message) else: logger.debug("{} installed".format(future.tag_bucket["bucket"])) os.remove(self.apt_fd.name) future.tag_bucket["installed_callback"](result) def _force_reload_apt_cache(self): """Loop on loading apt cache in case something else is updating""" try: self.cache.open() except SystemError: time.sleep(1) self._force_reload_apt_cache() class _FetchProgress(apt.progress.base.AcquireProgress): """Progress handler for downloading a bucket""" def __init__(self, bucket, status, progress_callback,): apt.progress.base.AcquireProgress.__init__(self) self._bucket = bucket self._status = status self._progress_callback = progress_callback def pulse(self, owner): percent = (((self.current_bytes + self.current_items) * 100.0) / float(self.total_bytes + self.total_items)) logger.debug("{} download update: {}% of {}".format(self._bucket['bucket'], percent, self.total_bytes)) report = {"step": self._status, "percentage": percent, "pkg_size_download": self.total_bytes} self._progress_callback(report) class _InstallProgress(apt.progress.base.InstallProgress): """Progress handler for installing a bucket""" def __init__(self, bucket, status, progress_callback, force_load_apt_cache, exchange_filename): apt.progress.base.InstallProgress.__init__(self) self._bucket = bucket self._status = status self._progress_callback = progress_callback self._force_reload_apt_cache = force_load_apt_cache self._exchange_filename = exchange_filename def error(self, pkg, msg): logger.error("{} installation finished with an error: {}".format(self._bucket['bucket'], msg)) self._force_reload_apt_cache() # reload apt cache raise BaseException(msg) def finish_update(self): # warning: this function can be called even if dpkg failed (it raised an exception around commit() # DO NOT CALL directly the callbacks from there. logger.debug("Install for {} ended.".format(self._bucket['bucket'])) self._force_reload_apt_cache() # reload apt cache def status_change(self, pkg, percent, status): logger.debug("{} install update: {}".format(self._bucket['bucket'], percent)) self._progress_callback({"step": self._status, "percentage": percent}) @staticmethod def _redirect_stdin(): # pragma: no cover (in a fork) os.dup2(os.open(os.devnull, os.O_RDWR), 0) def _redirect_output(self): # pragma: no cover (in a fork) fd = os.open(self._exchange_filename, os.O_RDWR) os.dup2(fd, 1) os.dup2(fd, 2) def _fixup_fds(self): # pragma: no cover (in a fork) required_fds = [0, 1, 2, # stdin, stdout, stderr self.writefd, self.write_stream.fileno(), self.statusfd, self.status_stream.fileno() ] # ensure that our required fds close on exec for fd in required_fds[3:]: old_flags = fcntl.fcntl(fd, fcntl.F_GETFD) fcntl.fcntl(fd, fcntl.F_SETFD, old_flags | fcntl.FD_CLOEXEC) # close all fds proc_fd = "/proc/self/fd" if os.path.exists(proc_fd): error_count = 0 for fdname in os.listdir(proc_fd): try: fd = int(fdname) except ValueError: print("ERROR: can not get fd for '%s'" % fdname) if fd in required_fds: continue try: os.close(fd) except OSError as e: # there will be one fd that can not be closed # as its the fd from pythons internal diropen() # so its ok to ignore one close error error_count += 1 if error_count > 1: print("ERROR: os.close(%s): %s" % (fd, e)) def fork(self): pid = os.fork() if pid == 0: # pragma: no cover # be root os.seteuid(0) os.setegid(0) self._fixup_fds() self._redirect_stdin() self._redirect_output() return pid ubuntu-make-18.09+disco1/umake/settings.py0000644000000000000000000000430313352651520015352 0ustar # -*- coding: utf-8 -*- # Copyright (C) 2014 Canonical # # Authors: # Didier Roche # # 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; version 3. # # 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 import os import requests import re from xdg.BaseDirectory import xdg_data_home DEFAULT_INSTALL_TOOLS_PATH = os.path.expanduser(os.path.join(xdg_data_home, "umake")) DEFAULT_BINARY_LINK_PATH = os.path.expanduser(os.path.join(DEFAULT_INSTALL_TOOLS_PATH, "bin")) OLD_CONFIG_FILENAME = "udtc" CONFIG_FILENAME = "umake" LSB_RELEASE_FILE = "/etc/lsb-release" UMAKE_FRAMEWORKS_ENVIRON_VARIABLE = "UMAKE_FRAMEWORKS" from_dev = False def get_version(): '''Get version depending if on dev or released version''' version = open(os.path.join(os.path.dirname(__file__), 'version'), 'r', encoding='utf-8').read().strip() if not from_dev: snap_appendix = '' snap_rev = os.getenv('SNAP_REVISION') if snap_rev: snap_appendix = '+snap{}'.format(snap_rev) return version + snap_appendix import subprocess try: # use git describe to get a revision ref if running from a branch. Will append dirty if local changes version = subprocess.check_output(["git", "describe", "--tags", "--dirty"]).decode('utf-8').strip() except (subprocess.CalledProcessError, FileNotFoundError): version += "+unknown" return version def get_latest_version(): '''Get latest available version from github''' try: page = requests.get("https://github.com/ubuntu/ubuntu-make/releases") page.raise_for_status() except Exception as e: raise e latest = re.search('releases/tag/(.*)\">', page.text).group(1) return latest ubuntu-make-18.09+disco1/umake/tools.py0000644000000000000000000003726313352651520014665 0ustar # -*- coding: utf-8 -*- # Copyright (C) 2014 Canonical # # Authors: # Didier Roche # # 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; version 3. # # 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 from collections import namedtuple from contextlib import contextmanager, suppress from enum import unique, Enum from gettext import gettext as _ from gi.repository import GLib, Gio from glob import glob import logging import os import re import shutil import signal import subprocess import sys from textwrap import dedent from time import sleep from threading import Lock from umake import settings from xdg.BaseDirectory import load_first_config, xdg_config_home, xdg_data_home import yaml import yaml.scanner import yaml.parser logger = logging.getLogger(__name__) # cache current arch. Shouldn't change in the life of the process ;) _current_arch = None _foreign_arch = None _version = None profile_tag = _("# Ubuntu make installation of {}\n") root_lock = Lock() @unique class ChecksumType(Enum): """Types of supported checksum algorithms.""" md5 = "md5" sha1 = "sha1" sha256 = "sha256" sha512 = "sha512" class Checksum(namedtuple('Checksum', ['checksum_type', 'checksum_value'])): """A combination of checksum algorithm and actual value to check.""" pass class Singleton(type): _instances = {} def __call__(cls, *args, **kwargs): if cls not in cls._instances: cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs) return cls._instances[cls] class ConfigHandler(metaclass=Singleton): def __init__(self): """Load the config""" self._config = {} old_config_file = load_first_config(settings.OLD_CONFIG_FILENAME) config_file = load_first_config(settings.CONFIG_FILENAME) if old_config_file: if not config_file: config_file = old_config_file.replace(settings.OLD_CONFIG_FILENAME, settings.CONFIG_FILENAME) os.rename(old_config_file, config_file) logger.debug("Opening {}".format(config_file)) try: with open(config_file) as f: self._config = yaml.load(f) except (TypeError, FileNotFoundError): logger.info("No configuration file found") except (yaml.scanner.ScannerError, yaml.parser.ParserError) as e: logger.error("Invalid configuration file found: {}".format(e)) @property def config(self): return self._config @config.setter def config(self, config): config_file = os.path.join(xdg_config_home, settings.CONFIG_FILENAME) logging.debug("Saving new configuration: {} in {}".format(config, config_file)) os.makedirs(os.path.dirname(config_file), exist_ok=True) with open(config_file, 'w') as f: yaml.dump(config, f, default_flow_style=False) self._config = config class NoneDict(dict): """We don't use a defaultdict(lambda: None) as it's growing everytime something is requested""" def __getitem__(self, key): return dict.get(self, key) class classproperty(object): """Class property, similar to instance properties""" def __init__(self, f): self.f = f def __get__(self, obj, owner): return self.f(owner) class MainLoop(object, metaclass=Singleton): """Mainloop simple wrapper""" def __init__(self): self.mainloop = GLib.MainLoop() # Glib steals the SIGINT handler and so, causes issue in the callback # https://bugzilla.gnome.org/show_bug.cgi?id=622084 signal.signal(signal.SIGINT, signal.SIG_DFL) def run(self): self.mainloop.run() def quit(self, status_code=0, raise_exception=True): GLib.timeout_add(80, self._clean_up, status_code) # only raises exception if not turned down (like in tests, where we are not in the mainloop for sure) if raise_exception: raise self.ReturnMainLoop() def _clean_up(self, exit_code): self.mainloop.quit() sys.exit(exit_code) @staticmethod def in_mainloop_thread(function): """Decorator to run a function in a mainloop thread""" # GLib.idle_add doesn't propagate try: except in the mainloop, so we handle it there for all functions def wrapper(*args, **kwargs): try: function(*args, **kwargs) except MainLoop.ReturnMainLoop: pass except BaseException: logger.exception("Unhandled exception") GLib.idle_add(MainLoop().quit, 1, False) def inner(*args, **kwargs): return GLib.idle_add(wrapper, *args, **kwargs) return inner class ReturnMainLoop(BaseException): """Exception raised only to return to MainLoop without finishing the function""" class InputError(BaseException): """Exception raised for errors in the input. Attributes: expr -- input expression in which the error occurred msg -- explanation of the error """ def __init__(self, value): self.value = value def __str__(self): return repr(self.value) def get_current_arch(): """Get current configuration dpkg architecture. Possible outputs: * amd64 * i386 """ global _current_arch if _current_arch is None: _current_arch = subprocess.check_output(["dpkg", "--print-architecture"], universal_newlines=True).rstrip("\n") return _current_arch def get_foreign_archs(): """Get foreign architectures that were enabled""" global _foreign_arch if _foreign_arch is None: _foreign_arch = subprocess.check_output(["dpkg", "--print-foreign-architectures"], universal_newlines=True)\ .rstrip("\n").split() return _foreign_arch def add_foreign_arch(new_arch): """Add a new architecture if not already loaded. Return if new arch was added""" global _foreign_arch # try to add the arch if not already present arch_added = False if new_arch not in get_foreign_archs() and new_arch != get_current_arch(): logger.info("Adding foreign arch: {}".format(new_arch)) with open(os.devnull, "w") as f: with as_root(): if subprocess.call(["dpkg", "--add-architecture", new_arch], stdout=f) != 0: msg = _("Can't add foreign architecture {}").format(new_arch) raise BaseException(msg) # mark the new arch as added and invalidate the cache arch_added = True _foreign_arch = None return arch_added def get_current_ubuntu_version(): """Return current ubuntu version or raise an error if couldn't find any""" global _version if _version is None: try: with open(settings.LSB_RELEASE_FILE) as lsb_release_file: for line in lsb_release_file: line = line.strip() if line.startswith('DISTRIB_RELEASE='): tag, release = line.split('=', 1) _version = release break else: message = "Couldn't find DISTRIB_RELEASE in {}".format(settings.LSB_RELEASE_FILE) logger.error(message) raise BaseException(message) except (FileNotFoundError, IOError) as e: message = "Can't open lsb-release file: {}".format(e) logger.error(message) raise BaseException(message) return _version def is_completion_mode(): """Return true if we are in completion mode""" return os.environ.get('_ARGCOMPLETE') == '1' def get_user_frameworks_path(): """Return user frameworks local path""" return os.path.expanduser(os.path.join('~', '.umake', 'frameworks')) def get_icon_path(icon_filename): """Return local icon path""" return os.path.join(xdg_data_home, "icons", icon_filename) def get_launcher_path(desktop_filename): """Return launcher path""" return os.path.join(xdg_data_home, "applications", desktop_filename) def launcher_exists(desktop_filename): """Return true if the desktop filename exists""" exists = os.path.exists(get_launcher_path(desktop_filename)) if not exists: logger.debug("{} doesn't exist".format(desktop_filename)) return False return True def launcher_exists_and_is_pinned(desktop_filename): """Return true if the desktop filename is pinned in the launcher""" if not launcher_exists(desktop_filename): return False if os.environ.get("XDG_CURRENT_DESKTOP") != "Unity": logger.debug("Don't check launcher as current environment isn't Unity") return True if "com.canonical.Unity.Launcher" not in Gio.Settings.list_schemas(): logger.debug("In an Unity environment without the Launcher schema file") return False gsettings = Gio.Settings(schema_id="com.canonical.Unity.Launcher", path="/com/canonical/unity/launcher/") launcher_list = gsettings.get_strv("favorites") res = "application://" + desktop_filename in launcher_list if not res: logger.debug("Launcher exists but is not pinned (pinned: {}).".format(launcher_list)) return res def copy_icon(source_icon_filepath, icon_filename): """copy icon from source filepath to xdg destination as icon_filename globs are accepted in the filepath""" icon_path = get_icon_path(icon_filename) os.makedirs(os.path.dirname(icon_path), exist_ok=True) for file_path in glob(source_icon_filepath): logger.debug("Copy icon from {} to {}".format(file_path, icon_path)) shutil.copy(file_path, icon_path) break else: logger.warning("Didn't find any icon for the launcher.") def create_launcher(desktop_filename, content): """Create a desktop file and an unity launcher icon""" # Create file in standard location launcher_path = get_launcher_path(desktop_filename) os.makedirs(os.path.dirname(launcher_path), exist_ok=True) logger.debug("Create launcher as {}".format(launcher_path)) with open(launcher_path, "w") as f: f.write(content) if "com.canonical.Unity.Launcher" not in Gio.Settings.list_schemas(): logger.info("Don't create a launcher icon, as we are not under Unity") return gsettings = Gio.Settings(schema_id="com.canonical.Unity.Launcher", path="/com/canonical/unity/launcher/") launcher_list = gsettings.get_strv("favorites") launcher_tag = "application://{}".format(desktop_filename) if launcher_tag not in launcher_list: index = len(launcher_list) with suppress(ValueError): index = launcher_list.index("unity://running-apps") launcher_list.insert(index, launcher_tag) # FIXME: working around a bug in glib: https://bugzilla.gnome.org/show_bug.cgi?id=744030 sleep(1.5) ########## gsettings.set_strv("favorites", launcher_list) def add_exec_link(exec_path, destination_name): bin_folder = settings.DEFAULT_BINARY_LINK_PATH os.makedirs(bin_folder, exist_ok=True) add_env_to_user("Ubuntu Make binary symlink", {"PATH": {"value": bin_folder}}) full_dest_path = os.path.join(bin_folder, destination_name) print(exec_path) with suppress(FileNotFoundError): os.remove(full_dest_path) os.symlink(exec_path, full_dest_path) def get_application_desktop_file(name="", icon_path="", try_exec="", exec="", comment="", categories="", extra=""): """Get a desktop file string content""" return dedent("""\ [Desktop Entry] Version=1.0 Type=Application Name={name} Icon={icon_path} TryExec={try_exec} Exec={exec} Comment={comment} Categories={categories} Terminal=false {extra} """).format(name=name, icon_path=icon_path, try_exec=try_exec, exec=exec, comment=comment, categories=categories, extra=extra) def strip_tags(content): """Strip all HTML tags from content""" return re.sub('<[^<]+?>', '', content) def switch_to_current_user(): """Switch euid and guid to current user if current user is root""" if os.geteuid() != 0: return # fallback to root user if no SUDO_GID (should be su - root) os.setegid(int(os.getenv("SUDO_GID", default=0))) os.seteuid(int(os.getenv("SUDO_UID", default=0))) @contextmanager def as_root(): # block all other threads making sensitive operations root_lock.acquire() try: os.seteuid(0) os.setegid(0) yield finally: switch_to_current_user() root_lock.release() # TODO: make that useful for more shells def _get_shell_profile_file_path(): """Return profile filepath for current preferred shell""" current_shell = os.getenv('SHELL', '/bin/bash').lower() profile_filename = '.zprofile' if 'zsh' in current_shell else '.profile' return os.path.join(os.path.expanduser('~'), profile_filename) def remove_framework_envs_from_user(framework_tag): """Remove all envs from user if found""" profile_filepath = _get_shell_profile_file_path() content = "" framework_header = profile_tag.format(framework_tag) try: with open(profile_filepath, "r", encoding='utf-8') as f: content = f.read() except FileNotFoundError: return if framework_header not in content: return while framework_header in content: framework_start_index = content.find(framework_header) framework_end_index = content[framework_start_index:].find("\n\n") content = content[:framework_start_index] + content[framework_start_index + framework_end_index + len("\n\n"):] # rewrite .profile and omit framework_tag with open(profile_filepath + ".new", "w", encoding='utf-8') as f: f.write(content) os.rename(profile_filepath + ".new", profile_filepath) def add_env_to_user(framework_tag, env_dict): """Add args to user env in .profile (.zprofile if zsh) if the user doesn't have that env with those args env_dict is a dictionary of: { env_variable: { value: value, keep: True/False } } value is either a list (in that case, it's concatenated) or a string If keep is set to True, we keep previous values with :$OLDERENV.""" profile_filepath = _get_shell_profile_file_path() remove_framework_envs_from_user(framework_tag) envs_to_insert = {} for env in env_dict: value = env_dict[env]["value"] if isinstance(value, list): value = os.pathsep.join(value) if env_dict[env].get("keep", True) and os.environ.get(env): os.environ[env] = value + os.pathsep + os.environ[env] value = "{}{}${}".format(value, os.pathsep, env) else: os.environ[env] = value envs_to_insert[env] = value with open(profile_filepath, "a", encoding='utf-8') as f: f.write(profile_tag.format(framework_tag)) for env in envs_to_insert: value = envs_to_insert[env] logger.debug("Adding {} to user's {} for {}".format(value, env, framework_tag)) export = "" if env != "PATH": export = "export " f.write("{}{}={}\n".format(export, env, value)) f.write("\n") ubuntu-make-18.09+disco1/umake/ui/0000755000000000000000000000000013415342711013554 5ustar ubuntu-make-18.09+disco1/umake/ui/__init__.py0000644000000000000000000000472013352651520015671 0ustar # -*- coding: utf-8 -*- # Copyright (C) 2014 Canonical # # Authors: # Didier Roche # # 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; version 3. # # 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 """Abstracted UI interface that will be overriden by different UI types""" import logging from contextlib import suppress from gi.repository import GLib from umake.tools import Singleton, MainLoop from umake.settings import get_version, get_latest_version logger = logging.getLogger(__name__) class UI(object, metaclass=Singleton): currentUI = None def __init__(self, current_UI): UI.currentUI = current_UI @classmethod def return_main_screen(cls, status_code=0): try: truncated_version = get_version().split("+")[0] if status_code == 1 and not (get_latest_version() == truncated_version): print(''' Your currently installed version ({}) differs from the latest release ({}) Many issues are usually fixed in more up to date versions. To get the latest version you can read the instructions at https://github.com/ubuntu/ubuntu-make '''.format(get_version(), get_latest_version())) except Exception as e: logger.error(e) cls.currentUI._return_main_screen(status_code=status_code) @classmethod @MainLoop.in_mainloop_thread def display(cls, contentType): """display in main thread this UI contentType. Can be delayed by 50 ms, like for pulse or message""" # TODO: add check for current framework == framework sending contentType cls.currentUI._display(contentType) @classmethod @MainLoop.in_mainloop_thread def delayed_display(cls, contentType): GLib.timeout_add(50, cls._one_time_wrapper, cls.currentUI._display, contentType) @staticmethod def _one_time_wrapper(fun, contentType): """To be called with GLib.timeout_add(), return False to only have one call""" fun(contentType) return False ubuntu-make-18.09+disco1/umake/ui/__pycache__/0000755000000000000000000000000013415342711015764 5ustar ubuntu-make-18.09+disco1/umake/ui/cli/0000755000000000000000000000000013415342711014323 5ustar ubuntu-make-18.09+disco1/umake/ui/cli/__init__.py0000644000000000000000000002451613352651520016445 0ustar # -*- coding: utf-8 -*- # Copyright (C) 2014 Canonical # # Authors: # Didier Roche # # 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; version 3. # # 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 """Module for loading the command line interface""" import argcomplete from contextlib import suppress from gettext import gettext as _ import logging import os from progressbar import ProgressBar, BouncingBar import readline import sys from umake.interactions import InputText, TextWithChoices, LicenseAgreement, DisplayMessage, UnknownProgress from umake.ui import UI from umake.frameworks import BaseCategory, list_frameworks from umake.tools import InputError, MainLoop from umake.settings import get_version logger = logging.getLogger(__name__) def rlinput(prompt, prefill=''): readline.set_startup_hook(lambda: readline.insert_text(prefill)) try: return input(prompt + " ") finally: readline.set_startup_hook() class CliUI(UI): def __init__(self): # This this UI as current super().__init__(self) def _return_main_screen(self, status_code=0): # quit the shell MainLoop().quit(status_code=status_code) def _display(self, contentType): # print depending on the content type while True: try: if isinstance(contentType, InputText): contentType.run_callback(result=rlinput(contentType.content, contentType.default_input)) elif isinstance(contentType, LicenseAgreement): print(contentType.content) contentType.choose(answer=input(contentType.input)) elif isinstance(contentType, TextWithChoices): contentType.choose(answer=input(contentType.prompt)) elif isinstance(contentType, DisplayMessage): print(contentType.text) elif isinstance(contentType, UnknownProgress): if not contentType.bar: contentType.bar = ProgressBar(widgets=[BouncingBar()]) with suppress(StopIteration, AttributeError): # pulse and add a timeout callback contentType.bar(contentType._iterator()).next() UI.delayed_display(contentType) # don't recall the callback return False else: logger.error("Unexcepted content type to display to CLI UI: {}".format(contentType)) MainLoop().quit(status_code=1) break except InputError as e: logger.error(str(e)) continue @MainLoop.in_mainloop_thread def run_command_for_args(args): """Run correct command for args""" # args.category can be a category or a framework in main target = None try: target = BaseCategory.categories[args.category] except AttributeError: target = BaseCategory.main_category.frameworks[args.category] target.run_for(args) def mangle_args_for_default_framework(args): """return the potentially changed args_to_parse for the parser for handling default frameworks "./ [global_or_common_options] category [options from default framework]" as subparsers can't define default options and are not optional: http://bugs.python.org/issue9253 """ result_args = [] skip_all = False pending_args = [] category_name = None framework_completed = False args_to_append = [] for arg in args: # --remove is both installed as global and per-framework optional arguments. argparse will only analyze the # per framework one and will override the global one. So if --remove is before the category name, it will be # ignored. Mangle the arg and append it last then. if not category_name and arg in ("--remove", "-r"): args_to_append.append(arg) continue if not arg.startswith('-') and not skip_all: if not category_name: if arg in BaseCategory.categories.keys(): category_name = arg # file global and common options result_args.extend(pending_args) pending_args = [] result_args.append(arg) continue else: skip_all = True # will just append everything at the end elif not framework_completed: # if we found a real framework or not, consider that one. pending_args will be then filed framework_completed = True if arg in BaseCategory.categories[category_name].frameworks.keys(): result_args.append(arg) continue # take default framework if any after some sanitization check elif BaseCategory.categories[category_name].default_framework is not None: # before considering automatically inserting default framework, check that this argument has # some path separator into it. This is to avoid typos in framework selection and selecting default # framework with installation path where we didn't want to. if os.path.sep in arg: result_args.append(BaseCategory.categories[category_name].default_framework.prog_name) # current arg will be appending in pending_args else: skip_all = True # will just append everything at the end pending_args.append(arg) # this happened only if there is no argument after the category name if category_name and not framework_completed: if BaseCategory.categories[category_name].default_framework is not None: result_args.append(BaseCategory.categories[category_name].default_framework.prog_name) # let the rest in result_args.extend(pending_args) result_args.extend(args_to_append) return result_args def get_frameworks_list_output(args): """ Get a frameworks list based on the arguments. It returns a string ready to be printed. Multiple forms of the frameworks list can ge given: - List with all frameworks - List with just only installed frameworks - List with just installable frameworks """ categories = list_frameworks() print_result = str() if args.list or args.list_available: # Sort the categories to prevent a random list at each new program execution for category in sorted(categories, key=lambda cat: cat["category_name"]): if category["category_name"] == "main" and len(category["frameworks"]) == 0: continue print_result += "{}: {}".format(category["category_name"], category["category_description"]) cat_is_installed = str() if category["is_installed"] == BaseCategory.NOT_INSTALLED: cat_is_installed = _("not installed") elif category["is_installed"] == BaseCategory.PARTIALLY_INSTALLED: cat_is_installed = _("partially installed") elif category["is_installed"] == BaseCategory.FULLY_INSTALLED: cat_is_installed = _("fully installed") if cat_is_installed: print_result = "{} [{}]".format(print_result, cat_is_installed) print_result += "\n" # Sort the frameworks to prevent a random list at each new program execution for framework in sorted(category["frameworks"], key=lambda fram: fram["framework_name"]): if args.list_available: if not framework["is_installable"]: continue print_result += "\t{}: {}".format(framework["framework_name"], framework["framework_description"]) if not framework["is_installable"]: print_result = _("{} [not installable on this machine]".format(print_result)) elif framework["is_installed"]: print_result = _("{} [installed]".format(print_result)) print_result += '\n' elif args.list_installed: # Sort the categories to prevent a random list at each new program execution for category in sorted(categories, key=lambda cat: cat["category_name"]): # Sort the frameworks to prevent a random list at each new program execution for framework in sorted(category["frameworks"], key=lambda fram: fram["framework_name"]): if framework["is_installed"]: print_result += "{}: {}\n".format(framework["framework_name"], framework["framework_description"]) print_result += "\t{}: {}\n".format(_("path"), framework["install_path"]) if not print_result: print_result = _("No frameworks are currently installed") return print_result def main(parser): """Main entry point of the cli command""" categories_parser = parser.add_subparsers(help='Developer environment', dest="category") for category in BaseCategory.categories.values(): category.install_category_parser(categories_parser) argcomplete.autocomplete(parser) # autocomplete will stop there. Can start more expensive operations now. arg_to_parse = sys.argv[1:] if "--help" not in arg_to_parse: # manipulate sys.argv for default frameworks: arg_to_parse = mangle_args_for_default_framework(arg_to_parse) args = parser.parse_args(arg_to_parse) if args.list or args.list_installed or args.list_available: print(get_frameworks_list_output(args)) sys.exit(0) if args.version: print(get_version()) sys.exit(0) if not args.category: parser.print_help() sys.exit(0) CliUI() run_command_for_args(args) ubuntu-make-18.09+disco1/umake/ui/cli/__pycache__/0000755000000000000000000000000013415342711016533 5ustar ubuntu-make-18.09+disco1/umake/version0000644000000000000000000000000613352651520014544 0ustar 18.09